﻿PB.Maps = {
	toString: function() { return 'Photobooks hCard to Map Manager'; },
	MapURL: 'http://map2.photobooks.com/s/m.asp?transaction=locMap',
	DirURL: 'http://map2.photobooks.com/s/m.asp?dir=true&transaction=locMap',
	vCards: [ ],
	Init: function() {
		// Search for vCards.
		// Extract useful data for map-making.
		// Create "View Map / Driving Directions" Link.
		var oVCards  = Dom.getElementsByClassName('vcard');
		var i = oVCards.length; while (i--) { this.vCards.push(this.ParseHCard(oVCards[i])); }
		this.CreateLinks();
	},
	Popup: function(e) {
		var oTarget = Event.getTarget(e);
		var sURL    = oTarget.href;
		Event.stopEvent(e);
		window.open(sURL, 'Map', 'menubar=yes,scrollbars=yes,width=900,height=600');
	},
	ParseHCard: function(oCard) {
		// Need name, phone, address, city, state, and zip
		// Will use lat, lng if available
		// Handles vcards with multiple addresses.
		var oName    = Dom.getElementsByClassName('fn',             null, oCard)[0];
		var oAdrs    = Dom.getElementsByClassName('adr',            null, oCard);

		var sName    = this.trimString(this.getInnerText(oName));
		var oAddress, oPhone, oCity, oState, oZip, oLat, oLng, aAdrs = [ ];
		var sAddress, sPhone, sCity, sState, sZip, sLat, sLng;
		var i = oAdrs.length; while (i--) {
			oAddress = Dom.getElementsByClassName('street-address', null, oAdrs[i])[0];
			oCity    = Dom.getElementsByClassName('locality',       null, oAdrs[i])[0];
			oState   = Dom.getElementsByClassName('region',         null, oAdrs[i])[0];
			oZip     = Dom.getElementsByClassName('postal-code',    null, oAdrs[i])[0];
			oPhone   = Dom.getElementsByClassName('tel',            null, oAdrs[i])[0];
			oLat     = Dom.getElementsByClassName('latitude',       null, oAdrs[i])[0];
			oLng     = Dom.getElementsByClassName('longitude',      null, oAdrs[i])[0];
			sAddress = this.trimString(this.getInnerText(oAddress));
			sCity    = this.trimString(this.getInnerText(oCity));
			sState   = this.trimString(this.getInnerText(oState));
			sZip     = this.trimString(this.getInnerText(oZip));
			sPhone   = this.trimString(this.getInnerText(oPhone));
			sLat     = this.trimString(this.getInnerText(oLat));
			sLng     = this.trimString(this.getInnerText(oLng));
			aAdrs.push({
				Address : sAddress,
				City    : sCity,
				State   : sState,
				Zip     : sZip,
				Phone   : sPhone,
				Lat     : sLat,
				Lng     : sLng,
				Node    : oAdrs[i]
			});
		}
		return {
			Name    : sName,
			Adrs    : aAdrs,
			Node    : oCard
		}
	},
	CreateLinks: function() {
		var oNode, oLink, iBottomMargin;
		var x, i = this.vCards.length; while(i--) {
			x = this.vCards[i].Adrs.length; while (x--) {
				oNode = document.createElement('span');
				oNode.appendChild(document.createTextNode('View '));
					oLink = document.createElement('a');
					oLink.href = this.MapHREF(this.vCards[i], this.vCards[i].Adrs[x]);
					oLink.appendChild(document.createTextNode('map'));
					Event.addListener(oLink, 'click', this.Popup);
				oNode.appendChild(oLink);
				oNode.appendChild(document.createTextNode(' / '));
					oLink = document.createElement('a');
					oLink.href = this.DirHREF(this.vCards[i], this.vCards[i].Adrs[x]);
					oLink.appendChild(document.createTextNode('driving directions'));
					Event.addListener(oLink, 'click', this.Popup);
				oNode.appendChild(oLink);
				Dom.setStyle(oNode, 'display', 'block');
				this.vCards[i].Adrs[x].Node.appendChild(oNode);
			}
		}
	},
	MapHREF: function(oCard, oAddress) {
		var sURL = this.MapURL;
		if (oCard.Name.length > 0)  { sURL += '&user1=' + escape(oCard.Name);  }
		if (oAddress.Phone.length > 0) { sURL += '&user2=' + escape(oAddress.Phone); }
		if (oAddress.Lat.length > 0 && oAddress.Lng.length > 0) {
			sURL += '&lat=' + escape(oAddress.Lat) + '&lng=' + escape(oAddress.Lng);
		}
		sURL += '&address=' + escape(oAddress.Address);
		sURL += '&city=' + escape(oAddress.City);
		sURL += '&stateProvince=' + escape(oAddress.State);
		sURL += '&postalCode=' + escape(oAddress.Zip);
		sURL += '&HeaderFile=';
		sURL += '&StyleSheetfile=';
		sURL += '&documentTitle=' + escape(oCard.Name || 'Maps');
		return sURL;
	},
	DirHREF: function(oCard, oAddress) {
		var sURL = this.DirURL;
		if (oCard.Name.length > 0)  { sURL += '&user1=' + escape(oCard.Name);  }
		if (oAddress.Phone.length > 0) { sURL += '&user2=' + escape(oAddress.Phone); }
		if (oAddress.Lat.length > 0 && oAddress.Lng.length > 0) {
			sURL += '&lat=' + escape(oAddress.Lat) + '&lng=' + escape(oAddress.Lng);
		}
		sURL += '&address=' + escape(oAddress.Address);
		sURL += '&city=' + escape(oAddress.City);
		sURL += '&stateProvince=' + escape(oAddress.State);
		sURL += '&postalCode=' + escape(oAddress.Zip);
		sURL += '&Headerfile=';
		sURL += '&StyleSheetfile=';
		sURL += '&documentTitle=' + escape(oAddress.Name || 'Driving Directions');
		return sURL;
	},
	getInnerText: function(o) { // Utility function. Probably should be looking for title attributes too.
		if (!o) { return; }
		if (o.innerText) { return o.innerText; }
		var s = '';
		for (var i = 0; i < o.childNodes.length; i++) {
			switch(o.childNodes[i].nodeType) {
				case 1 : s += this.getInnerText(o.childNodes[i]); break;
				case 3 : s += o.childNodes[i].nodeValue;          break;
			}
		}
		return s.replace(/\xA0/g, ' '); // convert non-breaking spaces to spaces.
	},
	trimString: function(s) { // Utility function. Prolly should be somewhere else.
		if (!s) { return ''; }
		s = s.replace( /^\s+/g, '' );
		return s.replace( /\s+$/g, '');
	}
};
Event.onDOMReady(PB.Maps.Init, PB.Maps, true);

var Physician = {
	init: function() {
		// Add popup property to specialty link.
		this.DoSpecialtyLink();
	},
	DoSpecialtyLink: function() {
		var aLinks = Dom.getElementsByClassName('popup', 'a');
		Event.addListener(aLinks, 'click', this.Popup, this, true);
	},
	Popup: function(e) {
		var oTarget = Event.getTarget(e);
		var sURL    = oTarget.href;
		Event.stopEvent(e);
		window.open(sURL, 'Specialty', 'width=780,height=500,resizable,scrollbars,status');
	},
	CloseSpecialty: function(w) { w.close(); },
	ChangeLoc: function(s, w) {
		this.CloseSpecialty(w);
		window.location.assign(s);
	}
};

var Specialty = {
	init: function() {
		// Activate close button
		this.DoCloseButton();
		// Make links open in parent window.
		this.DoLinks();
	},
	DoCloseButton: function() {
		var oButton = $('CloseButton');
		Dom.addClass(oButton, 'js');
		Event.addListener(oButton, 'click', this.CloseWindow, this, true);
	},
	CloseWindow: function() {
		if (opener && opener.Physician) {
			opener.Physician.CloseSpecialty(window);
		} else {
			window.close();
		}
	},
	DoLinks: function() {
		var aLinks = document.getElementsByTagName('a');
		Event.addListener(aLinks, 'click', this.OpenLink, this, true);
	},
	OpenLink: function(e) {
		var oTarget = Event.getTarget(e);
		var sPageID = oTarget.id;
		var sURL    = oTarget.href;
		Event.stopEvent(e);
		opener.Physician.ChangeLoc(sURL, window);
	}
};

// by Nannette Thacker
// http://www.shiningstar.net
// This script checks and unchecks boxes on a form
// Checks and unchecks unlimited number in the group...
// Pass the Checkbox group name...
// call buttons as so:
// <input type=button name="CheckAll"   value="Check All"
	//onClick="checkAll(document.myform.list)">
// <input type=button name="UnCheckAll" value="Uncheck All"
	//onClick="uncheckAll(document.myform.list)">

function checkAll(field)
{
for (i = 0; i < field.length; i++)
	field[i].checked = true ;
}

function uncheckAll(field)
{
for (i = 0; i < field.length; i++)
	field[i].checked = false ;
}
