﻿/*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);

