﻿var Searchmap = function($) {

    var priv = {
        minZoom: 4,
        maxZoom: 17,
        defaultLat: 49.210420445650286,
        defaultLng: 7.5146484375,
        defaultZoom: 5,

        pathPrefix: global.pathPrefix,
        fhQuery: '',
        googleMap: null,
        markerManager: null,
        updateMapTimeout: null,

        getMarkerValue: function(markerObj, value) {
            if (markerObj != null && markerObj.getAttribute(value)) {
                return markerObj.getAttribute(value);
            }
            else {
                return '';
            }
        },

        getIcon: function(multiple) {
            var icon = new GIcon();
            if (multiple) {
                icon.image = global.pathPrefix + "/images/googlemaps/marker-multiple.png";
            } else {
                icon.image = global.pathPrefix + "/images/googlemaps/marker-single.png";
            }
            icon.iconSize = new GSize(25, 25);
            icon.iconAnchor = new GPoint(12, 25);
            icon.infoWindowAnchor = new GPoint(20, 12);

            return icon;
        },

        getZoomIcon: function(markerCount, hover) {
            var markerSize = 24;
            if (markerCount > 999) {
                markerSize = 48;
            } else if (markerCount > 99) {
                markerSize = 40;
            } else if (markerCount > 9) {
                markerSize = 32;
            }

            var icon = new GIcon();
            icon.image = global.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;
        },

        createPopupMarker: function(gllPosition, markerObjArr) {
            //create marker with popup
            var opts = { "icon": priv.getIcon((markerObjArr.length > 1)) };
            var marker = new GMarker(gllPosition, opts);
            GEvent.addListener(marker, 'click', function() {
                var detailContent = '';
                var objectMax = 2;
                for (var i = 0; i < markerObjArr.length && i < objectMax; i++) {
                    var detailUrl = priv.getMarkerValue(markerObjArr[i], "linkurl");
                    var title = priv.getMarkerValue(markerObjArr[i], "title");
                    var price = priv.getMarkerValue(markerObjArr[i], "price");
                    var mainImage = priv.getMarkerValue(markerObjArr[i], "imageurl");
                    var shortDescription = priv.getMarkerValue(markerObjArr[i], "shortdescription");
                    var parcname = priv.getMarkerValue(markerObjArr[i], "parcname");
                    var parcurl = priv.getMarkerValue(markerObjArr[i], "parcurl");

                    detailContent += '<div class="mapInfoWindow">' +
                                        '<div class="title">' +
                                            '<a href="' + parcurl + '">' + parcname + '</a>,<br/>' +
                                            '<a href="' + detailUrl + '">' + title + '</a>' +
                                        '</div>' +
                                        '<div class="image"><a href="' + detailUrl + '"><img alt="' + title + '" src="' + mainImage + '" class="photo" /></a></div>' +
                                        '<div class="info">' +
                                            '<strong>' + price + '</strong><br/>' +
                                            '<p>' + shortDescription + '</p>' +
                                            '<a href="' + detailUrl + '">Bekijken &gt;</a>' +
                                        '</div><div class="clear-both"></div>' +
		                             '</div>';
                }
                priv.googleMap.openInfoWindowHtml(gllPosition, detailContent);
            });

            return marker;
        },

        createZoomMarker: function(gllPosition, strTargetText, intTargetZoom, strMarkerToolTip) {
            //Get rid of HTML tags and the 1000s separator or it will give problems when parsed
            var intMarkerCount = strTargetText;

            var opts = { "icon": priv.getZoomIcon(intMarkerCount, 'n'), "clickable": true, "draggable": false, "labelText": strTargetText, "labelOffset": new GSize(-23, -19), "title": strMarkerToolTip };
            var strHoverImage = priv.getZoomIcon(intMarkerCount, 'h').image;
            var strNoHoverImage = priv.getZoomIcon(intMarkerCount, 'n').image;

            var marker = new LabeledMarker(gllPosition, opts);
            //add click event... zoom in
            GEvent.addListener(marker, 'click', function() {
                priv.zoomToLocation(gllPosition.lat(), gllPosition.lng(), intTargetZoom);
            });
            //mouseover and mouseout make the marker change color when the mouse is over it
            GEvent.addListener(marker, 'mouseover', function() {
                marker.setImage(strHoverImage);
                marker.setTextColor("#00539F");
            });
            GEvent.addListener(marker, 'mouseout', function() {
                marker.setImage(strNoHoverImage);
                marker.setTextColor("#ffffff");
            });

            return marker;
        },

        setHistoryCookie: function() {
            $.cookie(global.cookiePrefix + "searchmap", priv.googleMap.getCenter().lat() + '^' + priv.googleMap.getCenter().lng() + '^' + priv.googleMap.getZoom(), { expires: 1, path: '/' });
        },

        zoomToLocation: function(fltLat, fltLng, intZoom) {
            priv.googleMap.setCenter(new GLatLng(fltLat, fltLng), intZoom);
        }
    };

    return {

        updateMap: function() {
            //$('#mapDebug').html('lat:'+priv.googleMap.getCenter().lat()+', lng:'+priv.googleMap.getCenter().lng()+', zoom:'+priv.googleMap.getZoom());

            // close open tooltips
            priv.googleMap.closeInfoWindow();

            // Get map variables
            var currentZoom = priv.googleMap.getZoom();
            var bounds = priv.googleMap.getBounds();
            var gllCenter = priv.googleMap.getCenter();
            var height2 = bounds.getSouthWest().distanceFrom(new GLatLng(bounds.getNorthEast().lat(), bounds.getSouthWest().lng()));
            var height3 = bounds.getNorthEast().distanceFrom(new GLatLng(bounds.getSouthWest().lat(), bounds.getNorthEast().lng()));
            var width2 = bounds.getSouthWest().distanceFrom(new GLatLng(bounds.getSouthWest().lat(), bounds.getNorthEast().lng()));
            var width3 = bounds.getNorthEast().distanceFrom(new GLatLng(bounds.getNorthEast().lat(), bounds.getSouthWest().lng()));
            var width = width2 > width3 ? width2 : width3;
            var height = height2 > height3 ? height2 : height3;
            var whiteLabel = $(".whiteLabelField").attr("value");
            // Build markers xml url
            var url = priv.pathPrefix + '/js/ajax/loadmap.ashx?' +
		              'lat=' + gllCenter.lat() +
		              '&lng=' + gllCenter.lng() +
		              '&zoomlevel=' + currentZoom +
		              '&width=' + width +
		              '&height=' + height +
		              '&WhiteLabel=' + whiteLabel +
		              '&fh_query=' + encodeURIComponent(priv.fhQuery);

            // Call the url
            GDownloadUrl(url, function(data, responseCode) {
                if (responseCode == 200) {
                    // Parse the returned url
                    var xmlDoc = GXml.parse(data);
                    
                    var resultCount = xmlDoc.documentElement.getAttribute("resultcount");
                    $('#resultcount').html(resultCount + ' woning(en)');
                    

                    // load the markers
                    var arrGroupMarkers = [];
                    var arrMarkers = [];
                    var fltCurrLat = 0;
                    var fltCurrLng = 0;
                    var markersXml = xmlDoc.documentElement.getElementsByTagName("marker");
                    // $('#mapDebug').html($('#mapDebug').html()+', resultcount:'+resultCount + ', markersXml: ' + markersXml.length);
                    for (var i = 0; i < markersXml.length; i++) {
                        var fltMarkerLat = parseFloat(markersXml[i].getAttribute("lat"));
                        var fltMarkerLng = parseFloat(markersXml[i].getAttribute("lng"));
                        var gllPoint = new GLatLng(fltMarkerLat, fltMarkerLng);
                        var name = markersXml[i].getAttribute("name");
                        var intMarkerClass = markersXml[i].getAttribute("jump");
                        var strMarkerText = markersXml[i].getAttribute("text");

                        if (intMarkerClass == '1') {
                            if (i > 0 && arrGroupMarkers.length > 0) {
                                //if not the same, flush and reset arrGroupMarkers
                                arrMarkers.push(priv.createPopupMarker(new GLatLng(fltCurrLat, fltCurrLng), arrGroupMarkers));
                                arrGroupMarkers = new Array();
                            }

                            //zoom marker... this one zooms in when clicked
                            var intMarkerZoom = parseInt(markersXml[i].getAttribute("zoom"));
                            var strMarkerToolTip = markersXml[i].getAttribute("tooltip");

                            //create empty bound box
                            var gllbBounds = new GLatLngBounds();

                            //get all vars for the two points
                            var fltTopLeftLat = parseFloat(markersXml[i].getAttribute("tllat"));
                            var fltTopLeftLon = parseFloat(markersXml[i].getAttribute("tllon"));
                            var fltBotRightLat = parseFloat(markersXml[i].getAttribute("brlat"));
                            var fltBotRightLon = parseFloat(markersXml[i].getAttribute("brlon"));

                            //create top left and bottom right points
                            var gllTopLeft = new GLatLng(fltTopLeftLat, fltTopLeftLon);
                            var gllBotRight = new GLatLng(fltBotRightLat, fltBotRightLon);

                            //add to bound box
                            gllbBounds.extend(gllTopLeft);
                            gllbBounds.extend(gllBotRight);

                            //if all went OK, the box will contain the marker
                            //if not, we use the zoom that has been set on the marker before creating
                            //the bound box. (preset in Web.config)
                            if (gllbBounds.contains(gllPoint)) {
                                //set zoom to what the map thinks it should be
                                intMarkerZoom = priv.googleMap.getBoundsZoomLevel(gllbBounds);
                                //if we are not moving up relative to current view
                                //force zoom in
                                if (intMarkerZoom <= currentZoom) {
                                    var intCurrentZoom = currentZoom;
                                    intMarkerZoom = intCurrentZoom + 1;
                                }
                            }
                            arrMarkers.push(priv.createZoomMarker(gllPoint, strMarkerText, intMarkerZoom, strMarkerToolTip));
                        }
                        else {
                            if (fltMarkerLat != fltCurrLat || fltMarkerLng != fltCurrLng) {
                                if (i > 0 && arrGroupMarkers.length > 0) {
                                    //if not the same, flush and reset arrGroupMarkers
                                    arrMarkers.push(priv.createPopupMarker(new GLatLng(fltCurrLat, fltCurrLng), arrGroupMarkers));
                                    arrGroupMarkers = new Array();
                                }
                                //set current lat lng
                                fltCurrLat = fltMarkerLat;
                                fltCurrLng = fltMarkerLng;
                            }

                            //add to current group
                            arrGroupMarkers.push(markersXml[i]);

                            //if last run flush
                            if ((i + 1) >= markersXml.length) {
                                arrMarkers.push(priv.createPopupMarker(new GLatLng(fltCurrLat, fltCurrLng), arrGroupMarkers));
                            }
                        }
                    }
                    priv.markerManager.clearMarkers();
                    priv.markerManager.addMarkers(arrMarkers, priv.minZoom, priv.maxZoom);
                    priv.markerManager.refresh();

                    // load the refinements
                    var refinements = xmlDoc.documentElement.getElementsByTagName("refinements")[0].childNodes[0].nodeValue;
                    $('#nav').html(refinements);
                    
                    $('#fredhopper #navigation ul.navigation a').bind('click', function() {
                        Searchmap.facetClick($(this).attr('href'));
                    });
                    $('#searchtype li:eq(1) a').bind('click', function() {
                        $.cookie(global.cookiePrefix + "_searchmap", '', { expires: -1, path: '/' });
                        Searchmap.facetClick($(this).attr('href'));
                        //setTimeout('location.reload(true)', 150);
                    });
                    Logic.bindFreeTextSearchEvents();
                }
            });
        },

        facetClick: function(href) {
            priv.fhQuery = Logic.getHashValue(href, 'fh_query');
            Searchmap.updateMap();
        },

        OnReady: function(doLoadDimensions, currentId) {
            if (GBrowserIsCompatible()) {
                // load googlemaps
                var cookieStr = $.cookie(global.cookiePrefix + "_searchmap");
                var lat = priv.defaultLat;
                var lng = priv.defaultLng;
                var z = priv.defaultZoom;
                if (cookieStr != null && cookieStr != '') {
                    var arrValues = cookieStr.split('^');
                    if (arrValues.length == 3) {
                        lat = parseFloat(arrValues[0]);
                        lng = parseFloat(arrValues[1]);
                        z = parseInt(arrValues[2]);
                    }
                }

                priv.googleMap = new GMap2($('#googlemap').get(0));
                priv.googleMap.addControl(new GLargeMapControl());
                priv.googleMap.addControl(new GMapTypeControl());
                priv.googleMap.addControl(new GScaleControl());
                priv.googleMap.addControl(new GOverviewMapControl());
                priv.googleMap.setCenter(new GLatLng(lat, lng), z);
                priv.googleMap.enableDoubleClickZoom();
                priv.googleMap.setMapType(G_HYBRID_MAP);

                // limit zooming
                var mapTypes = priv.googleMap.getMapTypes()
                for (var i in mapTypes) {
                    mapTypes[i].getMinimumResolution = function() { return priv.minZoom };
                    mapTypes[i].getMaximumResolution = function() { return priv.maxZoom };
                }

                // Set googlemaps events
                GEvent.addListener(priv.googleMap, 'zoomend', function() {
                    if (priv.updateMapTimeout != null) {
                        window.clearTimeout(priv.updateMapTimeout);
                    }
                    priv.updateMapTimeout = setTimeout('Searchmap.updateMap()', 150);
                });
                GEvent.addListener(priv.googleMap, 'dragend', function() {
                    if (priv.updateMapTimeout != null) {
                        window.clearTimeout(priv.updateMapTimeout);
                    }
                    priv.updateMapTimeout = setTimeout('Searchmap.updateMap()', 150);
                });
                GEvent.addListener(priv.googleMap, 'moveend', function() {
                    // add current search to cookie
                    priv.setHistoryCookie();
                });

                var markerMgrOptions = { minZoom: priv.minZoom, maxZoom: priv.maxZoom, trackMarkers: false };
                priv.markerManager = new MarkerManager(priv.googleMap, markerMgrOptions);

                // Update the map with markers
                priv.fhQuery = Logic.getHashValue(location.href, 'fh_query');
                Searchmap.updateMap();
            }
        }
    }

} (jQuery);

$(document).unload( function () { GUnload(); } );
