/**
 * @author rvassilev
 * date: 28-09-2009
 */
var mCovPng = "/maps/images/layout/tt_covcity.png";
var mCovGif = "/maps/images/layout/tt_covcity.gif";
var mCovCommingPng = "/maps/images/layout/tt_commingcity.png";
var mCovCommingGif = "/maps/images/layout/tt_commingcity.gif";
var mShopPng = "/maps/images/layout/tt_covcity.png";
var mShopGif = "/maps/images/layout/tt_covcity.gif";
var icoLoading = "/maps/images/layout/loading.gif";
//var urlKMLPath	= "http://4ever.local.net/maps/";
var urlKMLPath	= "http://4ever.bg/maps/";
var map = null;
var geocoder = null;
var oCities = null;
var oLoading = null;
var oPos = null;
var current_zoom = 7;


function initialize(){
    if (GBrowserIsCompatible()) {
		var options = {mapTypeControl: false};
        map = new GMap2(document.getElementById("cov_map"), options);
		geocoder = new GClientGeocoder();
		map.addControl(new GLargeMapControl3D);
        map.setCenter(new GLatLng(42.848658, 25.246582), current_zoom);
		map.setMapType(G_NORMAL_MAP);

		oCities = new Cities(map);
		oCities.showCitiesMarkers();
		
		// Add some event handlers
		GEvent.addListener(map, "zoomend", function(oz, nz){
			current_zoom = nz;
			oCities.removeCoverage(current_zoom);
        });
        GEvent.addListener(map, "moveend", function(){
			oCities.addCoverage(current_zoom);
			oCities.removeCoverage(current_zoom);
        });
		$("#sSubmit").click(function(){
			oCities.checkCoverage();
		});
		$("#legend").fadeTo("slow", 0.85);
	    $("#btn_legend").click(function () {
			$("#legend ul").slideToggle("slow");
			$("#btn_legend").toggleClass("btn_off");
	    });

    }
}

// BOF City class
function City () {
	var id;
	var name;
	var kml_file;
	var type;
	var lon;
	var lat;
	var covOverlay;
}
// EOF City class

// BOF Cities class
function Cities (m) {
	var bg_map = m;
	var cities_data = [];

	// Public methods
	this.showCitiesMarkers = showCitiesMarkers;
	this.addCoverage = addCoverage;
	this.removeCoverage = removeCoverage;
	this.switchPosControl = switchPosControl;
	this.checkCoverage = checkCoverage;
	
	function showCitiesMarkers () {
		var oCity;
		var oCities;
	    GDownloadUrl(urlCitiesData, function(data, responseCode)
		{
	        if (responseCode == 200) {
	            var xml = GXml.parse(data);
	            oCities = xml.documentElement.getElementsByTagName("city");
	            for (var i = 0; i < oCities.length; i++) {
					oCity = new City();
					oCity.id = oCities[i].getAttribute("id");
					oCity.name = oCities[i].getAttribute("name");
					oCity.kml_file = oCities[i].getAttribute("kml_file");
					oCity.type = oCities[i].getAttribute("type");
					
					/*
					if (((oCities[i].getAttribute("lon") == 0) && (oCities[i].getAttribute("lat") == 0)) ||
					((oCities[i].getAttribute("lon") == "") && (oCities[i].getAttribute("lat") == ""))) {
						oCity.type = 999;
					}
					*/
					
					oCity.lon = oCities[i].getAttribute("lon");
					oCity.lat = oCities[i].getAttribute("lat");						
					
					oCity.covOverlay = undefined;
					cities_data.push(oCity);
					makeMarker(oCity);				
	            }
				oCity = null;
	        }
	        else 
	            if (responseCode == -1) {
	                alert("Data request timed out. Please try later.");
	            }
	            else {
	                alert("Request resulted in error. Check XML file is retrievable.");
	            }
	    });		
	}

	function addCoverage(cz) {
		var gx;
		var city;
		
		for (var i = 0; i < cities_data.length; i++) {
			city = cities_data[i];
			if ((cz > 8) && (isCityInBound(city.lon, city.lat)) && (undefined == city.covOverlay)) {
				gx = new GGeoXml(urlKMLPath + city.kml_file + ".kml?k=1"+Math.floor(Math.random()*11));
				GEvent.addListener(gx, 'load', function(){
					if (gx.loadedCorrectly()) {
						if (oLoading != undefined) {
							bg_map.removeControl(oLoading);
							oLoading = undefined;
						}
					}
				});
				city.covOverlay = gx;
				bg_map.addOverlay(gx);
				showLoading();
			}
		}	
	}

	function removeCoverage(cz){
		var city;
		for (var i = 0; i < cities_data.length; i++) {
			city = cities_data[i];
			if (((!isCityInBound(city.lon, city.lat)) && (undefined != city.covOverlay) && (cz < 13))) {
				bg_map.removeOverlay(city.covOverlay);
				city.covOverlay = undefined;
			}
			if ((cz <= 8) && (undefined != city.covOverlay)) {
				bg_map.removeOverlay(city.covOverlay);
				city.covOverlay = undefined;				
			}
		}
	}

	function checkCoverage(){
		var address = $("#sAddress").val();
		var city = getCity($('#sCity option:selected').val());
		var address_msg = address + ", " + city.name;
		address += ", " + city.name + ", Bulgaria";
		
		showLoading();
		if (geocoder) {
			geocoder.getLatLng(
				address,
				function(point) {
					if (!point) {
						alert(address + " не е намерен.");
					} else {
						/*
						$.getJSON("/Map/checkcov?city="+city.kml_file+"&lon="+point.y+"&lat="+point.x,
						function(data){
							removeLoading();
						    var marker = new GMarker(point);
		    				bg_map.addOverlay(marker);
							message = "<b>"+data.status+"</b>";
							marker.openInfoWindowHtml(message);
							marker.showMapBlowup();
							bg_map.setCenter(point, 13);
						});
						*/
						var marker = new GMarker(point);
						bg_map.addOverlay(marker);
						marker.openInfoWindowHtml(address_msg);
						bg_map.setCenter(point, 13);
					}
				}
			)
		};		
	}
	
	function showLoading() {
		if (oLoading == undefined) {
			oLoading = new LoadingControl();
			bg_map.addControl(oLoading);
		}			
	}
	
	function removeLoading() {
		if (oLoading == undefined) {
			oLoading = new LoadingControl();
			bg_map.addControl(oLoading);
		}		
	}
	
	function getCity(id) {
		for (var i = 0; i < cities_data.length; i++) {
			if (id == cities_data[i].id) {
				return cities_data[i];
			}
		}
	}
	
	function switchPosControl(){
		oPos = new PosControl();
		bg_map.addControl(oPos);
	}
	
	function makeMarker(c){
		var png;
		var gif;
		if ((c.type == 1) || (c.type == 2)) {
			png = mCovPng;
			gif = mCovGif;
		} else {
			png = mCovCommingPng;
			gif = mCovCommingGif;			
		}		
	    var point = new GLatLng(parseFloat(c.lon), parseFloat(c.lat));
	    var pin = new GIcon();
	    pin.image = png;
	    pin.shadow = "";
	    pin.iconSize = new GSize(32, 37);
	    pin.shadowSize = new GSize(1, 1);
	    pin.iconAnchor = new GPoint(16, 37);
	    pin.infoWindowAnchor = new GPoint(5, 2);
	    pin.infoShadowAnchor = new GPoint(14, 25);
	    pin.transparent = png;
	    pin.printImage = gif;
	    pin.mozPrintImage = gif;
	    var markerOptions = {
	        icon: pin,
	        draggable: false
	    };
	    var marker = new GMarker(point, markerOptions);
	    bg_map.addOverlay(marker);
	    if (c.type == 1) {
			zoomCity(point, marker);
			showCityName(c.name, marker);
		} else if (c.type == 2) {
			showCityName(c.name, marker);
			gotoDealerAddress(c.kml_file, marker);
		} else {
			showCityName(c.name, marker);
		}
		
	}	
	
	function zoomCity(point, marker){
	    // Zoom to city
	    GEvent.addListener(marker, "click", function(){
	        bg_map.setCenter(point, 13);
	    });
	}
	
	function showCityName(name, marker) {
	    GEvent.addListener(marker, "mouseover", function(){
	        marker.openInfoWindow(name); 
	    });
		GEvent.addListener(marker, "mouseout", function(){
			bg_map.closeInfoWindow(bg_map); 
	    });	
	}
	
	function gotoDealerAddress (id, marker) {
	    GEvent.addListener(marker, "click", function(){
			//window.location.href = "/Dealer/"+id;
			window.location.href = "/chastni-klienti/plashtane/ot-kde-da-kupya/"+id+"/";
	    });		
	}
	
	function isCityInBound(lon, lat) {
		var point = new GLatLng(parseFloat(lon), parseFloat(lat));
		var bounds = bg_map.getBounds();
		return bounds.contains(point);
	}
		
}
// EOF Cities class

// BOF "Loading" custom control
function LoadingControl () { }
LoadingControl.prototype = new GControl();
LoadingControl.prototype.initialize = function(map) {
	var container = document.createElement("div");
	var loadingDiv = document.createElement("div");
	this.setDivStyle_(loadingDiv);
	container.appendChild(loadingDiv);
	var img = document.createElement("img");
	img.setAttribute("src", icoLoading);
	img.style.marginBottom = "6px";
	loadingDiv.appendChild(img);
	loadingDiv.appendChild(document.createElement("br"));
	loadingDiv.appendChild(document.createTextNode(lang_load));

	map.getContainer().appendChild(container);
	return container;
}
LoadingControl.prototype.getDefaultPosition = function() {
	return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(12, 12));
}
LoadingControl.prototype.setDivStyle_ = function(div) {
	div.style.textDecoration = "none";
	div.style.color = "#99B3CC";
	div.style.backgroundColor = "#ffffff";
	div.style.fontWeight = "bold";
	div.style.fontSize = "0.8em";
	div.style.border = "1px solid #99B3CC";
	div.style.padding = "8px";
	div.style.paddingTop = "8px";
	div.style.marginBottom = "3px";
	div.style.textAlign = "center";
	div.style.width = "8em";
}  
// EOF "Loading" custom control

window.onload = initialize;
window.onunload = GUnload;