/**
 * @author Marco Alionso Ramirez, marco@onemarco.com
 * @url http://onemarco.com
 * @version 1.0
 * This code is public domain
 */
var coder;
var icon;
var map = null;
var ginput;

//load and unload the map
GEvent.addDomListener(window,'load',loadGeoCoder);
GEvent.addDomListener(window,'unload',GUnload);

//check for google maps compatibility, if so, load xml
function loadGeoCoder(){
	if(!GBrowserIsCompatible()){
		alert('Sorry, the Google Maps API is not compatible with this browser.');
		return;
	}else{
		//createMap();
	}
}

//create map icon and sidebar
function createMap(){
	
	map = new GMap2(document.getElementById('map_canvas'));
	map.setCenter(new GLatLng(53.7978477,-1.5461347),13);
	map.addControl(new GMapTypeControl());
	map.addControl(new GLargeMapControl());
	
	/*
	var icon = new GIcon();
	icon.image = "/images/marker.png";
	icon.shadow = "/images/marker_shadow.png";
	icon.iconSize = new GSize(20, 26);
	icon.shadowSize = new GSize(32, 28);
	icon.iconAnchor = new GPoint(10, 25);
	icon.infoWindowAnchor = new GPoint(10, 0);
	icon.infoShadowAnchor = new GPoint(25, 7);
	*/
	icon = G_DEFAULT_ICON;
	
	/*var sidebarList = document.getElementById('historyItems');
	var addressForm = document.getElementById('addressForm');
	var markerForm = document.getElementById('markerForm');*/
	coder = new GClientGeocoder();
	/*
	GEvent.addDomListener(addressForm,'submit', function(evt){
		evt = standardizeEvent(evt);
		evt.preventDefault();
		getCoordinates.call(map,addressForm,coder,icon,sidebarList);
	});
	
	GEvent.addDomListener(markerForm,'submit', function(evt){
		evt = standardizeEvent(evt);
		evt.preventDefault();
		createDraggableMarker.call(map,markerForm,icon,sidebarList);
	})*/

    if ( typeof(loadmarks) == 'function' ) {
       loadmarks();
    }
}

//request coordinates
function getCoordinates(marklist,coder,icon){

//alert(marklist);

	//var map = this;
	var cb = function(response){
		processCoordinates.call(map,response,icon);
	}
	if(1 > 0){
		var inputs = marklist.split(';');
		for(var i in inputs){
		alert(inputs[i]);
		    ginput = inputs[i];
			coder.getLocations(inputs[i],cb);
		}
	}else{
		coder.getLocations(form.addressInput.value,cb);
	}
	//coder.getLocations(form.addressInput.value,cb);
}
var x = '';

//process coordinates
function processCoordinates(locations,icon){
	
	for(var i = 0; i < 1;i++ ) { //locations.Placemark.length; i++){
	alert('got it !!');
		createMarker.call(this,locations,locations.Placemark[i],icon);
	}
}

//create a draggable marker
function createDraggableMarker(form,icon){
	var name = /^\s*$/.test(form.markerInput.value) ? '[unnamed]' : form.markerInput.value;
	var coords = this.getCenter();
	var placemark =
		{Point:
			{coordinates:[coords.lng(),coords.lat()]},
		address:name};
	createMarker.call(this,{name:name},placemark,icon,list,true);
}

//create the marker
function createMarker(locations,placemark,icon,draggable){
	var lat = placemark.Point.coordinates[1];
	var lng = placemark.Point.coordinates[0];
	
	var opts = draggable ? {draggable:true,icon:icon} : {icon:icon};
	var marker = new GMarker(new GLatLng(lat,lng),opts);
	marker.tooltip = new Tooltip(marker,lat + ', ' + lng,5);
	createTab(marker,placemark.address,lat,lng,draggable);
	marker.isInfoWindowOpen = false;
	
	
	/*var ttmover = GEvent.callbackArgs(marker,tooltipMouseover,sidebarLink);
	var ttmout = GEvent.callbackArgs(marker,tooltipMouseout,sidebarLink);
	var mclick = GEvent.callback(marker,markerClick);
	
	GEvent.addDomListener(sidebarLink,'mouseover',ttmover);
	GEvent.addDomListener(sidebarLink,'mouseout',ttmout);
	GEvent.addDomListener(sidebarLink,'click',mclick);*/	
//	GEvent.addListener(marker,'mouseover',ttmover);
//	GEvent.addListener(marker,'mouseout',ttmout);
//	GEvent.addListener(marker,'click',mclick);
//	GEvent.addListener(marker,'infowindowopen',GEvent.callbackArgs(marker,infoWindowOpen,sidebarLink));
//	GEvent.addListener(marker,'infowindowclose',GEvent.callbackArgs(marker,infoWindowClose,sidebarLink));
//	if(draggable){
//		GEvent.addListener(marker,'dragstart',GEvent.callbackArgs(marker,markerDragStart,this,sidebarLink));
	//	GEvent.addListener(marker,'dragend',GEvent.callbackArgs(marker,markerDragged,sidebarLink.getElementsByTagName('span')[0]));
	//}
	
	Info = placemark.address;
	
	var xi = ginput;
	

	
    GEvent.addListener(marker, "click", function() {
        marker.openInfoWindowHtml(xi);
    });

	map.addOverlay(marker);	
	//map.addOverlay(marker.tooltip);
	map.setCenter(marker.getPoint());
	
	return marker;
}

//create the tab(s) for the GInfoWindow
function createTab(marker,address,lat,lng){
	var element = jsonToDom(
		{el:'div',att:{Class:'googleMarkerTab'},ch:[
			{el:'div',att:{Class:'address'},ch:[
				{txt:address}
			]},
			{el:'input',att:{Class:'coordinates',readOnly:'readonly',value:lat + ', ' + lng}
			}
		]});
	marker.tab = [new GInfoWindowTab('Address',element)];
	marker.coords = element.getElementsByTagName('input')[0];
}

//makrer,sidebar mouseover handler
function tooltipMouseover(sidebarLink){
	if(!(this.isInfoWindowOpen) && !(this.isHidden())){
		this.tooltip.show();
		if(sidebarLink) addClassToElement(sidebarLink,'hover');
	}
}

//marker,sidebar mouseout handler
function tooltipMouseout(sidebarLink){
	this.tooltip.hide();
	if(sidebarLink) removeClassFromElement(sidebarLink,'hover');
}

//marker click handler
function markerClick(){
	this.tooltip.hide();
	this.openInfoWindowTabs(this.tab);
}

//infowindowopen handler
function infoWindowOpen(sidebarLink){
	this.isInfoWindowOpen = true;
	removeClassFromElement(sidebarLink,'hover');
	addClassToElement(sidebarLink,'active');	
}

//infowindowclose handler
function infoWindowClose(sidebarLink){
	this.isInfoWindowOpen = false;
	removeClassFromElement(sidebarLink,'active');
}

//clear tooltip,infowindow when marker is dragged
function markerDragStart(map,sidebarLink){
	removeClassFromElement(sidebarLink,'hover');
	map.closeInfoWindow();
	this.tooltip.hide();
}

//update coordinates after marker has been dragged
function markerDragged(geocode){
	var coords = this.getPoint();
	clearChildren(this.tooltip.div_);
	this.tooltip.div_.appendChild(document.createTextNode(
		coords.lat() + ', ' + coords.lng()));
	this.tooltip.redraw(true);
	this.coords.value = coords.lat() + ', ' + coords.lng(); 
	clearChildren(geocode);
	geocode.appendChild(document.createTextNode('(' + coords.lat() + ', ' + coords.lng() + ')'));
}
