var BASE_URL = "http://www.mailboxmap.com";
//var BASE_URL = "http://localhost";
var BOXES;
var COMMENTS;
var freezeFrame = 0;
var current_size = 0;
var MAX_BOXES = 100;
var AUTO_ZOOM = 1;
var markersArray = [];
var INFOWINDOW;
var CURRENT_BOX;
var CURRENT_MARKER;
var CURRENT_LOCATION;
var TIME_SLICES_INDEX = [];
var TIME_SLICES_COUNT = 0;
var BASE_SHADOW = "http://www.google.com/mapfiles/shadow50.png";
var selected = -1;
var map = null;
var geocoder = null;
var userMarker = null;
var FIRST_LOAD = 0;
var geocoder;
var map;
var browserSupportFlag = false;
var STREET_ZOOM = 16;
var positionTimer;

function createRequestObject() {
    var ro;
    var browser = navigator.appName;
    if(browser == "Microsoft Internet Explorer"){
        ro = new ActiveXObject("Microsoft.XMLHTTP");
    }else{
        ro = new XMLHttpRequest(); 
    }
    //ro.overrideMimeType('text/xml');
    return ro;
}

/////////////////////map setup//////////////////////////////////////////////////
    

   
function initialize() {

		var centerLat;
		var centerLng;
		if(getParameterByName("lat") != '')
			centerLat = getParameterByName("lat"); 
		else
			centerLat = 40;
			
		if(getParameterByName("lng") != '')
			centerLng = getParameterByName("lng");
		else
			centerLng = -97;
	

       var myOptions = {
        zoom: 5,
   	     center: new google.maps.LatLng(centerLat, centerLng),
   	     mapTypeId: google.maps.MapTypeId.ROADMAP,
   	     mapTypeControl: true,
   	     mapTypeControlOptions: {
   	         style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
   	         position: google.maps.ControlPosition.BOTTOM_CENTER
   	     },
   	     panControl: false,
   	     panControlOptions: {
   	         position: google.maps.ControlPosition.RIGHT_BOTTOM
   	     },
   	     zoomControl: true,
   	     zoomControlOptions: {
   	         style: google.maps.ZoomControlStyle.SMALL,
   	         position: google.maps.ControlPosition.RIGHT_BOTTOM
   	     },
   	     scaleControl: false,
   	     scaleControlOptions: {
   	         position: google.maps.ControlPosition.RIGHT_BOTTOM
   	     },
   	     streetViewControl: true,
   	     streetViewControlOptions: {
   	         position: google.maps.ControlPosition.RIGHT_BOTTOM
       }
       };
       map = new google.maps.Map(document.getElementById("map_canvas"),
           myOptions);
       geocoder = new google.maps.Geocoder();
       
       
        google.maps.event.addListener(map, 'zoom_changed', function() {
           if(freezeFrame != 1) updateBoxes();
	 	});
	 	
	google.maps.event.addListener(map, 'center_changed', function() {
	           if(freezeFrame != 1) updateBoxes();
	 	});
	
       google.maps.event.addListener(map, 'bounds_changed', function() {
           if(freezeFrame != 1) updateBoxes();
	 	});	
	 	
       google.maps.event.addListener(map, 'resize', function() {
           if(freezeFrame != 1) updateBoxes();
	 	});	
	 
	 
	
	  
	  if(getParameterByName('lng') != '')
	  		map.setZoom(STREET_ZOOM);
	 	
       
  }


/////////////////////ajax for box locations///////////////////////////////////////////////


function getBoxes(n,s,e,w) {
    
    var ups = 0;
    var office = 0;
    var mailbox = 0;
    AUTO_ZOOM=0;
    
    if(document.getElementById('upscheck').checked){
        AUTO_ZOOM=1;
    	ups = 1;
    	}
    if(document.getElementById('uspscheck').checked){
        AUTO_ZOOM=1;
    	office = 1;
    	}	
    if(document.getElementById('mailboxcheck').checked){
        AUTO_ZOOM=1;
    	mailbox = 1;
    	}
    	
    URL = BASE_URL+'/php/getBoxesv3.php?north='+n+'&south='+s+'&east='+e+'&west='+w+'&ups='+ups+'&office='+office+'&boxes='+mailbox;    
           
     //    document.getElementById('container_bg').innerHTML  = URL;
           
    try {
	    if(jxmlhttp) {
		jxmlhttp.open('get', URL);
	    	jxmlhttp.onreadystatechange = handleBoxResponse;
	    	jxmlhttp.send(null);
			document.getElementById('warning').style.display='none';
			document.getElementById('loading').style.display='block';
	    }
    	else {
	    	alert('null');
		jxmlhttp = new ActiveXObject("Microsoft.XMLHTTP");	
	}
    } catch(e){ alert(e);}
}



function handleBoxResponse() {

    
    if(jxmlhttp.readyState == 1) {
			

	
    }
    else if(jxmlhttp.readyState == 4){
        
        document.getElementById('loading').style.display='none';
	    document.getElementById('warning').style.display='none';
   		
        BOXES = eval('(' + jxmlhttp.responseText + ')');
	
	if (BOXES == null) {
			current_size = 0;
			if(AUTO_ZOOM == 1)
				map.setZoom(map.getZoom()-1);
	} else{
		current_size = BOXES.length;
	}
		
		
	for(i = 0;i<current_size; i++) {
		     	
		markerLocation = new google.maps.LatLng( BOXES[i].lat, BOXES[i].lng);
		addMarker(markerLocation,BOXES[i]);
			
	} 
	
	showOverlays();
				
				
	if(current_size >= MAX_BOXES) {	
		document.getElementById('warning').style.display='block';		
				
	}
                
     }
        
}




   function updateBoxes(){
 
 	if(FIRST_LOAD == 0 && browserSupportFlag == false)
 		{
 		FIRST_LOAD++;
 		return;
 		}
 
	deleteOverlays();
	  
	var bounds = map.getBounds();
	var southWest = bounds.getSouthWest();
	var northEast = bounds.getNorthEast();
	getBoxes(northEast.lat(), southWest.lat(),northEast.lng(), southWest.lng());


	}



///////////////map functions////////////////////////////////////



function addMarker(location,box) {


  marker = new google.maps.Marker({
    position: location,
    map: map,
    flat: false,
    shadow: BASE_SHADOW,
    icon: getIconForBox(box)
  });
  
  
  google.maps.event.addListener(marker, "click", function() {
  	 freezeFrame = 1;
  	 if(INFOWINDOW) INFOWINDOW.close();
  	 
  	 INFOWINDOW  = new google.maps.InfoWindow({
	     position: location,
	     map: map,
	     content: getHTMLforBox(box)
 	 });
 	 
 	 CURRENT_BOX = box;
 	 CURRENT_MARKER = marker;
 	 CURRENT_LOCATION = location;
 	 
 	 google.maps.event.addListener(INFOWINDOW,"closeclick",function(){
   	   //currentMark.setMap(null); //removes the marker
   	   freezeFrame = 0;
	});
 	 
   });
  
  
  
  markersArray.push(marker);
  
}


// Shows any overlays currently in the array
function showOverlays() {
  if (markersArray) {
    for (i in markersArray) {
      markersArray[i].setMap(map);
    }
  }
}

// Deletes all markers in the array by removing references to them
function deleteOverlays() {
  if (markersArray) {
    for (i in markersArray) {
      markersArray[i].setMap(null);
    }
    markersArray.length = 0;
  }
}





//geocode address
function showAddress(address) {
      
        geocoder.geocode( { 'address': address}, function(results, status) {
          if (status == google.maps.GeocoderStatus.OK) {
            map.setCenter(results[0].geometry.location);
            map.setZoom(STREET_ZOOM);
        
           var marker = new google.maps.Marker({
              map: map,
              position: results[0].geometry.location
            });
            
            
            if(userMarker)
            	userMarker.setMap(null);
            
            userMarker = marker;
            updateBoxes();
          } else {
            alert("Geocode was not successful for the following reason: " + status);
          }
        });
        
        
        
        
} 
    
function useCurrentLocation() {
// Try W3C Geolocation (Preferred)

	 	document.getElementById('GPSButton').src = "images/map/ajax-loader-location.gif";
	 	
	    navigator.geolocation.getCurrentPosition(function(position) {
	      initialLocation = new google.maps.LatLng(position.coords.latitude,position.coords.longitude);
	      map.setCenter(initialLocation);
	      map.setZoom(STREET_ZOOM);
	      document.getElementById('GPSButton').src = "images/map/1ptrans.png"
	    }, function() {});
	    
	    /*
	    var positionTimer = navigator.geolocation.watchPosition(
	    function( position ){
	     
 		updatedLocation = new google.maps.LatLng(position.coords.latitude,position.coords.longitude);
	     	map.setCenter(updatedLocation);
	      	map.setZoom(STREET_ZOOM);
	     
	    });
		
	   setTimeout(
	   	function(){navigator.geolocation.clearWatch( positionTimer );},
		(1000 * 60 * 5)
		);	    
	   */
}


/////////////////////box viewing info window display////////////////////////////

function getIconForBox(box) {
	
	 	if(box.location_type==1)
	   	    	return BASE_URL+"/images/map/ups-logo-sd.png";   	     
   	     	else if(box.location_type=='BUSINESS' || box.location_type=='RESIDENTIAL')
   	     		return BASE_URL+"/images/map/expressbox-sd.png";
	   	else if (box.location_type == 2)
		   	return BASE_URL+"/images/map/logo_usps_eagle-sd-t.png";
	   	else
	   	  	return BASE_URL+'/images/map/expressbox-sd.png';
}


function getHTMLforBox(box) {
	 
  		 if(box.new_location_type == 11 || box.new_location_type == 11 || box.new_location_type == 15) {
  		 
  		 			  
  		 
  		 
				  	  return "<div id=\"infoWindow"+box.id+"\"><table><tr><td><img src=\""+BASE_URL+"/images/map/expressbox-sd.png\" />&nbsp;&nbsp;"+
				  	   "</td><td><div class=\"winDesc\"><span style=\"vertical-align:middle\"><b>"+box.description + "</b></span></div></td></tr>"+
				  	   "<tr><td colspan=\"2\"><table style=\"width:220px;\"><tr><td>Pick-up Times</td><td><div>" +
				  	   make24hours12(box.pickup_stringA) + "</div></td></tr></table></td></tr>" +
				  	   "<tr><td colspan=\"2\" style=\"text-align:right;\"><span id=\"commentsLink\" class=\"smallLink\" onclick=\"openComments();\" >comments("+box.comment_count+")</span>&nbsp;&nbsp;<span class=\"smallLink\" onclick=\"updateInfoWindow("+box.id+");\">[update/delete]</span></td></tr>" +
				  	   "</table></div>";
				  	  
	   	       }
   	  	 else if(box.new_location_type==1) {
	 	   	   	   var shippers =  "none";
		 	   	   	   if(box.fedexFlag == 1)
		 	   	   	   		shippers = "FedEx";
					   if(box.uspsFlag == 1 && shippers == "none")
	 	   	   		   		shippers = "USPS";
	 	   		   	   else if(box.uspsFlag == 1)
	 		   	   	   		shippers += ", USPS"; 	   	   	   
					   if(box.upsFlag == 1  && shippers == "none")
	 		   	   	   		shippers = "UPS";
					   else if(box.upsFlag == 1)
	   	   	   		   		shippers += ", UPS";
					   if(box.dhlFlag == 1 && shippers == "none")
	 		   	   	   		shippers = "DHL";
		 	   	   	   else if(box.dhlFlag == 1 && shippers == "none")
	 	   	   		   		shippers += ", DHL";
					  return "<div style='margin-right:-80px;text-align:left;'><table><tr><td style='vertical-align:top;'><img src='"+BASE_URL+"/images/map/ups-logo-sd.png' /></td><td style='text-align:left;'><b>The UPS Store</b> <br>"+
								box.address+"<br>"+box.description+"<br>"+box.phone+"&nbsp;&nbsp;<br></td></tr></table>"+
								"<div style='padding-top:5px;text-align:left;'><b>Hours of Operation:</b></div>"+
								"<table><tr><td>Mon "+
								box.hoursMon+"</td><td style='text-align:left;'>&nbsp;&nbsp;Sat "+
								box.hoursSat+"</td></tr><tr><td>Tue "+
								box.hoursTues+"</td><td>&nbsp;&nbsp;Sun "+
								box.hoursSun+"</td></tr><tr><td>Wed "+
								box.hoursWeds+"</td></tr><tr><td>Thu "+
								box.hoursThurs+"</td></tr><tr><td>Fri "+
								box.hoursFri+"</td></tr></td></tr></table>"+
								"<div style='padding-top:4px;text-align:left'><b>Additional Carriers:</b></div>"+
								"<div style='text-align:left;'>"+shippers+"</div>"+
								
								"</div>";
						}
		 else if(box.new_location_type==2) {
					   return "<div style='text-align:left;'><table><tr><td style='vertical-align:top;'><img src='"+BASE_URL+"/images/map/logo_usps_eagle-sd-t.png' /></td><td><b>US Post Office</b> <br>"+
								box.address+"<br>"+box.phone+"</td></tr></table>"+
								"<table><tr><td><div style='padding-top:5px;text-align:left;'><b>Hours of Operation (Last Collection):</b></div>"+
								"<table><tr style='text-align:left;'><td style='text-align:left;'>Mon "+
								box.hoursMon+" ("+box.LCMon+")</td><td style='text-align:left;'>&nbsp;&nbsp;Sat "+
								box.hoursSat+" ("+box.LCSat+")</td></tr><tr><td>Tue "+
								box.hoursTues+" ("+box.LCTues+")</td><td>&nbsp;&nbsp;Sun "+
								box.hoursSun+" ("+box.LCSun+")</td></tr><tr><td>Wed "+
								box.hoursWeds+" ("+box.LCWeds+")</td></tr><tr><td>Thu "+
								box.hoursThurs+" ("+box.LCThurs+")</td></tr><tr><td>Fri "+
								box.hoursFri+" ("+box.LCFri+")</td></tr></td></tr></table></tr></td>" + 
								"<tr><td> <div> </div></tr></td>" +
								"</table>";
		}
		else 
		  return "<div id=\"infoWindow"+box.id+"\"><table><tr><td><img src=\""+BASE_URL+"/images/map/expressbox-sd.png\" />&nbsp;&nbsp;"+
		  				  	   "</td><td><div class=\"winDesc\"><span style=\"vertical-align:middle\"><b>"+box.description + "</b></span></div></td></tr>"+
		  				  	   "<tr><td colspan=\"2\"><table style=\"width:220px;\"><tr><td>Pick-up Times</td><td><div>" +
		  				  	   make24hours12(box.pickup_stringA) + "</div></td></tr></table></td></tr>" +
		  				  	   "<tr><td colspan=\"2\" style=\"text-align:right;\"><span id=\"commentsLink\" class=\"smallLink\" onclick=\"openComments();\" >comments("+box.comment_count+")</span>&nbsp;&nbsp;<span class=\"smallLink\" onclick=\"updateInfoWindow("+box.id+");\">[update/delete]</span></td></tr>" +
				  	   "</table></div>";
}





function make24hours12(inputString) {

	timeArray = inputString.split('<br>');
	
	returnString = '';
	
	for(i = 0; (i < timeArray.length - 1 && i < 10); i++) {
			returnString = returnString + convertSingleTime(timeArray[i]) + '<br/>';
	}
	
	
	return returnString;

}


function convertSingleTime(singleTimeString) {

	if(!(singleTimeString))
		singleTimeString = "               ";
	if(singleTimeString.length < 9)	
		singleTimeString = "               ";
	
	myday = singleTimeString.substring(0,3);
	myStringHour = singleTimeString.substring(4,6);
	if(myStringHour.charAt(0) == '0')
		myStringHour = myStringHour.substring(1,2);
	myhour = parseInt(myStringHour);
	AorP = "AM";
	if(myhour > 12) {
		myhour = myhour - 12;
		AorP = "PM";
	}
	mymin = singleTimeString.substring(7,9);
	
	
	return (myday+" "+myhour+":"+mymin+" "+AorP);

}

//////////////////////////box editing/////////////////////////////

function updateInfoWindow(myid) {

	post_to_url(BASE_URL+"/update.html?",CURRENT_BOX,"get");
		
}

	
function post_to_url(path, params, method) {
    method = method || "post"; // Set method to post by default, if not specified.

    var form = document.createElement("form");
    form.setAttribute("method", method);
    form.setAttribute("action", path);

    for(var key in params) {
        var hiddenField = document.createElement("input");
        hiddenField.setAttribute("type", "hidden");
        hiddenField.setAttribute("name", key);
        hiddenField.setAttribute("value", params[key]);

        form.appendChild(hiddenField);
    }

    document.body.appendChild(form);
    form.submit();
}

function makeNewBox() {

	location.href="./update.html?lat="+map.getCenter().lat()+"&lng="+map.getCenter().lng();

}


////////////comments////////////////


function openInfoWindowComments() {
	
	if(INFOWINDOW) {	
	    oldInfoWindow = INFOWINDOW;
 	}
	  
	  
	 INFOWINDOW  = new google.maps.InfoWindow({
		     position: CURRENT_LOCATION,
		     map: map,
		     content: getHTMLforBox(CURRENT_BOX)+getHTMLforComments()
	 	 });
	 	 
	 	 
	  
	 	 
	google.maps.event.addListener(INFOWINDOW,"closeclick",function(){
	   	  freezeFrame = 0;
	});		


	oldInfoWindow.close();
	


}

function getHTMLforComments() {

	returnString = "";

	if(COMMENTS == 'none') {
	
		returnString = "<br><div style=\"color:grey;text-align:right;\">No Comments Yet</div>";
	} else {

		
		for(i = 0;i < COMMENTS.length; i++) {
		
			returnString = returnString + "<br><div style=\"font-size:12px;color:grey;\">"+COMMENTS[i].comment_date+" by "+COMMENTS[i].user+" :</div><div style=\"font-size:12px;color:black;\">"+COMMENTS[i].comments+"</div>";
		
		}
	
	}
	
	returnString = returnString + "<div style=\"text-align:right;font-size:10px;\"><a  href=\"#\" onclick=\"makeNewComment();\"; >Make New Comment</a></div>";
	
	return returnString;
}


function openComments() {

 	URL = BASE_URL+'/php/getComments.php?id='+CURRENT_BOX.id;    
           
    try {
	    if(jxmlhttp) {
	    
			jxmlhttp.open('get', URL);
	    	jxmlhttp.onreadystatechange = handleCommentsResponse;
	    	jxmlhttp.send(null);
			document.getElementById('commentsLink').innerHTML='loading...';
			
	    }
    	else {
	    	alert('null');
		jxmlhttp = new ActiveXObject("Microsoft.XMLHTTP");	
	}
    } catch(e){ alert(e);}
}



function handleCommentsResponse() {

    
    if(jxmlhttp.readyState == 1) {
	
    }
    else if(jxmlhttp.readyState == 4){
        
		///alert(jxmlhttp.responseText);
		
        COMMENTS = eval('(' + jxmlhttp.responseText + ')');
        
 		openInfoWindowComments();
 		
    }
        
}


function makeNewComment() {

	post_to_url(BASE_URL+"/comments.html?",CURRENT_BOX,"get");
		
}


/////////////////////////////////utility/////////////////////////



function getParameterByName(name)
{
  name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
  var regexS = "[\\?&]" + name + "=([^&#]*)";
  var regex = new RegExp(regexS);
  var results = regex.exec(window.location.href);
  if(results == null)
    return "";
  else
    return decodeURIComponent(results[1].replace(/\+/g, " "));
}


