/**
 * @author Freddo
**/

	// Global Variables
	var map, iconPetFound, iconPetLost, iconPetTell, iconPetNeed, customIcons = [];
	var iconPetVolunt, iconPetSPoint = [];
	var moveHandler, oldZoom;
	var PetMarkersArray = [];
	// Categories (Petfound, petlost, ...)
	var categoryToggle = []; 
	// Types (cat, dog, snake, ...)
	var typeToggle = [];
	// More Search Options
	var moreSearch;
    var moreMarkers;
	// scrollWheel Option
	var scrollWheel;

	// Dom OnLoad Function
	jQuery(document).ready(function(){
		jQuery('#map_canvas .more_info_window').live('click', function (event) {
			target = jQuery(event.target).parent();
			//target_link = target.parent();
			target.colorbox({iframe:true, width:'50%', height:'50%'});
			target.click();
			return false;
			//target.open();
		});
		
    	// Map Options
    	var mapOptions = {
    		scrollwheel: false,
        	zoom: 11,
			navigationControl: true,
			navigationControlOptions: {style: google.maps.NavigationControlStyle.ZOOM_PAN},
			mapTypeControl: false,
        	center: new google.maps.LatLng(37.9806951,  23.734414),
        	mapTypeId: google.maps.MapTypeId.ROADMAP
		};
		// Create Map
    	map = new google.maps.Map(document.getElementById("pet_map"), mapOptions);
		// Initialize Variables
		initialize();
		// Add Events to map
		mapAddEvents();
		// Load Default Markers
		mapBoundsChanged()
		// Show Initial Content
	})

	function petMarker(id, marker, point, type, category) {
		this.pet_id = id;
		this.pet_marker = marker;
		this.pet_type = type;
		this.pet_category = category;
		this.pet_point = point;
	}

	// Add Events to map
	function mapAddEvents() {
		moveHandler = google.maps.event.addListener(map, 'bounds_changed', mapBoundsChanged);
		google.maps.event.addListener(map, 'dragstart',      mapDragStart);
		google.maps.event.addListener(map, 'dragend',        mapDragEnd);
		google.maps.event.addListener(map, 'zoom_changed',   mapZoomChanged);
	}

	// Initialize Global Variables
	function initialize() {
    	// Custom PetFound Icon
		iconPetFound = new google.maps.MarkerImage('./images/pet_found.png', new google.maps.Size(32, 32), new google.maps.Point(0,0), new google.maps.Point(16, 16));
		customIcons["petfound"] = iconPetFound;
    	// Custom PetLost Icon
		iconPetLost = new google.maps.MarkerImage('./images/pet_lost.png', new google.maps.Size(32, 32), new google.maps.Point(0,0), new google.maps.Point(16, 16));
	    customIcons["petlost"] = iconPetLost;
    	// Custom PetTell Icon
		iconPetTell = new google.maps.MarkerImage('./images/pet_tell.png', new google.maps.Size(32, 32), new google.maps.Point(0,0), new google.maps.Point(16, 16));
		customIcons["pettell"] = iconPetTell;
    	// Custom PetNeed Icon
		iconPetNeed = new google.maps.MarkerImage('./images/pet_need.png', new google.maps.Size(32, 32), new google.maps.Point(0,0), new google.maps.Point(16, 16));
		customIcons["petneed"] = iconPetNeed;
    	// Custom PetVolunt Icon
		iconPetVolunt = new google.maps.MarkerImage('./images/pet_volunt.png', new google.maps.Size(25, 28), new google.maps.Point(0,0), new google.maps.Point(13, 14));
		customIcons["petvolunt"] = iconPetVolunt;
    	// Custom PetSPoint Icon
		iconPetSPoint = new google.maps.MarkerImage('./images/pet_spoint.png', new google.maps.Size(20, 28), new google.maps.Point(0,0), new google.maps.Point(10, 14));
		customIcons["petspoint"] = iconPetSPoint;
		/* PetFound Enable */
		categoryToggle['petfound'] = true;	myobj = document.getElementById('togglepetfoundimg');	toggleImageCategory(myobj, 'petfound');
		/* PetLost Enable */
		categoryToggle['petlost'] = true;	myobj = document.getElementById('togglepetlostimg');	toggleImageCategory(myobj, 'petlost');
		/* PetTell Enable */
		categoryToggle['pettell'] = false;	myobj = document.getElementById('togglepettellimg');	toggleImageCategory(myobj, 'pettell');
		/* PetNeed Enable */
		categoryToggle['petneed'] = true;	myobj = document.getElementById('togglepetneedimg');	toggleImageCategory(myobj, 'petneed');	
		/* PetNeed Enable */
		categoryToggle['petvolunt'] = false;	myobj = document.getElementById('togglepetvoluntimg');	toggleImageCategory(myobj, 'petvolunt');	
		/* PetNeed Enable */
		categoryToggle['petspoint'] = false;	myobj = document.getElementById('togglepetspointimg');	toggleImageCategory(myobj, 'petspoint');	
		/* General Type Enable */
		typeToggle['general'] = true;
		/* Cats Enable */
		typeToggle['cat'] = true;		myobj = document.getElementById('togglecatimg');	toggleImageType(myobj, 'cat');
		/* Dogs Enable */
		typeToggle['dog'] = true;		myobj = document.getElementById('toggledogimg');	toggleImageType(myobj, 'dog');
		/* Bird Enable */
		typeToggle['bird'] = false;		myobj = document.getElementById('togglebirdimg');	toggleImageType(myobj, 'bird');
		/* Snake Enable */
		typeToggle['snake'] = false;		myobj = document.getElementById('togglesnakeimg');	toggleImageType(myobj, 'snake');
		/* Lizard Enable */
		typeToggle['lizard'] = false;	myobj = document.getElementById('togglelizardimg');	toggleImageType(myobj, 'lizard');
		/* More Search */
		jQuery("div#more_options").slideUp("slow");
		moreSearch = false;
		moreMarkers = true;
		scrollWheel = false;
    }

	// Map Event Drag Start
    function mapDragStart() {
		google.maps.event.removeListener(moveHandler);
    };
	// Map Event Drag End
    function mapDragEnd() {
		mapBoundsChanged();
		moveHandler = google.maps.event.addListener(map, 'bounds_changed', mapBoundsChanged);
    };
	// Map Event Change Zoom
    function mapZoomChanged() {
		if (map.getZoom() < oldZoom) {
			if (PetMarkersArray.length > 0) {
		        for (var m = PetMarkersArray.length - 1; m >= 0; m--) {
					removeMarker(m);
				}
			}
		}
		oldZoom = map.getZoom();
    };
	// Map Event Change Bounds
    function mapBoundsChanged() {
		google.maps.event.removeListener(moveHandler);
    };
    // Remove Markers from map
    function removeMarker(m) {
		if (!!PetMarkersArray[m].pet_marker.infoWindow) {
			PetMarkersArray[m].pet_marker.infoWindow.close();
		}
		PetMarkersArray[m].pet_marker.setMap(null);
		PetMarkersArray.splice(m, 1);
    };

	// Refresh Markers Display after the map events have been Triggered
    function mapBoundsChanged() {
		//if (!!geoXml.lastmarker && !!geoXml.lastmarker.infoWindow)
		//return;
    
		// Get the map boundary coordinates
		var mapBounds = map.getBounds();

		if (!!mapBounds) {
			// Remove old markers from display
			if (PetMarkersArray.length > 0) {
		        for (var m = PetMarkersArray.length - 1; m >= 0; m--) {
					var position = PetMarkersArray[m].pet_point;
					if (!mapBounds.contains(position)) {
						removeMarker(m);
					}
				}
			}
			// Parameterize the geodata URL based on those boundaries 
			var url = 'mydatapoints.xml.php?maxRows=10&west=' + 
                  mapBounds.getSouthWest().lng().toFixed(6) + '&north=' + 
                  mapBounds.getNorthEast().lat().toFixed(6) + '&east=' + 
                  mapBounds.getNorthEast().lng().toFixed(6) + '&south=' +  
                  mapBounds.getSouthWest().lat().toFixed(6);
      
			// Load the KML - new markers will be added when it returns
			loadMarkers(url);
		}
    };

	// Load Markers xml file from url
    function loadMarkers(myUrl){
		//jQuery.get(url, {}, function(mydata){
		jQuery.ajax({type:"POST", url:myUrl,  
			success:function(mydata){
				jQuery(mydata).find("marker").each(function(){
					var marker = jQuery(this);
					var point = new google.maps.LatLng(parseFloat(marker.attr("lat")), parseFloat(marker.attr("lng")));
					var id = marker.attr("id");
					var category = marker.attr("category");
					var type = marker.attr("type");
					createMarker(point, id, type, category);
				})
			},error:function(XMLHTTPRequest,textStatus,errorThrow){
				alert("There was an error retrieving the marker information.");
			}
		});
	}

	// Create Markers Function
	function createMarker(point, id, type, category) {
		for (var j in PetMarkersArray) {
			if ((PetMarkersArray[j].pet_id == id)) {
				return;
			}
		}

		if (categoryToggle[category] == true) {
			if (typeToggle[type] == true) {
				var marker = new google.maps.Marker({ position: point, map: map, icon: customIcons[category] });
			} else {
				var marker = new google.maps.Marker({ position: point, map: null, icon: customIcons[category] });
			}
		} else {
			var marker = new google.maps.Marker({ position: point, map: null, icon: customIcons[category] });
		}
	  	//markers.push(marker);
		
		var petmarker = new petMarker(id, marker, point, type, category);
		PetMarkersArray.push(petmarker);

		// Marker Event Listener for Click (Infowindow)
      	var url = category + "_small.php?id=" + id;
	  	google.maps.event.addListener(marker, "click", function() {
 			jQuery.get(url, {}, function(doc, code){
				var infowindow = new google.maps.InfoWindow({content: doc});
     			infowindow.open(map,marker);
  			});
	  	});
    }

	function getMoreInfo() {
		$this = "foo";
	}

	// Toggle Type Buttons (Cat, Dog, Snake...)
	function toggleImageType(myobj,type) {
		images = myobj.getElementsByTagName('img');
		if (typeToggle[type] == true) {
			images[0].src="./images/toggle_" + type + "_on.jpg" 
		} else {
			images[0].src="./images/toggle_" + type + "_off.jpg"
		} 
	}
	// Toggle Category Buttons (Petlost, Petfound, Pettell)
	function toggleImageCategory(myobj,category) {
		images = myobj.getElementsByTagName('img');
		if (categoryToggle[category] == true) {
			images[0].src="./images/toggle_" + category + "_on.png" 
		} else {
			images[0].src="./images/toggle_" + category + "_off.png"
		} 
	}

	// Toggle Type Markers (Cat, Dog, Snake...)
	function toggleTypeMarkers(type,myobj) {
		typeToggle[type] = !typeToggle[type];
		toggleImageType(myobj,type);
		for (var j in PetMarkersArray) {
			if (categoryToggle[PetMarkersArray[j].pet_category] == true) {
				if (PetMarkersArray[j].pet_type == type) {
					var marker = PetMarkersArray[j].pet_marker;
					if (marker.getMap() == null) {
						marker.setMap(map);
					}
					else {
						marker.setMap(null);
					}
				}
			}
		}
	}

	// Toggle Category Markers (Petlost, Petfound, Pettell, Petneed)
    function toggleCategoryMarkers(category,myobj){
		categoryToggle[category] = !categoryToggle[category];
	  	toggleImageCategory(myobj,category);
		for (var j in PetMarkersArray) {
			if (typeToggle[PetMarkersArray[j].pet_type] == true) {
				if (PetMarkersArray[j].pet_category == category) {
					var marker = PetMarkersArray[j].pet_marker;
					if (marker.getMap() == null) {
						marker.setMap(map);
					}
					else {
						marker.setMap(null);
					}
				}
			}
		}
	}

	// Function check if value exists in array
	function inArray(elem, array) {
	    for (var i in array) {
	        if (i == elem) {
	            return true;
	        }
	    }
	    return false;
	}

	// Toggle More search options
	jQuery(document).ready(function(){
		jQuery("img#toggleMoreSearch").click(function () {
			if (moreSearch) {
				jQuery("div#more_options").slideUp("slow");
				moreSearch = false;
			} else {
				jQuery("div#more_options").slideDown("slow");
				moreSearch = true;
			}
		});
	});
	
	// Toggle More search options
	jQuery(document).ready(function(){
		jQuery("div#toggleMoreMarkers").click(function () {
			if (moreMarkers) {
				jQuery('div#sideBarMarkers').hide("slide", { direction: "left" }, 200, function() {
					jQuery('div#yui-main').attr("style", "float:right; margin-left:0px;");
					jQuery('div#mainMapDiv').attr("style", "margin-left:0px;")
				});
				moreMarkers = false;
			} else {
				jQuery('div#mainMapDiv').attr("style", "margin-left:250px;")
				jQuery('div#yui-main').attr("style", "float:right; margin-left:-250px;");
				jQuery('div#sideBarMarkers').show("slide", { direction: "left" }, 200);
				moreMarkers = true;
			}
		});
	});

	jQuery(document).ready(function(){
		jQuery("#toggleMouseWheel").click(function () {
			if (scrollWheel == true) { 
				map.setOptions({scrollwheel: false}); 
				scrollWheel=false; 
				jQuery('#toggleMouseWheel img').attr("src","./images/toggle_mousewheel_off.png"); 
			} else if (scrollWheel == false) { 
				map.setOptions({scrollwheel: true}); 
				scrollWheel=true; 
				jQuery('#toggleMouseWheel img').attr("src","./images/toggle_mousewheel_on.png"); 
			}
		});
	});
