
var MAX_ZOOM = 18;
var MIN_ZOOM = 3;
var state = 'recent';
var add_marker = 0;
var map;
var homesearch;
var marker = [];
var page = 1;
var oldPoly;
var busy = 0;
var moved = 0;
var selectedMarker;

var basePin = new GIcon();
basePin.iconSize = new GSize(28, 28);
basePin.iconAnchor = new GPoint(14, 28);
basePin.infoWindowAnchor = new GPoint(5,1);


var redPin = new GIcon(basePin);    redPin.image = "/images/map/marker.png";
var yellowPin = new GIcon(basePin); yellowPin.image = "/images/pin_yellow.png";
var pimage;
var yimage;

function createPin(note_id, point) {
	var icon = new GIcon(basePin);
	var ranNum= Math.floor(Math.random()*3);
	yimage=new Array(3);
	yimage[0] = "note_yellow.png";
	yimage[1] = "note_yellow_left.png";
	yimage[2] = "note_yellow_right.png";
	pimage=new Array(3);
	pimage[0] = "note_pink.png";
	pimage[1] = "note_pink_left.png";
	pimage[2] = "note_pink_right.png";	
	icon.image = "/images/" + yimage[ranNum] ;
	
	var m = new GMarker(point, icon);
	m.id = note_id
	
	// hover marker => highlight list
	GEvent.addListener(m, "mouseover", function() {
		if(selectedMarker != m){
			m.setImage("/images/" + pimage[ranNum]);
			$('tr' + note_id).bgColor = '#F098BA';
		}
	}); 	    
	GEvent.addListener(m, "mouseout", function() {
		if(selectedMarker != m){
			m.setImage("/images/" + yimage[ranNum]);
			$('tr' + note_id).bgColor = '';
		}
	});
	
	// hover list => highlight marker			  		
	GEvent.addDomListener($('tr'+note_id), "mouseover", function() {
		if(selectedMarker != m){
			m.setImage("/images/" + pimage[ranNum]);
			$('tr' + note_id).bgColor = '#F098BA';
		}
	});
	GEvent.addDomListener($('tr'+note_id), "mouseout", function() {
		if(selectedMarker != m){
			m.setImage("/images/" + yimage[ranNum]);
			$('tr' + note_id).bgColor = '';
		}
	});
	
	// click on note => lock in 
	GEvent.addDomListener(m, "click", function() {
		if(selectedMarker == m){
			m.setImage("/images/" + yimage[ranNum]);
			$('tr' + note_id).bgColor = '';
			selectedMarker = '';
		}else{
			if(selectedMarker){
				selectedMarker.setImage("/images/" + yimage[ranNum]);
				$('tr' + selectedMarker.id).bgColor = '';
			}
			m.setImage("/images/" + pimage[ranNum]);
			$('tr' + note_id).bgColor = '#F098BA';
			selectedMarker = m;
		}
	});	
						
    return m;
}

function clearerror(){
	$('error').style.display='none';
	$('where').value = '';
}

function showAddressOLD(address) {
  if(address != '' && address != 'in map area'){
  var geocoder = new GClientGeocoder();
  geocoder.getLatLng(
    address,
    function(point) {
      if (!point) {
		$('error').style.display='';
		setTimeout("clearerror();", 1950);
      } else {
        map.setCenter(point, 13);
	
		var oldCenter;
		var oldRadius;
		var oldPoly;
		/* drawCircle(map.getCenterLatLng(), .005); */
		$('where').value = address;
		$('where').style.color='black';
		update_place_list();
      }
    }
  );
  }else{
	update_place_list();
  }
}
function showAddress(address) {
  if(address != '' && address != 'in map area'){
    var geocoder = GXmlHttp.create(); //new GClientGeocoder();
    url = "/explore/geo?a="+address;
    geocoder.open("GET", url, true);
    geocoder.onreadystatechange = function(){
        if (geocoder.readyState ==4) {
        	var x = geocoder.responseXML; 
	      	markers = x.getElementsByTagName('result');
		    if(markers[0]){	  
			    var point = new GLatLng(parseFloat(markers[0].getAttribute("lat")), parseFloat(markers[0].getAttribute("lng")));
		    }
		    if (!point) {
				$('error').style.display='';
				setTimeout("clearerror();", 1950);
			}else {
				$('spinner').style.display='none';
				map.setCenter(point, 13);	
				$('where').value = address;
				$('where').style.color='black';
				busy = 0;
				$('leftsidenav').innerHTML = "";
				$('page').value = '1';
				update_place_list(true);
	      	}	    
		}else{
	    	$('spinner').style.display='';
	    	busy = 1;
		}    
    }
    $('spinner').style.display='none';
  }
  if(geocoder){
	  geocoder.send(null);
  }else{
	 $('page').value = '1';
	 update_place_list(true); 
  }
}
function drawCircle(center, radius){
	//Function created by Chris Haas
	
	var circleQuality = 5						
	var points = [];							
	oldCenter = center;
	oldRadius = radius;
	var M = Math.PI / 180;						
	var L = map.getBoundsLatLng();				
	var circleSquish = 1;
	var T = map.getCurrentMapType();
	circleSquish = (L.minX - L.maxX) / (L.minY - L.maxY);	
	for(var i=0; i<=360; i+=circleQuality){
		var P = new GPoint(center.x + (radius * Math.cos(i * M)) * circleSquish, center.y + (radius * Math.sin(i * M)));
		points.push(P);
	}
	oldPoly = new GPolyline(points)
	map.addOverlay(oldPoly); 
}

/*
	rebuilds our query url and picks up any changes.
*/
function urlForExploreDataRequest(initial){
    var bounds = map.getBounds();
    var southWest = bounds.getSouthWest();
    var northEast = bounds.getNorthEast();

    tmp = "/explore/data?nelat=" + northEast.lat() + "&nelong=" + northEast.lng() + "&swlat=" +southWest.lat()  + "&swlong=" + southWest.lng();
    tmp = tmp + "&sort=" + $('sort').value;
    tmp = tmp + "&tag=" + $('tag').value;
    tmp = tmp + "&what=" + $('searchwhat').value;
    tmp = tmp + "&page=" + $('page').value;
    tmp = tmp + "&who=" + $('who').value;
    tmp = tmp + "&zoom=" + $('zoom').value;
	tmp = tmp + "&notesubset=" + $('usrtnav').value;
	if(initial) tmp = tmp + "&initial=true";
    return tmp;
}

// if inital is true the map gets centered and zoomed to show all notes
function update_place_list(initial){
	if (busy == 0){
		$('spinner').style.display = 'block';
		$('spinner').style.border = '1px solid #ccc'
		busy = 1;
		setTimeout(function(){update_place_list_do(initial)}, 100);
	}else{
		$('spinner').style.display = 'block';
		$('spinner').style.border = '1px solid red'
		setTimeout("$('spinner').style.display='none';", 700);
		/* if we experience load issue, comment this out */
		/* setTimeout(function(){update_place_list_do(initial)}, 100); */
		moved = 1;
	}
}


function update_place_list_do(initial) {
    var r = GXmlHttp.create();
    url = urlForExploreDataRequest(initial);
	r.open("GET", url, true);
    r.onreadystatechange = function(){
        if (r.readyState == 4) {
            var x = r.responseXML;
		    if(x){
			    // var newhtml = GXml.value(x.getElementsByTagName('newhtml')[0]);
			    var notshown = GXml.value(x.getElementsByTagName('notshown')[0]);
			    var markers = x.getElementsByTagName('result');
				map.clearOverlays();
			    	// $('explorenav1').innerHTML = newhtml;
				$('leftsidenav').innerHTML = GXml.value(x.getElementsByTagName('sidenav')[0]);
				$('paging').innerHTML = GXml.value(x.getElementsByTagName('paging')[0]);
				if(markers.length > 0){
					var maxLat = -90.0;// - 90 degrees is the minimum value of lat/lng
					var maxLng = -90.0;
					var minLat = 90.0;// 90 degrees is the maximum value of lat/lng
					var minLng = 90.0;
				
					// we only show 10 notes	
				    for (m = 0; m < markers.length; m++) {
						var lat = parseFloat(markers[m].getAttribute('lat'));
						var lng = parseFloat(markers[m].getAttribute('lng'));
						var note_id = parseInt(markers[m].getAttribute('id'), 10);
						var marker = window.createPin(note_id, new GPoint(lng, lat));
						if(initial){
							maxLat = Math.max(maxLat, lat);
							maxLng = Math.max(maxLng, lng);
							minLat = Math.min(minLat, lat);
							minLng = Math.min(minLng, lng);
						}
						map.addOverlay(marker);
					}
				
					if(initial && markers.length > 1){
						// center and zoom map so all notes are in bounding box
						bounds = new GLatLngBounds(new GLatLng(minLat, minLng), new GLatLng(maxLat, maxLng));
						map.setCenter(bounds.getCenter());
						map.setZoom(MIN_ZOOM);
						while(map.getZoom() < MAX_ZOOM + 1 && map.getBounds().containsBounds(bounds)){
							map.zoomIn();
						}
						map.zoomOut(); //gives all notes a litte space 
					}
					else if (initial && markers.length == 1){
						var latlng = new GLatLng(markers[0].getAttribute('lat'), markers[0].getAttribute('lng'));
						map.setCenter(latlng, MAX_ZOOM);
					}
				}else{
					$('leftsidenav').innerHTML = "<tr><td align=center>Couldn't find any Notes in map area.</td></tr>";
				}
			    $('clat').value = GXml.value(x.getElementsByTagName('clat')[0]);
			    $('clng').value = GXml.value(x.getElementsByTagName('clng')[0]);
				busy = 0;
			    $('spinner').style.display='none';
		    }else{
			  	$('leftsidenav').innerHTML = "<tr><td align=center>Please wait - loading Sticky Notes...</td></tr>";
				update_place_list_do(initial);  
		    }
		}
    }
    r.send(null);
};
 
function showNextPage(){
	$('page').value = parseInt($('page').value) + 1; 
	update_place_list(true);
}

function showPreviousPage(){
	$('page').value = parseInt($('page').value) - 1; 
	update_place_list(true);
}


function onLoad() {
    if (!GBrowserIsCompatible()) {
        $('browserwontwork').className= '';
    } 
    map = new GMap($("exploremap"));
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
    map.enableDoubleClickZoom();
    map.enableContinuousZoom(); 
	if(false && readCookie('lat') && readCookie('lat') != ''){
		var cclat = parseFloat(readCookie('lat'));
	    var cclng = parseFloat(readCookie('long'));
	    var cczoom = parseFloat(readCookie('zoom'));    
	    if(cczoom != '' && parseInt(cczoom) > 0){
		    var tzoom = cczoom;
	    }else{
		    var tzoom = 3;
	    }
	    map.setCenter(new GLatLng(cclat, cclng), tzoom);
    }else if(setlatitude){
		map.setCenter(new GLatLng(setlatitude, setlongitude), 9);	
	}else{
		map.setCenter(new GLatLng(40.648325, -73.968795), 9);   
	}
    // for the home page
    if(homesearch){
			if(setlatitude){
				map.setCenter(new GLatLng(setlatitude, setlongitude), 9)
			}else{		
				map.setCenter(new GLatLng(0.274, 5.273), 13);
			}	
    }
	GEvent.addListener(map, 'click', function() {
			if(busy == 1){
				$('spinner').style.display='';
				setTimeout("$('spinner').style.display='none';", 700);
			}
    	});
  
    for (p = 0; p < marker.length; p ++)
        map.addOverlay(marker[p]);
    if (marker.length==1)
        GEvent.trigger(marker[0], "click");

    // lastly, sets see if loki is present and where it thinks we are.
	if (window.loki){	
		loki.onSuccess = lokionSuccess;
		loki.onFailure = lokionFailure;
		loki.setKey('socialight.com');
		loki.requestLocation(true,loki.LIMITED_STREET_ADDRESS_LOOKUP);	
		map.setCenter(new GLatLng($('setlocation_latitude').value, $('setlocation_longitude').value), 4);
	}
    jdragend = GEvent.addListener(map, 'dragend', function() {
		$('where').value='in map area';
		if (navigator.appVersion.indexOf("MSIE") == -1){
			$('where').style.color='grey';   
		}
		update_place_list();
    });

    jzoomend = GEvent.addListener(map, 'zoomend', function(oldLevel, newLevel) {
		$('where').value='in map area';
		if (navigator.appVersion.indexOf("MSIE") == -1){
			$('where').style.color='grey';   
		}
		$('zoom').value = newLevel;
		update_place_list();
    });	
    /* now call the default map */
    update_place_list(true);

}
window.onload = onLoad;
window.onunload = GUnload;

function slreenableevents(){
    jdragend = GEvent.addListener(map, 'dragend', function() {
	$('where').value='in map area';
	if (navigator.appVersion.indexOf("MSIE")==-1){
		$('where').style.color='grey';   
	}
	$('page').value = 1;
		update_place_list();
    });
    jzoomend = GEvent.addListener(map, 'zoomend', function() {
		$('where').value='in map area';
		if (navigator.appVersion.indexOf("MSIE")==-1){
			$('where').style.color='grey';   
		}	
		$('page').value = 1;
			update_place_list();
    });
}

function revert() {
    if (!map) return true;
    show_recent_places();
    map.closeInfoWindow()
    map.centerAndZoom(new GPoint(10, 34.724620), 16); // -4.218750, 34.724620), 16);
    return false;
}
GSize.fromLatLngXml = function(s) {
    return new GSize(s.getAttribute('lng'), s.getAttribute('lat'));
}
GPoint.fromLatLngXml = function(c) {
    return new GPoint(c.getAttribute('lng'), c.getAttribute('lat'));
}




function field_error(e,errspan,errstr) {
    e.style.backgroundColor = '#ffeeee';
    e.style.border = 'solid 1px #ff0000';
    if (errspan)
        $(errspan).innerHTML = errstr;
}
function field_unerror(e,errspan) {
    e.style.backgroundColor = '#ffffff';
    e.style.border = 'solid 1px #000000';
    if (errspan)
        $(errspan).innerHTML = '';
}
function show_recent_places() {
    if (state=='recent') return
    state = 'recent'
    $('recent_places').style.display='block';
    $('add_success').style.display='none';
    $('report_success').style.display='none'
    $('incorrect_entry').style.display='none'
    $('add_place').style.display='none';
    if (add_marker) map.removeOverlay(add_marker);
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function writeCookie(name, value){
	document.cookie = name + '=' + value
}