/*
 * Mapping script for Goldsboro News-Argus Dining Guide categories
 *
 * Purpose: Displays a map with markers from restaurants on the page 
 * 			and changes links to select the markers on the map.
 *
 * By Alexis Deveria
 * Created on: Dec 12, 2005
 * Last revision: Jan 15, 2008
 *
 */

var mapMaker = function(){
	//Global Variables
	var map, markurl, givenaddr;
	var markers=[];
	var mapAnchor = '#top';
	
	//News-Argus office data for default info: 
	var gna = {
		lng : -77.948645,
		lat : 35.373155,
		addr:'310 Berkeley Blvd, Goldsboro, NC'
	}
	
	//Private methods:
	
	//Get vcard properties
	function vprop(item,cname) {
		var x = getElementsByClassName(cname,item);
		if(x.length) { return x[0].innerHTML } 
	}
	
	//Set onclick for markers
	function attachEvent(item,n) {
		item.onclick = function() {
			document.location = mapAnchor;
			mapMaker.toggleMap(true,n);
			return false;
		}
	}
	
	//Load map with markers
	function initMap(num) {
	
		//Code convert from first 3 letters of category to get the right marker images
		var catCodes = {
			asi:'as',
			bar:'bbq',	
			fas:'ff',
			fin:'fd',
			hom:'hc',
			ita:'it',
			mex:'mx',
			oth:'ot',
			piz:'pz',
			ste:'st',
			cat:'ctr',
			wit:'wco'
		};
		
		var cat = document.getElementById('category').value;
		givencat = catCodes[cat.substring(0,3).toLowerCase()];
		
		markurl="../../mapall/mark-"+givencat+".png";
	
		//Get bounds for correct viewport size
		var bounds = new GLatLngBounds();
		
		//Check cookie for address
		var useraddr = getCookie('useraddr');
		givenaddr = useraddr?useraddr:gna.addr;
	
		//Build map w/controls, w/starting point
		map = new GMap(document.getElementById("map"));
		map.addControl(new GLargeMapControl());
		map.centerAndZoom(new GPoint(gna.lng, gna.lat), 6);
		
		//Add markers based on vcard info found on page
		var vcards = getElementsByClassName('vcard',document,'li');
		for (var i=0;i<vcards.length;i++) {
			var menu = false;
			var vcard = vcards[i];
			var name = vprop(vcard,"org");
			var city = vprop(vcard,"locality");
			var addr = vprop(vcard,"street-address") + ', ' + city;
			
			var urlel = getElementsByClassName('url',vcard);
			if (urlel.length) {
				var menuURL = urlel[0].href;
				menu = true;
			}
			
			var point = new GLatLng(parseFloat(vprop(vcards[i],"latitude")),
								   parseFloat(vprop(vcards[i],"longitude")));
			
			//Add point to bounds container
			bounds.extend(point);
			
			//Add menu links when found
			var menuStr=menu?' [<a href="'+menuURL+'">Menu</a>]':'';
			var menuIcon=menu?'<a href="'+menuURL+'"><img src="../../mapall/menusm.gif" alt="" title="View Menu" alt="View Menu" /></a>':'';

			//Set the HTML that appears in the bubble
			var html = '<div id="bubble">'
				+ menuIcon
				+'<h5>' + name +'</h5><br /><span>'
				+ addr 
				+'</span><form action="http://maps.google.com/maps" method="get" target="_blank"><label for="saddr">For directions, enter your address</label><br /><input type="text" name="saddr" id="saddr" value="'
				+ givenaddr
				+'" onfocus="if (this.value==this.defaultValue) {this.value=\'\'};" onblur="if (this.value==\'\') {this.value=this.defaultValue} else { mapMaker.setCookie(\'useraddr\',this.value,365) };" /><input type="submit" value="Go"><input type="hidden" name="daddr" value="'
				+ addr
				+ '" /><input type="hidden" name="hl" value="en" /></form><p>[<a href="http://maps.google.com/maps?oi=map&z=5&f=d&q='
				+ addr
				+ '" target="_blank">Large map</a>]'+menuStr+'</p></div>';

			//Create the marker
			createMarker(point, html);
			
			//Add a menu icon if needed (also a marker)
			if(menu) createMarker(point, html, menu);
		}
		
		
		//Set zoom and center based on points in "bounds"
		map.setZoom(map.getBoundsZoomLevel(bounds));
		var clat = (bounds.getNorthEast().lat() + bounds.getSouthWest().lat()) /2;
		var clng = (bounds.getNorthEast().lng() + bounds.getSouthWest().lng()) /2;
		map.setCenter(new GLatLng(clat,clng));
	}
	
	//Draw marker and add to map
	function createMarker(point, html, menu) {
		var icon = new GIcon();
		icon.image = menu?"../../mapall/markerm.png":markurl;
		icon.shadow = menu?"":"http://www.google.com/intl/en_ALL/mapfiles/shadow50.png";
		icon.iconSize = new GSize(20, 34);
		icon.shadowSize = new GSize(37, 34);
		icon.iconAnchor = new GPoint(9, 34);    
		icon.infoWindowAnchor = new GPoint(9, 34);

		var marker = new GMarker(point, icon);
		marker.loc = point;
		marker.html = html;
	
		GEvent.addListener(marker, "click", function() {
			marker.openInfoWindowHtml(html);
		});
			
		if(!menu) markers.push(marker);
		
		map.addOverlay(marker);
	}
	
	//Fix address if needed
	function fixAddr(addr) {
		if (addr.substring(addr.length-2).toUpperCase().search(/NC/) == -1) 
		{addr += ", NC" }
		return addr;
	}
	
	function getCookie(c_name) {
		if (document.cookie.length>0) { 
			var c_start = document.cookie.indexOf(c_name + "=");
			if (c_start!=-1) { 
				c_start=c_start + c_name.length+1;
				c_end=document.cookie.indexOf(";",c_start);
				if (c_end==-1) c_end=document.cookie.length;
				return unescape(document.cookie.substring(c_start,c_end));
			} 
		}
		return null;
	}
	
	return {

		//Public methods:
		toggleMap:function(openmap,marknum) {
			var mapDiv = document.getElementById('map');
			//var mapSub = document.getElementById('mapsub');
			if (openmap || mapDiv.style.display != 'block') {
				mapDiv.style.display='block';
				//mapSub.style.display='inline';	
				
				if(map == null)	initMap();
				
				//show popup based on item
				if(marknum) {
					var item = markers[marknum];
					map.openInfoWindowHtml(item.loc, item.html);
				}
				
			} else {
				mapDiv.style.display='none';
				//mapSub.style.display='none';
			}
			return true;
		},
		
		setLinks:function() {
		
			if(!document.getElementById('maplink')) {
				return;
			}
		
			var link = document.getElementById('maplink');
			link.style.display = 'block';
			link.onclick = function() {
				mapMaker.toggleMap();
			}
			
			var self = this;
            var anchors = document.getElementsByTagName("a");
            var size = anchors.length;

			var k = 0;
			for (var i=0;i<size;i++) {
				if (anchors[i].innerHTML == "Map") {

					var maplink = anchors[i];
					maplink.setAttribute('href','#top');
					maplink.setAttribute('target','');	
					attachEvent(maplink,k);
					k++;
				} 
			}
		},
		
		setCookie:function(c_name,value,expiredays) {
			givenaddr = value;
			var exdate=new Date();
			exdate.setDate(expiredays);
			document.cookie=c_name+ "=" +escape(value)+((expiredays==null) ? "" : "; expires="+exdate);
		}
	}
}();

function getElementsByClassName(searchClass,node,tag) {
	if(document.getElementsByClassName) {
		return node.getElementsByClassName(searchClass);
	} else {
		var classElements = new Array();
		if ( node == null )	node = document;
		if ( tag == null ) tag = '*';
		var els = node.getElementsByTagName(tag);
		var elsLen = els.length;
		var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
		for (var i = 0, j = 0; i < elsLen; i++) {
			if ( pattern.test(els[i].className) ) {
				classElements[j] = els[i];
				j++;
			}
		}
		return classElements;
	}
}


// Dean Edwards/Matthias Miller/John Resig

function init() {
  // quit if this function has already been called
  if (arguments.callee.done) return;

  // flag this function so we don't do the same thing twice
  arguments.callee.done = true;

  // kill the timer
  if (_timer) clearInterval(_timer);

  mapMaker.setLinks();
};

/* for Mozilla/Opera9 */
if (document.addEventListener) {
  document.addEventListener("DOMContentLoaded", init, false);
}

/* for Internet Explorer */
/*@cc_on @*/
/*@if (@_win32)
  document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
  var script = document.getElementById("__ie_onload");
  script.onreadystatechange = function() {
    if (this.readyState == "complete") {
      init(); // call the onload handler
    }
  };
/*@end @*/

/* for Safari */
if (/WebKit/i.test(navigator.userAgent)) { // sniff
  var _timer = setInterval(function() {
    if (/loaded|complete/.test(document.readyState)) {
      init(); // call the onload handler
    }
  }, 10);
}

/* for other browsers */
window.onload = init;

