var map;
var mapObj;
var allowedBounds = new google.maps.LatLngBounds(new google.maps.LatLng(54.418,-11.228), new google.maps.LatLng(59.277,3.054));
var localSearch = new GlocalSearch();
var initialised = false;
var inProcess = false;
var lat, lng, zoom, type, area, loader, center, infowindow;
var subTypes = {};
var markers = {};
var filter = [];
var pricing = [];
var states = [];
var months = [];
	months[1] = "January";
	months[2] = "February";
	months[3] = "March";
	months[4] = "April";
	months[5] = "May";
	months[6] = "June";
	months[7] = "July";
	months[8] = "August";
	months[9] = "September";
	months[10] = "October";
	months[11] = "November";
	months[12] = "December";

var image = new google.maps.MarkerImage('http://www.google.com/mapfiles/marker.png',
  new google.maps.Size(20, 39),
  new google.maps.Point(0,0),
  new google.maps.Point(0, 32));
var shadow = new google.maps.MarkerImage('http://www.google.com/mapfiles/shadow50.png',
  new google.maps.Size(37, 32),
  new google.maps.Point(0,0),
  new google.maps.Point(5, 32));
var shape = {
  coord: [1, 1, 1, 20, 18, 20, 18 , 1],
  type: 'poly'
};
var hold = false;

function getMarkerImage(src,yOffset) {
    return new google.maps.MarkerImage(src,
        new google.maps.Size(26, 39),
        new google.maps.Point(0,0),
        new google.maps.Point(10, yOffset));
}

function getViewBounds() {
    var vars = [], hash;
    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
    for(var i = 0; i < hashes.length; i++)    {
        hash = hashes[i].split('=');
        vars.push(hash[0]);
        vars[hash[0]] = hash[1];
    }

    lng = mapObj["xcen"];
    lat = mapObj["ycen"];
    zoom = parseInt(mapObj["zoom"]);
}

function getMarkerById(id){
    if (mapObj['markers'][id] == null) {
        var dataString="locationid=" + id;

        $.ajax({
           type: "GET",
           url: "xmllocations.php",
           data: dataString,
           success: function(xml) {
               parseMarkers(xml, true, false);
               show(id);
           }
        });
    }
}

function getMarkersByArea(map, mapObj, enableInfoWindow, enableClickThrough){
    var bounds = map.getBounds();
    var ne = bounds.getNorthEast();
    var sw = bounds.getSouthWest();
    var excludes = "0";

    $('#loader').show();
    if (markers.length || 1 == 1) {
	for (var i in markers) {
            excludes += "," + markers[i].db_id;
	}
    }
    var dataString= "minLng=" + sw.lng() +
                    "&maxLng=" + ne.lng() +
                    "&minLat=" + sw.lat() +
                    "&maxLat=" + ne.lat() +
                    "&excludes=" + excludes +
                    "&type=" + mapObj["type"] +
                    "&subType=" + mapObj["subType"] +
                    "&checkAvailability=" + mapObj["checkAvailability"] +
                    "&checkin=" + mapObj["checkin"] +
                    "&checkout=" + mapObj["checkout"] +
                    "&states=" + mapObj["states"].join(",");

    $.ajax({
       type: "GET",
       url: "xmllocations.php",
       data: dataString,
       success: function(xml) {
           parseMarkers(xml, enableInfoWindow, enableClickThrough);
       }
    });
}

function parseMarkers(xml, enableInfoWindow, enableClickThrough) {
   var results = mapObj['markers'];
    $(xml).find("location").each(function() {
        var xy = $(this).attr("xy").split(',');
        var importance = 1;
        var typeID = 0;
        var appendChar = "";

        var position = new google.maps.LatLng(xy[0],xy[1]);
        var marker = new google.maps.Marker({
            position: position,
            map: map,
            shadow: shadow,
            icon: image,
            shape: shape,
            title: $(this).attr("title").replace(/\+/g," ")
        });

        if ($(this).attr("type") == 1 || 1) {
            typeID = $(this).attr("type");
            if (typeID == "1") {
                switch($(this).attr("available")) {
                    case "1":
                        appendChar = "a";
                        break;
                    case "3":
                        appendChar = "n";
                        break;
                    case "2":
                        appendChar = "q";
                        break;
                }
            }

            marker.setIcon(getMarkerImage("images/markers/" + typeID + appendChar + ".png",24));
            if (results != 'undefined') {
                if (!isNaN(parseInt(results[$(this).attr("id")]))) {
                    marker.setIcon(getMarkerImage("images/markers/" + typeID + "_" + results[$(this).attr("id")] + appendChar + ".png",32));
                    marker.setZIndex(1000000000000);
                   importance = 2;
                }
            }
        } else if (locations[i].getAttribute("type") == "postcodeSearch"){
            marker.setIcon(getMarkerImage("images/markers/1_0.png",32));
        } else{
            marker.setIcon(getMarkerImage("images/marker02.png",32));
        }

        var index = $(this).attr("id");
        if (markers[index] === undefined) {
            markers[index] = marker;
            markers[index].importance = importance;
            markers[index].available = $(this).attr("available");
            markers[index].infowindow = $(this).attr("title");
            markers[index].title = markers[index].infowindow;
            markers[index].slug = $(this).attr("slug");
            markers[index].markerindex = index;
            markers[index].type = type;
            markers[index].moreInfo = $(this).attr("moreInfo");
            markers[index].subtype = $(this).attr("subtype");
            markers[index].db_id = $(this).attr("id");
            subTypes[$(this).attr("subtype")] = 1;

            if (enableInfoWindow) {
                google.maps.event.addListener(markers[index], "click", function() {
                    var dataString="locationtab.php?t=" + type + "&a=" + area + "&l=" + this.db_id;

                    $.ajax({
                        type: "GET",
                        url: "locationtab.php",
                        data: dataString,
                        success: function(html) {
                            if (infowindow != null && infowindow.close) { infowindow.close(); }
                            infowindow = new google.maps.InfoWindow({
                                content: html
                            });
                            infowindow.open(map, markers[index]);
                            google.maps.event.addListener(infowindow,"closeclick", function() {
                                setSession("infowindow=0", true);
                                mapObj["infowindow"] = null;
                            }); 
                            setSession("infowindow=" + markers[index].db_id, true);
                        }
                    });
                });
            }
            if (enableClickThrough && markers[index].moreInfo == "1") {
                google.maps.event.addListener(markers[index], "click", function() {
                    var urlstr="l/" + this.type + "/" + this.slug;
                    location.href = urlstr;
                });
            }
        } 
    });
    if (mapObj["infowindow"] != null && IsNumeric(mapObj["infowindow"]) && mapObj["infowindow"] > 0) {
        show(mapObj["infowindow"]);
    }
    $('#loader').hide();
}

function urlencode(str) {
    str = escape(str);
    return str.replace(/[*+\/@]|%20/g,
        function (s) {
            switch (s) {
                case "*":s = "%2A";break;
                case "+":s = "%2B";break;
                case "/":s = "%2F";break;
                case "@":s = "%40";break;
                case "%20":s = "+";break;
            }
            return s;
        }
        );
}

function search(searchTerm, callbackFunction) {
    if (infowindow != null && infowindow.close) { infowindow.close(); setSession("infowindow=0", false); }

    $('loader').show();

    var states = mapObj["states"];
    var dataString="search=" + urlencode(searchTerm) + "&lat=" + map.getCenter().lat() + "&lng=" + map.getCenter().lng() + "&states=" + states.join(",");
    var doLocalSearch = true;

    $.ajax({
       type: "GET",
       url: "/xmlsearch.php",
       data: dataString,
       success: function(xml) { 
           var doLocalSearch = true;
           $(xml).find("result").each(function() { 
               var point = new google.maps.LatLng($(this).attr("x"),$(this).attr("y"));
               var tab = 0;
                if (allowedBounds.contains(point)) {
                    doLocalSearch = false;
                }
                if ($(this).attr("type") == "location") { 
                    if (markers[$(this).attr("id")] == null) { 
                        
                        if ($(this).attr("zoom") > 0) {
                            
                        }
                        // getMarkerById($(this).attr("id"));
                    } else {
                        // show($(this).attr("id"));
                    }
                    hold = true;
                    map.setZoom(parseInt($(this).attr("zoom")));
                    map.setCenter(point);
                    map.panBy(35,-150);
                    point = map.getCenter();
                    hold = false;
                    setSession("infowindow=" + $(this).attr("id"), false);
                } else { 
                    // callbackFunction(point, $(this).attr("title"));
                    map.setZoom(parseInt($(this).attr("zoom")));
                }
                logSearch(searchTerm, point, $(this).attr("alias"), $(this).attr("type"), $(this).attr("id"), $.xml2json(xml));
                setCoords(point, map.getZoom());
                return false;
           });
           if (doLocalSearch) {
                if (searchTerm.length < 4 && isNaN(parseInt(searchTerm.substr(searchTerm.length - 1,1)))) {
                    searchTerm = searchTerm + "1";
                }
                localSearch.setCenterPoint(map.getCenter());
                localSearch.setSearchCompleteCallback(null,
                    function() {
                        var found = true;
                        if (localSearch.results[0])
                        {
                            var resultLat = localSearch.results[0].lat;
                            var resultLng = localSearch.results[0].lng;

                            var point = new google.maps.LatLng(resultLat,resultLng);
                            if (allowedBounds.contains(point)) {
                                callbackFunction(point, searchTerm);
                            } else {
                                $('#notFound').dialog();
                                found = false;
                            }
                        }else{
                            $('#notFound').dialog();
                            found = false;
                        }
                        if (found) {
                            var results = [];
                            for (var i = 0; i < localSearch.results.length; i++) {
                                var result = {};
                                result.title = localSearch.results[i]['titleNoFormatting'];
                                result.streetAddress = localSearch.results[i]['streetAddress'];
                                result.city = localSearch.results[i]['city'];
                                result.x = localSearch.results[i]['lat'];
                                result.y = localSearch.results[i]['lng'];
                                result.zoom = 0;
                                results.push(result);
                            }

                            logSearch(searchTerm, point, null, "API", null, results);
                            setCoords(point, 0);
                        } else {
                            logSearch(searchTerm, null, null, "API", null, null);
                        }

                    });

                localSearch.execute(searchTerm + ", UK");
            }
       }
    });
}


function logSearch(searchTerm, point, isAlias, type, id, results) {
    $.post = {};
    $.post.term = searchTerm;
    if (point != null) {
        $.post.latitude = point.lat();
        $.post.longitude = point.lng();
    }
    $.post.type = type;
    $.post.zoom = map.getZoom();
    $.post.matchType = type;
    $.post.matchID = id;
    $.post.states = mapObj["states"];
    $.post.url = location.href;
    $.post.results = results;
    $.post.isAlias = isAlias;
    $.ajax({
        type: "POST",
        url: "setfilter.php?search=1",
        data: $.post,
        async: false
    });
    console.log($.post);
}


function placeMarkerAtPoint(point, postcode)
{
    image = getMarkerImage("/images/markers/1_0.png",32);
    var marker = new google.maps.Marker({
        position: point,
        map: map,
        shadow: shadow,
        icon: image,
        shape: shape,
        title: "Search Result - " + postcode + " (Click to remove)"
    });

    marker.importance = 1;
    marker.setZIndex(2000000000000);
    google.maps.event.addListener(marker, "click", function() {
        this.setMap(null);
        clearPostcode();
    });

    if (mapObj["postcode"][0] != postcode) {
        var dataString="lat=" + point.lat() + "&lng=" + point.lng() ;

        $.ajax({
           type: "GET",
           url: "postcode.php",
           data: dataString,
           asyc: false,
           success: function(html) {
               map.setCenter(point, parseInt(html));
           }
        });
    }
    savePostcode(postcode, point);
}

function savePostcode(postcode, point) {
    var dataString = "p=" + urlencode(postcode) + "&plat=" + point.lat() + "&plng=" + point.lng();
    setSession(dataString, false);
}

function clearPostcode() {
    var dataString = "p";
    setSession(dataString, true);
}

function setSession(dataString, isAsync) {
    $.ajax({
       type: "GET",
       url: "setfilter.php",
       async: isAsync,
       data: dataString
    });
}

function toggleIntro() {
    var show = $('#introHeader').is(":visible");
    if (show) {
        $('#introHeader').hide(500);
        $('#showBar').show(500);
    } else {
        $('#introHeader').show();
        $('#showBar').hide();
    }
    var dataString = "intro=" + show;
    setSession(dataString, true);
}


//function showPointLatLng(point)
//{
//    alert("Latitude: " + point.lat() + "\nLongitude: " + point.lng());
//}

function mapLoad(div, mapObj) {
    var center = new google.maps.LatLng(33.956461,-118.396225);
        var mapOptions = {
            zoom: 13,
            center: center,
            mapTypeId: google.maps.MapTypeId.ROADMAP,
            scrollwheel: false
        }

        map = new google.maps.Map(document.getElementById(div), mapOptions);

        var $img=new Image(64, 43);
        $img.alt='Loading';
        $img.id = "loader";
        $img.index=1;
        $img.src='/images/loader.gif';
        $img.style.display='none';
        $img.style.marginRight='100px';
        $img.style.marginTop='140px';
        map.controls[google.maps.ControlPosition.TOP_CENTER].push($img); 

        $('loader').show();

        getViewBounds(); 
        map.setCenter(new google.maps.LatLng(lng, lat), zoom);
        map.setZoom(parseInt(mapObj['zoom']));

        filter = mapObj["filter"].split(",");

        var delay;
        google.maps.event.addListener(map, 'click', function() {map.enableScrollWheelZoom(); })
        google.maps.event.addListener(map, 'bounds_changed', function() {
            if (!hold) {
                clearTimeout(delay);
                delay = setTimeout(function () {
                    getMarkersByArea(map, mapObj, true, false);
                    showAvailability();
                    if (initialised) {
                        $('#mapFooter').show();
                        checkBounds();
                    }
                    if (mapObj["hide"]) {
                        $('#map div:first-child').hide();
                    }
                    initialised = true;
                },200);
            }
        });

        google.maps.event.addListener(map, 'zoom_changed', onZoomChanged);

        /* maybe add another listener to call setCoords_no_redirect() automatically? */

        if (mapObj["postcode"].length > 0) { 
            point = new google.maps.LatLng(mapObj["postcode"][1],mapObj["postcode"][2]);
            placeMarkerAtPoint(point, mapObj["postcode"][0]);
        }

        

}

function onZoomChanged() {
    if (inProcess) return;

    if (map.getZoom() > 20) {
        inProcess = true;
        map.setZoom(20);
        inProcess = false;
        return
    }
    else if (map.getZoom() < 6) {
        inProcess = true;
        map.setZoom(6);
        inProcess = false;
        return;
    }
}
      

// If the map position is out of range, move it back
function checkBounds() {
    // Perform the check and return if OK
    if (allowedBounds.contains(map.getCenter())) {
        return;
    }
    // It`s not OK, so find the nearest allowed point and move there
    var C = map.getCenter();
    var X = C.lng();
    var Y = C.lat();

    var AmaxX = allowedBounds.getNorthEast().lng();
    var AmaxY = allowedBounds.getNorthEast().lat();
    var AminX = allowedBounds.getSouthWest().lng();
    var AminY = allowedBounds.getSouthWest().lat();

    if (X < AminX) {
        X = AminX;
    }
    if (X > AmaxX) {
        X = AmaxX;
    }
    if (Y < AminY) {
        Y = AminY;
    }
    if (Y > AmaxY) {
        Y = AmaxY;
    }
    //alert ("Restricting "+Y+" "+X);
    map.setCenter(new GLatLng(Y,X));
}

function mapLoadSmall(div, type, area, results, lng, lat, zoom, mapObj) {
    if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById(div));
        //getViewBounds();
        map.setCenter(new GLatLng(lng, lat), parseInt(zoom));
        //map.enableScrollWheelZoom();
        map.disableDragging();
        filter = mapObj["filter"].split(",");
        getMarkers(map, type, area, results, false, true, mapObj, null);

    }
}


//function urldecode( str ) {
//
//    var histogram = {}, histogram_r = {}, code = 0, str_tmp = [];
//    var ret = str.toString();
//
//    var replacer = function(search, replace, str) {
//        var tmp_arr = [];
//        tmp_arr = str.split(search);
//        return tmp_arr.join(replace);
//    };
//
//    // The histogram is identical to the one in urlencode.
//    histogram['!']   = '%21';
//    histogram['%20'] = '+';
//
//    for (replace in histogram) {
//        search = histogram[replace]; // Switch order when decoding
//        ret = replacer(search, replace, ret) // Custom replace. No regexing
//    }
//
//    // End with decodeURIComponent, which most resembles PHP's encoding functions
//    ret = decodeURIComponent(ret);
//
//    return ret;
//}



function setCoords_no_redirect()
{
    var send_x = document.getElementById("send_x");
    var send_y = document.getElementById("send_y");
    var send_z = document.getElementById("send_z");
    if (send_x !== undefined && send_y !== undefined && send_z !== undefined && map !== undefined)
    {
        send_x.value = map.getCenter().lat();
        send_y.value = map.getCenter().lng();
        send_z.value = map.getZoom();
        alert ("X: " + send_x.value + ", Y: " + send_y.value + ", Zoom: " + send_z.value);
    }
}

function setCoords(point, zoom) {
//    var map_x = document.getElementById("map_x");
//    var map_y = document.getElementById("map_y");
//    var map_z = document.getElementById("map_z");
//    if (map_x !== undefined && map_y !== undefined && map_z !== undefined && map !== undefined) {
//        map_x.value = map.getCenter().lat();
//        map_y.value = map.getCenter().lng();
//        map_z.value = map.getZoom();
        var slugs = [];
        var typeslug = "";
        switch (mapObj["type"]) {
            case 1:
            case "1":
                typeslug = "Accommodation";
                break;
            case 2:
            case "2":
                typeslug = "Attractions";
                break;
            case 3:
            case "3":
                typeslug = "Eating-And-Drinking";
                break;
        }

        slugs[slugs.length] = typeslug;
        if (mapObj["subType"] != "") { 
            var urlstr = "lookup.php?subtype=" + mapObj["subType"];
            var request = GXmlHttp.create();
            request.open('GET', urlstr , false);
            request.send(null);
            slugs[slugs.length] = request.responseText;
        } else { 
            slugs[slugs.length] = "All";
        }
        // console.log(slugs.join("/"));
        // alert(slugs.join("/"));
        // location.href = location.pathname + "?&lat=" + point.lat() + "&lng=" + point.lng() + "&zoom=" + zoom + "#m";
        location.href = "/" + slugs.join("/") + "?&lat=" + point.lat() + "&lng=" + point.lng() + "&zoom=" + zoom + "#m";
//    }
}

function setUrl(obj, base, subtype) {
    var refresh = document.getElementById("refresh");
    var map_x = document.getElementById("map_x");
    var map_y = document.getElementById("map_y");
    var map_z = document.getElementById("map_z");
    if (refresh.style.display == "" && map_x !== undefined && map_y !== undefined && map_z !== undefined && map !== undefined) { 
        map_x.value = map.getCenter().lat();
        map_y.value = map.getCenter().lng();
        map_z.value = map.getZoom();
        var slugs = [];
        slugs[slugs.length] = base;
        if (subtype != null) {
            slugs[slugs.length] = subtype;
        } else {
            slugs[slugs.length] = "All";
        }
        obj.href = slugs.join("/") + "/?&lat=" + map.getCenter().lat() + "&lng=" + map.getCenter().lng() + "&zoom=" + map.getZoom();
    }
}

function show(id) {
    $('m').scrollTop();
    for (var i in markers) {
        if (markers[i].db_id == id) { 
            google.maps.event.trigger(markers[i],'click');
        }
    }
}

function showMarkers() {
    // getMarkers(map, type, mapObj["area"], results, true, false, mapObj, null);
    getMarkersByArea(map, mapObj, true, false);
    showAvailability();
}

function hideMarkers(type, subtype) { 
    for (var i in markers) {
        if (markers[i] !== undefined && markers[i].subtype == subtype) {
            // map.removeOverlay(markers[i]);
            markers[i].setMap(null);
            delete markers[i];
        }
    }
    showAvailability();
}

function showAllMarkers() {
    for (var i in mapObj["stats"][mapObj["type"]]) {
        if (IsNumeric(i) && i > 0) {
            //if (subTypes[i] === undefined) {
                mapObj["subType"] = i;
                showMarkers();
            //}
        }
    }
}

function changeFilter(type, value) {
    var states = mapObj["states"].slice(0);
    mapObj['states'][type - 1] = value;
    if (states[type - 1] == -1) {
        if (states[type - 1] == 0) {
            mapObj["type"] = type;
            showAllMarkers();
        } else {
            mapObj["type"] = type;
            mapObj["subType"] = states[type - 1];
            showMarkers();
        }
    } else if (states[type - 1] == 0) {
        for (var i in mapObj["stats"][type]) {
            if (i != value) {
                hideMarkers(type, i);
            }
        }
    } else { 
        hideMarkers(type, states[type -1]); 
        if (value > -1) {
            if (value == 0) {
                mapObj["type"] = type;
                showAllMarkers();
            } else {
                mapObj["type"] = type;
                mapObj["subType"] = states[type - 1];
                showMarkers();
            }
        }
    }

    var dataString = "state=" + type + "&stateValue=" + value;
    setSession(dataString, true);
    $('mapFooterNoMove').show();
}

function IsNumeric(input)
{
   return (input - 0) == input && input.length > 0;
}


function showAvailability() {
    if (document.getElementById("available") == null) {
        return;
    }
    var available = document.getElementById("available").checked;
    var unknown = document.getElementById("unknown").checked;
    var unavailable = document.getElementById("unavailable").checked;
    var arr = [];
    if (available) {
        arr["1"] = true;
    }
    if (unknown) {
        arr["3"] = true;
    }
    if (unavailable) {
        arr["2"] = true;
    }
    for (var i in markers) {
        if (markers[i] !== undefined) {
            if (arr[markers[i].available] !== undefined) {
                markers[i].show();
            } else {
                markers[i].hide();
            }
        }
    }
}

Array.prototype.remove = function(from, to) {
  var rest = this.slice((to || from) + 1 || this.length);
  this.length = from < 0 ? this.length + from : from;
  return this.push.apply(this, rest);
};


function RefreshControl(controlDiv, map) {

  // Set CSS styles for the DIV containing the control
  // Setting padding to 5 px will offset the control
  // from the edge of the map
  controlDiv.style.padding = '5px';

  // Set CSS for the control border
  var controlUI = document.createElement('DIV');
  controlUI.style.backgroundColor = 'white';
  controlUI.style.borderStyle = 'solid';
  controlUI.style.borderWidth = '2px';
  controlUI.style.cursor = 'pointer';
  controlUI.style.textAlign = 'center';
  controlUI.title = 'Click to set the map to Home';
  controlUI.setAttribute("id", "refresh2");
  controlUI.setAttribute("style", "display:none");

  var img = document.createElement("img");
  img.src = "images/refresh.png";
  img.setAttribute("alt", "Refresh Results");
  controlUI.appendChild(img);
  controlDiv.appendChild(controlUI);


  // Setup the click event listeners:
  google.maps.event.addDomListener(controlUI, 'click', function() {
    setCoords();
  });
}

function LoadingControl(controlDiv, map) {

  // Set CSS styles for the DIV containing the control
  // Setting padding to 5 px will offset the control
  // from the edge of the map
  controlDiv.style.padding = '5px';

  // Set CSS for the control border
  var controlUI = document.createElement('DIV');
  controlUI.style.backgroundColor = 'white';
  controlUI.style.borderStyle = 'solid';
  controlUI.style.borderWidth = '2px';
  controlUI.style.cursor = 'pointer';
  controlUI.style.textAlign = 'center';
  controlUI.title = 'Loading';
  controlUI.setAttribute("id", "loader");
  controlUI.setAttribute("style", "display:none");

  var img = document.createElement("img");
  img.src = "/images/loader.gif";
  img.setAttribute("alt", "Loading");
  img.setAttribute("style", "position: absolute; top:160px; left:310px;");
  controlUI.appendChild(img);

  controlDiv.appendChild(controlUI);
}

$('a.area').click(function(){ if (infowindow != null && infowindow.close != null) { setSession("infowindow=0", false); }});
