$(document).ready(function() {
    if ( $(".retailersearch").size() == 0) return;
	
    $.ajaxSetup({
         async: "false",
         contentType: "application/x-www-form-urlencoded; charset=utf-8"
    });
	
	Map.init();
	RS.init();
});

var Translations = {
	toDE: "Route hierher",
	toEN: "Route to",
	fromDE: "Route von hier aus",
	fromEN: "Route from",
	noSupportDE: 'Leider unterstützt Ihr Browser diese Funktion nicht! Für eine optimierte Darstellung <a target="_blank" href="http://www.microsoft.com/austria/windows/internet-explorer/">aktualisieren Sie bitte Ihren Browser</a>.',
	noSupportEN: 'Unfortunately your browser does not support this feature. <a target="_blank" href="http://www.microsoft.com/windows/internet-explorer/">Please update your browser!</a>',
	noRetailerDE: 'Für Ihre Auswahl sind leider keine Händler verfügbar',
	noRetailerEN: 'No retailers available for in this area',
	representativeDE: 'Handelsvertreter',
	representativeEN: 'Representative',
	showOnMapDE: 'auf Karte anzeigen',
	showOnMapEN: 'show on map'
};
		  
var Map = {     
    geocoder: null,
    map: null,
	markerClusterer: null,
    markersArray: [],
    markerImage: 'fileadmin/templates/img/retailersearch_logo.png',
	markerCluster1: 'fileadmin/templates/img/cluster1.png',
	markerCluster2: 'fileadmin/templates/img/cluster2.png',
	markerCluster3: 'fileadmin/templates/img/cluster3.png',
	markerCluster4: 'fileadmin/templates/img/cluster4.png',
	markerCluster5: 'fileadmin/templates/img/cluster4.png',
    lat_min: null,
    lat_max: null,
    lng_min: null,
    lng_max: null,
    geocodeCounter: null,
    geocodeArray: [],
	routeUrlTo: 'http://maps.google.com/maps?daddr=',
	routeUrlFrom: 'http://maps.google.com/maps?saddr=',
	maxZoom: 12,
    
    init: function() {	
	    // disable google map if less than IE7
		if ($.browser.msie && $.browser.version.substr(0, 1) < 7) { 
		  var text = $('<p>').html(Translations.noSupportDE + '<br/><br/>' + Translations.noSupportEN);
		  $('#showroom_map').html(text);
		
		  return;
		}
		
		google.maps.event.addDomListener(window, 'load', Map.initMap); 
    },
	
	initMap: function() {
        //var latlng = new google.maps.LatLng(47.947994,14.588012);
        
        var myOptions = {
          //zoom: 8,
          //center: latlng,
          mapTypeId: google.maps.MapTypeId.ROADMAP
        };

        Map.resetBorders();
        Map.resetGeocodes();
        geocoder = new google.maps.Geocoder();
        map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
		
		// init marker clusterer
		Map.initMarkerClusterer();        
        
        // load all retailers and init markers
        Map.loadAllMarkers(RS.category); 
	},
	
	initMarkerClusterer: function() {
        var mcOptions = {
			gridSize: 50,
			styles: [
            {
                height: 60,
                url: Map.markerCluster1,
                width: 60,
                textColor: 'white',
                anchor: [0, 37, 30, 0]
            },
            {
                height: 60,
                url: Map.markerCluster2,
                width: 60,
                textColor: 'white',
                anchor: [0, 34]
            },
            {
                height: 60,
                url: Map.markerCluster3,
                width: 60,
                textColor: 'white',
                anchor: [0, 31]
            },
            {
                height: 60,
                url: Map.markerCluster4,
                width: 60,
                textColor: 'white',
                anchor: [0, 28]
            },
            {
                height: 60,
                url: Map.markerCluster5,
                width: 60,
                textColor: 'white',
                anchor: [0, 26]
            }]
		};
        
        Map.markerClusterer = new MarkerClusterer(map, [], mcOptions);  
	},
	
    loadAllMarkers: function(category) {
        var data = {};
        if ((category != "false") && (category != "")) {
            data.category = category;
        }
        
        //load retailer data
        $.get(RS.path + "allRetailers", data, Map.showMarkers, "json");
    }, 
	
	showMarkers: function(data) {		
		// get markers
		for (var i in data.retailers) {
			var company = data.retailers[i].company +  " " + data.retailers[i].company2;
			var address = data.retailers[i].street + ", " + data.retailers[i].zip + " " + data.retailers[i].city
			var country = data.retailers[i].country;
			var latlng = new google.maps.LatLng(data.retailers[i].lat, data.retailers[i].lng);
			
			var marker = Map.createMarker(latlng,address, company,country);
			
			Map.markersArray.push(marker);
			
			// Map.setMarker(latlng,address, company,country);
		}
		
		// show markers on map
		Map.markerClusterer.addMarkers(Map.markersArray, true);
		Map.markerClusterer.redraw();
	},
    
    resetBorders: function() {
        if ($.browser.msie && $.browser.version.substr(0, 1) < 7) 
          return;
		
        Map.lat_min = 200;
        Map.lng_min = 200;
        Map.lat_max = -1;
        Map.lng_max = -1;
    },
   
    resetGeocodes: function() {
        if ($.browser.msie && $.browser.version.substr(0, 1) < 7) 
          return;
		
        Map.geocodeCounter = -1;
        Map.geocodeArray.length = 0;
    },
    
	// DEPRECATED
    showAddressOnMap: function(company, address, country) {
        if ($.browser.msie && $.browser.version.substr(0, 1) < 7) 
          return;
		  
        Map.geocodeCounter++;
		Map.getGeocode(company, address, country, 'setMarker', Map.geocodeCounter);
    },
	
    // asynchronous:
    // to avoid overwriting request results a unique number must be given
	// possible handlers: setMarker, zoomToLocation
    getGeocode: function(company, address, country, handler, id, ignoreMaxZoom) {
        if ($.browser.msie && $.browser.version.substr(0, 1) < 7) 
          return;
		  
		var address = (address != null ? address + ', ' : '' ) + country;
        geocoder.geocode( { 'address': address }, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
				//console.log(status + ': ' + id + ' | ' + address);
		
			    // get position
                Map.geocodeArray[id] = results[0].geometry.location;
                
                //set Marker
                if (handler == 'setMarker') {
				    Map.setMarker(Map.geocodeArray[id], address, company);
                } 
				// zoom to location
				else if (handler == 'zoomToLocation'){					
                    // get viewport bounds
					var viewport = results[0].geometry.viewport;
					
					// fit bounds
					map.fitBounds(viewport);	
						
                    // reset zoom if too close
					if (!ignoreMaxZoom && (map.getZoom() > Map.maxZoom)) {
						map.setZoom(Map.maxZoom); 
					} 

				}
					
            } else {
                // ignore: address is invalid
				// console.log(status + ': ' + id + ' | ' + address);
            }
        });
    },
	
	getRouteToLink: function(address, country) {
		var toUrl = Map.routeUrlTo + address + ', ' + country;		
		return '<a href="'+toUrl+'" target="_blank">' +  (RS.lang() == "de" ? Translations.toDE : Translations.toEN) + '</a>'
	},
	
	getRouteFromLink: function(address, country) {
        var fromUrl = Map.routeUrlFrom + address + ', ' + country;        
        return '<a href="'+fromUrl+'" target="_blank">' + (RS.lang() == "de" ? Translations.fromDE : Translations.fromEN) + '</a>'
    },
	
    // DEPRECATED
    setMarker: function(position, address, company, country) {
        if ($.browser.msie && $.browser.version.substr(0, 1) < 7) 
          return;

        // marker
	  	var marker = new google.maps.Marker({
	  		map: map,
	  		position: position,
	  		icon: Map.markerImage
	  	}); 		
        
        // create info window
        var infowindow = Map.createInfowindow(company, address, country);
        google.maps.event.addListener(marker, 'click', function() {
          infowindow.open(map,marker);
        });

        // calculate current map borders
        // Map.calculateBorders(position);
        
        // save marker reference
        Map.markersArray.push(marker);
		
        // center map
        // Map.setCenter();
    },
	
    createMarker: function(position, address, company, country) {
        if ($.browser.msie && $.browser.version.substr(0, 1) < 7) 
          return;

        // marker
        var marker = new google.maps.Marker({
            position: position,
            icon: Map.markerImage
        }); 
        
        // create info window
        var infowindow = Map.createInfowindow(company, address, country);
        google.maps.event.addListener(marker, 'click', function() {
          infowindow.open(map,marker);
        });

        return marker;
    },
	
	createInfowindow: function(company, address, country) {
        var infowindow = new google.maps.InfoWindow({
            content: 
             '<strong>' + company + '</strong>' + 
             '<br/>' + 
             address +
             '<br/><br/>' +
             '<div>' + 
                 Map.getRouteToLink(address, country) + ' | ' + Map.getRouteFromLink(address, country) +
             '</div>'
        });
		
		return infowindow;
	},
	
	// DEPRECATED
	calculateBorders: function(position) {
        if (Map.lat_min > position.lat()) {
            Map.lat_min = position.lat();
        }
        if (Map.lat_max < position.lat()) {
            Map.lat_max = position.lat();
        }
        if (Map.lng_min > position.lng()) {
            Map.lng_min = position.lng();
        }
        if (Map.lng_max < position.lng()) {
            Map.lng_max = position.lng();
        }
	},
    
	// DEPRECATED
    // set center of map considering currently set markers
    setCenter: function () {
        if ($.browser.msie && $.browser.version.substr(0, 1) < 7) 
          return;
		
        map.setCenter(new google.maps.LatLng(
          ((Map.lat_max + Map.lat_min) / 2.0),
          ((Map.lng_max + Map.lng_min) / 2.0)
        ))
        
        map.fitBounds(new google.maps.LatLngBounds(
          //bottom left
          new google.maps.LatLng(Map.lat_min, Map.lng_min),
          //top right
          new google.maps.LatLng(Map.lat_max, Map.lng_max)
        ));
        
        // correct zoom level if to much
        if (map.getZoom() > 15) {
            map.setZoom(15);
        }
    },
    
    // deletes all markers in the array and from map
    // resets variables holding current used borders and geocodes
    deleteOverlays: function() {
        if ($.browser.msie && $.browser.version.substr(0, 1) < 7) 
          return;
		  
		Map.markerClusterer.clearMarkers();
		
		if (Map.markersArray) {
			for (var i = 0; i < Map.markersArray.length; i++) {
			    Map.markersArray[i].setMap(null);
			}
            Map.markersArray.length = 0;
		}
		
		Map.resetBorders();
		Map.resetGeocodes();
    }
}

var RS = {
    path: "?eID=retailer_",	
	country: "nil",	
	city: "nil",	
    category: false,
    
    lang: function() {
      return ($.getUrlVar('L') == 1) ? "en" : "de"
    },

    init: function() {
        //IE bugfix
        //current timestamp tricks IE into thinking that page has never been accessed before
        var timestamp = new Date().getTime();

        // prepare data container
		RS.initCitiesContainer();
        RS.initCountriesContainer();
		
        // load data
		$.ajax({
			url: RS.path + "categories",
			data: {
				"lang": RS.lang,
				"timestamp": timestamp
			},
			success: function(data){
				
				// CATEGORIES
				RS.renderCategories(data);
				
		        $.ajax({
		            url: RS.path + "cities",
		            data: {
		                "country": "AT",
		                "timestamp": timestamp
		            },
		            success: function(data){
						
						// CITIES
		                RS.renderCities(data, false);
						
						// COUNTRIES
				        $.ajax({
				            url: RS.path + "countries",
				            data: {
				                "lang": RS.lang,
				                "timestamp": timestamp
				            },
				            success: RS.renderCountries,
				            dataType: "json",
				            async: "false"
				        });
						
		            },
		            dataType: "json",
		            async: "false"
		        });				
			},
			dataType: "json",
			async: "false"
		});		

		/*
		$.get(RS.path + "categories", {"lang": RS.lang, "timestamp": timestamp}, RS.renderCategories, "json");
		$.get(RS.path + "cities", {"country": "AT", "timestamp": timestamp}, function(data){RS.renderCities(data, false)}, "json");
        $.get(RS.path + "countries", {"lang": RS.lang, "timestamp": timestamp}, RS.renderCountries, "json");
		*/
		
		RS.category = false;

		RS.initEventHandlers();
    },
	
	initEventHandlers: function() {
		//IE bugfix
        //current timestamp tricks IE into thinking that page has never been accessed before
        var timestamp = new Date().getTime();
		
		
        //$("#countries").live("change", function() {
        $("body").delegate("#countries","change", function() {
            //Map.deleteOverlays();
            var country = $(this).val();
			var countryName = $(this).find('option[value='+country+']').text();
			
			// load cities and retailer data
            $.get(
			 RS.path + "cities", {"country": country, "timestamp": timestamp}, 
			 function(data){
			 	RS.renderCities(data, true)
		      },
			  "json"
			)
        
            // zoom
            Map.getGeocode(null, null, countryName, 'zoomToLocation', null);
		});
        
        
        
        //$("#cities").live("change", function() {
        $("body").delegate("#cities","change", function() {
            //Map.deleteOverlays();
          
            var country = $("#countries").val();
			var countryName = $("#countries").find('option[value='+country+']').text();
            var city = $(this).val();
			var zip = $(this).find('option[value='+city+']').attr('zip');
			var address = (zip != '' ? zip + ' ' : '') + city;

            // zoom
            Map.getGeocode(null, address, countryName, 'zoomToLocation', null);
            
            // load retailers
            RS.getRetailers(country, city, RS.category, true);
        });
        
        
        
        $(".category").live("click", function() {
            RS.category = $(this).attr("cat");
            var country = $("#countries").val();
            var city = $("#cities").val();
            
            // reload markers
            Map.deleteOverlays();
            Map.loadAllMarkers(RS.category);
            
            // load retailer
            RS.getRetailers(country, city, RS.category, true);
        }); 
		
		
		
		$('#retailers .showOnMap').live('click', function() {
			var address = $(this).attr('address');
			var country = $(this).attr('country');

			Map.getGeocode(null, address, country, 'zoomToLocation', null, true);
		});
	},
    
	initCountriesContainer: function () {
        if ($("#countries").size() == 0) {
            list = $("<ul>");
            countries = $("<li>").appendTo(list);
            $("<select>").attr("id", "countries").appendTo(countries);
            list.appendTo("#showroom_form");
        }
	},
	
    renderCountries: function(data) {
        //load countries
        $("#countries").empty();
		for (var c = 0; c < data.countries.length; c++) {
            $("#countries").append('<option value="' + data.countries[c].id + '">' + data.countries[c].name + '</option>');
        }
        
        setTimeout(function(){
			//preselect default country (Austria)
	        $('#countries').val('AT');
	        $('#countries').trigger('change');
			
			//load retailer data
            RS.getRetailers($("#countries").val(), $("#cities").val(), RS.category, true);
		}, 100);
    },
	
	initCitiesContainer: function() {
        if ($("#cities").size() == 0) {
            cities = $("<li>");
            $("<select>").attr("id", "cities").appendTo(cities);
            cities.insertAfter("#countries");
        }
	},
	
    renderCities: function(data, loadRetailers) {
        //load cities
        $("#cities").empty().append('<option value="nil">---</option>');
		
        for (var c = 0; c < data.cities.length; c++) {
			var zip = data.cities[c].zip;
			var name = data.cities[c].name;
            $("#cities").append('<option zip="'+zip+'">' + name + '</option>');
        }
        
      //load retailer data
      if (loadRetailers) {
          RS.getRetailers($("#countries").val(), $("#cities").val(), RS.category, true);
      }
    },
    
    renderCategories: function(data) {
    	prev = $("#cities").parent();
    	
		// ==========================
    	// create default category
		// ==========================
		
		defaultCategory = " ";
        if (RS.lang() == "de") {
            defaultCategory = "Alle";
        } else if (RS.lang() == "en") {
            defaultCategory = "All";
        }
		
		// IE6 workaround
		var category = $("<li>");
		var name = 'all';
		var input = '<input type="radio" id="'+name+'" name="categories" cat="false" class="category">';
		var span = '<span><label for="'+name+'">'+defaultCategory+'</label></span>';		
		category.html(input + span);
		category.insertAfter(prev);
        prev = category;

  		
      	// ==========================
  		// create remaining categories
		// ==========================
		
    	if ($("#category").size() == 0) {
			for (var c = 0; c < data.categories.length; c++) {
				var name = data.categories[c].name;
				var id = data.categories[c].id;
				
		        // IE6 workaround
		        var category = $("<li>");
		        var input = '<input type="radio" id="'+id+'" name="categories" cat="'+id+'" class="category">';
		        var span = '<span><label for="'+name+'">'+name+'</label></span>';       
		        category.html(input + span);
		        category.insertAfter(prev);
		        prev = category;
        	}
        }
        
        //preselect default category
        $("#all").attr("checked", true);
    },
    
    getRetailers: function(country, city, category, clearRetailers) {
        var data = {};
        if ((country != "nil") && (country != "")) {
            data.country = country;
    		RS.country = country;
        }
        if ((city != "nil") && (city != "")) {
            data.city = city;
        }
        if ((category != "false") && (category != "")) {
        	data.category = category;
        }
        
        if (clearRetailers == true) {
            $("#retailers").empty();
        }
        
        //load retailer data
        $.get(RS.path + "retailers", data, RS.renderRetailers, "json");
    },
    
    renderRetailers: function(data) {
    	// no retailers for selected filters
        if (data.retailers.length == 0) {
            text = RS.lang() == "de" ? Translations.noRetailerDE : Translations.noRetailerEN;          	
          	$("<div>").addClass("location retailer").html(text).appendTo("#retailers");
          	return;
        }

        // get retailer data	
	    for (var r = 0; r < data.retailers.length; r++) {
            RS.renderRetailer(data.retailers[r]);
		}
        
        //IE Bugfix
        //positionFooter();
		ie6FixPositionFooter();
    }, 

    renderRetailer: function(data, country) {
        var representative = RS.lang() == "de" ? Translations.representativeDE : Translations.representativeEN;		
		var company = data.company + " " + data.company2;
		var address = data.street + ", " + data.zip + " " + data.city;
		var country = data.country;
        
        
        //append DOM with retailer data
        var retailer = $("<div>").attr("id", "ret-" + data.id).addClass("location retailer retcat-" + data.category);
        var retailerData = $("<div>").addClass("showroom_static").appendTo(retailer);
		
        if (data.representative  == 1) {
        	$("<p>").addClass("representative").html(representative).appendTo(retailerData);
        }
        $("<p>").addClass("heading").html(data.company).appendTo(retailerData);
        $("<p>").addClass("heading").html(data.company2).appendTo(retailerData);
        $("<p>").html(data.street).appendTo(retailerData);
        $("<p>").html(data.zip + " " + data.city).appendTo(retailerData);
		
		if (data.phone != "") {
			$("<p>").html("Tel.: " + data.phone).appendTo(retailerData);
		}
		
		if (data.phone2 != "") {
			$("<p>").html("Tel.: " + data.phone2).appendTo(retailerData);
		}
		
		/*
        if (data.fax != "") {
			$("<p>").html("Fax: " + data.fax).appendTo(retailerData);
		}   
		*/     
        
		if (data.email != "") {
	        var mail = $("<p>").appendTo(retailerData);
	        $("<a>").html(data.email).attr({"href": "mailto:" + data.email}).appendTo(mail);	
		}

        if (data.web != "") {
	        var web = $("<p>").appendTo(retailerData);
	        if (data.web.indexOf("http://") > -1) {
	            data.web = data.web.substring(7);
	        }
	        $("<a>").html(data.web).attr({"target": "_blank", "href": "http://" + data.web}).appendTo(retailerData);
		}
		
        $("<a>").addClass('showOnMap link top').attr({'href': '#', 'address': address, 'country': country}).html(RS.lang() == 'de' ? Translations.showOnMapDE : Translations.showOnMapEN).appendTo(retailerData);
        
		var routeLinks = $("<p>");
		var toLink = $(Map.getRouteToLink(address, country)).addClass('link');
		toLink.appendTo(routeLinks);
		$('<span>').html(' | ').appendTo(routeLinks);
		var fromLink = $(Map.getRouteFromLink(address, country)).addClass('link');
		fromLink.appendTo(routeLinks);
		routeLinks.appendTo(retailerData);
        //$("<p>").html(toLink + ' | ' + fromLink).appendTo(retailerData);
        

/*
		$("<p>").html($(Map.getRouteToLink(address, country)).addClass('link left')).appendTo(retailerData);
		$("<p>").html($(Map.getRouteFromLink(address, country)).addClass('link right')).appendTo(retailerData);
		$("<p>").addClass('c').appendTo(retailerData);
*/	
		retailer.appendTo("#retailers");
		
        // set marker to google map
		// Map.showAddressOnMap(company, address, RS.country);
    } 
    
}

