//Globals
var geocoder = null;
var mgr = null;
var map;
var statsList;
var globSettings;

//Check if we are using IE. 
try { 
	//If the Javascript version is greater than 5. 
	xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); 
	//alert ("You are using Microsoft Internet Explorer."); 
	} catch (e) { 
	//If not, then use the older active x object. 
	try { 
		//If we are using Internet Explorer. 
		xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
		//alert ("You are using Microsoft Internet Explorer"); 
	} catch (E) { 
		//Else we must be using a non-IE browser. 
		xmlhttp = false; 
	} 
} 

//If we are using a non-IE browser, create a javascript instance of the object. 
if (!xmlhttp && typeof XMLHttpRequest != 'undefined') { 
	xmlhttp = new XMLHttpRequest(); 
	//alert ("You are not using Microsoft Internet Explorer"); 
} 

function statSettings(lang)
// Lang: 1-Spanish, 2-English, 3-Catalan
{
if (lang == undefined) { this.lang = 1; }
else { this.lang = lang; }
}

statSettings.prototype.setLanguage = function(lang)
{
	this.lang  = lang;
}


function topStation(type,rank,html)
{
	this.type = type;
	this.rank=rank;
	this.html = html;
}

function addMarkerStation(date,station,cache,view, reload) { 

	if (typeof reload == 'undefined' ) reload = false;

	
	//GLog.write("date:"+ date+" Loading data "+ station+ " cache mode "+cache);
	// view: "bicing"  or "parking"
	var batch = [];
	
        //xmlhttp.open('GET', 'analyzeBicing.php' + getVars, true);
	if (cache == true) {
	//        xmlhttp.open('GET', 'analyzeBicingCache.php', true);
        xmlhttp.open('POST', 'retrieveXml.php', true);
	var getVars =  "?xmlfile=test.xml";
	} else {
        //open the request to storeMarker.php on your server 
	var getVars =  "?date=" + date + "&stationid=" + station;
        xmlhttp.open('POST', 'analyzeBicing.php', true);
	}	
	//Send the proper header information along with the request
	xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	xmlhttp.setRequestHeader("Content-length", getVars.length);
	xmlhttp.setRequestHeader("Connection", "close");
        
	xmlhttp.onreadystatechange = function() {
                if (xmlhttp.readyState == 4) {
                //the request is complete 
                var xmlDoc = xmlhttp.responseXML;
                //GLog.write(xmlhttp.responseText);
		var bcgArray = xmlDoc.documentElement.getElementsByTagName("bicingGraph");
		var bcgAxis = xmlDoc.documentElement.getElementsByTagName("bicingAxis");
		//var currentCounts = xmlDoc.documentElement.getElementsByTagName("bicingCurrent");
		// Google image params
		var graphParams = "http://chart.apis.google.com/chart?chs=300x200&chtt=Available+Bicings&";
		graphParams = graphParams+"chts=FF9900,20&chf=c,lg,90,76A4FB,1,ffffff,0&chls=2,1,0&chco=0000ff";
		bcgAxisStr = bcgAxis[0].getAttribute("axisTime");
		for (var i = 0; i < bcgArray.length; i++) {
			mynode = bcgArray[i];
			//currentCountsNode = currentCounts[i];
			// GLog.write(mynode.length);

			var lat = mynode.getAttribute("lat");
			var imagegraph = graphParams+mynode.getAttribute("graphStr")+bcgAxisStr;
			var imagegraphSlots = graphParams+mynode.getAttribute("graphStrSlots")+bcgAxisStr;
			var long = mynode.getAttribute("long");
			var stationAddress = mynode.getAttribute("address");
			var avgbicing = parseFloat(mynode.getAttribute("avgbicing"));
			var avgfreeslots = parseFloat(mynode.getAttribute("avgfreeslots"));
			var stdbicing = parseFloat(mynode.getAttribute("stdbicing"));
			var currentBcgs = parseFloat(mynode.getAttribute("currentBcgs"));
			var currentSlts = parseFloat(mynode.getAttribute("currentSlts"));
			var maxAvgIdx = parseInt(mynode.getAttribute("maxAvg"));
			var maxStdIdx = parseInt(mynode.getAttribute("maxStd"));
			var maxSltsIdx = parseInt(mynode.getAttribute("maxSlts"));
			//GLog.write("max Avg index "+ isNaN(maxAvgIdx));

			var isMarkerError = false;
			if (avgbicing == 0 && avgfreeslots == 0) isMarkerError = true;
			//GLog.write("graph source"+ imagegraph+ " lat "+ lat+ " long "+ long);

			//Construct marker
			var latlng = new GLatLng(parseFloat(lat),parseFloat(long));
			//Localize graph
			if (globSettings.lang == 1) { 
			imagegraph = imagegraph.replace("Available+Bicings","Bicings+disponibles");
			imagegraphSlots = imagegraphSlots.replace("Available+Bicings","Aparcamientos+disponibles");
			} else if (globSettings.lang == 2) { 
			imagegraphSlots = imagegraphSlots.replace("Available+Bicings","Available+slots");
			} else if (globSettings.lang == 3) {
			imagegraph = imagegraph.replace("Available+Bicings","Bicings+disponibles");
			imagegraphSlots = imagegraphSlots.replace("Available+Bicings","Aparcaments+disponibles");
			}

			//html
			if (view == "bicing") {
			html = "<div><img src='" + imagegraph + "' WIDTH=300 HEIGHT=200 /></div>";
			} else { html = "<div><img src='" + imagegraphSlots + "' WIDTH=300 HEIGHT=200 /></div>";
			}
			html = html + "<div><b> " + stationAddress + "</b><div>";
			if (globSettings.lang == 1) {
			html = html + "<div><rightcontainer> Promedio bicings (dia): " + avgbicing.toFixed(1) + "</rightcontainer><div>";
			html = html + "<div><rightcontainer> Promedio aparcamientos (dia): " + avgfreeslots.toFixed(1) + "</rightcontainer><div>";
			html = html + "<div><rightcontainer> Bicings disponibles: " + currentBcgs + "</rightcontainer><div>";
			html = html + "<div><rightcontainer> Aparcamientos disponibles: " + currentSlts + "</rightcontainer><div>";
			} else if (globSettings.lang == 2) { 
			html = html + "<div><rightcontainer> Average available bicings (day): " + avgbicing.toFixed(1) + "</rightcontainer><div>";
			html = html + "<div><rightcontainer> Average free slots (day): " + avgfreeslots.toFixed(1) + "</rightcontainer><div>";
			html = html + "<div><rightcontainer> Current available bicings: " + currentBcgs + "</rightcontainer><div>";
			html = html + "<div><rightcontainer> Current free slots: " + currentSlts + "</rightcontainer><div>";
			} else if (globSettings.lang == 3) { 
			html = html + "<div><rightcontainer> Mitjana Bicings disponibles (dia): " + avgbicing.toFixed(1) + "</rightcontainer><div>";
			html = html + "<div><rightcontainer> Mitjana aparcaments disponibles (dia): " + avgfreeslots.toFixed(1) + "</rightcontainer><div>";
			html = html + "<div><rightcontainer> Bicings disponibles: " + currentBcgs + "</rightcontainer><div>";
			html = html + "<div><rightcontainer> Aparcaments disponibles: " + currentSlts + "</rightcontainer><div>";
			} 
			//GLog.write("adding marker bicing "+view+isMarkerError);
			if (isMarkerError == false) {

			//Create an object to pass to create marker, managing the cuadrant top stations.
			if (!isNaN(maxAvgIdx)) {
				//var popupHtml = (maxAvgIdx+1)+"-"+stationAddress;
				var popupHtml = stationAddress;
				topStationItem = new topStation("maxAvg",maxAvgIdx,popupHtml);
			} else if(!isNaN(maxSltsIdx)) {
				//var popupHtml = (maxSltsIdx+1)+"-"+stationAddress;
				var popupHtml = stationAddress;
				topStationItem = new topStation("maxSlt",maxSltsIdx,popupHtml);
			} else if(!isNaN(maxStdIdx)) {
				//var popupHtml = (maxStdIdx+1)+"-"+stationAddress;
				var popupHtml = stationAddress;
				topStationItem = new topStation("maxStd",maxStdIdx,popupHtml);
			} else {
				var topStationItem = null;
			}

			if (view == "bicing") {
			var marker = createMarker(latlng,html,currentBcgs,topStationItem);
			} else {
			var marker = createMarker(latlng,html,currentSlts,topStationItem);
			}

			batch.push(marker);
			//map.addOverlay(marker);
			}
			}
		mgr.addMarkers(batch,12);
		mgr.refresh();
		updateSideBar();
		finishLoad();
                }
        }
	if (cache == true) {
        xmlhttp.send(getVars);
        //xmlhttp.send(null);
	} else {
        xmlhttp.send(getVars);
	}
        return false;

} //function 

function updateLanguage(language) {
globSettings.setLanguage(language);
localizeTo(language);
reloadMarkers();

}

function localizeTo(language) {
// Default language is spanish
if (typeof language == 'undefined' ) {
	language = globSettings.lang;
	if (typeof language == 'undefined' ) language = 1;
}
var nlocs = 10;
var nlang = 3;

locArray =new Array(nlocs)
for (i=0; i <nlocs; i++)
locArray[i]=new Array(nlang+1)


// Legend loc
locArray[0] = ["redlegend","0 elementos: ","0 item left: ","0 element: "];
locArray[1] = ["orangelegend","1-2 elementos: ","1-2 items left: ","1-2 elements: "];
locArray[2] = ["yellowlegend","3-5 elementos: ","3-5 items left: ","3-5 elements: "];
locArray[3] = ["greenlegend","6+ elementos: ","6+ items left: ","6+ elements: "];

// Inputs loc
locArray[4]= ["addressfield","Buscar direcci&oacute;n (ie: Diagonal 500)","Locate address (ex: Diagonal 500)","Cercar direcci&oacute; (ie: Diagonal 500)"];
var searchbutton = ["searchbutton","Buscar","Search","Cercar"]; 
locArray[5]= ["bicingradio","Bicings disponibles","Available Bicings","Bicings disponibles"];
locArray[6]= ["slotsradio","Aparcamientos disponibles","Free parking slots","Aparcaments disponibles"];

// Output locs
locArray[7]= ["topbicings","Estaciones con m&aacute;s Bicing","Top Available Bicings","Estacions amb m&eacute;s Bicings"];
locArray[8]= ["topslots","Estaciones con m&aacute;s aparcamientos","Top Free Slots","Estacions amb m&eacute;s aparcaments"];
locArray[9]= ["topstd","Estaciones m&aacute;s activas","Top Active Stations","Estacions m&eacute;s actives"];

// Changing innerHTMLs
for (i=0; i <nlocs; i++) {
rlnode = document.getElementById(locArray[i][0]);
rlnode.innerHTML = locArray[i][language];
}

rlnode = document.getElementById("searchbutton");
rlnode.value = searchbutton[language];
}

function initMap(){
       if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById("map"));
        map.addControl(new GSmallMapControl());
        map.addControl(new GMapTypeControl());
        map.setCenter(new GLatLng(41.386871149, 2.1698641), 15); //(41.494225999999998, 2.062351), 18,G_HYBRID_MAP);
	mgr = new MarkerManager(map);
	geocoder = new GClientGeocoder();
	/* Init Radio Button
	myForm = document.getElementById("markerView");
	with (myForm) {
	var isChecked = false;
	for (i=0, n=viewType.length; i<n; i++) {
		if (viewType[i].checked) {
			isChecked = true;
		}
	    }
	if (isChecked == false) { viewType[0].checked = true; }
	} // myform
	*/
	} // browser compat
}


function markersLoad(cache,view,reload) {

	if (typeof reload == 'undefined' ) reload = false;

       if (GBrowserIsCompatible()) {
	if (reload == false) {
        map = new GMap2(document.getElementById("map"));
        map.addControl(new GSmallMapControl());
        map.addControl(new GMapTypeControl());
        map.setCenter(new GLatLng(41.386871149, 2.1698641), 15); //(41.494225999999998, 2.062351), 18,G_HYBRID_MAP);
	mgr = new MarkerManager(map);
	}
	statArray = "";
	for (var i = 60; i < 80; i++) {
		if (statArray=="")
		{ 
			statArray = i;
		} else {	
			statArray= statArray+"," + i;
		}
	}
	var currentTime = new Date();
	var month = currentTime.getMonth() + 1;
	var day = currentTime.getDate();
	var year = currentTime.getFullYear();
	//GLog.write("Date : " +statArray);
	addMarkerStation(year+month+day,statArray,cache,view,reload);
      }
    }

function geocodeBicing(form){
//http://www.developer.com/lang/jscript/article.php/3615681
   with (form)
        {
	var destAddress = address.value;
	}

	// Check if Barcelona is inside the address, otherwise add it
        addLowerCase = destAddress.toLowerCase();	
	if (addLowerCase.match("barcelona") == null) {
		destAddress = destAddress + " Barcelona, Spain";
	}

	geocoder.getLocations(destAddress, addToMap);
}

function addToMap(response)

   {
	var firstFound = false;
	var nPlaces = response.Placemark.length;
	var i = 0;
	// Retrieve the object
	while (!firstFound && i<nPlaces) {

	place = response.Placemark[i];
	locality = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;
	if (locality.toLowerCase() == "barcelona") {
	firstFound = true;
	break;
	} else {
	i++;
	}
	
	}

	if (firstFound == true) {
	// Retrieve the latitude and longitude
	point = new GLatLng(place.Point.coordinates[1],
			  place.Point.coordinates[0]);

	// Center the map on this point
	map.panTo(point, 15);

	// Create a marker
	var foundIcon = new GIcon(G_DEFAULT_ICON);
	/*
	foundIcon.image = "http://maps.google.com/mapfiles/ms/icons/blue-dot.png";
	markerOptions = { icon:foundIcon };
	marker = new GMarker(point,markerOptions);
	*/
	marker = new GMarker(point);
	
	address1 = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName;
	postal = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber;
	

	//Construct HTML
	 html = "<b> Destination address </b>";
	 html = html + "<br>"+ address1 +"</ br>";
	 html = html + "<br>"+ postal+"," +locality+" </br>";
	
	GEvent.addListener(marker, 'click', function() {
        var markerHTML = html;
        marker.openInfoWindowHtml(markerHTML);
        });

	
	// Add the marker to map
	map.addOverlay(marker);

	} else {
	alert ("No address found in Barcelona");
	}
   }


function reloadMarkers(form){
	mgr.clearMarkers();
	resetSideBar();
	document.body.className = document.body.className.replace("standby", "loading"); 
	myNode = document.getElementById("mapsection");	
	myNode.className = myNode.className.replace("opaque","transparent"); 
	if (typeof form == 'undefined' ) 
	{
	markersLoad(true,"bicing", true);
	} else {
	with (form)
	{
	for (i=0, n=viewType.length; i<n; i++) {
		if (viewType[i].checked) {
		    var checkvalue = viewType[i].value;
		    break;
		} 
	    }

		if (checkvalue == "bicing") {
			markersLoad(true,"bicing", true);
		} else if (checkvalue == "parking") {
			markersLoad(true,"parking",true);
		} else
		{alert ("bad form fill");
		}
	}
	}
}

function createMarker(latlng, html,available,topMarker) {

	if (typeof topMarker == 'undefined' ) topMarker = null;

	orangethd = 2;
	yellowthd = 5;
	greenthd = 8;

        var greenIcon = new GIcon(G_DEFAULT_ICON);
        var redIcon = new GIcon(G_DEFAULT_ICON);
        var yellowIcon = new GIcon(G_DEFAULT_ICON);
        var orangeIcon = new GIcon(G_DEFAULT_ICON);
        greenIcon.image = "images/mm_20_green.png";
        redIcon.image = "images/mm_20_red.png";
        yellowIcon.image = "images/mm_20_yellow.png";
        orangeIcon.image = "images/mm_20_orange.png";
        var tinyIcon = new GIcon();
        tinyIcon.image = "images/mm_20_green.png";
        tinyIcon.shadow = "images/mm_20_shadow.png";
        tinyIcon.iconSize = new GSize(12, 20);
        tinyIcon.shadowSize = new GSize(22, 20);
        tinyIcon.iconAnchor = new GPoint(6, 20);
        tinyIcon.infoWindowAnchor = new GPoint(5, 1);


        if (available <= 0) { // red marker, printer not available
                tinyIcon.image = "images/mm_20_red.png";
                markerOptions = { icon:tinyIcon };
                var marker = new GMarker(latlng,markerOptions);
                }
        else if (available > 0  && available <= orangethd) {
                tinyIcon.image = "images/mm_20_orange.png";
                markerOptions = { icon:tinyIcon };
                var marker = new GMarker(latlng,markerOptions);
                }
        else if (available > orangethd  && available <= yellowthd) {
                tinyIcon.image = "images/mm_20_yellow.png";
                markerOptions = { icon:tinyIcon };
                var marker = new GMarker(latlng,markerOptions);
                }
        else if (available > yellowthd) {
                tinyIcon.image = "images/mm_20_green.png";
                markerOptions = { icon:tinyIcon };
                var marker = new GMarker(latlng,markerOptions);
                }
        else {
                GLog.write("wrong avail parameter:"+available);
        }

	var focusPoint = function() {
		marker.openInfoWindowHtml(html);
		map.panTo(latlng);
	}

	GEvent.addListener(marker, 'click', focusPoint);
	/*
        GEvent.addListener(marker, 'click', function() {
        var markerHTML = html;
	map.panTo(latlng);
        marker.openInfoWindowHtml(markerHTML);
        });
	*/

	addSideBar(topMarker,focusPoint);
	/* check if marker is a top marker
	if (topMarker != null)
	{
		var listItem = document.createElement('li');
		var listItemLink = listItem.appendChild(document.createElement('a'));
		listItemLink.href = "#";
		//listItemLink.innerHTML = "<p> " + stationAddress + ": ranked " + maxAvgIdx + "</p>";
		listItemLink.innerHTML = topMarker.html;
		listItemLink.onclick = focusPoint;
		if (topMarker.type =="maxAvg") {
		document.getElementById('sidebar-avgbcgs').appendChild(listItem);
		} else if (topMarker.type =="maxSlt") {
		document.getElementById('sidebar-avgslts').appendChild(listItem);
		} else if (topMarker.type =="maxStd") {
		document.getElementById('sidebar-avgstd').appendChild(listItem);
		}
	}
*/
        return marker;
        }


// Side Bar functions

function resetSideBar() {
statsList =new Array(3)
for (i=0; i <3; i++)
statsList[i]=new Array(3)

listNode = document.getElementById('sidebar-avgbcgs');
while(listNode.firstChild != listNode.lastChild) { // delete all nodes
      listNode.removeChild(listNode.lastChild);
}
listNode = document.getElementById('sidebar-avgslts');
while(listNode.firstChild != listNode.lastChild) { // delete all nodes
      listNode.removeChild(listNode.lastChild);
}
listNode = document.getElementById('sidebar-avgstd');
while(listNode.firstChild != listNode.lastChild) { // delete all nodes
      listNode.removeChild(listNode.lastChild);
}
return;
}

function addSideBar(topMarker, focusPoint) { 
	
//statsList;
// dimension 1: average bicings
// dimension 2: average free slots
// dimension 3: most active stations
// Top average station
// check if marker is a top marker
        if (topMarker != null)
        {
                var listItem = document.createElement('li');
                var listItemLink = listItem.appendChild(document.createElement('a'));
                //listItemLink.href = "#";
                //listItemLink.innerHTML = "<p> " + stationAddress + ": ranked " + maxAvgIdx + "</p>";
                listItemLink.innerHTML = topMarker.html;
                listItemLink.onclick = focusPoint;
                if (topMarker.type =="maxAvg") {
		statsList[0][topMarker.rank] = listItem; 
                //document.getElementById('sidebar-avgbcgs').appendChild(listItem);
                } else if (topMarker.type =="maxSlt") {
		statsList[1][topMarker.rank] = listItem; 
                //document.getElementById('sidebar-avgslts').appendChild(listItem);
                } else if (topMarker.type =="maxStd") {
		statsList[2][topMarker.rank] = listItem; 
                //document.getElementById('sidebar-avgstd').appendChild(listItem);
                }
        }
        return true;

} //function 

function updateSideBar() {
for (i in statsList[0]) {
document.getElementById('sidebar-avgbcgs').appendChild(statsList[0][i]);
}
for (i in statsList[1]) {
document.getElementById('sidebar-avgslts').appendChild(statsList[1][i]);
}
for (i in statsList[2]) {
document.getElementById('sidebar-avgstd').appendChild(statsList[2][i]);
}

return;
}

function retrieveMarkers(stationid) {
        var request = GXmlHttp.create();
        //tell the request where to retrieve data from. 
        request.open('GET', 'stationMarkers.php', true);

        //tell the request what to do when the state changes. 
        request.onreadystatechange = function() {
                if (request.readyState == 4) {
                        var xmlDoc = request.responseXML;
                        var markers = xmlDoc.documentElement.getElementsByTagName("marker");
                        for (var i = 0; i < markers.length; i++) {
				var lng = markers[i].getAttribute("lng");
				var lat = markers[i].getAttribute("lat");
				if(lng && lat) {
                                        var latlng = new GLatLng(parseFloat(lat),parseFloat(lng));
                                        var company = markers[i].getAttribute("company");

                                        var html = '<div><b>station</b> ';
                                        var marker = createMarker(latlng,html,status);
                                        map.addOverlay(marker);
                                } // if lat lnf 
                        } //for 
                } //if 
        } //function 
        request.send(null);
}


function load() {
	globSettings = new statSettings();
	fitToWindow();
	initMap();
	resetSideBar();
	localizeTo();
        markersLoad(true,"bicing");
}

function finishLoad() {
	
	document.body.className = document.body.className.replace("loading", "standby"); 
	myNode = document.getElementById("mapsection");	
	myNode.className = myNode.className.replace("transparent","opaque"); 
        map.checkResize();
}


function windowHeight() { 
// Standard browsers (Mozilla, Safari, etc.) 
if (self.innerHeight) 
return self.innerHeight; 
// IE 6 
if (document.documentElement && document.documentElement.clientHeight) 
return y = document.documentElement.clientHeight; 
// IE 5 
if (document.body) 
return document.body.clientHeight; 
// Just in case. 
return 0; 
} 

function windowWidth() { 
// Standard browsers (Mozilla, Safari, etc.) 
if (self.innerWidth) 
return self.innerWidth; 
// IE 6 
if (document.documentElement && document.documentElement.clientWidth) 
return y = document.documentElement.clientWidth; 
// IE 5 
if (document.body) 
return document.body.clientWidth; 
// Just in case. 
return 0; 
} 

window.onresize = fitToWindow;

function fitToWindow() { 
var height = windowHeight(); 
var width = windowWidth();
height -= document.getElementById('titleblock').offsetHeight + 165; 
width -= document.getElementById('sidebar-avgbcgs').offsetWidth +50 ; 
document.getElementById('map').style.height = height + 'px'; 
document.getElementById('map').style.width = width + 'px'; 

} 


