/*
Created by Todd Dzur for opshop.org
Google Map Christmas lights. 2009

*/

function login2a(e) {
	  document.getElementById("message").innerHTML = "Trying to Login";
	  var url = "/christmas/login2.php?email=" + e;
      GDownloadUrl(url, function(data, responseCode) {

        if (responseCode == 200 && Left(data,4) == "user") {
	        
	      document.getElementById("message").innerHTML = "Logged In.";
          document.getElementById("userdetails").innerHTML = "<b>" + Mid(data,5,50) + "</b>";
          document.getElementById("login").innerHTML = "";
          document.getElementById('mainpage').style.display = 'block'; 
          if (typeof(marker) != "undefined") {marker.closeInfoWindow()};
         
        } else {
        	document.getElementById("message").innerHTML = "<img src='http://maps.google.com/mapfiles/ms/micons/caution.png' /> Login Error. " + data;
      	}
      });
      
}


/*
 Gives directions between a series of points within a given radius.
*/
function closestMarkerSearch(map, markers, zoom, address,within) {
	
	  within = within * 1000
    if (markers.length == 0) {
        throw new Exception('No markers given');
    }
    var mymarkers = markers.slice();
    new GClientGeocoder().getLatLng(address, function(latLng) {
        if (latLng === null) {
            alert('Please enter an address');
        } else {
            var distance;
            var homedistnace;
            var closestDistance = null;
            var closestMarker = null;
            var drive = [];
            var tmpmarkers = new Array();
            var itn = "<pre>";
           if (pmarker) {
            	map.removeControl(pmarker);
            	pmarker.hide();
            }
            
            pmarker = createMarkerIcon(latLng,address,'',"start");
            map.addOverlay(pmarker);
            drive.push(pmarker.getLatLng());
            
            var cm;
            var c = 0;
            var stops = 15;
            
            for (var m = 0; m < stops;m++){
	          closestDistance = null;
              closestMarker = null;
              tmpmarkers = new Array();
            
	          for (var i = 0; i < mymarkers.length; i++) {
		    
		              if (latLng == mymarkers[i].getLatLng()) {
		              } else {
			              
		                distance = latLng.distanceFrom(mymarkers[i].getLatLng());
		                homedistance = pmarker.getLatLng().distanceFrom(mymarkers[i].getLatLng());
		                c++;
		                if (homedistance>within) {
			                  farMarker = mymarkers[i];
			               	  farMarker.hide();
		                } else if (mymarkers[i].getIcon().image.match(/red/)) {
			
		                } else { 	
			            	closeMarker = mymarkers[i];
			                closeMarker.show();
			                if (closestDistance === null || distance < closestDistance ) {
		                    	closestDistance = distance;
		                    	closestMarker = mymarkers[i];
		                    	cm = i;
		                	}
		                	tmpmarkers.push(mymarkers[i]);
		                	
		                	 
	                  } 
	               }
	               if (mymarkers.length <= i) {i=mymarkers.length;}
	            }
	           
	           if (closestMarker == null) {
		           // alert ("No Closest Marker:" + cm);
	           }else{
		            //Add marker to route and remove the marker from array.
								
		            drive.push(closestMarker.getLatLng());
					latLng = closestMarker.getLatLng();
					
				    //itn += latLng.lng() + '|'+ latLng.lat() + '|' + m + '|0\n';
								
								var isNotSame = function(x) {
			   						if (x.getLatLng() == latLng) { return false; } else { return true; }
								}
				
								mymarkers = tmpmarkers.filter(isNotSame);
				
				  	}
			  
			  /* Work here */
			  
			  	if (m >= 10) { 
				  	within = latLng.distanceFrom(pmarker.getLatLng());
			  	 //alert (within);
			  	 }
			  
			  	 
			  /*End here */
			  
				if (mymarkers < 1) { m = stops; }
		    }//End Loops
					  
            if (closestDistance < 2000) { zoom = 14; } else if (closestDistance< 4000) { zoom = 12;} else { zoom = 10;}
            map.setZoom(zoom);
            map.setCenter(latLng);

            
			document.getElementById("route").innerHTML = "";
			//document.getElementById("itn").innerHTML = itn + "</pre>";
            directions.clear();
            directions = new GDirections(map,directionsPanel);
            directions.loadFromWaypoints(drive);

        		GEvent.addListener(directions, 'load', function(){ // Listnener for directions on load 
        			   	document.getElementById('dist').innerHTML = (directions.getDistance().meters / 1000).toPrecision(4) + ' km, not including return travel';   // Fill kilometers  
        		}); 
        }
    });
}
/* LatLng Drive */
function closestMarkerLatLng(map, markers, zoom, lat, lng,within) {
	
	within = within * 1000
    if (markers.length == 0) {
        throw new Exception('No markers given');
    }
    var mymarkers = markers.slice();

		var latLng = new GLatLng(lat, lng);
            var distance;
            var homedistnace;
            var closestDistance = null;
            var closestMarker = null;
            var drive = [];
            var tmpmarkers = new Array();
            var itn = "<pre>";
           if (pmarker) {
            	map.removeControl(pmarker);
            	pmarker.hide();
            }
            
            pmarker = createMarkerIcon(latLng,'Start','',"start");
            map.addOverlay(pmarker);
            drive.push(pmarker.getLatLng());
            
            var cm;
            var c = 0;
            var stops = 15;
            
            for (var m = 0; m < stops;m++){
	          closestDistance = null;
              closestMarker = null;
              tmpmarkers = new Array();
            
	          for (var i = 0; i < mymarkers.length; i++) {
		    
		              if (latLng == mymarkers[i].getLatLng()) {
		              } else {
			              
		                distance = latLng.distanceFrom(mymarkers[i].getLatLng());
		                homedistance = pmarker.getLatLng().distanceFrom(mymarkers[i].getLatLng());
		                c++;
		                if (homedistance>within) {
			                  farMarker = mymarkers[i];
			               	  farMarker.hide();
		                } else if (mymarkers[i].getIcon().image.match(/red/)) {
			
		                } else { 	
			            	closeMarker = mymarkers[i];
			                closeMarker.show();
			                if (closestDistance === null || distance < closestDistance ) {
		                    	closestDistance = distance;
		                    	closestMarker = mymarkers[i];
		                    	cm = i;
		                	}
		                	tmpmarkers.push(mymarkers[i]);
		                	
		                	 
	                  } 
	               }
	               if (mymarkers.length <= i) {i=mymarkers.length;}
	            }
	           
	           if (closestMarker == null) {
		           // alert ("No Closest Marker:" + cm);
	           }else{
		            //Add marker to route and remove the marker from array.
								
		            drive.push(closestMarker.getLatLng());
					latLng = closestMarker.getLatLng();
					
				    //itn += latLng.lng() + '|'+ latLng.lat() + '|' + m + '|0\n';
								
								var isNotSame = function(x) {
			   						if (x.getLatLng() == latLng) { return false; } else { return true; }
								}
				
								mymarkers = tmpmarkers.filter(isNotSame);
				
				  	}
			  
			  /* Work here */
			  
			  	if (m >= 10) { 
				  	within = latLng.distanceFrom(pmarker.getLatLng());
			  	 //alert (within);
			  	 }
			  
			  	 
			  /*End here */
			  
				if (mymarkers < 1) { m = stops; }
		    }//End Loops
					  
            if (closestDistance < 2000) { zoom = 14; } else if (closestDistance< 4000) { zoom = 12;} else { zoom = 10;}
            map.setZoom(zoom);
            map.setCenter(latLng);

            
			document.getElementById("route").innerHTML = "";
			//document.getElementById("itn").innerHTML = itn + "</pre>";
            directions.clear();
            directions = new GDirections(map,directionsPanel);
            directions.loadFromWaypoints(drive);

        		GEvent.addListener(directions, 'load', function(){ // Listnener for directions on load 
        			   	document.getElementById('dist').innerHTML = (directions.getDistance().meters / 1000).toPrecision(4) + ' km, not including return travel';   // Fill kilometers  
        		}); 
       
}



//This prototype is provided by the Mozilla foundation and
//is distributed under the MIT license.
//http://www.ibiblio.org/pub/Linux/LICENSES/mit.license

if (!Array.prototype.filter)
{
  Array.prototype.filter = function(fun /*, thisp*/)
  {
    var len = this.length;
    if (typeof fun != "function")
      throw new TypeError();

    var res = new Array();
    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in this)
      {
        var val = this[i]; // in case fun mutates this
        if (fun.call(thisp, val, i, this))
          res.push(val);
      }
    }

    return res;
  };
}

//******************************
function closestList(map, markers, zoom, address,within) {
	  directions.clear();
	  var debug = "";
	  within = within * 1000
    if (markers.length == 0) {
        throw new Exception('No markers given');
    }
    var mymarkers = markers.slice();
    
    new GClientGeocoder().getLatLng(address, function(latLng) {
        if (latLng === null) {
            alert('Please enter an address - or address not found');
        } else {
            var distance;
           if (pmarker) {
            	map.removeControl(pmarker);
            	pmarker.hide();
            }
            pmarker = createMarkerIcon(latLng,address,'',"start");
            map.addOverlay(pmarker);
            
            var c = 0;
						var hidden = false;
            var listmarkers = [];
            for (var i = 0; i < mymarkers.length; i++) {
	             if (mymarkers[i] != null){
			           if (latLng == mymarkers[i].getLatLng()) {
				              
			           } else {
				              distance = latLng.distanceFrom(mymarkers[i].getLatLng());
				              
			                //debug += mymarkers[i].getTitle() + ',' + i + ',' + (distance / 1000).toPrecision(4) + ',' +  mymarkers[i].getLatLng() +  '<br />';
			                if (latLng.distanceFrom(mymarkers[i].getLatLng())>within) {
				                  farMarker = mymarkers[i];
				               	  farMarker.hide();
											} else if (mymarkers[i].getIcon().image.match(/red/)) {
			                //alert("Low rated");
			                } else { 	
				                 closeMarker = mymarkers[i];
				                 closeMarker.show();
				                 listmarkers.push(mymarkers[i]);
				                 //debug += mymarkers[i].getTitle() + ',' + i + ',' + (distance / 1000).toPrecision(4) + ',' +  mymarkers[i].getLatLng() + ',' + (latLng.distanceFrom(mymarkers[i].getLatLng()) / 1000).toPrecision(4) + '<br />';	 
			                }
		                } 

	         			}       

		         }

	           

            zoom = 12;
            map.setZoom(zoom);
            map.setCenter(latLng);
            listmarkers.sort(sortLatLng);
             
            var msg = "";
            for (var i=0;i < listmarkers.length; i++){
	           	msg += listmarkers[i].getTitle() + '<br />';
            }     
						document.getElementById("route").innerHTML = msg + '<br /><div id="rightlist" class="font1"></div>';
						document.getElementById("debug").innerHTML = debug;
      
        }
    });
}
function sortLatLng(a, b){
//Compare "a" and "b" in some fashion, and return -1, 0, or 1
  return  (b.getLatLng().lat() - a.getLatLng().lat());
}
//******************************

function createMarkerIcon(point, mtitle, name, icon) {
  //alert(icon);
  if (icon) {
  	var marker = new GMarker(point, {
    icon: icons[icon],
    draggable: false,
    bouncy: false,
    title:mtitle
  });
  }else{
  	var marker = new GMarker(point);
  }
  GEvent.addListener(marker, "click", function() {
    marker.openInfoWindowHtml(mtitle + '<br />' + name);
  });

  return marker;
}

function createMarkerIconDetail(point, mtitle, name, icon, id) {
  //alert(icon);
  if (icon) {
  	var marker = new GMarker(point, {
    icon: icons[icon],
    draggable: false,
    bouncy: false,
    title:mtitle
  });
  }else{
  	var marker = new GMarker(point);
  }
  GEvent.addListener(marker, "click", function() {
    //marker.openInfoWindowHtml(mtitle + '<br />' + name); objectDetails(id, "false");
    marker.openInfoWindowHtml(mtitle + '<br />' + name); objectDetails2(id, "false","true");
  });

  return marker;
}

function objectDetails(id, map) {
	if (id < 1) {
	     alert ("location id error");
   } else {
	    //popUp('phpsql_storedetails.php?id=' + id);
      
      var url = "/christmas/phpsql_objectdetails.php?id=" + id + "&showmap=" + map;
      GDownloadUrl(url, function(data, responseCode) {
        if (responseCode == 200) {
          document.getElementById("rightlist").innerHTML = data;
        } else {
        	document.getElementById("message").innerHTML = "Error retriving location details" & data & "<br />";
      	}
      });
      
    }
}

function objectDetails2(id, map, showvote) {
	if (id < 1) {
	     alert ("location id error");
   } else {
	    //popUp('phpsql_storedetails.php?id=' + id);
      
      var url = "/christmas/phpsql_objectdetails.php?id=" + id + "&showmap=" + map + "&showvote=" + showvote + "&iframe=true";
      /*GDownloadUrl(url, function(data, responseCode) {
        if (responseCode == 200) {
          document.getElementById("rightlist").innerHTML = data;
          document.getElementById("message").innerHTML = "";
        } else {
        	document.getElementById("message").innerHTML = "Error retriving location details" & data & "<br />";
      	}
      });*/
      $("#rightlist").load(url, function(){
      		$("#message").text('');
      });
   
      
    }
}

// Creates a marker whose info window displays the given number
function createMarker(point, number)
{
var marker = new GMarker(point, {title: number});

// Show this markers index in the info window when it is clicked
var html = number;
GEvent.addListener(marker, "click", function() {marker.openInfoWindowHtml(html);});
return marker;
};

function vote(id,r) {
	
	
   if (r < -2 || r > 2) {
	     alert ("Voting error");
   } else {
	    //popUp('christmas_vote.php?id=' + id + '&rank=' + r + '&by=')
      
      var url = "/christmas/phpsql_vote.php?id=" + id + "&rank=" + r + "&by=";
      GDownloadUrl(url, function(data, responseCode) {
        if (responseCode == 200 && data.length <= 2) {
          marker.closeInfoWindow();
          document.getElementById("message").innerHTML = "Ranking added. Page will need to be reloaded to see any changes";
         
        } else {
        	document.getElementById("message").innerHTML = "<img src='http://maps.google.com/mapfiles/ms/micons/caution.png' /> Ranking error. " + data;
      	}
      });
      
    }
}

function votelistc(id,r,com,chk) {
	
   if (r < -2 || r > 2) {
	     alert ("Voting error");
   } else {
      var url = "/christmas/phpsql_votecomment.php?id=" + id + "&rank=" + r + "&comment=" + com + "&chk=" + chk;
      GDownloadUrl(url, function(data, responseCode) {
        if (responseCode == 200 && data.length <= 2) {
          document.getElementById("message").innerHTML = "Ranking added. Page will need to be reloaded to see any changes";
          if (marker) {marker.closeInfoWindow()};
        } else {
        	document.getElementById("message").innerHTML = data;
      	}
      });
      
    }
}

function login(e) {
	document.getElementById("message").innerHTML = "Login";
		  var url = "/christmas/login.php?email=" + e;
      GDownloadUrl(url, function(data, responseCode) {
        if (responseCode == 200 && data.length <= 2) {
          marker.closeInfoWindow();
          document.getElementById("message").innerHTML = "Email Registred OK.";
         
        } else {
        	document.getElementById("message").innerHTML = "<img src='http://maps.google.com/mapfiles/ms/micons/caution.png' /> Login Error. " + data;
      	}
      });
      
}




function popUp(URL) {
day = new Date();
id = day.getTime();
eval("page" + id + " = window.open(URL, '" + id + "', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=1,width=400,height=200,left = 440,top = 412');");
}
/*
function objectDetails(id, map) {
	if (id < 1) {
	     alert ("Store id error");
   } else {
	    //popUp('phpsql_storedetails.php?id=' + id);
      
      var url = "/christmas/phpsql_objectdetails.php?id=" + id + "&showmap=" + map;
      GDownloadUrl(url, function(data, responseCode) {
        if (responseCode == 200) {
          document.getElementById("rightlist").innerHTML = data;
        } else {
        	document.getElementById("message").innerHTML = "Error retriving store details" & data & "<br />";
      	}
      });
      
    }
}

*/
function showlogin() {
	document.getElementById("login").innerHTML = "<form onsubmit=\"login2(document.getElementById('email').value); return false\">Email:<input type='text' id='email' /> <input type=submit value='Login' /></form><br />";
}
function login2(e) {
	  document.getElementById("message").innerHTML = "Trying to Login";
	  var url = "/christmas/login2.php?email=" + e;
      GDownloadUrl(url, function(data, responseCode) {
		
	     if (responseCode == 200 ){//&& Left(data,4) == "user") {  
	      //document.getElementById("message").innerHTML = "";
          //document.getElementById("userdetails").innerHTML = "<b>" + Mid(data,5,50) + "</b>";
          //document.getElementById("login").innerHTML = "";
          //if (typeof(marker) != "undefined") {marker.closeInfoWindow()};
          window.location.reload();
         
        } else {
        	document.getElementById("message").innerHTML = "<img src='http://maps.google.com/mapfiles/ms/micons/caution.png' /> Login Error. " + data;
      	}
      });
      
}

function Right(str, n)
        /***
                IN: str - the string we are RIGHTing
                    n - the number of characters we want to return

                RETVAL: n characters from the right side of the string
        ***/
        {
                if (n <= 0)     // Invalid bound, return blank string
                   return "";
                else if (n > String(str).length)   // Invalid bound, return
                   return str;                     // entire string
                else { // Valid bound, return appropriate substring
                   var iLen = String(str).length;
                   return String(str).substring(iLen, iLen - n);
                }
        }
        
               function Mid(str, start, len)
        /***
                IN: str - the string we are LEFTing
                    start - our string's starting position (0 based!!)
                    len - how many characters from start we want to get

                RETVAL: The substring from start to start+len
        ***/
        {
                // Make sure start and len are within proper bounds
                if (start < 0 || len < 0) return "";

                var iEnd, iLen = String(str).length;
                if (start + len > iLen)
                        iEnd = iLen;
                else
                        iEnd = start + len;

                return String(str).substring(start,iEnd);
        }
        
               function Left(str, n)
        /***
                IN: str - the string we are LEFTing
                    n - the number of characters we want to return

                RETVAL: n characters from the left side of the string
        ***/
        {
                if (n <= 0)     // Invalid bound, return blank string
                        return "";
                else if (n > String(str).length)   // Invalid bound, return
                        return str;                // entire string
                else // Valid bound, return appropriate substring
                        return String(str).substring(0,n);
        }
        

//Archive

