// 
//  bin.js
//  Don't Be A Tosser
//  
//  Created by Scott Luedtke on 2011-04-14.
//  Copyright 2011 Trigger
//

var Bin = {
isLoggedIn: false,          
showDebug: false,  
map:null,
markerClusterer: null,
alberta: new google.maps.LatLng(51.886664,-113.675537),
initialLocation: new google.maps.LatLng(51.886664,-113.675537), 
ismobile: false,    
geocodedip:null,
newBin:null,   
sbAnimating:false,   
allowDropBin:true,
//infowindow: null,
infowindow: {},
markers: [], 
dlg: "#dlg-all",
infoBoxPlaceBin: {},
geocoder:null,     
gLocalSearch:null, 
gCurrentResults:null,     
boolIsPlacing:false,
savedBinID:null, 
panel2HTML:"",  
facebook_id:null, 
infoboxOptions:null, 
infoboxUserOptions:null, 
dialogDisplayMode: "iframe",
markerHash: [],
schoolMarkerHash: [],  
baseIWStyle:{},
urlBase:"",
urlAjaxSave:"",
urlAjaxGetbins:"",  
urlAjaxNotify:"",  
urlInfoboxBackground: "",
urlInfoboxBackgroundSchool: "",
urlInfoboxCloseBtn: "",  
urlIconBin:"",
urlIconBinShadow:"", 
urlImageDir: "/img/",
urlAjaxUpdate: "", 
strFBtitle: "",
strFBschoolTitle: "",  
strFBdesc: "",  
strFBschoolDesc: "Raise cash for your school club with your very own recycle bin.",
strFBimage: "",
strFBschoolImage: "img/fb_bts_thumbnail.jpg",
strFBLogin: "You must log in to Facebook to place a bin. Don’t have Facebook? Hmm… Awkward.",
strRepeat: "You’ve already placed a bin, but thanks for coming back. We missed you.", 
strBadSearch: "Sorry, that location can’t be found. Unless it’s the location for hidden treasure, then we’ll help you find it.", 
strBadPlacement: "You must have slept through geography class because that location is not in Alberta.",
urlSwfLocation: "http://www.trigger-demo.com/abc/facebook_map.swf",
urlSwfLocationBTS: "http://www.trigger-demo.com/abc/facebook_map_BTS.swf",
strPlaceInfoboxContent:"<p style='text-align:center;'><a href='#' class='large awesome white' id='btn-place-bin' onclick='Bin.placeBin(Bin.newBin);return false;'>Place Bin Here</a><br /><span style='font-size:11px;line-height:26px !important;color:#fff;padding-top:10px'>Or drag bin where you want</span></p>",
initViewBin: function(thebin){  
	Bin.allowDropBin = false;      
	var myOptions = {
		zoom: 14, 
		maxZoom: 19, 
		minZoom:5,
		mapTypeControlOptions: {
		    style: google.maps.MapTypeControlStyle.DEFAULT,
			position: google.maps.ControlPosition.TOP_LEFT
		},
		panControl: false,
		center: new google.maps.LatLng(parseInt(thebin['lat']),parseInt(thebin['lon'])),
		disableDoubleClickZoom:true,
		streetViewControl: false, 
		backgroundColor: "transparent",
		mapTypeId: google.maps.MapTypeId.ROADMAP    
	};
	Bin.init(false, myOptions);
	Bin.loadAllBins({id:thebin['id'],kind:thebin['kind']});    
	//Bin.openInfoAndZoom(thebin);
	$("#sb-toggle a").click(Bin.handlerToggleSidebar);  
	
	$('.map-opener').trigger('click');   
},
openInfoAndZoom: function(bin){
	
},
initMap: function(mapOpts){
  	var myOptions = {
	    zoom: 6, 
	  	maxZoom: 19, 
		minZoom:5,
		mapTypeControlOptions: {
		    style: google.maps.MapTypeControlStyle.DEFAULT,
			position: google.maps.ControlPosition.TOP_LEFT
		},
		panControl: false,
		center: Bin.alberta,
		disableDoubleClickZoom:true,
	    streetViewControl: false, 
		backgroundColor: "transparent",
	    mapTypeId: google.maps.MapTypeId.ROADMAP
	  };  
	
	  var options = mapOpts || myOptions; 
	
	  Bin.map = new google.maps.Map(document.getElementById("bin-map"), options);       
	 
},  
promptGeolocationCheck: function(){
  return;
	 // Try W3C Geolocation method (Preferred)    
	var initialLocation = false;
	var browserSupportFlag = new Boolean();
	if(navigator.geolocation) {
	  browserSupportFlag = true;
	  navigator.geolocation.getCurrentPosition(function(position) {
	    initialLocation = new google.maps.LatLng(position.coords.latitude,position.coords.longitude);
	    contentString = "Location found using W3C standard";
	    Bin.map.setCenter(initialLocation);

	    Bin.log(contentString);      
	    Bin.map.setZoom(14)
	  }, function() {
	    Bin.handleNoGeolocation(browserSupportFlag);  
	  });  
	} else {   
	  // Browser doesn't support Geolocation
	  browserSupportFlag = false;
	  Bin.handleNoGeolocation(browserSupportFlag);
	}  
}, 
init: function(useLocation, mapOpts){   
   	Bin.initMap(mapOpts);    
	if(useLocation === null){
		useLocation = true;
	}  

	if(useLocation){ 
	   Bin.promptGeolocationCheck();  
	}        

	Bin.geocoder = new google.maps.Geocoder();   
	Bin.preLoadImages(Bin.urlInfoboxBackground,Bin.urlInfoboxBackgroundSchool, Bin.urlInfoboxCloseBtn, Bin.urlIconBinShadow, Bin.urlIconBin + 'blue-user.png',Bin.urlIconBin + 'blue-user-shadow.png',Bin.urlIconBin + 'blue.png',Bin.urlIconBin + 'blue-shadow.png'); 
  
   Bin.baseIWStyle = {
		background: 'url(' + Bin.urlInfoboxBackground + ')',
		opacity: 1,
		width: "175px",    
		height: "83px",
		padding: "20px 80px 10px 12px"    
	}
  Bin.infoboxOptions = {
	content: Bin.strPlaceInfoboxContent,
	disableAutoPan: false,
	maxWidth: 0,
	pixelOffset: new google.maps.Size(-94, -168),
	zIndex: null,
	boxStyle: Bin.baseIWStyle,
	closeBoxMargin: "0",
	closeBoxURL: "",
	infoBoxClearance: new google.maps.Size(1, 1),
	isHidden: false,
	pane: "floatPane",
	enableEventPropagation: false    
  }  

  //slightly different options for the bin info box
  Bin.infoboxUserOptions = $.extend(Bin.infoboxOptions);
  Bin.infoboxUserOptions.content = "testy";   
  Bin.infoboxUserOptions.pixelOffset = new google.maps.Size(-94, -145),  
  Bin.infoboxUserOptions.boxStyle = Bin.baseIWStyle;
 
  Bin.installListeners();
  Bin.infowindow = new InfoBox(Bin.infoboxUserOptions);   
  Bin.initOpenClose(Bin.mapOpenComplete, Bin.mapCloseComplete);       

	Bin.clearFormFields({
		clearInputs: true,
		clearTextareas: true,
		passwordFieldText: false,
		addClassFocus: "focus",
		filterClass: "default"
	});  

  //if(ismobile){alert('mobile!');}
}, 
mapOpenComplete: function(){
   //alert("map open")    
	if(Bin.allowDropBin) Bin.handlerGetStarted();
},
mapCloseComplete: function(){
   //alert("map closed")  
},
initOpenClose: function (openComplete, closeComplete){
	var opener = $('.map-opener');
	var slideDuration = 500;
	opener.each(function(){
		var _this = $(this);
		var block = $(_this.attr('href'));
		var ind = parseInt(block.css('marginTop'));
		var closer = block.find('.close');
		_this.click(function(){  
			block.animate({
				marginTop:0
			},{
				queue:false,
				duration:slideDuration,
				complete: openComplete
			});
			return false;
		});
		closer.click(function(){  
			Bin.close_dialog();
			block.animate({
				marginTop:ind
			},{
				queue:false,
				duration:slideDuration,
				complete: closeComplete
			});
			return false;
		});
	});
},  
closeSidebar: function(callback){ 
	var intContentWidth = ($('#bin-map').css('width'));   
	$('#bin-sidebar').animate({ right: '-304px' },
								 250,
								 'swing',
								 callback
								 );      
								
	intContentWidth = parseInt(intContentWidth, 10) + 304;
	$('#bin-map').css({ width: intContentWidth + 'px' });
	//$('#pano_overlay a').animate({ right: '50px' }, 250, 'swing');
	Bin.map.panBy(-150, 0);
	
},
openSidebar: function(callback){     
	var intContentWidth = ($('#bin-map').css('width'));     
	
	$('#bin-sidebar').animate({ right: '0px' },
								 250,
								 'swing',
								 callback );
	intContentWidth = parseInt(intContentWidth, 10) - 304;
	
	$('#bin-map').animate({ width: intContentWidth + 'px' }, 250, 'swing',function(){});
	//$('#pano_overlay a').animate({ right: '367px' }, 250, 'swing');
	Bin.map.panBy(150, 0);
	
},     
handlerToggleSidebar: function(){
	var intContentWidth = ($('#bin-map').css('width'));     
	Bin.log("this: ", $(this));
	if(Bin.sbAnimating === false){
		if ($('#sb-toggle a').hasClass('expanded')) {  
			Bin.sbAnimating = true;
			Bin.closeSidebar(function() {
			 	$('#sb-toggle a').removeClass('expanded');
			 	$('#sb-toggle a').addClass('collapsed');    
				google.maps.event.trigger(Bin.map, 'resize');  
				Bin.sbAnimating = false;
			 });
		} else if($('#sb-toggle a').hasClass('collapsed')) {
		    Bin.sbAnimating = true;
			Bin.openSidebar(function() {
			 	$('#sb-toggle a').removeClass('collapsed');
			 	$('#sb-toggle a').addClass('expanded');   
				google.maps.event.trigger(Bin.map, 'resize'); 
				Bin.sbAnimating = false;
			});
		}  
	}else{Bin.log('not gonna toggle cause its already animating');} 
	  
	//google.maps.event.trigger(Bin.map, 'resize');

  	return false;	
}, 
handerGetStartedFindLocation: function(){
	Bin.promptGeolocationCheck();    
	Bin.handlerGetStarted();
},  
handlerGetStarted: function(){
	var ico = Bin.getBinIcon('blue-user');
     if(Bin.markerClusterer){Bin.markerClusterer.clearMarkers();}    
     if(Bin.newBin === null && Bin.allowDropBin === true){                   
		//console.log('center',map.getCenter().lat());
		var lat = Bin.map.getCenter().lat();
		var lng = Bin.map.getCenter().lng();     

		Bin.newBin = new google.maps.Marker({   
		   position: new google.maps.LatLng(lat, lng),
		   map: Bin.map,
		   draggable: true,
		   icon:ico.icon,   
		   shadow:ico.shadow,
		   animation: google.maps.Animation.DROP
		}); 
		      
		Bin.infoBoxPlaceBin = new InfoBox(Bin.infoboxOptions); 

		//var iw = new google.maps.InfoWindow({content: "<a href='#' class='large awesome' onclick='getMarkerPosition(newBin);return false;'>Place bin here</a>", pixelOffset: new google.maps.Size(5,0),disableAutoPan:true});

		setTimeout(function() {Bin.infoBoxPlaceBin.open(Bin.map, Bin.newBin)}, 800); 

		google.maps.event.addListener(Bin.newBin, "click", function() {
		  //iw.open(map, newBin);    
		  //Bin.infoBoxPlaceBin.setMap(null); 
		  Bin.infoBoxPlaceBin.hide();     
		  Bin.infoBoxPlaceBin.setPosition(Bin.newBin.getPosition()); 
		  Bin.infoBoxPlaceBin.show();
		  Bin.closeInfoWindow();     
		  //Bin.infoBoxPlaceBin = new InfoBox({content:Bin.strPlaceInfoboxContent,latlng: Bin.newBin.getPosition(), map: Bin.map, bgimage:Bin.urlInfoboxBackground, closeimage: Bin.urlInfoboxCloseBtn, showclose: false});
		});          
		google.maps.event.addListener(Bin.newBin, "dragstart", function() {    
		  //removeInfoBox(infoBox);  
		  //Bin.infoBoxPlaceBin.setMap(null); 
	      Bin.infoBoxPlaceBin.hide();  
		  //infoBox.remove();
		  //iw.close();
		});    
		google.maps.event.addListener(Bin.newBin, "dragend", function() {       
		   setTimeout(function() {Bin.map.panTo(Bin.newBin.getPosition());Bin.infoBoxPlaceBin.setPosition(Bin.newBin.getPosition()); Bin.infoBoxPlaceBin.show();       }, 300);
		});         

		Bin.markers.push(Bin.newBin);     
      }else{ 
		Bin.map.panTo(Bin.newBin.getPosition());  // take them back to their marker 	
      } 

       return false;	
},
resetNewBinPosition: function(){   
	
	Bin.log("drag end");  
	
	if(Bin.newBin && !Bin.boolIsPlacing){   
		Bin.newBin.setAnimation(google.maps.Animation.DROP);
	 	Bin.newBin.setPosition(Bin.map.getCenter());
		Bin.infoBoxPlaceBin.hide();     

		setTimeout(function() {Bin.infoBoxPlaceBin.setPosition(Bin.newBin.getPosition());Bin.infoBoxPlaceBin.show();},600);   
	}
},
installListeners: function(){   
	
  google.maps.event.addListener(Bin.map, 'click', Bin.closeInfoWindow);   // Make the info window close when clicking anywhere on the map.
  //google.maps.event.addListener(Bin.map, 'center_changed', Bin.resetNewBinPosition);   
  google.maps.event.addListener(Bin.map, 'zoom_changed', function() {   
      Bin.resetNewBinPosition();    
	  Bin.closeInfoWindow();    
	
      Bin.log("zoom level: ", Bin.map.getZoom()); 
  }); 
  google.maps.event.addListener(Bin.map, "dragend", Bin.resetNewBinPosition);   
   
  //$("#toggle-sidebar").click(Bin.handlerToggleSidebar);
  $("#map-tog").click(function () {
    if ($("#bin-wrap").is(":hidden")) {
      $("#bin-wrap").show("slide", { direction: "down" }, 1000);
    } else {
      $("#bin-wrap").hide("slide", { direction: "up" }, 1000);
    }
  });   
     
  if($("#btnQuery")){
  	$("#btnQuery").click(Bin.doSearch);  
  }      
	$("#queryInput").bind('keyup', function(event){ 
	  if(event.keyCode == 13){ 
	      $("#btnQuery").trigger("click"); 
	      return false;
	  }
	});  
	
	$('#search-form').submit(function() {
		return false;  
	});     

  //$("#btn-placebin").click(Bin.handlerGetStarted);    - this button is gone - drop the bin when the map is coming down
  
  $("#school-form-opener").click(Bin.handlerShowSchoolForm); 
  // $("#place-bin-opener").click(Bin.handlerPlaceBinButton); 
  // $('#show_all_bins_placed').click(Bin.handlerShowBins);
  $('#email-perms').click(Bin.handlerAskEmailPerm);  
  //Bin.log("adsfasdf", $(Bin.dlg).dialog().parent());
  $(Bin.dlg).dialog({    //instantiate the dialog
		autoOpen: false,                                
		width: 845,
		height:85,   
		position: [-100,160],
		show: "fade",
		hide: "fade"
   });
   //$(Bin.dlg).dialog("widget").position({ my: 'top left', at: 'top left', of: $('#wrapper')});   
	// ajax submit for schools
	var ajaxOptions = { 
	   target:        '#schoolFormResponse',   // target element(s) to be updated with server response 
	   beforeSubmit:  Bin.showRequest,  // pre-submit callback 
	   success:       Bin.showResponse,  // post-submit callback 
	   type:      'post',        // 'get' or 'post', override for form's 'method' attribute 
	   dataType:  'json',   
	   timeout:   10000 
	}; 

	// school bin listeners
	$("#cancel-school").click(function () {      
		Bin.removeSchoolErrors();  
		$(':input','#addSchoolBinForm')
		 .not(':button, :submit, :reset, :hidden')
		 .val('')
		 .removeAttr('checked')
		 .removeAttr('selected'); 
		
		// close the 
		$('.close').trigger('click');
	});

	$('#addSchoolBinForm').submit(function() {  
	   Bin.removeSchoolErrors();
	   $("#school-loading").show();
     
     ajaxOptions.success = Bin.schoolBinFormSuccess;
     
	   $(this).ajaxSubmit(ajaxOptions);         
	   return false;     // !!! Important !!!    
	});  
},
schoolBinFormSuccess: function(responseText, statusText, xhr, $form) {
  $('#schoolFormResponse').html('<strong>Got it, thanks!</strong>');
  $('#addSchoolBinForm').hide();
},
removeSchoolErrors: function(){
	$(':input').each(function() {
		$(this).removeClass('error');
	});   
},
// pre-submit callback 
showRequest: function(formData, jqForm, options) { 
	return true;    
}, 
// post-submit callback 
showResponse: function(responseText, statusText, xhr, $form)  { 
	Bin.log("RESPONSE",responseText);      
	if(responseText.errors){
	  //alert(JSON.stringify(responseText.errors));
	  $("#school-loading").hide();
	  Bin.addErrors(responseText.errors);
  
	}else{
	  location.href = Bin.urlBase + "?bin=" +  responseText.bin_id + "&school=true";
	}  
},
addErrors: function(errors){  

	$.each(errors, function(key, value) { 
  	  //alert(key + ': ' + value);  
		$('input[name="data[SchoolBin][' + key + ']"]', '#addSchoolBinForm').addClass("error");
		$('select[name="data[SchoolBin][' + key + ']"]', '#addSchoolBinForm').addClass("error");
		//$('input:select[name="data[SchoolBin][' + key + ']"]', '#addSchoolBinForm').addClass("error");    
	});  
}, 
handlerPlaceBinButton: function(){
	$("#map-holder").show();   
	$("#school-form-holder").hide();  
	Bin.log("allow?", Bin.allowDropBin);

	$('.map-opener').trigger('click');    
	Bin.log("place a bin button");	  
	return false;
},
handlerShowSchoolForm: function(){
	$("#map-holder").hide();   
	$("#school-form-holder").show();  

	$('.map-opener').trigger('click');    
	Bin.log("School button"); 
	
	return false; 
},   
handlerAskEmailPerm: function(){  
	
	FB.login(function(response){
		Bin.log("perms response: ", response);
		if(response.perms != null && response.perms === "email"){
			$.ajax({  
			      type:'GET',
			      url: Bin.urlAjaxNotify,
			      dataType: "text",
			      data: {
			      },
			      success: function( data ) {
	              	Bin.log("server perms response: ", data);
					if(data == "error"){
					   $("#notify-block").html("There was an error retrieving your email from Facebook. Check out our facebook page to see the chosen bins.");  
					}else{
					   $("#notify-block").html("You will be emailed at: " + data + " if your bin was chosen.");  
					}
                    
			      }     
			  });
		}else{
			Bin.log("You clicked the email button, but denied FB email permissions");
		}
		
	}, {perms:'email'});
    return false;   
},
binSuccessfullyPlaced: function(binid, html){     

	// if(html === null){ 		// no more panel at beginning, just reload the page to their bin
	// 	html = Bin.panel2HTML;    
	// 	Bin.log('html is null')
	// }
       
	var staticmap_image = 'http://maps.google.com/maps/api/staticmap?center=' + Bin.newBin.getPosition().lat() + ',' + Bin.newBin.getPosition().lng() + '&zoom=15&size=129x103&sensor=false';            
	var swf_url = Bin.urlSwfLocation + "?id=" + binid+ "&lat=" +Bin.newBin.getPosition().lat() + "&lon=" + Bin.newBin.getPosition().lng() + "&uid=" + Bin.facebook_id + "&zoomLevel=15";
	Bin.log('stream image: ',staticmap_image); 
	Bin.log('swf: ',swf_url);
	// show stream publish dialog
	FB.ui(
	   {
	     method: 'stream.publish', 
		 display:Bin.dialogDisplayMode,
	     name: 'My recycle bin has landed.',
	     link: Bin.urlBase,
	     picture: Bin.strFBimage,
	     caption: Bin.strFBtitle,
	     description: Bin.strFBdesc,
	     message: 'I’ve placed a recycle bin on the streets of Alberta. Why? Because that’s what amazing people do.',
	     source: swf_url,
	     properties:{
		       "1":{"text":"Place your own bin now","href":"http://www.dontbeatosser.com/"},
		       "2":{"text":"Join our fan page","href":"http://www.facebook.com/pages/DONT-BE-A-TOSSER-Recycle-Your-Empties/133345936687414?sk=app_216005841758948"}
		 }  
	   },                        
	   function(response) {
	     if (response && response.post_id) {
	       //alert('Post was published.');
	     } else {
	       //alert('Post was not published.');
	     }
		 // either way, reload the page with the users ID in a param    
		
		// TODO: check to make sure binid is not NULL, if it is we need to start over
		if(binid !== null){
			location.href = Bin.urlBase + "?bin=" + binid;
		} else{
			// TODO: not sure... give them an error?
			location.href = Bin.urlBase + "?error=true" ;
		}
		
	   }
	 );     
	
	// Since we are reloading the page, dont do this stuff anymore
    // Bin.resetMap();    
    // Bin.changeSidebar(html); 
    // Bin.loadAllBins();       

},  
resetMap: function(){
	// reset it all
	if(Bin.newBin){     // TODO: this should be in a ResetMap function
	 	Bin.newBin.setMap(null);  
		Bin.infoBoxPlaceBin.hide();   
		Bin.newBin = null;
	}	
	//Bin.allowDropBin = true;
 	Bin.handlerGetStarted()
},
changeSidebar: function(html){
// animate out the sidebar, change its content, then animate it back in.         


 Bin.sbAnimating = true;
	Bin.closeSidebar(function() {
	 	$('#toggle-sidebar').removeClass('expanded');
	 	$('#toggle-sidebar').addClass('collapsed');    
		google.maps.event.trigger(Bin.map, 'resize');  
		//Bin.sbAnimating = false;   
		$("#bin-sidebar").html(html);  
		 
		Bin.openSidebar(function() {
		 	$('#toggle-sidebar').removeClass('collapsed');
		 	$('#toggle-sidebar').addClass('expanded');   
			google.maps.event.trigger(Bin.map, 'resize'); 
			Bin.sbAnimating = false;  
			$("#sb-toggle a").click(Bin.handlerToggleSidebar);  
		});
		
	 });

//$('#bin-sidebar').animate({ right: '-304px' },350,'swing',function() { $("#bin-sidebar").html(html); $('#bin-sidebar').animate({ right: '0px' },350,'swing'); });
	
},
handlerShowBins: function(){
    if($('#show_all_bins_placed').is(':checked')){
      Bin.loadAllBins();  
    }else{
      if(Bin.markerClusterer){Bin.markerClusterer.clearMarkers();} 
    }	
}, 
loadAllBins: function(openBinId){   
	if(Bin.markerClusterer){         
		//alert('clear markers')
		Bin.markerClusterer.clearMarkers();
	}	
   	$.ajax({  
          type:'GET',
          url: Bin.urlAjaxGetbins,
          dataType: "json",
          data: {
            zoom:5
          },
          success: function( data ) {
            Bin.placebinsonmap(data, openBinId);
          }     
     	});
},
log: function(){
    //wrapper from: http://paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/
    Bin.log.history = Bin.log.history || [];   // store logs to an array for reference
    Bin.log.history.push(arguments);
    if(window.console && Bin.showDebug){    
        console.log( Array.prototype.slice.call(arguments) );
    }     
},
handleNoGeolocation: function(errorFlag) {
  if (errorFlag == true) {
    initialLocation = Bin.alberta;
    contentString = "Error: The Geolocation service failed.";    
  } else {
    initialLocation = Bin.alberta;
    contentString = "Error: Your browser doesn't support geolocation. Are you in Siberia?";  
  }
  Bin.map.setCenter(initialLocation);
  //Bin.infowindow.setContent(contentString);
  //Bin.infowindow.setPosition(initialLocation);
  //infowindow.open(map);    
},       
prepBinForSave: function(facebook_id){  
	
  Bin.log("lat/long",Bin.newBin.getPosition().lat(),Bin.newBin.getPosition().lng()); 
  Bin.boolIsPlacing = true;

  $('#btn-place-bin').html('Placing...').addClass('placing');  

  var in_alberta = new Boolean();  
  var geocode_results = new Boolean();           

  // check to make sure it is in alberta - maybe move this check when they drop it   
  //geocode({ 'latLng': newBin.getPosition()});   

  Bin.geocoder.geocode({'latLng': Bin.newBin.getPosition()}, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
      if (results[1]) {     
        geocode_results = true;
        //Bin.log('formatted:', results[1].formatted_address);
        //Bin.log('results1 components: ',results[1].address_components);
        $('#geocode_results').html('<h4>Placing....</h4></br>'); 
        // loop through results[1].address_components and compare long_name to Alberta  
		in_alberta = Bin.resultAlbertaCheck(results[1]);   
      }
    } else {
      $('#geocode_results').html("Geocoder failed due to: " + status);
    }

	if(in_alberta !== true){
      Bin.log("Not Alberta");  
	  Bin.boolIsPlacing = false; 
 	  Bin.show_dialog(Bin.strBadPlacement);
	  //$('#geocode_results').html("<span style='color:red;font-weight:bold'>Must be in Alberta.</span>");  //TODO: show this someone on the new template
	  $('#btn-place-bin').html('Place bin here').removeClass('placing');    
    }
	
    if(geocode_results===true && in_alberta===true){ 
	  // everything is good to go
	  Bin.close_dialog();         
      Bin.save_bin(Bin.newBin.getPosition().lat(), Bin.newBin.getPosition().lng(),results[1].formatted_address,results[1].address_components,facebook_id);
    }     

  }); // end geocode	
},
placeBin: function(elm){
    var fbid = null; 
    Bin.boolIsPlacing = true;    

	FB.getLoginStatus(function(response) {
	  if (response.session && response.session.uid) {   // The user was already logged in
		Bin.facebook_id = response.session.uid;  
		Bin.log('logged in',response.session.uid);  
		
		Bin.prepBinForSave(response.session.uid);   // Good to go!
	  } else {   
  
		Bin.log('not logged in');   
	    // no user session available, someone you dont know     
		FB.login(function(response) {
		  if (response.session && response.session.uid) {
		    // user successfully logged in    
			Bin.log('yay - they authenticated', response);     
			Bin.facebook_id = response.session.uid;     
			//Bin.updateRecord(Bin.savedBinID,response.session.uid );  // No longer doing this
			//Bin.binSuccessfullyPlaced(null);
			Bin.prepBinForSave(response.session.uid); // Good to go!
		  } else {
		    // user cancelled login  - FTF    
			// TODO: reset map 
			Bin.boolIsPlacing = false;  
			Bin.resetMap();
			$("#btn-placebin").trigger("click");
			//alert('By not logging into facebook your Bin will not be saved!') 
			Bin.show_dialog(Bin.strFBLogin);
		  }
		  Bin.boolIsPlacing = false;
		});
		
	  }
	}); 
       
}, //end placebin    
show_dialog: function(message){
   $(Bin.dlg).dialog("option", "title", '<span class="ui-icon ui-icon-alert" style="float: left; margin-right: .3em;"></span>' + message);
   //$(Bin.dlg).dialog("widget").position({ my: 'top left', at: 'top left', of: $('#map-block')});              
   $(Bin.dlg).dialog("open");      

}, 
close_dialog: function(){
   $(Bin.dlg).dialog("close");   
},
save_bin: function(lat,lng,addy,addy_components,facebook_id){      
   $.ajax({  
      type:'POST',
      url: Bin.urlAjaxSave,
      dataType: "json",
      data: {
        lat:lat,
        lon:lng,
        address:addy,
        address_components: addy_components,
		facebook_id: facebook_id
      },
      success: function( data ) {
        Bin.log("ajax response: ", data);
		if(data['result'] == "success"){ 
			Bin.updateBinID(data['bin_id']);    

			Bin.binSuccessfullyPlaced(data['bin_id'],data['html']);    

			Bin.panel2HTML = data['html']; // save this for later when they do actuall authenticate
			Bin.parseFBML();
		} else if(data['result'] == "repeat"){
			location.href = Bin.urlBase + "?bin=" + data['bin_id'] + "&repeat=true"; //just forward the repeat binner to their old bin   
		}   
      }     
  });
},
getBinIcon: function(icotype){
	if(icotype === null){
	  icotype='blue';
	}  
   	if(icotype === 'blue-user'){       // Larger size  
		var iconImage = new google.maps.MarkerImage(Bin.urlIconBin + icotype + '.png',
		   new google.maps.Size(81, 50),   // dimensions
		   new google.maps.Point(0,0),     // origin - 0,0
		   new google.maps.Point(17, 46)   // anchor
		);

		var iconShadow = new google.maps.MarkerImage(Bin.urlIconBin + icotype + '-shadow.png',
		   new google.maps.Size(81, 50),
		   new google.maps.Point(0,0),
		   new google.maps.Point(17, 46)   
		);   
	}else if(icotype === 'school'){ 
		var iconImage = new google.maps.MarkerImage(Bin.urlIconBin  + icotype + '.png',
		   new google.maps.Size(49, 30),   // dimensions
		   new google.maps.Point(0,0),     // origin - 0,0
		   new google.maps.Point(11, 28)   // anchor
		);
		var iconShadow = new google.maps.MarkerImage(Bin.urlIconBin  + icotype + '-shadow.png',
		   new google.maps.Size(49, 30),
		   new google.maps.Point(0,0),
		   new google.maps.Point(11, 28)    
		);
	
	}else{
	   	var iconImage = new google.maps.MarkerImage(Bin.urlIconBin  + icotype + '.png',
		   new google.maps.Size(49, 30),   // dimensions
		   new google.maps.Point(0,0),     // origin - 0,0
		   new google.maps.Point(11, 28)   // anchor
		);
		var iconShadow = new google.maps.MarkerImage(Bin.urlIconBin  + icotype + '-shadow.png',
		   new google.maps.Size(49, 30),
		   new google.maps.Point(0,0),
		   new google.maps.Point(11, 28)    
		);     
	} 

   ICON = { 
     icon : iconImage,
     shadow: iconShadow
   };    

   return ICON;  
},
openBinAndPan: function(marker){  
	Bin.log("open bin and pan",marker);
	Bin.openInfoWindow(marker);
},  
openSchoolBinAndPan: function(marker){  
	Bin.log("open school bin and pan",marker);
	Bin.openSchoolInfoWindow(marker);
},   
openInfoWindow: function(marker) {
	var markerLatLng = marker.getPosition();     
	if(Bin.isLoggedIn){
        var content = [
    		'<div class="bin-block" id="binfowin-' + marker.id + '"><div class="visual"><img src="http://graph.facebook.com/' + marker.facebook_id + '/picture" alt="image description" width="50" height="50" /></div><div class="text"><h4 class="user" id="name-' + marker.id + '">Loading...</h4><div class="facebook"><script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script><fb:like href="http://www.dontbeatosser.com?bin=' + marker.id + '" layout="button_count" show_faces="true" width="100" font=""></fb:like><br /><a href="#" onclick="Bin.shareBin(' + marker.id + ');return false;">Share</a>' + marker.created + '.</div></div></div>'
        ].join('');
    }else{
        var content = [
    		'<div class="bin-block" id="binfowin-' + marker.id + '"><div class="visual"><img src="http://graph.facebook.com/' + marker.facebook_id + '/picture" alt="image description" width="50" height="50" /></div><div class="text"><h4 class="user" id="name-' + marker.id + '">Loading...</h4><div class="facebook"><script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script><fb:like href="http://www.dontbeatosser.com?bin=' + marker.id + '" layout="button_count" show_faces="true" width="100" font=""></fb:like><br />' + marker.created + '.</div></div></div>'
        ].join('');
    }
    
	// var content = [
	// 	'<div class="bin-info"><div class="left-side"><img src="http://graph.facebook.com/' + marker.facebook_id + '/picture" /><br /><a href="#" onclick="Bin.shareBin(' + marker.id + ');return false;">share</a></div><span class="title">' + marker.title + '</span><p class="meta"><span class="date">Added ' + marker.created + '</span><span class="user" id="name-' + marker.facebook_id + '"></span></p>'
	// ].join('');    
    Bin.infowindow.setOptions( { boxStyle: Bin.baseIWStyle } );   
	Bin.infowindow.setContent(content);  
	Bin.infowindow.setPosition(marker.getPosition());      

	//if(Bin.infowindow !== null){Bin.infoBoxPlaceBin.setMap(null);} 
	//Bin.infowindow = new InfoBox({content:content, latlng: markerLatLng, map: Bin.map, bgimage:Bin.urlInfoboxBackground, closeimage: Bin.urlInfoboxCloseBtn, showclose: false});

	Bin.infowindow.open(Bin.map, marker);
	//Bin.infowindow.show();
	//Bin.infowindow.open(Bin.map, marker);  

	setTimeout(function() {FB.api('/' + marker.facebook_id  + '/', function(response) {   
		Bin.log("facebook response:", response);     
		setTimeout(function() {$('#name-' + marker.id).html(response.name)}, 400);    // for some reason we need a pause       
		Bin.parseFBML(); 
	});}, 400);    // for some reason we need a pause    
	 
},   
openSchoolInfoWindow: function(marker){
	var markerLatLng = marker.getPosition();     
	if(Bin.isLoggedIn){
        var content = [
    		'<div class="bin-block" id="binfowin-' + marker.id + '"><div class="visual"><img src="' + Bin.urlImageDir + "school_logos/" + marker.logo + '" alt="image description" width="50" height="50" /></div><div class="text"><h4 class="user" id="name-' + marker.id + '">' + marker.title + '</h4><div class="facebook"><script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script><fb:like href="http://www.dontbeatosser.com?bin=' + marker.id + '&school=true" layout="button_count" show_faces="true" width="100" font=""></fb:like><br /><a href="#" onclick="Bin.shareSchoolBin(' + marker.id + ');return false;">Share</a> ' + marker.school_bin_count + ' bins placed!</div></div></div>'
        ].join(''); 
    }else{
        var content = [
    		'<div class="bin-block" id="binfowin-' + marker.id + '"><div class="visual"><img src="' + Bin.urlImageDir + "school_logos/" + marker.logo + '" alt="image description" width="50" height="50" /></div><div class="text"><h4 class="user" id="name-' + marker.id + '">' + marker.title + '</h4><div class="facebook"><script src="http://connect.facebook.net/en_US/all.js#xfbml=1"></script><fb:like href="http://www.dontbeatosser.com?bin=' + marker.id + '&school=true" layout="button_count" show_faces="true" width="100" font=""></fb:like><br />' + marker.school_bin_count + ' bins placed!</div></div></div>'
        ].join('');
    }
     
   var newStyle = {	
		background: 'url(' + Bin.urlInfoboxBackgroundSchool + ')',
		opacity: 1,
		width: "187px",    
		height: "93px",
		padding: "10px 70px 10px 5px"      
	}
	Bin.infowindow.setOptions( { boxStyle: newStyle } );  
	
	Bin.infowindow.setContent(content);  
	Bin.infowindow.setPosition(marker.getPosition());      
    

	Bin.infowindow.open(Bin.map, marker);   
	
	Bin.parseFBML();     

},
shareBin: function(id){  
	Bin.log("share bin:",Bin.markerHash[id]);  
	var bininfo = Bin.markerHash[id];
	
	var staticmap_image = 'http://maps.google.com/maps/api/staticmap?center=' + bininfo.lat + ',' + bininfo.lon + '&zoom=15&size=129x103&sensor=false';          
	Bin.log("share bin map:",staticmap_image);    
	var swf_url = Bin.urlSwfLocation + "?id=" + id + "&lat=" + bininfo.lat + "&lon=" + bininfo.lon + "&uid=" + bininfo.facebook_id + "&zoomLevel=12";
	Bin.log('stream image: ',staticmap_image); 
	Bin.log('swf: ',swf_url);
	// show stream publish dialog
	FB.ui(
	   {
	     method: 'stream.publish',
		 display:Bin.dialogDisplayMode,
	     name: 'My recycle bin has landed.',
	     link: Bin.urlBase + '?bin=' + id,
	     picture: Bin.strFBimage,
	     caption: Bin.strFBtitle,
	     description: Bin.strFBdesc,
	     message: 'I’ve placed a recycle bin on the streets of Alberta. Why? Because that’s what amazing people do. ',
	     source: swf_url,
	     properties:{
		       "1":{"text":"Place your own bin now","href":"http://www.dontbeatosser.com/"},
		       "2":{"text":"Join our fan page","href":"http://www.facebook.com/pages/DONT-BE-A-TOSSER-Recycle-Your-Empties/133345936687414?sk=app_216005841758948"}
		 }
	   },                        
	   function(response) {
	     if (response && response.post_id) {
	       //alert('Post was published.');
	     } else {
	       //alert('Post was not published.');
	     }   	 
	   }
	 );  
	 
}, 
shareSchoolBin: function(id){
    Bin.log("share bin:",Bin.schoolMarkerHash[id]);  
	var bininfo = Bin.schoolMarkerHash[id];
	
	var staticmap_image = 'http://maps.google.com/maps/api/staticmap?center=' + bininfo.lat + ',' + bininfo.lon + '&zoom=15&size=129x103&sensor=false';          
	Bin.log("share bin map:",staticmap_image);    
	var swf_url = Bin.urlSwfLocationBTS + "?id=" + id + "&lat=" + bininfo.lat + "&lon=" + bininfo.lon + "&schoolName=" +bininfo.schoolName+ "&clubName=" + "&crestURL="+bininfo.logo+"&zoomLevel=12";
	Bin.log('image URL: ', Bin.urlBase + Bin.strFBschoolImage); 
	Bin.log('swf: ',swf_url);
	// show stream publish dialog
	FB.ui(
	   {
	     method: 'stream.publish',
		 display:Bin.dialogDisplayMode,
	     name: 'Recycling 101: Donate your empties.',
	     link: Bin.urlBase + '?bin=' + id,
	     picture: Bin.urlBase + Bin.strFBschoolImage,
	     caption: Bin.strFBschoolTitle,
	     description: Bin.strFBschoolDesc,
	     message: 'Raise cash for your school club with your very own recycle bin.',
	     source: swf_url,
	     properties:{
		       "1":{"text":"Place your own bin now","href":"http://www.dontbeatosser.com/"},
		       "2":{"text":"Join our fan page","href":"http://www.facebook.com/pages/DONT-BE-A-TOSSER-Recycle-Your-Empties/133345936687414?sk=app_216005841758948"}
		 }
		 
	   },                        
	   function(response) {
	     if (response && response.post_id) {
	       //alert('Post was published.');
	     } else {
	       //alert('Post was not published.');
	     }   	 
	   }
	 );
   //alert("TODO: Program the school share feature and facebook player (Hogan)")  
},
attachMarkerListener: function(marker){
  google.maps.event.addListener(marker, 'click', function() {
    Bin.openInfoWindow(marker);
  }); 
},
attachSchoolMarkerListener: function(marker){
  google.maps.event.addListener(marker, 'click', function() {
    Bin.openSchoolInfoWindow(marker);
  }); 
},
getBinMarkers: function(data,openBinId) {
  var batch = [];                      
  Bin.log('length: ',data.length)     
  for (var i = 0; i < data.length; ++i) {   
	
	//determine the type of bin (bin or school)
	if(data[i].Bin){   
		//Bin.log("bin");    
		if(data[i].Bin.chosen === "1"){
		   var tmpIcon = Bin.getBinIcon('blue-chosen');  
		}else{
		   var tmpIcon = Bin.getBinIcon('blue'); 
		}
    
	    var newMarker = new google.maps.Marker({
	        position: new google.maps.LatLng(data[i].Bin.lat,data[i].Bin.lon),
	        shadow: tmpIcon.shadow,
	        icon: tmpIcon.icon,  
			kind: 'bin',
	        chosen: data[i].Bin.chosen,
	        id: data[i].Bin.id,
	        facebook_id: data[i].Bin.facebook_id,  
	        created: data[i].Bin.created
	    });   

	    if(openBinId !== null && openBinId.kind == "bin"){  
			if(parseInt( openBinId.id) === parseInt( newMarker.id)){   
			   Bin.log("found",openBinId, newMarker.id) 
			   Bin.openBinAndPan(newMarker);  
			}
	    }

	    Bin.markerHash[data[i].Bin.id] = {lat:data[i].Bin.lat, lon:data[i].Bin.lon, facebook_id:data[i].Bin.facebook_id};  
	    Bin.attachMarkerListener(newMarker);      
    }else if(data[i].School){
		// new kind of 'bin' - school    
		// assume they are all vaid  
	    //Bin.log("school"); 
	
		var tmpIcon = Bin.getBinIcon('school');  
		
		var newMarker = new google.maps.Marker({
	        position: new google.maps.LatLng(data[i].School.lat,data[i].School.lon),
	        shadow: tmpIcon.shadow,  
			kind: 'school', 
	        icon: tmpIcon.icon,
	        id: data[i].School.id,
	        title: data[i].School.title,
	        logo: data[i].School.logo,  
	        school_bin_count: data[i].School.school_bin_count
	    });                                                                                                                       
	    
		// TODO: figure out how to open a school       
		
		if(openBinId !== null && openBinId.kind == "school"){ 
			Bin.log("4444444444444444444",openBinId);  
			if(parseInt(openBinId.id) === parseInt( newMarker.id)){   
			   Bin.log("found",openBinId, newMarker.id) 
			   Bin.openSchoolBinAndPan(newMarker);  
			}
	    }     
	
	    Bin.schoolMarkerHash[data[i].School.id] = {lat:data[i].School.lat, lon:data[i].School.lon, schoolName:data[i].School.title, logo:data[i].School.logo, count:data[i].School.school_bin_count};  
        Bin.attachSchoolMarkerListener(newMarker);       
	}     
	
	
	batch.push(newMarker);   
  }            
  //console.log('batch: ',batch)
  return batch;
},
closeInfoWindow: function(){
  Bin.infowindow.close();   
  //Bin.infowindow.setMap(null);
},
placebinsonmap: function(data, openBinId){
  var styles = [{
    url: Bin.urlImageDir + 'cluster_small.png',
    height: 40,
    width: 33,
    anchor: [9, 0],
    textColor: '#fff',
    textSize: 11
  }, {
    url: Bin.urlImageDir + 'cluster_med.png' ,
    height: 40,
    width: 33,
    anchor: [9, 0],
    textColor: '#fff',
    textSize: 11
  }, {
    url: Bin.urlImageDir + 'cluster_large.png' ,
    height: 40,     
	width: 33,
    anchor: [9, 0],
    textSize: 11,
	textColor: '#fff'       
  }];          

  Bin.markers = Bin.getBinMarkers(data, openBinId);
  Bin.markerClusterer = new MarkerClusterer(Bin.map, Bin.markers, {
    maxZoom: 12,
    gridSize: 40,
    styles: styles    
  });    
},  
resultAlbertaCheck: function(result){
    var in_alberta = false;
	for (var i = 0; i < result.address_components.length; i++) {  
        if(result.address_components[i].long_name === 'Alberta'){
          in_alberta = true;  
          //Bin.log('found Alberta');
        }
    }
    return in_alberta;
},    
parseFBML: function(ele){
	if (FB.XFBML.parse){
	   if(ele === null){
	   	setTimeout( function(){ FB.XFBML.parse(); }, 200 );    
	   }else{      
		Bin.log($(ele))
		setTimeout(  function(){ FB.XFBML.parse(document.getElementById(ele)); }, 200 ); 
	   } 
	}
   
},
doSearch: function(){ 
	var address = $("#queryInput").val();  
	var geocoder = new google.maps.Geocoder();
	//$("#search-status").html('');
	geocoder.geocode({address: address}, function(results, status) {
		if (status == google.maps.GeocoderStatus.OK) {   
			
            if(Bin.resultAlbertaCheck(results[0])){
	        	Bin.log('result 0',results[0]);   
				Bin.map.setCenter(results[0].geometry.location);
				Bin.map.setZoom(12);  
				Bin.resetNewBinPosition(); 
    
			} else {
				Bin.show_dialog(Bin.strBadSearch);       
			}
			
		} else {                             
			Bin.show_dialog(Bin.strBadSearch); 
			Bin.log(address + ' not found');
		}  
	});  
},
updateRecord: function(bin_id, fb_id){
	$.ajax({  
          type:'GET',
          url: Bin.urlAjaxUpdate,
          dataType: "json",
		  data:{
			bin_id: Bin.savedBinID,
			fb_id: fb_id
		  },
          success: function( data ) {
            // do nothing
          }     
     	});
},
updateBinID: function(bin_id){
	//do something with the returned MYSQL ID
	Bin.log("Returned Bin ID: ", bin_id);
	Bin.savedBinID = bin_id;
},
preLoadImages: function() {
  var cache = [];
  var args_len = arguments.length;
  for (var i = args_len; i--;) {
    var cacheImage = document.createElement('img');
    cacheImage.src = arguments[i];
    cache.push(cacheImage);
  }
  Bin.log("finished preloading map images: ",args_len);
},   
clearFormFields: function(o){
	if (o.clearInputs == null) o.clearInputs = true;
	if (o.clearTextareas == null) o.clearTextareas = true;
	if (o.passwordFieldText == null) o.passwordFieldText = false;
	if (o.addClassFocus == null) o.addClassFocus = false;
	if (!o.filterClass) o.filterClass = "default";
	if(o.clearInputs) {
		var inputs = document.getElementsByTagName("input");
		for (var i = 0; i < inputs.length; i++ ) {
			if((inputs[i].type == "text" || inputs[i].type == "password") && inputs[i].className.indexOf(o.filterClass) == -1) {
				inputs[i].valueHtml = inputs[i].value;
				inputs[i].onfocus = function ()	{
					if(this.valueHtml == this.value) this.value = "";
					if(this.fake) {
						inputsSwap(this, this.previousSibling);
						this.previousSibling.focus();
					}
					if(o.addClassFocus && !this.fake) {
						this.className += " " + o.addClassFocus;
						this.parentNode.className += " parent-" + o.addClassFocus;
					}
				}
				inputs[i].onblur = function () {
					if(this.value == "") {
						this.value = this.valueHtml;
						if(o.passwordFieldText && this.type == "password") inputsSwap(this, this.nextSibling);
					}
					if(o.addClassFocus) {
						this.className = this.className.replace(o.addClassFocus, "");
						this.parentNode.className = this.parentNode.className.replace("parent-"+o.addClassFocus, "");
					}
				}
				if(o.passwordFieldText && inputs[i].type == "password") {
					var fakeInput = document.createElement("input");
					fakeInput.type = "text";
					fakeInput.value = inputs[i].value;
					fakeInput.className = inputs[i].className;
					fakeInput.fake = true;
					inputs[i].parentNode.insertBefore(fakeInput, inputs[i].nextSibling);
					inputsSwap(inputs[i], null);
				}
			}
		}
	}
	if(o.clearTextareas) {
		var textareas = document.getElementsByTagName("textarea");
		for(var i=0; i<textareas.length; i++) {
			if(textareas[i].className.indexOf(o.filterClass) == -1) {
				textareas[i].valueHtml = textareas[i].value;
				textareas[i].onfocus = function() {
					if(this.value == this.valueHtml) this.value = "";
					if(o.addClassFocus) {
						this.className += " " + o.addClassFocus;
						this.parentNode.className += " parent-" + o.addClassFocus;
					}
				}
				textareas[i].onblur = function() {
					if(this.value == "") this.value = this.valueHtml;
					if(o.addClassFocus) {
						this.className = this.className.replace(o.addClassFocus, "");
						this.parentNode.className = this.parentNode.className.replace("parent-"+o.addClassFocus, "");
					}
				}
			}
		}
	}
	function inputsSwap(el, el2) {
		if(el) el.style.display = "none";
		if(el2) el2.style.display = "inline";
	}
}
}; // end Bin
