//Created by Kay 17/01/08 to allow for the use of google maps to open in a thickbox.

//Add the event fAddEvent on the window load
//fAddEvent(window, "unload", GUnload);

//Create the event which adds an event listener to the window
function fAddEvent(obj, evType, fn){ if(obj.addEventListener){ obj.addEventListener(evType, fn, false); return true; } else if(obj.attachEvent){ var r = obj.attachEvent("on"+evType, fn); return r; } else return false; }
 
var LatLng = "";

function fGetElementsByClassName(clsName) {
	//loop through each element within the document
	var my_array = document.getElementsByTagName("*");
	var retvalue = new Array();
	var i;
	var j;
	for (i=0,j=0;i<my_array.length;i++) {
		//if the classname is equal to the classname your searching for then add the
		//element to the array
		if (my_array[i].className.indexOf(clsName)!= -1) {
			retvalue[j++] = my_array[i];
		}
	}
	return retvalue;
}
 
function fGetLatLng(postcode){	
	var geocoder = new GClientGeocoder();
	if (geocoder) {
		geocoder.getLatLng(
		postcode,
		function(point) {
			if (!point) {
			  alert(postcode + " not found");
			} else {	
			  LatLng = point;
			  return point;
			}
		}
		);
	}
}

//Code added to add the lightbox - This is the code that is used for the link to the lightbox google map only

// Copyright 2007 - Michael Uyttersprot / eMich.be
// v0.1b - 07.03.01

var gmlb_width=640;
var gmlb_height=480;
var gmOverlay;
var gmContainer;
var gmMap;
var gmLabel;
var gmMapObject = null;
var gm_zoom;
var gm_mapType;
var gm_close;
var gm_marker = null;

function gmLb_init(){	
	
	var linksArr=document.getElementsByTagName("a");
	for(i = 0;i<linksArr.length;i++){
		if(linksArr[i].getAttribute("rel")=="gmap"){
			gmLbAddClickEvent(linksArr[i],function(){gm_ShowMap(this);return false;});
		}
	}

	gmOverlay = document.createElement("div");
	gmOverlay.setAttribute("id","gmlb_overlay");
	gmOverlay.style.display="none";
	gmOverlay.style.position=document.all?"absolute":"fixed";
	gmOverlay.style.top="0px";
	gmOverlay.style.left="0px";
	
	gmOverlay.style.width=gmlb_width+"px";
	gmOverlay.style.height=gmlb_height+"px";
	gmOverlay.style.width = getFrameWidth();
	gmOverlay.style.height = getFrameHeight();

	gmContainer = document.createElement("div");
	gmContainer.setAttribute("id","gmlb_container");
	gmContainer.style.width=gmlb_width+"px";
	gmContainer.style.position="absolute";
	gmContainer.style.display="inline";

	gmLabel = document.createElement("div");
	gmLabel.setAttribute("id","gmlb_label");
	gmLabel.setAttribute("class","gmlb_label");
	gmLabel.style.display="block";
	gmLabel.innerHTML="test";

	gmClose = document.createElement("div");
	gmClose.setAttribute("id","gmlb_close");
	gmClose.setAttribute("class","gmlb_close");
	gmClose.style.display="block";
	gmClose.onclick=function(){gmOverlay.style.display='none';gmLbOnClose();};

	gmMap = document.createElement("div");
	gmMap.setAttribute("id","gmlb_map");
	gmMap.style.width=gmlb_width+"px";
	gmMap.style.height=gmlb_height+"px";
	gmMap.style.display="block";
	gmMap.style.float="left";
	gmMap.onclick=function(){return false;};
	
	gmContainer.appendChild(gmMap);
	gmContainer.appendChild(gmLabel);
	gmContainer.appendChild(gmClose);
	gmOverlay.appendChild(gmContainer);
	document.documentElement.ownerDocument.body.appendChild(gmOverlay);
}

function gm_ShowMap(obj){
	
	if(document.all){
		gmOverlay.style.top = getScrollHeight()+"px";
		gmOverlay.style.left = getScrollWidth()+"px";
	}
	gmOverlay.style.width=getFrameWidth()+"px";
	gmOverlay.style.height=getFrameHeight()+"px";

	if(obj.title){
		gmLabel.innerHTML=obj.title;
	}
	else{
		gmLabel.innerHTML="Google Map";
	}

	gmContainer.style.visibility="hidden";
	document.getElementById("gmlb_overlay").style.display="";
	gmContainer.style.left=((getFrameWidth()-gmContainer.offsetWidth)/2)+"px";
	gmContainer.style.top=((getFrameHeight()-gmContainer.offsetHeight)/2)+"px";
	gmContainer.style.visibility="";
	var params = parseGmapLink(obj.href);
	
	gm_setMap(params);
	gmLbOnShow();
}

function gmLbOnShow(){
	;
}

function gmLbOnClose(){
	;
}

function getFrameWidth(){
	if (self.innerWidth)
	{
		return self.innerWidth;
	}
	else if (document.documentElement && document.documentElement.clientWidth)
	{
		return document.documentElement.clientWidth;
	}
	else if (document.body)
	{
		return document.body.clientWidth;
	}
	else return;
}

function getFrameHeight(){
	if (self.innerWidth)
	{
		return self.innerHeight;
	}
	else if (document.documentElement && document.documentElement.clientWidth)
	{
		return document.documentElement.clientHeight;
	}
	else if (document.body)
	{
		return document.body.clientHeight;
	}
	else return;
}

function getScrollWidth()
{
   var w = window.pageXOffset ||
           document.body.scrollLeft ||
           document.documentElement.scrollLeft;
           
   return w ? w : 0;
}

function getScrollHeight()
{
   var h = window.pageYOffset ||
           document.body.scrollTop ||
           document.documentElement.scrollTop;
           
   return h ? h : 0;
}

function gm_setMap(params) {
	
	if (GBrowserIsCompatible()) {
		if(!gmMapObject)
		{
			gmMapObject = new GMap2(gmMap);
			gmMapObject.addControl(new GLargeMapControl());
			gmMapObject.addControl(new GMapTypeControl());
		}
		
		gm_mapType=G_NORMAL_MAP;
		gm_zoom=10;
		if(params["t"]=="k"){gm_mapType=G_SATELLITE_MAP;gm_zoom=parseInt(params["z"]); }
		else if(params["t"]=="" || params["t"]==null){gm_mapType=G_NORMAL_MAP;gm_zoom=parseInt(params["z"]);}
		else if(params["t"]=="h"){gm_mapType=G_HYBRID_MAP;gm_zoom=parseInt(params["z"]);}

		if(params["lat"]==null && params["long"]==null && params["q"]!=null && params["q"].indexOf("http://")==-1){
						
			  var geocoder = new GClientGeocoder();
              var postcode = unescape(params["q"].replace(/\+/g,  " "));
			  geocoder.getLatLng(
				postcode,
				function(point){
					gmMapObject.setCenter(LatLng, gm_zoom,gm_mapType);
					gm_addMarker(LatLng, postcode);					
				}
			  );
		}
		else if(params["q"]!=null && params["q"].indexOf('http://')!=-1){			
		}
		else{				
			var postcode = unescape(params["q"].replace(/\+/g,  " "));
			var point = new GLatLng(LatLng);
			gmMapObject.setCenter(point, gm_zoom,gm_mapType);
			gm_addMarker(point, postcode);
		}
	}
}

function gm_addMarker(point, postcode){
	if(gm_marker!=null){gmMapObject.removeOverlay(gm_marker);}	
	gm_marker = new GMarker(point);	
	gmMapObject.addOverlay(gm_marker);	
	
	var address = fCreateAddress(postcode);
	
	if(address!=""){
		gm_marker.openInfoWindowHtml(address);
	}
}

function fCreateAddress(postcode){
	var name = "";
	var address = "";	
	var uri = "";
	var colAddress = "";
	
	//find the element that has the post-code
	var colPostCodes =  fGetElementsByClassName("postal-code")
	var elem = ""; 

	//loop through the postcode elements
	var i;
	for(i=0;i<colPostCodes.length;i++){
		if(colPostCodes[i].innerHTML == postcode){
			
			elem=colPostCodes[i];	
		}
	}
	
	// adrElem should always be the element that contains the adr class and the parent of all the address nodes such as postal code.
	var adrElem = elem.parentNode.parentNode;	

	
	//get the vcard root element which should always be the parent of the adr element	
	var vCardElem = adrElem.parentNode;
	
	if(vCardElem.className.indexOf("vcard")!=-1){
		colAddress = vCardElem.getElementsByTagName("*");	
		
		//we should now have all the vcard children nodes, loop through them and get all the bits of the address you want
		for (i=0;i<colAddress.length;i++) {
			if(colAddress[i].className.indexOf("postal-code")!=-1 || colAddress[i].className.indexOf("street-address")!=-1 || colAddress[i].className.indexOf("locality")!=-1){
				if (address==""){
					address = colAddress[i].innerHTML;
				}else {
					address = address + ", " + colAddress[i].innerHTML;
				}
			}else if(colAddress[i].className.indexOf("uri")!=-1){
				uri = "<p class=\"text\"><a href='" + colAddress[i].innerHTML + "'>" + colAddress[i].innerHTML + "</a></p>"
			}else if(colAddress[i].className.indexOf("fn")!=-1){
				if (colAddress[i].innerHTML.indexOf("strong")!=-1 || colAddress[i].innerHTML.indexOf("b")!=-1){
				    name = colAddress[i].innerHTML				
				}else{
				    name = "<strong>" + colAddress[i].innerHTML + "</strong>"
				}							
			}
		};
		
		//now populate the whole address to go in the popup
		address = "<p class=\"text\">" + name + "<\p>" + "<p class=\"text\">" + address + "<\p>" + uri		
	}
		
		return address;
	
}


function gm_addXMLMarker(geoxml){
	if(gm_marker!=null){gmMapObject.removeOverlay(gm_marker);}
	gm_marker = geoxml;
	gmMapObject.addOverlay(gm_marker);
}

function parseGmapLink(url){
	
	var parts = url.split("?");
	if(parts.length<2)return new Array();
	var params = parts[1].split("&");
	var gMapParams=new Array();
	for(i = 0 ; i < params.length ; i++){
		keyValue=params[i].split("=");
		if(keyValue[0]=="q"){	
			var postcode = keyValue[1];				
			fGetLatLng(postcode);
			gMapParams["postcode"] = postcode;
		}
		
		if(keyValue[0]!="ll"){
			gMapParams[keyValue[0]]=keyValue[1];
		}
		else{
			var latlong=keyValue[1].split(",");
			gMapParams["lat"]=latlong[0];
			gMapParams["long"]=latlong[1];
		}
	}
	return gMapParams;
}

function gmSetCenter(point){
	document["gmCenter"]=point;
}

function gmLbAddLoadEvent(func) {
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	}
	else {
		window.onload = function() {
			oldonload();
			func();
		}
	}
}

function gmLbAddClickEvent(obj,func) {
	var oldonclick = obj.onclick;
	if (typeof obj.onclick != 'function') {
		obj.onclick = func;
	}
	else {
		obj.onclick = function() {
			oldonclick();
			func();
		}
	}
}

gmLbAddLoadEvent(gmLb_init);