﻿
var searchlist = function() {

    var searchparams;

    var centerLat;
    var centerLon;
    var zoom;

    var map = null;
    var geocoder = null;

    var poiData = null;
    var propData = null;
    var propGroupData = null;

    //var PROPICONMAP = { 1: "l", 2: "l", 3: "a", 4: "l", 5: "a", 6: "l", 7: "l", 8: "l", 9: "c", 10: "a", 11: "l", 12: "l", 13: "l", 14: "l", 15: "l", 16: "c", 17: "c", 18: "c", 19: "c", 20: "c", 21: "c", 23: "a", 24: "l", 25: "a", 26: "l", 28: "l", 29: "a", 30: "l", 31: "l", 32: "l", 33: "l", 34: "a", 35: "a", 36: "l", 37: "l", 38: "l", 39: "l", 40: "l", 41: "l", 42: "l", 43: "l", 44: "l", 45: "l", 46: "l", 47: "l", 48: "l", 49: "l", 50: "l", 51: "l", 52: "l", 53: "c", 54: "c", 55: "c", 56: "l", 57: "l", 58: "l", 59: "a", 60: "a", 61: "l", 9999: "g" }
    var PROPICONMAP = { 1: "a", 2: "a", 3: "a", 4: "a", 5: "a", 6: "l", 7: "l", 8: "l", 9: "l", 10: "l", 11: "l", 12: "l", 13: "l", 14: "c", 15: "c", 16: "c", 17: "c", 18: "c", 19: "c", 20: "c", 21: "c", 22: "c", 23: "c", 24: "l", 25: "l", 9999: "g" }

    var ICONSPOI = [];
    var ICONSPROP = [];
    var markers = [];
    var mgrs = [];  // marker managers
    var overlays = [];
    var clickMarkerPoi = null;
    var clickMarkerProp = null;
    var mapDragEvent = null;
    var mapZoomEvent = null;

    // ajax variables
    var poiSearchAjax = null;
    var listSearchAjax = null;
    var mapPoiAjax = null;
    var mapPropAjax = null;

    var propertyPopups = []

    var origCenter = null;


    function initGMap() {
        if (GBrowserIsCompatible()) {
            map = new GMap2(document.getElementById("map_canvas"));
            geocoder = new GClientGeocoder();
            map.setCenter(new GLatLng(centerLat, centerLon), zoom);
            map.setUIToDefault();

            //var mgrOptions = { borderPadding: 50, maxZoom: 15, trackMarkers: true };
            for (key in poicategories) {
                // initialize marker manager
                mgrs[poicategories[key].PoiCategoryId] = new MarkerManager(map);

                // initialize markers reference
                markers[poicategories[key].PoiCategoryId] = [];
            }

            // 9999 is used for properties
            mgrs[9999] = new MarkerManager(map);
            markers[9999] = [];

            mapDragEvent = GEvent.addListener(map, "dragend", function() { mapPanned(); });
            mapZoomEvent = GEvent.addListener(map, "zoomend", function() { mapPanned(); });

            GEvent.addListener(map, 'infowindowclose', function() {
                if (origCenter) map.panTo(origCenter);
            });

        }

        // send request
        //mapPanned();

    }

    function showMap() {
        $('#map').slideDown("fast");
        $('#maptoggler').text("Hide Map");
        map.checkResize();
        map.setCenter(map.getCenter());

    }

    function hideMap() {
        $('#map').slideUp("fast");
        $('#maptoggler').text("Show Map");
    }


    function mapPanned(preserveClickMarker, addHistory) {

        if (map != null)
            origCenter = map.getCenter();

        if (preserveClickMarker == false) {
            clickMarkerPoi = null;
            clickMarkerProperties = null;
        }


        if (searchparams.mapsearch) {
            searchparams.page = 1;
            listSearch();
            mapSearch();
        }
        else {
            mapSearch(false);
        }

        if (addHistory == undefined || addHistory == true) {
            var hash = $.param(buildparams(searchparams));
            ajaxHistory.add(document.location.pathname + "?" + hash);
        }
        //document.location.hash = hash;

    }


    function buildPropertyDialog(property) {
        var price = "";
        if (searchparams.searchtypeid && (searchparams.searchtypeid == 1 || searchparams.searchtypeid == 3)) {
            if (property.SellingPrice > 0) price = "RM" + property.SellingPrice;
        } else if (searchparams.searchtypeid && (searchparams.searchtypeid == 2)) {
            if (property.RentalPrice > 0) price = "RM" + property.RentalPrice;
        } else {
            if (property.RentalPrice > 0) price = "RM" + property.RentalPrice;
            if (property.SellingPrice > 0) price = "RM" + property.SellingPrice;
        }

        var landarea = "";
        if (property.LandArea) {
            var landareas = property.LandArea.split(",");
            if (landareas.length > 0) {
                if (landareas[0] == "0X0" || landareas[0] == "0x0") {
                    if (landareas.length > 1) {
                        if (parseInt(landareas[1]) > 0) {
                            landarea = landareas[1] + " Sq. Feet";
                        }
                    }
                }
                else {
                    landarea = landareas[0];
                }
            }
        }

        var bedrooms = "";
        if (property.Bedrooms > 0) bedrooms = property.Bedrooms;
        if (property.BedroomsExt > 0) bedrooms += " + " + property.BedroomsExt;

        var bathrooms = "";
        if (property.Bathrooms > 0) bathrooms = property.Bathrooms;

        var str = "<table class='propertyPopup' cellpadding='0' cellspacing='0' width='300'>" +
                    "<tr class='title'><td><a href='details.aspx?pid=" + property.PropertyID + "'>" + (property.Name || "") + "</a></td><td align='center'>" + price + "</td></tr>" +
                    "<tr><td width='280'><table width='100%'>" +
                        "<tr><td width='50' class='label'>Property Type:</td><td class='desc'>" + (property.PropertyTypeName || "") + "</td></tr>" +
                        "<tr><td  class='label'>Bedrooms:</td><td class='desc'>" + bedrooms + "</td></tr>" +
                        "<tr><td  class='label'>Bathrooms:</td><td class='desc'>" + bathrooms + "</td></tr>" +
                        "<tr><td class='label'>Land Area:</td><td class='desc'>" + landarea + "</td></tr>" +
        //"<tr><td class='label'>Furnishing:</td><td class='desc'>" + (property.FurnishingType || "") + "</td></tr>" +
                        "<tr><td class='label'>Land Title: </td><td class='desc'>" + (property.PropertyHoldTitleName || "") + "</td></tr>" +
                    "</table></td>" +
                    "<td width='120'><a href='details.aspx?pid=" + property.PropertyID + "'><img src='" + property.PropertyImageFile + "' width=120 height=90 /></a>" + "</td></tr>" +
                    "</table>";
        return str;
    }

    function buildPropertyGroupDialog(properties) {

        var str = "<div class='propertyGroupPopup'><table class='propertyPopup' cellpadding='0' cellspacing='0'><tr class='title'><td width='200'>Address</td><td width='80'>Price</td><td width='30'>BR</td><td width='50'>Size</td></tr>";

        for (var i = 0; i < properties.length; i++) {
            var property = properties[i];

            var price = "";
            if (searchparams.searchtypeid && (searchparams.searchtypeid == 1 || searchparams.searchtypeid == 3)) {
                if (property.SellingPrice > 0) price = "RM" + property.SellingPrice;
            } else if (searchparams.searchtypeid && (searchparams.searchtypeid == 2)) {
                if (property.RentalPrice > 0) price = "RM" + property.RentalPrice;
            } else {
                if (property.RentalPrice > 0) price = "RM" + property.RentalPrice;
                if (property.SellingPrice > 0) price = "RM" + property.SellingPrice;
            }


            var landarea = "";
            if (property.LandArea) {
                var landareas = property.LandArea.split(",");
                if (landareas.length > 0) {
                    if (landareas[0] == "0X0" || landareas[0] == "0x0") {
                        if (landareas.length > 1) {
                            if (parseInt(landareas[1]) > 0) {
                                landarea = landareas[1] + " Sq. Feet";
                            }
                        }
                    }
                    else {
                        landarea = landareas[0];
                    }
                }
            }

            var bedrooms = "";
            if (property.Bedrooms > 0) bedrooms = property.Bedrooms;
            if (property.BedroomsExt > 0) bedrooms += " + " + property.BedroomsExt;

            var bathrooms = "";
            if (property.Bathrooms > 0) bathrooms = property.Bathrooms;

            var bLineOdd = !bLineOdd;

            str += "<tr onclick='searchlist.showDialog(" + property.PropertyID + " , " + property.Lat + " , " + property.Lon + ")'>"
            str += "<td class='line_" + i % 2 + "'>" + (property.Name || "") + "</td>";
            str += "<td class='line_" + i % 2 + "'>" + price + "</td>";
            str += "<td class='line_" + i % 2 + "'>" + bedrooms + "</td>";
            str += "<td class='line_" + i % 2 + "'>" + landarea + "</td>";
            str += "</tr>"

        }

        str += "</table></div>";
        return str;
    }



    function createPoiMarker(poi) {
        var point = new GLatLng(poi.Lat, poi.Lon);
        var marker = new GMarker(point, { icon: getPoiIcon(poi.PoiSubCategoryId) });
        //var marker = new GMarker(point);

        GEvent.addListener(marker, "click", function() {
            clickMarkerPoi = marker;   // set click marker so that don't delete the marker when panned and popup wont't disappear 

            var cdiv = document.createElement("div");
            var div1 = document.createElement("div");
            var div2 = document.createElement("div");
            cdiv.appendChild(div1);
            cdiv.appendChild(div2);

            div1.innerHTML = "<b>" + poi.Name + "</b>";
            div2.innerHTML = poi.PoiCategoryName + "<br/><img src='" + "/content/images/map/" + poi.PoiSubCategoryId + ".gif" + "' /> ";

            marker.openInfoWindowHtml(cdiv.outerHTML);
        });

        return marker;
    }

    function createPropertyMarker(property) {
        var point = new GLatLng(property.Lat, property.Lon);
        var marker = new GMarker(point, { icon: getPropertyIcon(property.PropertyTypeID || 6, property.UserTypeID) });
        //var marker = new GMarker(point);


        GEvent.addListener(marker, "click", function() {
            clickMarkerProp = marker;   // set click marker so that don't delete the marker when panned and popup wont't disappear 
            marker.openInfoWindowHtml(buildPropertyDialog(property));
        });

        return marker;
    }

    function createPropertyGroupMarker(properties) {
        var property = properties[0];

        var type = 3;

        for (var i = 0; i < properties.length; i++) {
            if (properties[i].UserTypeID != 3) {
                type = undefined;
                break;
            }
        }


        var point = new GLatLng(property.Lat, property.Lon);
        var marker = new GMarker(point, { icon: getPropertyIcon(9999, type) });
        //var marker = new GMarker(point);


        GEvent.addListener(marker, "click", function() {
            clickMarkerProp = marker;   // set click marker so that don't delete the marker when panned and popup wont't disappear
            marker.openInfoWindowHtml(buildPropertyGroupDialog(properties));
        });

        return marker;
    }


    function refreshMapPoi(data) {
        var clickmarkerfound = false;
        // remove poi markers which isn't the currently selected marker
        for (key in markers) {
            if (key == 9999) continue;
            while (markers[key].length > 0) {
                var marker = markers[key].pop();
                if (marker != clickMarkerPoi) mgrs[key].removeMarker(marker);
            }
        }

        // clickmarker's lat & lon
        var cmLatLng = null;
        if (clickMarkerPoi) cmLatLng = clickMarkerPoi.getLatLng();


        // populate poi
        if (data) {
            for (var i = 0; i < data.pois.length; i++) {
                var poi = data.pois[i];
                var marker = createPoiMarker(poi);
                var mLatlng = marker.getLatLng();

                if (clickMarkerPoi && mLatlng.lat() == cmLatLng.lat() && mLatlng.lng() == cmLatLng.lng()) {
                    clickmarkerfound = true;
                    markers[poi.PoiCategoryId].push(clickMarkerPoi);
                } else {
                    markers[poi.PoiCategoryId].push(marker);
                    mgrs[poi.PoiCategoryId].addMarker(marker, 14);
                }
            }
        }

        if (!clickmarkerfound && clickMarkerPoi) {
            mgrs[key].removeMarker(clickMarkerPoi);
        }


        clickMarkerPoi = null;
    }

    function refreshMapProp(data) {
        var clickmarkerfound = false;
        // remove property markers which isn't the currently selected marker
        for (key in markers) {
            if (key != 9999) continue;
            while (markers[key].length > 0) {
                var marker = markers[key].pop();
                if (marker != clickMarkerProp) mgrs[key].removeMarker(marker);
            }
        }

        // clickmarker's lat & lon
        var cmLatLng = null;
        if (clickMarkerProp) cmLatLng = clickMarkerProp.getLatLng();


        // populate property
        propertyPopups = [];
        for (var latgroup in data) {
            for (var longroup in data[latgroup]) {
                if (data[latgroup][longroup].length > 1) {
                    // property popups for show on map
                    for (var i = 0; i < data[latgroup][longroup].length; i++) {
                        var property = data[latgroup][longroup][i];
                        propertyPopups[property.PropertyID] = buildPropertyDialog(property);

                    }

                    // create group marker with propertlisting popup

                    var marker = createPropertyGroupMarker(data[latgroup][longroup]);
                    var mLatlng = marker.getLatLng();

                    if (clickMarkerProp && mLatlng.lat() == cmLatLng.lat() && mLatlng.lng() == cmLatLng.lng()) {
                        clickmarkerfound = true;
                        markers[9999].push(clickMarkerProp);
                    } else {
                        markers[9999].push(marker);
                        mgrs[9999].addMarker(marker, 1);
                    }


                } else {
                    var property = data[latgroup][longroup][0];

                    propertyPopups[property.PropertyID] = buildPropertyDialog(property);
                    var marker = createPropertyMarker(property);
                    var mLatlng = marker.getLatLng();

                    if (clickMarkerProp && mLatlng.lat() == cmLatLng.lat() && mLatlng.lng() == cmLatLng.lng()) {
                        clickmarkerfound = true;
                        markers[9999].push(clickMarkerProp);
                    } else {
                        markers[9999].push(marker);
                        mgrs[9999].addMarker(marker, 1);
                    }

                }
            }
        }


        if (!clickmarkerfound && clickMarkerProp) {
            mgrs[key].removeMarker(clickMarkerProp);
        }

        //GEvent.trigger(markers[9999][0], "click"); 
        //markers[9999][0].click(new GLatLng(markers[9999][0].getLatLng().lat(), markers[9999][0].getLatLng().lon()))
        //var lat = markers[9999][0].getLatLng().lat();
        //var lon = markers[9999][0].getLatLng().lng();
        //GEvent.trigger(mgrs[9999].getMarker(lat, lon,1), "click");

        clickMarkerProp = null;
    }


    function getPoiIcon(id) {
        if (!ICONSPOI[id]) {
            if (poisubcategories[id]) {
                var icon = new GIcon();
                icon.image = "/content/images/map/" + id + ".gif";
                icon.iconAnchor = new GPoint(parseInt(poisubcategories[id].Width / 2), parseInt(poisubcategories[id].Height / 2));
                icon.infoWindowAnchor = new GPoint(parseInt(poisubcategories[id].Width / 2), 0);
                icon.iconSize = new GSize(poisubcategories[id].Width, poisubcategories[id].Height);
                //icon.shadow = "/content/images/map/" + name + "-shadow.png";
                //icon.shadowSize = new GSize(59, 32);
                ICONSPOI[id] = icon;
            }
            else {
                var icon = new GIcon();
                ICONSPOI[id] = icon;
            }
        }
        return ICONSPOI[id];
    }


    function getPropertyIcon(id, usertype) {
        var type = "";
        if (usertype == 3) type = "new-";

        if (!ICONSPROP[id.toString() + type]) {
            var res = PROPICONMAP[id]
            var name = "residential_landed";
            var iconAnchor;
            var infoWindowAnchor;
            var iconSize;
            var shadowSize;

            iconAnchor = new GPoint(18, 18);
            infoWindowAnchor = new GPoint(18, 0);
            iconSize = new GSize(37, 42);
            shadowSize = new GSize(37, 34);

            switch (res) {
                case "a":
                    name = "apartment";
                    break;
                case "l":
                    name = "landed";
                    break;
                case "c":
                    name = "commercial";
                    break;
                case "i":
                    name = "industrial";
                    break;
                case "g":
                    name = "group";
                    iconSize = new GSize(46, 53);
                    break;
                default:
                    name = "landed";
                    break;
            }
            var icon = new GIcon();
            icon.image = "/content/images/map/" + type + name + ".png";
            icon.iconAnchor = iconAnchor;
            icon.infoWindowAnchor = infoWindowAnchor;
            icon.iconSize = iconSize;
            icon.shadow = "/content/images/map/" + name + "-shadow.png";
            icon.shadowSize = shadowSize;
            ICONSPROP[id + type] = icon;
        }
        return ICONSPROP[id + type];
    }


    function centerToLink(e, lat, lon, zoom) {
        e.click(function() {
            showMap();
            centerTo(lat, lon, zoom);
            return false;
        });

    }

    function centerTo(lat, lon, zoom) {
        map.setCenter(new GLatLng(lat, lon), zoom);
        mapPanned();
    }

    // search

    function buildparams(searchparams) {
        var params = {};
        // deep cloning of parameters
        for (var key in searchparams) {
            if (searchparams[key]) {
                params[key.toLowerCase()] = searchparams[key];
            }
        }

        if (map) {
            var bounds = map.getBounds();
            var southWest = bounds.getSouthWest();
            var northEast = bounds.getNorthEast();
            var lngSpan = northEast.lng() - southWest.lng();
            var latSpan = northEast.lat() - southWest.lat();

            var neLat = northEast.lat();
            var neLon = northEast.lng();
            var swLat = southWest.lat();
            var swLon = southWest.lng();

            var bqs = neLat + "," + neLon + "," + swLat + "," + swLon;
            for (var key in searchparams) {
                params["bound"] = bqs;
            }

            var clatlng = map.getCenter()

            params["center"] = clatlng.lat() + "," + clatlng.lng();
            params["zoom"] = map.getZoom();
        }

        return params;
    }


    function groupPropertyData(data) {
        var d = [];

        for (var i = 0; i < data.properties.length; i++) {
            var prop = data.properties[i];
            if (d[prop.Lat.toString()] == undefined) d[prop.Lat.toString()] = [];
            if (d[prop.Lat.toString()][prop.Lon.toString()] == undefined) d[prop.Lat.toString()][prop.Lon.toString()] = [];
            d[prop.Lat.toString()][prop.Lon.toString()].push(prop);
        }



        return d;
    }


    function mapSearch(propSearch) {
        function poiCallback(data, textStatus) {
            if (textStatus == 'success') {
                poiData = data;

                refreshMapPoi(poiData);
            } else {
            }
        }

        function propCallback(data, textStatus) {
            if (textStatus == 'success') {
                propData = data;
                propGroupData = groupPropertyData(propData);
                refreshMapProp(propGroupData);
            } else {
            }
        }

        searchparams.center = map.getCenter().lat() + "," + map.getCenter().lng();

        // get all the search parameters
        var params = buildparams(searchparams);


        var bounds = map.getBounds();
        var southWest = bounds.getSouthWest();
        var northEast = bounds.getNorthEast();
        var lngSpan = northEast.lng() - southWest.lng();
        var latSpan = northEast.lat() - southWest.lat();

        var neLat = northEast.lat();
        var neLon = northEast.lng();
        var swLat = southWest.lat();
        var swLon = southWest.lng();

        var bqs = neLat + "," + neLon + "," + swLat + "," + swLon;
        for (var key in searchparams) {
            params["Bound"] = bqs;
        }

        if (map.getZoom() >= 14) {
            if (mapPoiAjax != null) mapPoiAjax.abort();
            mapPoiAjax = $.getJSON("mappoi.ashx?bound=" + bqs, null, poiCallback);
        }

        if (propSearch == undefined || propSearch == true) {
            if (mapPropAjax != null) mapPropAjax.abort();
            mapPropAjax = $.getJSON("mapprop.ashx?", params, propCallback);
        }

    }

    // query main page and capture the content out
    function listSearch() {
        function pagingCallback(data, textStatus) {
            var div = document.createElement("div")
            div.innerHTML = data;
            $("#searchresults").html($(data).find("#searchresults").html());
            //initPaging();

            // reinit sorting since live("change") is not fully supported esp in IE8
            initSortOrder()
        }


        var params = buildparams(searchparams);

        if (listSearchAjax != null) listSearchAjax.abort();
        listSearchAjax = $.get("searchlist.aspx", params, pagingCallback, "html");


    }


    function poiSearch(relocate) {

        function searchCallback(data, textStatus) {
            if (textStatus == 'success') {
                $("#poi_result").html("");
                var ul = document.createElement("ul");
                for (var i = 0; i < data.pois.length; i++) {
                    var poi = data.pois[i];
                    var img = document.createElement("img");
                    var li = document.createElement("li");
                    var a = document.createElement("a");
                    ul.appendChild(li);
                    li.innerHTML = "<table width='100%' height='100%'><tr><td width='20'><img src='/content/images/map/" + poi.PoiSubCategoryId + ".gif'></td><td><a href='#'>" + poi.Name + "</a></td></tr></table>"

                    //img.src = "/content/images/map/" + poi.PoiSubCategoryId + ".gif";
                    //a.innerText = poi.Name;
                    //a.href = "#";

                    //alert()

                    centerToLink($(li).find("a"), poi.Lat, poi.Lon, 16);

                }
                $("#poi_result").append(ul);

                if (relocate == true || relocate == undefined) {
                    if (data.pois.length > 0) {
                        centerTo(data.pois[0].Lat, data.pois[0].Lon, 16);
                        origCenter = map.getCenter();
                    }
                }

            } else {
                alert('failed');
            }
        }

        if (searchparams.mapsearch) {
            var val = $("#query").val();
            var centerPoint = map.getCenter();
            bqs = "keywords=" + encodeURIComponent(searchparams.keywords) + "&center=" + centerPoint.lat() + "," + centerPoint.lng();
            if (poiSearchAjax != null) poiSearchAjax.abort();
            poiSearchAjax = $.getJSON("poisearch.ashx?" + bqs, null, searchCallback);

        }
    }









    // ajax history
    function initAjaxHistory() {
        ajaxHistory.initialize(historyLoad);
    }

    function historyLoad(hash) {
        //if (hash.length == 0) hash = $.param(origparams);

        if ((hashparams = hash.match(/searchlist.aspx\?(.*)/i)[1])) {
            // clear map event
            if (mapDragEvent) GEvent.removeListener(mapDragEvent);
            if (mapZoomEvent) GEvent.removeListener(mapZoomEvent);
            mapDragEvent = null;
            mapZoomEvent = null;

            var params = {};
            var paramstring = hashparams;
            if (paramstring.length != 0) {
                // create an array
                var qs = paramstring.split("&");
                // get first parameter value
                for (var i = 0; i < qs.length; i++) {
                    if (qs[i].split("=")[0] == "page") {
                        params[qs[i].split("=")[0]] = parseInt(decodeURIComponent(qs[i].split("=")[1]));
                    } else {
                        params[qs[i].split("=")[0]] = decodeURIComponent(qs[i].split("=")[1].replace(/\+/g, " "));
                    }
                }
            }

            if (params.center) {
                var center = new GLatLng(params.center.split(",")[0], params.center.split(",")[1]);
                if (map) map.setCenter(center);
            }
            if (params.zoom) {
                if (map) map.setZoom(parseInt(params.zoom));
            }


            if (params.isnoteworthyprop = "1") {
                $("#nsearch.x").val(params.isnoteworthyprop || "");
            }
            $("#keywords").val(params.keywords || "");
            $("#searchtypeid").val(params.searchtypeid || "");
            $("#usertypeids").val(params.usertypeids || "");
            $("#propertytypeids").val(params.propertytypeids || "");
            $("#bedroomfrom").val(params.bedroomfrom || "");
            $("#bathroomfrom").val(params.bathroomfrom || "");
            $("#pricefrom").val(params.pricefrom || "");
            $("#priceto").val(params.priceto || "");
            if (params.hasimage) $("#hasimage").attr("checked", "on");
            else $("#hasimage").removeAttr("checked");
            if (params.mapsearch) $("#mapsearch").attr("checked", "on");
            else $("#mapsearch").removeAttr("checked");
            if (params.isprinted) $("#isprinted").attr("checked", "on");
            else $("#isprinted").removeAttr("checked");

            hideShowPrintRefine();

            searchparams = params;

            listSearch();
            mapSearch();

            // set map event
            mapDragEvent = GEvent.addListener(map, "dragend", function() { mapPanned(); });
            mapZoomEvent = GEvent.addListener(map, "zoomend", function() { mapPanned(); });

        }

    }





    // forms

    function initForm() {
        // form submit initialize
        $("#aspnetForm").attr("method", "GET");
        $("#aspnetForm").submit(function() {
            var paramstring = $("#aspnetForm").serialize(); ;
            var params = $.queryString(paramstring);
            params.page = 1;
            params = buildparams(params);
            if (!params.mapsearch) {
                delete params["Center"];
                delete params["Zoom"];
                delete params["Bound"];
                delete params["center"];
                delete params["zoom"];
                delete params["bound"];
            }
            searchparams = params;

            paramstring = $.queryString(params);

            clickMarkerProp = null;
            clickMarkerPoi = null;

            if (params.mapsearch) {
                showMap();
            } else {
                //hideMap();
            }

            if (searchparams.mapsearch && searchparams.keywords && searchparams.keywords.length > 0) {
                $("#poi_searchresult").slideDown("fast");
            } else {
                $("#poi_searchresult").slideUp("fast");
            }

            var hash = $.param(params);
            ajaxHistory.add(document.location.pathname + "?" + hash);

            $.scrollTo($("#newsearch"), 300);

            listSearch();
            mapSearch();
            poiSearch();

            // title
            document.title = "StarProperty - " + (params.keywords || "");

            return false;
        });
    }


    // poi

    function initPoiFilters() {

        // POI filter initialize
        $("a[id*='filter_']").click(function() {
            var a = $("#" + this.id);

            // if is currently checked
            var pcatid = this.id.match(/filter_([\d]+)/)[1];

            // if markermanager is visible
            if (mgrs[pcatid].visible()) {
                mgrs[pcatid].hide();

                a.css("filter", "alpha(opacity=20)");
                a.css("opacity", .5);


                refreshMapPoi(poiData);
                // if markermanager is not visible
            } else {
                mgrs[pcatid].show();

                a.css("filter", "alpha(opacity=100)");
                a.css("opacity", 1);

                refreshMapPoi(poiData);
            }

            return false;
        });
    }



    function initCreateAlert() {
        $("a#createalert").live("click", function() {
            $(this).attr("disabled", "disabled");

            if (searchparams.center) {
                var center = new GLatLng(searchparams.center.split(",")[0], searchparams.center.split(",")[1]);
                if (map) map.setCenter(center);
            }

            // get all the search parameters
            var params = buildparams(searchparams);

            searchparams = params;

            var hash = $.param(searchparams);

            $.facebox(function() {
                $.get("createalert.aspx?" + hash, null, function(data, textStatus) {
                    if (textStatus == "success") {
                        $.facebox($(data).find("#content"));
                    } else {
                        $.facebox("An error occured while trying to create email alert. Please try again!");
                    }
                });
            });

            return false;
        });
    }

    function initPrintFound() {
        $("a#printfound").live("click", function() {
            if (searchparams.center) {
                var center = new GLatLng(searchparams.center.split(",")[0], searchparams.center.split(",")[1]);
                if (map) map.setCenter(center);
            }


            searchparams.page = 1
            searchparams.isprinted = true

            // get all the search parameters
            var params = buildparams(searchparams);
            searchparams = params;

            clickMarkerProp = null;
            clickMarkerPoi = null;

            $("#mapsearch").removeAttr("checked")
            $("#isprinted").attr("checked", "on")

            hideMap();
            listSearch();
            mapSearch();

            $.scrollTo($("#newsearch"), 300);

            var hash = $.param(params);
            ajaxHistory.add(document.location.pathname + "?" + hash);

            return false;
        });
    }

    function initPaging() {
        $("#searchresults #paging a").live("click", function() {
            if (searchparams.center) {
                var center = new GLatLng(searchparams.center.split(",")[0], searchparams.center.split(",")[1]);
                if (map) map.setCenter(center);
            }


            // get all the search parameters
            var params = buildparams(searchparams);

            var paramstring = this.href.match(/.*?\?(.*)/)[1];
            if (paramstring.length != 0) {
                // create an array
                var qs = paramstring.split("&");
                // get first parameter value
                for (var i = 0; i < qs.length; i++) {
                    if (qs[i].split("=")[0] == "page") {
                        params["page"] = parseInt(decodeURIComponent(qs[i].split("=")[1].replace(/\+/g, " ")));
                    }
                }
            }

            searchparams = params;

            clickMarkerProp = null;
            clickMarkerPoi = null;

            listSearch();
            mapSearch();

            $.scrollTo($("#newsearch"), 300);


            var hash = $.param(params);
            ajaxHistory.add(document.location.pathname + "?" + hash);
            return false;
        });
    }

    function initSortOrder() {
        $("#sortorder").change(function() {
            if (searchparams.center) {
                var center = new GLatLng(searchparams.center.split(",")[0], searchparams.center.split(",")[1]);
                if (map) map.setCenter(center);
            }


            // get all the search parameters
            var params = buildparams(searchparams);
            params["sortorder"] = $(this).val();

            searchparams = params;

            clickMarkerProp = null;
            clickMarkerPoi = null;

            listSearch();
            mapSearch();

            //$.scrollTo($("#newsearch"), 300);


            var hash = $.param(params);
            ajaxHistory.add(document.location.pathname + "?" + hash);
            return false;
        });
    }

    function initAdvanceSearch() {
        $("a#advancesearch").live("click", function() {
            if (searchparams.center) {
                var center = new GLatLng(searchparams.center.split(",")[0], searchparams.center.split(",")[1]);
                if (map) map.setCenter(center);
            }

            // get all the search parameters
            var params = buildparams(searchparams);
            searchparams = params;
            var hash = $.param(searchparams);

            $(this).attr("href", "advancesearch.aspx?" + hash);
        });
    }
    function initAddRemoveFavorites() {
        $("a#addremovefavorite").live("click", function() {
            //$(this).attr("disabled", "disabled");
            var href = $(this).attr("href");
            var action = href.match(/action=add/) ? "add" : "remove";
            var pid = href.match(/pid=(.*?)$/)[1];
            var thisObj = this;
            $.facebox(function() {
                $.get("/administrator/property/favoritesmodify.aspx?action=" + action + "&pid=" + pid, null, function(data, textStatus) {
                    if (textStatus == "success") {
                        if ($(data).find("#content").text().match(/added/)) {
                            $(thisObj).attr("href", "/administrator/property/favoritesmodify.aspx?action=remove&pid=" + pid);
                            $(thisObj).text("Remove from my list");
                        } else if ($(data).find("#content").text().match(/removed/)) {
                            $(thisObj).attr("href", "/administrator/property/favoritesmodify.aspx?action=add&pid=" + pid);
                            $(thisObj).text("Add to my list");
                        }
                        $.facebox($(data).find("#content"));
                    } else {
                        $.facebox("An error occured while trying to create email alert. Please try again!");
                    }
                });
            });
            return false;
        });

    }

    function initPrintOrMap() {
        $("#isprinted").live("click", function() {
            if ($(this).attr("checked")) {
                $("#mapsearch").removeAttr("checked");
            }
        });

        $("#mapsearch").live("click", function() {
            if ($(this).attr("checked")) {
                $("#isprinted").removeAttr("checked");
            }
        });

    }

    function hideShowPrintRefine() {
        if ($("#isprinted").attr("checked")) {
            var oldval = $("#usertypeids").val();
            $("#usertypeids").val("");
            //$("#postbyrow").hide();
            $("#postbyrow").attr("usertypeids", oldval);
        } else {
            $("#postbyrow").show();
            var oldval = $("#postbyrow").attr("usertypeids");
            if (oldval) {
                $("#usertypeids").val(oldval);
                $("#postbyrow").removeAttr("usertypeids");
            }
        }
    }

    function initPrintRefine() {
        $("#isprinted").live("click", function() {
            hideShowPrintRefine();
        });

    }

    function initGeoLocate() {
        $('#geosearchtext').keypress(function(e) {
            if (e.which == 13) {
                locateAddress($(this).val(), true);
                return false;
            }
        });
    }


    function locateAddress(address, showErrorDialog) {
        if (geocoder) {
            geocoder.getLocations(address, function(response) {
                if (!response || response.Status.code != 200) {
                    if (showErrorDialog || showErrorDialog === undefined) {
                        alert("Sorry, we were unable to geocode that address");
                    }
                } else {
                    var place = response.Placemark[0];
                    var point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);

                    map.setZoom(15);
                    map.setCenter(point);

                    mapPanned();


                    //var marker = placeMarker(point);
                    //marker.openInfoWindowHtml(place.address);
                }
            });
        }

    }


    return {
        init: function(searchParams) {
            searchparams = buildparams(searchParams);
            if (searchparams.center) {
                centerLat = parseFloat(searchparams.center.split(",")[0]);
                centerLon = parseFloat(searchparams.center.split(",")[1]);
            } else {
                centerLat = 3.134444;
                centerLon = 101.746389;
            }
            if (searchparams.zoom) {
                zoom = parseInt(searchparams.zoom);
            } else {
                zoom = 13;
            }

            initForm();
            initPoiFilters();
            initGMap();
            initAjaxHistory();
            initCreateAlert();
            initPrintFound();
            initAdvanceSearch();
            initPaging();
            initSortOrder();
            initAddRemoveFavorites();
            initGeoLocate();

            initPrintOrMap();
            initPrintRefine();

            poiSearch();
            mapSearch();

            origCenter = map.getCenter();

            $("input[name='__VIEWSTATE']").remove();
            $("#__EVENTTARGET").remove();
            $("#__EVENTARGUMENT").remove();
            $("#__EVENTVALIDATION").remove();

            $("body").ajaxStart(function() {
                $(this).append('<div id="ajaxloading"><img src="/content/images/ajax-loader.gif"></div>')
            });
            $("body").ajaxStop(function() {
                $(this).find("#ajaxloading").remove();
            });

        },

        toggleMap: function() {
            if ($('#map').css("display") == "none") {
                showMap();
            } else {
                hideMap();
            }
        },

        showOnMap: function(propertyID, lat, lon, zoom) {
            showMap();
            map.setCenter(new GLatLng(lat, lon));
            setTimeout(function() {
                clickMarkerProp = mgrs[9999].getMarker(lat, lon, 1);
                clickMarkerProp.openInfoWindowHtml(propertyPopups[propertyID]);
                //GEvent.trigger(mgrs[9999].getMarker(lat, lon, 1), "click");
            }, 100);
            if ($.scrollTo)
                $.scrollTo($('#map'), 300);
            return false;
        },
        showDialog: function(propertyID, lat, lon, zoom) {
            clickMarkerProp = mgrs[9999].getMarker(lat, lon, 1);
            clickMarkerProp.openInfoWindowHtml(propertyPopups[propertyID]);
        },
        showAddress: function(address, showErrorDialog) {
            locateAddress(address, showErrorDialog);
        }


    };

} ();




