$(document).ready(function() {

    var map;
    var geocoder = new google.maps.Geocoder();
    var sh = new SearchHandler();
    var markers = [];
    var centermark;
    var time;
    var time2;
    var visibleInfoWindow = null;
    var vzoom = 11;


    /*****************  Icons ********************/
    var gYellowIcon = new google.maps.MarkerImage(
      "http://labs.google.com/ridefinder/images/mm_20_yellow.png",
      new google.maps.Size(12, 20),
      new google.maps.Point(0, 0),
      new google.maps.Point(6, 20));
    var gRedIcon = new google.maps.MarkerImage(
      "http://labs.google.com/ridefinder/images/mm_20_red.png",
      new google.maps.Size(12, 20),
      new google.maps.Point(0, 0),
      new google.maps.Point(6, 20));
    var gSmallShadow = new google.maps.MarkerImage(
      "http://labs.google.com/ridefinder/images/mm_20_shadow.png",
      new google.maps.Size(22, 20),
      new google.maps.Point(0, 0),
      new google.maps.Point(6, 20));
    /***************** End of Icons ********************/

    /********** function initialize *************/
    var initialize = function() {
        var latlng = new google.maps.LatLng(geoip_latitude(), geoip_longitude());
        var myOptions = {
            disableDefaultUI: true,
            zoom: vzoom,
            center: latlng,
            mapTypeId: google.maps.MapTypeId.ROADMAP,
            scrollwheel: false

        };
        map = new google.maps.Map($(".map_canvas")[0], myOptions);
        attachCentermark(latlng);

       
        /* google.maps.event.addListener(map, 'idle', function() {
        if (visibleInfoWindow) { visibleInfoWindow.close(); }
        if (time) { clearTimeout(time) };
        time = setTimeout(searchGo, 0);
        }); 

        google.maps.event.addListener(map, 'zoom_changed', function() {
        if (visibleInfoWindow) { visibleInfoWindow.close(); }
        searchGo();
        }); */
    }
    /********** end of initialize *************/


    /********** function centerLocation *************/
    var centerLocation = function() {
        var address = $('#location').val() + ' ' + $('#country :selected').text();
        if (geocoder) {
            geocoder.geocode({ 'address': address }, function(results, status) {
                if (status == google.maps.GeocoderStatus.OK) {
                    map.setCenter(results[0].geometry.location);
                    map.setZoom(vzoom);
                    attachCentermark(results[0].geometry.location);
                }
            });
        }
    }
    /********** end of centerLocation *************/


    /********** function attachCentermark *************/
    var attachCentermark = function(location) {
        if (centermark) { centermark.setMap(null); }
        centermark = new google.maps.Marker({
            map: map,
            position: location,
            icon: gYellowIcon,
            shadow: gSmallShadow,
            draggable: true

        });

        google.maps.event.addListener(centermark, 'dragend', function() {
            map.setCenter(centermark.position)
            if (time2) { clearTimeout(time2) };
                time2 = setTimeout(searchGo, 500);

        });
        /*
        geocoder.geocode({ 'latLng': location }, function(results, status) {
        var infowindow = new google.maps.InfoWindow({
        content: results[0].formatted_address
        });
        google.maps.event.addListener(centermark, 'click', function() {
        infowindow.setZIndex(0);
        infowindow.open(map, centermark);
        });
        }); */
    }
    /********** end of attachCentermark *************/



    /********** function searchGo *************/
    var searchGo = function() {
        $('#Results').text("");
        if (visibleInfoWindow) { visibleInfoWindow.close(); }
        $('.LoadingBar').css('visibility', 'visible');
        $('#col2').css('visibility', 'visible');
        $.each(markers, function() {
            this.set_map(null);
        });
        var wage = $('#wage').val().replace(/[^0-9\.]+/, '');
        if (wage == '') wage = 0;
        var currency = $('#currency').val();
        var bounds = map.getBounds();
        var ne = bounds.getNorthEast();
        var sw = bounds.getSouthWest();
        var latitude = [sw.lat(), ne.lat()];
        var longitude = [sw.lng(), ne.lng()];
        var oldids = [];
        var workType = $('#worktype').val();
        if (workType == '') workType = 0;
        var availabilityCBS = $('#availabilityCBS').val();
        if (availabilityCBS == '') availabilityCBS = 0;
        sh.search(latitude, longitude, workType, availabilityCBS, wage, currency, oldids,   function(response) {
            $('#Results').processTemplate(response.result);
            if (response.result == "")
                $('#Results').html("<p style='text-align:center;'>You search did not match any person.</p>");
            $.each(response.result, function(i) {
                var that = this;
                var latlng = new google.maps.LatLng(this.latitude, this.longitude);
                var marker = new google.maps.Marker({
                    position: latlng,
                    map: map,
                    title: this.name
                });

                var infowindow = new google.maps.InfoWindow({
                    
                    content: "<div style='float:left;'><img src='" + this.imageurl + "' style='' /></div><div style='float:left;padding-left:5px;'><a href='" + this.facebookurl + "' target='_blank'>" + this.name + "</a><br/>minimum " + this.wage + " per hour</div>"
                });
                google.maps.event.addListener(marker, 'click', function() {
                    $('#Results .Selected').removeClass('Selected');
                    $('#Results #' + that.id).addClass('Selected');
                    if (visibleInfoWindow) { visibleInfoWindow.close(); }
                    infowindow.open(map, marker);
                    visibleInfoWindow = infowindow;
                });
                markers.push(marker);
                $('#pane4').jScrollPane({ scrollbarWidth: 8, scrollbarMargin: 5, showArrows: false });
            });
            $('.LoadingBar').css('visibility', 'hidden');
        });
        $('#pane4').jScrollPane({ scrollbarWidth: 8, scrollbarMargin: 5, showArrows: false });
    }
    /********** end of searchGo *************/


      

    initialize();
    centerLocation();

    $("#slider").slider({
        value: vzoom,
        min: 10,
        max: 15,
        step: 1,
        animate: true,
        slide: function(event, ui) {
            vzoom = ui.value;
            map.setZoom(vzoom);
            searchGo();
        }
    });

    $('#Results').setTemplate($("#TemplateResults").html());
    $('.SearchButton').click(searchGo);
    $('#currency').change(searchGo);
    $('#worktype').change(searchGo);
    $('#availabilityCBS').change(searchGo);
    $('#country').change(function() {
        centerLocation();
        if (time2) { clearTimeout(time2) };
            time2 = setTimeout(searchGo, 1000);
    });
    $('#location').keyup(function() {
        if (time) { clearTimeout(time) };
        time = setTimeout(centerLocation, 500);
        if (time2) { clearTimeout(time2) };
        time2 = setTimeout(searchGo, 1000);
    });
    $('#wage').keyup(function() {
          if (time) { clearTimeout(time) };
        time = setTimeout(searchGo, 1000); 
    });

    $('#pane4').jScrollPane({ scrollbarWidth: 8, scrollbarMargin: 5, showArrows: false });
    $('.SearchCriteria input, .SearchCriteria select, .SearchCriteria a').keydown(function(event) {
        if (event.keyCode == 13) {
            event.stop();
            searchGo();
        }
    });
});
