/*funciones utiles*/
Function.prototype.bindAsEventListener=function(object){var __method=this,args=$A(arguments),object=args.shift();return function(event){return __method.apply(object,[(event||window.event)].concat(args).concat($A(arguments)));}}
var $A=Array.from=function(iterable){if(!iterable)return [];if(iterable.toArray){return iterable.toArray();}else{var results=[];for(var i=0,length=iterable.length;i<length;i++)results.push(iterable[i]);return results;}}
function stopevent(event){ if(event.preventDefault){event.preventDefault();event.stopPropagation();}else{event.returnValue=false;event.cancelBubble=true;}}
function	_addlistener(obj,evt,func){try{if(obj.attachEvent){obj.attachEvent('on'+evt,func);}else{if(obj.addEventListener){obj.addEventListener(evt,func,false);}else{if(obj.eval){obj["on"+evt]=func;}else{}}}}catch(e){alert("js:"+e.message);}}
function ajaxget(url, func){if(window.XMLHttpRequest){ajax=new XMLHttpRequest();}else if(window.ActiveXObject){try{ajax=new ActiveXObject("Msxml2.XMLHTTP");}catch(e){try{ajax=new ActiveXObject("Microsoft.XMLHTTP");}catch(e){}}};ajax.open("get",url,true);ajax.onreadystatechange = function(){if(ajax.readyState==4){if(ajax.status==200){var contenttype=ajax.getResponseHeader('Content-Type');if(contenttype.indexOf('xml')>-1){func(ajax.responseXML);}else{func(ajax.responseText);}}else{func('Error: '+httpObj.status);}}};ajax.send(null);}

//http://www.google.com/apis/maps/documentation/reference.html

var googlemaps= {
	key:undefined,
	version:"2.81",
	mode:'normal',
	datafile:undefined,
	layer:undefined,
	wheelscroll:true,
	controlstyle:"large",
	scale:false,
	lang:"es",
	minimap:[100,60],
	maptype:1,
	maptypecontrol:false,


/*---------------------------------------------*/
	currentplace:undefined,	placedb:new Array(),	googlemapobj:undefined,
	directions:undefined, directionsPanel:undefined,state:true,marker:false,active:false,poly:undefined,bounds:undefined,p_from:undefined,p_to:undefined,newHandle:undefined,

	init:function()
	{	try
		{	if(!this.key) { throw new Error("googlemaps key not found"); }
			if(!this.layer) { this.layer=document.getElementById('map'); if(!this.layer) throw new Error("layer googlemaps not found"); }
			if(this.mode=='normal')
			{	document.write('<script type="text/javascript" src="http://maps.google.com/maps?file=api&amp;hl='+this.lang+'&amp;oe=utf-8&amp;v='+this.version+'&amp;key='+this.key+'"></script>');
			}
			else throw("mode not found");
			_addlistener(window,"load",this.onload.bindAsEventListener(this));
			_addlistener(window,"unload",this.onunload.bindAsEventListener(this));
		} catch(e){alert("js:"+e.message);}
	},

	onunload:function() { GUnload(); },
	onload:function()
	{  try
		{	if(this.mode=='normal')
			{	if(!GBrowserIsCompatible()) throw new Error("browser not compatible with googlemaps api");
				if(!(this.googlemapobj=new GMap2(this.layer))) throw new Error("cannot create googlemap");
				if(this.datafile){ ajaxget(this.datafile,this.processdatafile.bindAsEventListener(this)); }
				else this.draw();

				//if(!this.directions) { this.directions = new GDirections(this.googlemapobj, this.directionsPanel); }
				if(!this.directions) { this.directions = new GDirections(null, this.directionsPanel); }
				if(!this.bounds) { this.bounds = new GLatLngBounds(); }

				TextualZoomControl = function() {};
				TextualZoomControl.prototype = new GControl();
				TextualZoomControl.prototype.initialize = function(){
					var container = document.createElement("div");

					var zoomInDiv = document.createElement("div");
			      this.setButtonStyle_(zoomInDiv);
			      container.appendChild(zoomInDiv);
			      zoomInDiv.appendChild(document.createTextNode("Ruta desde aqui"));
			      GEvent.addDomListener(zoomInDiv, "click", function(e) {
						var pos = googlemaps.getRelPos_(e);
						var x = pos.left - googlemaps.layer.offsetLeft;
						var y = pos.top - googlemaps.layer.offsetTop;
						var newPixel = new GPoint(x, y);
						var newLatLng = googlemaps.googlemapobj.fromContainerPixelToLatLng(newPixel);
						//alert(x+","+y+"-"+newPixel+"-"+newLatLng);
						GEvent.trigger(googlemaps.googlemapobj, "dblclick", newPixel, newLatLng);
						document.getElementById("custommenu").style.display = "none";
			      });

			      /*var zoomOutDiv = document.createElement("div");
			      this.setButtonStyle_(zoomOutDiv);
			      container.appendChild(zoomOutDiv);
			      zoomOutDiv.appendChild(document.createTextNode("Zoom Out"));
			      GEvent.addDomListener(zoomOutDiv, "click", function() {
			        googlemaps.googlemapobj.zoomOut();
			      });*/

			      googlemaps.googlemapobj.getContainer().appendChild(container);
					this.setLayerId_(container);
					this.setLayerStyle_();
					return container;
				}
            /*
				TextualZoomControl.prototype.getDefaultPosition = function() {
					return new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(7, 7));
				} */

				TextualZoomControl.prototype.setLayerId_ = function(button) {
					button.id = "custommenu";
               button.style.position = "relative";
				}
				TextualZoomControl.prototype.resetLayerStyle_ = function() {
					document.getElementById("custommenu").style.display = "";
					//container.style.display = "";
				}
				TextualZoomControl.prototype.setLayerStyle_ = function() {
					document.getElementById("custommenu").style.display = "none";
					//container.style.display = "none";
				}

				TextualZoomControl.prototype.setButtonStyle_ = function(button) {
					button.style.textDecoration = "underline";
					button.style.color = "#0000cc";
					button.style.backgroundColor = "white";
					button.style.font = "small Arial";
					button.style.border = "1px solid black";
					button.style.padding = "2px";
					button.style.marginBottom = "3px";
					button.style.textAlign = "center";
					button.style.width = "6em";
					button.style.cursor = "pointer";
				}

            this.googlemapobj.addControl(new TextualZoomControl());

				/*this.newHandle = GEvent.addListener(this.googlemapobj, "singlerightclick", function(overlay,point) {
					//alert(point.x+","+point.y+"-"+overlay.x+","+overlay.y);
					var x = overlay.x;
					var y = overlay.y;
               var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(x,y));
					var container = document.getElementById("custommenu");
					container.style.display = "";
					pos.apply(container);
				});
				GEvent.addListener(this.googlemapobj, "click", function(overlay,point) {
					//alert(point.x+","+point.y+"-"+overlay.x+","+overlay.y);
					var container = document.getElementById("custommenu");
					container.style.display = "none";
				});
				GEvent.addListener(this.googlemapobj, "dblclick", function(overlay,point) {
					//alert("addListener:"+point);
					//if (point && googlemaps.state) {googlemaps.doStart(point); googlemaps.state = false}
					if (point) {googlemaps.doStart(point); }
				});*/
         	GEvent.addListener(this.directions, "load", function() {
      		  if (googlemaps.poly) googlemaps.googlemapobj.removeOverlay(googlemaps.poly);
		        googlemaps.poly = googlemaps.directions.getPolyline();
      		  googlemaps.googlemapobj.addOverlay(googlemaps.poly);
		      });
			}
		} catch(e){alert("js:"+e.message);}
	},

	processdatafile:function(xml)
	{	try
		{  places=xml.documentElement.getElementsByTagName("place");
			for(var i=0;i<places.length;i++)
			{	id=places[i].getAttribute("id");
				lat=parseFloat(places[i].getAttribute("lat"));
				lon=parseFloat(places[i].getAttribute("lon"));
				if(places[i].getAttribute("zoom")) zoom=parseFloat(places[i].getAttribute("zoom"));	else zoom=null;
				if(places[i].getAttribute("ico")) ico=places[i].getAttribute("ico");	else ico=null;
				if(places[i].firstChild)  msg=places[i].firstChild.data; else msg=null;
				this.addplace(id,lat,lon,zoom,msg,ico);
			}
		} catch(e){alert("processdatafile js:"+e.message);}
		this.draw();
	},


	draw:function()
	{ 	try
		{	if(this.placedb.length<=0) throw new Error("sin datos para representar.");

			if(this.scale) this.googlemapobj.addControl(new GScaleControl());
			if(this.controlstyle=="small") this.googlemapobj.addControl(new GSmallMapControl()); else this.googlemapobj.addControl(new GLargeMapControl());
			if(this.maptypecontrol) this.googlemapobj.addControl(new GMapTypeControl());
			if(this.minimap) this.googlemapobj.addControl(new GOverviewMapControl(new GSize(this.minimap[0],this.minimap[1])));
			this.googlemapobj.enableContinuousZoom();
			if(this.wheelscroll) this.googlemapobj.enableScrollWheelZoom();
			this.moveto(0);

			for(i=0;i<this.placedb.length;i++)
			{	if(this.placedb[i][4]!=null)
				{	this.addmarker(this.placedb[i]); /*this.googlemapobj.addOverlay(new GMarker(new GLatLng(this.placedb[i][1],this.placedb[i][2])));*/
				}

			}
			switch(this.maptype)
			{	case 1:this.googlemapobj.setMapType(G_NORMAL_MAP);break;
				case 2:this.googlemapobj.setMapType(G_SATELLITE_MAP);break;
				case 3:this.googlemapobj.setMapType(G_HYBRID_MAP);break;
			}
		} catch(e){alert("js:"+e.message);}
	},


	addplace:function(id,lat,lon,zoom,msg,ico) { this.placedb.push(new Array(id,lat,lon,zoom,msg,ico)); if(!this.currentplace) this.currentplace=0; },
	movetoid:function(id){index=-1;for(i=0;i<this.placedb.length;i++)if(this.placedb[i][0]==id) {index=i;break;}else {/*alert(this.placedb[i][0]+" "+id);*/} /*alert(index);*/if(index<0) return; this.moveto(index); },
	moveto:function(index){this.currentplace=index; this.googlemapobj.setCenter(new GLatLng(this.placedb[index][1],	this.placedb[index][2]), this.placedb[index][3]); },
	addmarker:function(item)
	{	var point=new GLatLng(item[1],item[2]);	msg=item[4];
		if(item[5])
		{	var icon = new GIcon();
			if(item[5].indexOf(';')!=-1) //viene con tamaño
			{	var part=new Array(); part=item[5].split(";");	icon.image=part[1];
				if(part[0].indexOf('x')) { var size=new Array(); size=part[0].split("x");
				icon.iconSize = new GSize(parseFloat(size[0]), parseFloat(size[1]));
				icon.iconAnchor = new GPoint(parseFloat(size[0])/2, parseFloat(size[1])  );
				icon.infoWindowAnchor = new GPoint(parseFloat(size[0])/2,parseFloat(size[1])/2 ); }
			}
			else icon.image=item[5];
			var marker=new GMarker(point,icon);
		}
		else var marker=new GMarker(point);

		if(item[4])
		{	GEvent.addListener(marker,"load",function(){marker.openInfoWindowHtml(""+item[4]+"");});
			GEvent.addListener(marker,"click",function(){marker.openInfoWindowHtml(""+item[4]+"");});
		}

		this.googlemapobj.addOverlay(marker);
	},
	calculateroute:function(from, to){
		//var directions;
		//var directionsPanel;

     	GEvent.addListener(this.directions, "error", function() {
			var code = this.directions.getStatus().code;
			alert("Error al obtener las direcciones, "+code);
      });

      var geocoder = new GClientGeocoder();
      geocoder.getLatLng(from,
			function(point) {
		      if (point){
  					googlemaps.bounds.extend(point);
               googlemaps.googlemapobj.setZoom(googlemaps.googlemapobj.getBoundsZoomLevel(googlemaps.bounds));
			      googlemaps.googlemapobj.setCenter(googlemaps.bounds.getCenter());
				}
			}
		);
      geocoder.getLatLng(to,
			function(point) {
		      if (point){
					googlemaps.bounds.extend(point);
               googlemaps.googlemapobj.setZoom(googlemaps.googlemapobj.getBoundsZoomLevel(googlemaps.bounds));
			      googlemaps.googlemapobj.setCenter(googlemaps.bounds.getCenter());
				}
			}
		);

		//Comprobar si está la marca y si no llama a doStart.
      /*
		if(!this.marker)
			geocoder.getLatLng(from,function(point) {googlemaps.doStart(point);});
		else
			geocoder.getLatLng(from,function(point) {googlemaps.marker.setPoint(point);});
		*/
		geocoder.getLatLng(from,function(point) {googlemaps.doStart(point);});

		//geocoder.getLatLng(from,function(point) {GEvent.trigger(googlemaps.googlemapobj, "dblclick", point, point);});
		//GEvent.trigger(googlemaps.googlemapobj, "dblclick", newPixel, newLatLng);

		this.directions.load("from: "+from+" to: "+to+"", { "locale": "es_ES", getPolyline:true });
	},
	doStart:function (point) {
		var icon1 = G_START_ICON;
		//alert("#:"+this.marker);
		if(this.marker)
			this.marker.setPoint(point)
		else
	      this.createMarker(point,icon1);
		document.getElementById('saddr').value=point;
		//Eliminar el escuchador
		//GEvent.removeListener(this.newHandle);
	},
   createMarker:function (point,icon) {
   	this.marker = new GMarker(point, {draggable:true,icon:icon});
   	//gmarkers[i]=marker;
   	GEvent.addListener(this.marker, "dragend", function() {
			document.getElementById('saddr').value=googlemaps.marker.getPoint();
   	});
   	this.googlemapobj.addOverlay(this.marker);
	},

	swapMarkers:function () {
		var icon1 = G_START_ICON;
		this.googlemapobj.removeOverlay(this.marker);
   	this.createMarker(this.marker.getPoint(),icon1);
   },
	getRelPos_:function(e){
		var posX = 0;
		var posY = 0;
		if (!e) var e = window.event;
		if (e.pageX || e.pageY) {
		  posX = e.pageX;
		  posY = e.pageY;
		} else if (e.clientX || e.clientY){
		  posX = e.clientX +
		    (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
		  posY = e.clientY +
		    (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
		}
		return {left: posX, top: posY};
	}

};

	//googlemaps.init();

