$(function(){
	$.ajaxSetup({
		  	 async: true,
			 url:'/results_json.php',
			 type:"POST",			
			 dataType:'json',
			 cache:true,
			 error:function (XMLHttpRequest, textStatus, errorThrown){
                 alert('[' + textStatus + ']');
             }
	});

    

	var keywords = $('#keywords').val();
	var pet_type_id = $('#pet_type_id').val();
    var location_id = $('#location_id').val();
	var var_ad_type = $('#ad_type').val();
	var pets_data = new Array();
	var location_data = new Array();
    //Ireland lat & lon
    var lat_ireland = 53.41291;
    var lon_ireland = -8.24389;

    //Responsible for activating or not ajax queries
    var mapMoveendEventActive = true;
    //Zoom level to change "group" markers for single "pet" markers
    var zoomOfChange = 9

	if (GBrowserIsCompatible()) {				
		var map = new GMap2($('#map').get(0));
		map.addControl(new GLargeMapControl3D());
		map.addControl(new GOverviewMapControl());

		var allowedBounds = new GLatLngBounds(new GLatLng(51.4,-10.58), new GLatLng(55.4,-5.39)/*new GLatLng(49.5,-10), new GLatLng(59,2.6)*/);
        GEvent.addListener(map, "move", checkBounds);
		var mt = map.getMapTypes();
        for (var i=0; i<mt.length; i++) {
            mt[i].getMinimumResolution = function() {return 7;}           
        }

        /**
         * Change map state event
         */
		// There's no point to this at the moment, because we're currently adding points for all locations or ads
        //GEvent.addListener(map, "moveend", getMapsPoints);
		
		getMapsPoints();

        //init state of mape
        mapNativeState();
	}

	// Create Icon
    var pawIcon = new GIcon(G_DEFAULT_ICON);
    pawIcon.image = "http://www.pets.ie/images/GMAPI_marker.png";
    pawIcon.iconSize = new GSize(33, 32);
    pawIcon.shadow = "http://www.pets.ie/images/GMAPI_marker_shadow.png";
    pawIcon.shadowSize = new GSize(33, 32);
    pawIcon.imageMap = [2,7,16,1,30,7,30,13,27,16,27,29,5,29,5,16,2,13];
	// pawIcon.transparent = "http://www.pets.ie/images/GMAPI_marker_IE_area.png";
    pawIcon.iconAnchor = new GPoint(17, 29);
    pawIcon.infoWindowAnchor = new GPoint(17, 0);	
    var markerOptions = { icon:pawIcon };
   

    function setAjaxOverlay() {
        var mapParameters     = {};
        mapParameters.width   = $('#map').width();
        mapParameters.height  = $('#map').height();
        $('#map').append('<div id="ajax-indicator"><img src="/includes/ajax-loader.gif" alt="ajax" /></div>');
        
        var ajax_indicator    = {};
        ajax_indicator.width  = $('#ajax-indicator').width();
        ajax_indicator.height = $('#ajax-indicator').height();

        var w = mapParameters.width/2 - ajax_indicator.width/2;
        var h = mapParameters.height/2 - ajax_indicator.height/2;
        $("#ajax-indicator").css({position:'absolute', left:w, top:h, display:'block'});
    }

    function clearAjaxOverlay() {
        $("#ajax-indicator").remove();
    }

    /**
     * Returns map to the native state (Ireland land)
     */
    function mapNativeState(){  
	
        map.setCenter(new GLatLng(lat_ireland, lon_ireland), 7);

    }



    /**
     *  Gets data from DB.
     *  Main action.
     */
    var ajax_query = true;
    function getMapsPoints() {
        
        if (mapMoveendEventActive == false) {
            mapMoveendEventActive = true;
            ajax_query = false;
            return;
        }
		
        map.clearOverlays();
        var zoomLevel = map.getZoom();
        var grouping = false;
    	var mapBounds = map.getBounds();
        var sw = mapBounds.getSouthWest();
        var ne = mapBounds.getNorthEast();
        var bounds = {maxLat:ne.lat(), maxLng:ne.lng(), minLat:sw.lat(), minLng:sw.lng()};

    	$.ajax({
             beforeSend: function(XMLHttpRequest) {
                setAjaxOverlay();
             },
			 data:JSON.stringify({
             	target:'getMapPoints',
             	data:{keywords:keywords, pettypeid:pet_type_id, locationid:location_id, adtype:var_ad_type}
             }),
			 success: function (data, textStatus) {
				changeText(data);
             	putPoint(data);
             },
			 complete: function (XMLHttpRequest, textStatus) {
                clearAjaxOverlay();
			 }
        });
        
    };

    /**
     * Put a marker(GMarker) on the map
     */
    function putPoint(points) {	
        if (points.length > 0) {
            var marker, point;
            for (var i=0; i<points.length; i++) {
				// if ( points[i].location_id == 58 ) { alert("WESTMEATH:" + points[i].lat + "," + points[i].lon); };
                point = new GLatLng(points[i].lat, points[i].lon);
                marker = createSingleMarker(point, points[i]);
                map.addOverlay(marker);
            }			
        }
		setMapZoom();
	};

   function setMapZoom() {
		if(location_id == '') {
			map.setCenter(new GLatLng(lat_ireland, lon_ireland), 7);
			return;
		}
		if(location_data[location_id]) {
			map.setCenter(new GLatLng(location_data[location_id].latitude, location_data[location_id].longitude), 9);
		}
		else
			$.ajax({
				 url:'/ajax.php',
				 beforeSend: function(XMLHttpRequest) {
					setAjaxOverlay();
				 },
				 data:JSON.stringify({
					target:'getGeoCo',
					indata:{location_id:location_id}
				 }),
				 success: function (data, textStatus) {
					location_data[location_id] = data;
					map.setCenter(new GLatLng(data.latitude, data.longitude), 9);
				 },
				 complete: function (XMLHttpRequest, textStatus) {
					clearAjaxOverlay();
				 }
			});		
   }

    //PET MARKERS --------------------------------------------------------------
	
    /**
     * Creates single marker
     */
    function createSingleMarker(geoLatLng, data) {
       
        var marker = new GMarker(geoLatLng, markerOptions);
        GEvent.bind(marker, "click", [marker, data], markerPetClick);
        GEvent.bind(marker, "dblclick", [marker, data], markerPetDblclick);
		GEvent.bind(marker, "infowindowopen", [marker], markerIWOpen);
        return marker;
		
    };
    
	//set ZoomIn link click event function
	function markerIWOpen() {		
		$('a.MapZoomIn').each(function(n,element){		
			$(element).click(function() {
				map.zoomIn();
				return false;
			});
		});
	}

	function getPetsHTML(description) {
		var month_names = ["Jan", "Feb", "March", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
		return "<table><tr><td style='width: 91px'>"+
			"<a href='"+description.lurl+"'>"+
				"<img class='photo_thumb_infowin' src='"+description.photo_url+"' />"+
			"</a></td><td>"+
			"<h5 class='red no_margin'>"+(description.ad_type == 'l'?'Lost':'Found')+"</h5>"+
			"<p class='no_margin'><b>"+description.title+"</b><br/>"+(description.ad_type == 'l'?'Lost':'Found')+" since "+(new Date(description.date_lf* 1000).getDate() +' / ' + month_names[new Date(description.date_lf* 1000).getMonth()] + ' / ' + new Date(description.date_lf* 1000).getFullYear())+"<br/>"+
			"<a class='MapZoomIn' href='#'>Zoom In</a> | <a href='"+description.lurl+"'>View Full Details</a></p></td></tr></table>";			
	}
	
    function openInfoPetWindow(marker, data) {
		//if pet data exists
		if(pets_data[data.ad_id]) {
			marker.openInfoWindowHtml(getPetsHTML(pets_data[data.ad_id]), {maxWidth:250});
			return;
		}
        $.ajax({
			 url:'/details_json.php',
             beforeSend: function(XMLHttpRequest) {
                setAjaxOverlay();
             },
			 data:JSON.stringify({
             	//target:'getMapPoints',
             	data:{ad_id:data.ad_id}
             }),
			 success: function (description, textStatus) {
				pets_data[data.ad_id] = description;
				marker.openInfoWindowHtml(getPetsHTML(description), {maxWidth:250});
             },
			 complete: function (XMLHttpRequest, textStatus) {
                clearAjaxOverlay();
			 }
        });
    }



    function markerPetClick() {
        /**
         * AJAX returned JSON object
         * {pet_id, pet_type_id,  price, description, title, status, photo, date, ad_type}
         */
        var marker = this[0];
        var data   = this[1];        

        //Disactivate ajax for the moveend event
        mapMoveendEventActive = false;
        
        openInfoPetWindow(marker, data);
		
    };

    function markerPetDblclick() {
		// Go to URL
    }

	function checkBounds() {
		if (allowedBounds.contains(map.getCenter())) {
			return;
		}
		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;}
		map.setCenter(new GLatLng(Y,X));
	}
	  
	  //END ----------------------------------------------------------------------

	function makeSearchString() {
		return (($('#pet_type_id').val() == "")?'all pets':$('#pet_type_id option:selected').text()) + ' ' + 
			$('#ad_type option:selected').text().toLowerCase() + ' in ' + 
			(($('#location_id').val() == "")?'Ireland':$('#location_id option:selected').text()) + 
			(($('#keywords').val()=="")?'':(" and '" + $('#keywords').val() + "'"));
	}

	function changeText(data) {
		if(data.length > 0) {
			$('div.box_num_results').html('<p class="no_margin">Your search for <strong><em>"'+makeSearchString()+'"</em></strong> found <strong>'+data.length+'</strong> results results.</p>');
		}
		else
			$('div.box_num_results').html('<h3 title="No Results Found" class="blue">No Results Found</h3><p>Sorry but no ads for <strong><em>"'+makeSearchString()+'"</em></strong> were found.</p><p>Please try broadening your search.</p>');
	}

    /**
     *  Filter by form values
     */
	 
    $('#droplist').submit(function(event){
								   
		keywords = $('#keywords').val();
		pet_type_id = $('#pet_type_id').val();
		location_id = $('#location_id').val();
		var_ad_type = $('#ad_type').val();
		
        //AJAX query
        getMapsPoints();

		return false;
	});




});

