﻿var routemap = function ($){
	
	var priv = {
		markerManager : null,
        googleMap : null,
        pathPrefix : messages.path_prefix, 
        isAutoZooming : false,
        doAutoZoom : false,
        
		getIcon : function (markerObjArr, trans) {
            var icon = new GIcon();
            if(trans != null && trans == true){
                icon.image = priv.pathPrefix + 'images/trans.gif';
                icon.iconAnchor = new GPoint(15, 24);
                icon.iconSize = new GSize(31, 49);
            } else {
                if(markerObjArr.length > 1){
                    // is a marker with multiple accommodation
                    icon.image = priv.pathPrefix + '/images/googlemaps/marker_multiple.png';
                    icon.iconAnchor = new GPoint(15, 24);
                    icon.iconSize = new GSize(31, 49);
                } else {
                    // is a marker for a single accommodation
                    var priority = priv.getMarkerValue(markerObjArr[0], "priority");
                    if(priority == '1'){
                        icon.image = priv.pathPrefix + '/images/googlemaps/marker_single_prio1.png';
                    } else {
                        icon.image = priv.pathPrefix + '/images/googlemaps/marker_single.png';
                    }
                    icon.iconAnchor = new GPoint(15, 24);
                    icon.iconSize = new GSize(31, 49);
                }
            }

            return icon;
        },
        
        getZoomIcon : function (markerCount, hover) {
            var markerSize = 28;
            if(markerCount > 999){
                markerSize = 60;
            } else if(markerCount > 99){
                markerSize = 44;
            } else if(markerCount > 9){
                markerSize = 36;
            }
        
            var icon = new GIcon();
            icon.image = priv.pathPrefix + '/images/googlemaps/marker'+markerSize+'x'+markerSize+hover+'.png';
            icon.iconSize = new GSize(markerSize, markerSize);
            icon.iconAnchor = new GPoint((markerSize/2), (markerSize/2));

            return icon;
        },
        
        getMarkerValue : function(markerObj, value){
           if(markerObj != null && markerObj.getAttribute(value)){
                return markerObj.getAttribute(value);
           }
           else {
                return '';
           }
        },
        
        createPopupMarker : function (gllPosition, markerObjArr)
        {
            //create marker with popup
            var icon = priv.getIcon(markerObjArr);
            var opts = {"icon": icon}; 
            var marker = new GMarker(gllPosition, opts);  
            //markerObjArr is the full set of properties that have been created in XML... tooltip takes care of display issues
            
            return marker;
        },
        
        zoomToLocation : function(fltLat, fltLng, intZoom){
            priv.googleMap.setCenter(new GLatLng(fltLat, fltLng), intZoom);
        },
        
        setHistoryCookie : function(){
            $.cookie(messages.cookie_prefix + "searchmap", priv.googleMap.getCenter().lat()+'^'+priv.googleMap.getCenter().lng()+'^'+priv.googleMap.getZoom(), { expires: 365, path : '/' });
        },
        
        showIndicator : function(){
            // disable all user actions on the map
            // to prevent overloading the server with marker requests
            if( isPrintView != 1){
                priv.googleMap.disableDragging();
                priv.googleMap.disableContinuousZoom();
                priv.googleMap.disableDoubleClickZoom();
            }
            //disallow user actions on the zoom / pan control
            //Control.LockControl();

		    
		    //going to do something that might take some time... display loading message
            if(document.getElementById("mapLoading")){
                document.getElementById("mapLoading").style.display = '';
            }
        },
        
        hideIndicator : function(){
            //hide loading text
            if(document.getElementById("mapLoading")){
                document.getElementById("mapLoading").style.display = 'none';
            }
            
            if( isPrintView != 1){
                //Done... give control back
                priv.googleMap.enableDragging();
    	        priv.googleMap.enableContinuousZoom();
	            priv.googleMap.enableDoubleClickZoom();
	        }
	        
            //allow user actions on the zoom / pan control
            //Control.UnlockControl();
        },
        
		createMap : function(){
		    // close open tooltips
		    priv.googleMap.closeInfoWindow();
		
		    // Clear current markers
		    priv.markerManager.clearMarkers();
		    priv.markerManager.refresh();
		    
		    // show indicator
		    priv.showIndicator();
		    
		    // Get map variables
		    var gllbCornerMapLatNE = parseFloat(priv.googleMap.getBounds().getNorthEast().lat());
            var gllbCornerMapLngNE = parseFloat(priv.googleMap.getBounds().getNorthEast().lng());
            var gllbCornerMapLatSW = parseFloat(priv.googleMap.getBounds().getSouthWest().lat());
            var gllbCornerMapLngSW = parseFloat(priv.googleMap.getBounds().getSouthWest().lng());
		    var gllCenter = priv.googleMap.getCenter();
		    
		    var xmlDoc = GXml.parse(xmlData);
            
            var arrGroupMarkers=[];
            var arrMarkers=[];
            var fltCurrLat = 0;
            var fltCurrLng = 0;
            var newZoom = priv.googleMap.getZoom();
            
            var strDirection = "";
                    
            var NoRouteZoomLevel = xmlDoc.documentElement.getElementsByTagName("zoomForNoRoute");
            var zoomNoRoute = parseInt(NoRouteZoomLevel[0].getAttribute("zoom"));
                    
            // get all markers and loop through them
		    var markers = xmlDoc.documentElement.getElementsByTagName("marker");  
        	var bounds = new GLatLngBounds(); 
        	       	
		    for (var i = 0; i < markers.length; i++) {
		        var fltMarkerLat = parseFloat(markers[i].getAttribute("lat"));
                var fltMarkerLng = parseFloat(markers[i].getAttribute("lng"));
                var intMarkerClass = markers[i].getAttribute("jump");
                var strMarkerText = markers[i].getAttribute("text");
                var gllPoint = new GLatLng(fltMarkerLat,fltMarkerLng);
                bounds.extend(gllPoint);
                
                
                if(fltMarkerLat == 0 && fltMarkerLng == 0){
                    tempMarker = markers[i];
                    var strAddress = markers[i].getAttribute("Address");
                    var geocoder = new GClientGeocoder();
                    geocoder.getLatLng(
                        strAddress,
                        function(point) {
                            if (!point) {
                                // do not add customer address to map
                                if (markers.length == 2) {
                                    //if there is only one marker left (the 2nd one isn't shown), zoom in on that one
		                            var fltFirstMarkerLat = parseFloat(markers[0].getAttribute("lat"));
                                    var fltFirstMarkerLng = parseFloat(markers[0].getAttribute("lng"));
                                    if (fltFirstMarkerLng == 0 && fltFirstMarkerLat == 0) {
                                        intNewMapZoom = priv.googleMap.getZoom();
                                        priv.finalize(arrMarkers, intNewMapZoom);
                                    }
                                    else {
                                        priv.googleMap.setCenter(new GLatLng(fltFirstMarkerLat, fltFirstMarkerLng), 14); 
                                        priv.finalize(arrMarkers, 14);
                                    }
                                }
                                else {
                                    intNewMapZoom = priv.googleMap.getZoom();
                                    priv.finalize(arrMarkers, intNewMapZoom);
                                }
                            } else {
                                arrGroupMarkers=new Array();
                                tempMarker.setAttribute("lat", point.y);
                                tempMarker.setAttribute("lng", point.x);
                                arrGroupMarkers.push(tempMarker);
                                arrMarkers.push(priv.createPopupMarker(point, arrGroupMarkers));
                                
                                // use google direction to draw route
                                strDirection = "from: " + point.y + ", " + point.x + strDirection;
                                var directionsPanel = document.getElementById("directions");
                                var directions = new GDirections(priv.googleMap, directionsPanel);
                                directions.load(strDirection, { "locale": strLocale, getPolyline:true });
                                intNewMapZoom = priv.googleMap.getZoom();
                                priv.finalize(arrMarkers, intNewMapZoom);

                            }
                        }
                    );

                }else{                
                    arrGroupMarkers=new Array();
                    arrGroupMarkers.push(markers[i]);
                    var point = new GLatLng(fltMarkerLat,fltMarkerLng);
                    arrMarkers.push(priv.createPopupMarker(new GLatLng(fltMarkerLat,fltMarkerLng), arrGroupMarkers));
                    
                    // if only restaurant coordinates
                    // then show only restaurant marker
                    if(markers.length == 1){
                        intNewMapZoom = zoomNoRoute;
                        priv.googleMap.setCenter(new GLatLng(fltMarkerLat, fltMarkerLng), intNewMapZoom); 
                        priv.finalize(arrMarkers, intNewMapZoom);
                    }
                    strDirection = " to: " + fltMarkerLat + ", " + fltMarkerLng;
                }
            }//for markers
		},
		
		finalize : function(arrMarkers, intNewMapZoom)
        {
            if(priv.doAutoZoom && !bounds.isEmpty()){
                var autoZoomLevel = priv.googleMap.getBoundsZoomLevel(bounds);
                if(autoZoomLevel > 16)
                    autoZoomLevel = 16;
                  
                newZoom = autoZoomLevel;
                if(autoZoomLevel > 3){
                    priv.isAutoZooming = true;
                    priv.googleMap.setZoom(autoZoomLevel);
                    priv.googleMap.setCenter(bounds.getCenter());
                }
                priv.doAutoZoom = false;
            }
            
            // Add markers to map
            priv.markerManager.addMarkers(arrMarkers, /*min zoom value*/4, /*max zoom value*/20);
            priv.markerManager.refresh();
            
            // hide indicator
		    priv.hideIndicator();            
        }
	};
	
	return {
	    
        dimensionClick : function(href, doAutoZoom){
            priv.setHistoryCookie();
            if(doAutoZoom != null && doAutoZoom)
                priv.doAutoZoom = true;
            priv.updateMap();
        },
 
        loadGoogleMaps : function() {           
        
            // Initialize GoogleMaps in Div
            var params = Logic.getJsParams('/routemap.js');
            var lat = parseFloat(params.lat);
            var lng = parseFloat(params.lng);
            var z = parseInt(params.z);
            var cookieStr = $.cookie(messages.cookie_prefix + "routemap");
            if(cookieStr != null && cookieStr != ''){
                var arrValues = cookieStr.split('^');
                if(arrValues.length == 4 && arrValues[0] != 'undefined'){
                    lat = parseFloat(arrValues[0]);
                    lng = parseFloat(arrValues[1]);
                    z = parseInt(arrValues[2]);
                } else {
                    $.cookie(messages.cookie_prefix + "routemap", '', { expires: -1 });
                }
            }
            if(isPrintView == 1){
                $('#googleMap').jmap({center:[lat,lng],zoom:z,showzoom:false,dragging:false,scrollzoom:false,smoothzoom:false,doubleclickzoom:false,showoverview:false,showtype:true,controlsize:"none",maxZoom:6,minZoom:22});
            }else
                $('#googleMap').jmap({center:[lat,lng],zoom:z,showoverview:true,showtype:true,controlsize:"large",maxZoom:6,minZoom:22});
            
            // Set googlemaps and initialize markermanager
            priv.googleMap = $('#googleMap').myMap();
            priv.markerManager = new MarkerManager(priv.googleMap, {maxZoom:22});    

            // Update the map with markers
            priv.createMap();
        }
        
	}
	
}(jQuery);
