﻿/*extern $, Maps, Dom, Event, window, Lang, document, escape */
/*members toString, MapURL, DirURL, vCards, Init, getElementsByClassName, length,
          push, ParseHCard, CreateLinks, Popup, getTarget, href, stopEvent, open,
          trim, Address, City, State, Zip, Phone, Lat, Lng, Node, Adrs, Name,
          createElement, appendChild, createTextNode, MapHREF, addListener, DirHREF,
          setStyle, trimString, replace, onDOMReady
*/


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--) {
		    oAddress2 = Dom .getElementsByClassName('organization-name', null, oAdrs[i])[0];
		    oAddress3 = Dom .getElementsByClassName('organization-unit', null, oAdrs[i])[0];
			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];
			sAddress2 = this.trimString(this.getInnerText(oAddress2));
			sAddress3 = this.trimString(this.getInnerText(oAddress3));
			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({
			    Address2 : sAddress2,
			    Address3 : sAddress3,
				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.parentNode.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) + ' ' + escape(oAddress.Address2) + ' ' +escape(oAddress.Address3);
		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) + ' ' + escape(oAddress.Address2) + ' ' +escape(oAddress.Address3);
		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(Maps.Init, Maps, true);

