var Site = {
	
	dispensers:Array,
	map:Object,
	updating:Boolean,
	
	init : function()
	{
		Site.current_infowindow = null;
		Site.updating = false;
		$('#jswarning').remove();
		$.get("/token",function(txt)
		{
			$('#contactform').append('<input type="hidden" name="ts" value="'+txt+'">');
		});
		
		$(document).pngFix();
		
		$('a.lightbox').lightBox();
		
		// track external links
		$("a[href^='http']").bind('click', Site.track_external_links);
		
		// init audio players
		$('.audioplayer').each(function(){
			audio_file = $(this).children('a').attr('href'); 
			$(this).html('').flash(
				{
					swf: '/swf/player.swf',
					width:290,
					height:40,
					flashvars:
					{
						soundFile: audio_file
					},
					wmode:'transparent'
				}
			);
		});
		
		if ($('#newquote').size()) 
		{
			$('#newquote').bind('click', Site.refresh_quote);
		}
		
		if ($('#smallmap').size()) 
		{
			Site.create_smallmap();
		}
		
		$('#dispensersearch').bind('focus', Site.focus_search).bind('blur', Site.blur_search);
		if ($('#map').size()) 
		{
			var params = {};
			params.a = 1;
			if ($('#dispensersearch').val() && $('#dispensersearch').val()!='Type your address to find a dispenser near you') 
			{
				params.address = $('#dispensersearch').val();
				params.distance = $('#distance').val();
				var geocoder = new google.maps.Geocoder();
				geocoder.geocode( { 'address': params.address}, function(results, status) {
					if (status == google.maps.GeocoderStatus.OK) 
					{
						params.lat = results[0].geometry.location.lat();
						params.lon = results[0].geometry.location.lng();
					}
					Site.load_map(params);
				});
			}
			else
			{
				Site.load_map(params);
			}
			
			
			$('a.parkname').bind('click', Site.goto_park);
			$('#dispensersearchbutton').bind('click', Site.search_dispenser);
		}
		$('a.parksystem').bind('click', Site.toggle_parksystem);
		$('#toggle_sponsorship').bind('click', Site.toggle_sponsorship);
		$('#toggle_available').bind('click', Site.toggle_available);
		$('#toggle_pricing').bind('click', Site.toggle_pricing);
		$('#downloadpasteable').live('click',Site.toggle_pasteable);
		
		$('a.cart').not('.disabled').bind('click', Site.add_to_cart);
		$('a.removeitem').live('click', Site.remove_item);
		$('#sameasbilling').bind('click', Site.duplicate_info);
		$('#revieworder').bind('click', Site.review_order);
		$('#calculate').bind('click', Site.calculate_shipping);
		$('#changeshipping').bind('click', Site.change_shipping);
	},
	
	focus_search: function()
	{
		var p = 'Type your address to find a dispenser near you';
		var v = $(this).val();
		$(this).addClass('focus').val((v==p)?'':v);
	},
	
	blur_search: function()
	{
		var p = 'Type your address to find a dispenser near you';
		var v = $(this).val();
		$(this).val((v=='')?p:v);
		if($(this).val()==p) $(this).removeClass('focus');
	},
	
	load_map: function(params)
	{
		$.post('/customajax/load_map',
			params,
			function(data, textStatus, xhr) 
			{
				var o = $.evalJSON(data);
		  		Site.dispensers = o.dispensers;
				var myOptions = {
					zoom: 10,
					navigationControl: true,
					mapTypeControl: false,
					scaleControl: false,
					mapTypeId: google.maps.MapTypeId.ROADMAP
				};
		
				if (params.address) 
				{
					var geocoder = new google.maps.Geocoder();
					geocoder.geocode( { 'address': params.address}, function(results, status) {
						if (status == google.maps.GeocoderStatus.OK) {
							myOptions.center = results[0].geometry.location;
							myOptions.zoom = 11;
							o.address = params.address;
							Site.finish_map(myOptions,o);
							var marker = new google.maps.Marker({
								map: Site.map, 
								position: results[0].geometry.location
							});
							
							$('#results').show();
							$('#dlist').html(o.results);
							$('.dresult').bind('click', Site.click_to_dispenser);
							$('a.lightbox').lightBox();
							
						} else {
							// alert("Geocode was not successful for the following reason: " + status);
						}
					});
				}
				else
				{
					var center = new google.maps.LatLng(39.76216424455168, -104.9754786614375);
					myOptions.center = center;
					Site.finish_map(myOptions,o);
				}
			}
		);
	},
	
	finish_map: function(opt,o)
	{
		Site.map = new google.maps.Map(document.getElementById("map"), opt);
			
		var listener = google.maps.event.addListener(Site.map, 'bounds_changed', function(){
			Site.add_dispensers(Site.map);
			google.maps.event.removeListener(listener);
		});
	},
	
	toggle_parksystem: function(){
		
		$('#results').hide();
		
		var a = $(this);
		var id = $(this).attr('rel');
		$('ul.parksystem').not('#'+id).hide();
		$('#'+id).toggle();
		
		if ($('#'+id).is(':hidden')) 
			return false;
		
		var params = {};
		params.parksystem = id.split('_')[1];
		
		$.post('/customajax/toggle_parksystem',
			params,
			function(data, textStatus, xhr) 
			{
		  		var o = $.evalJSON(data);
				var center = new google.maps.LatLng(parseFloat(o.midlat), parseFloat(o.midlon));
				
				var b = [];
				b.push(new google.maps.LatLng(parseFloat(o.minlat),parseFloat(o.minlon)));
				b.push(new google.maps.LatLng(parseFloat(o.maxlat),parseFloat(o.maxlon)));
				
				Site.map.setCenter(center);
				
				var z = 19;
				var present = true;
				do
				{
					Site.map.setZoom(z);
					
					present = true;
					for (var i=0; i < b.length; i++) {
						if(!Site.map.getBounds().contains(b[i]))
						{
							present = false;
							z--;
							break;
						}
					};
				}
				while(!present);
				
				$.scrollTo('#map', 800, {easing:'easeInOutCubic', offset:{top:-20}});
				
				// Site.map.setZoom(--z);
			}
		);
		
		
		return false;
	},
	
	toggle_pricing: function()
	{
		$('#sponsorshippricingform').slideToggle();
		$('#toggle_pricing').html(($('#toggle_pricing').html()=='Hide sponsorship pricing')?"Show sponsorship pricing":"Hide sponsorship pricing");
		return false;
	},
	
	toggle_pasteable: function()
	{
		$('#pasteablecodearea').slideToggle();
		$('#pasteablecode').select().bind('keydown', function(){ return false; }).bind('click', function(){ $(this).select(); });
		return false;
	},
	
	toggle_available: function()
	{
		$('.addressresult').not('.available').slideToggle();
		$(this).html(($(this).html()=='Show only available')?'Show all stations':'Show only available');
		return false;
	},
	
	toggle_sponsorship: function(){
		
		for (var i=0; i < Site.batch.length; i++) {
			var marker = Site.batch[i];
			if(marker.icon.url.indexOf('available')==-1)
				marker.setVisible(!marker.visible);
		};
		return false;
	},
	
	track_external_links: function(){
		
		// var href = 'test';
		var href = $(this).attr('href').replace(/^https?:\/\//m, "");
		href = href.replace('/','_');
		// alert(href);
		_gaq.push(['_trackEvent', 'Links', 'clicked', href]);
		// return false;
	},
	
	calculate_shipping: function(){
		
		var zipcode = parseInt($('#zipcode').val(),10);
		if (zipcode && zipcode.toString().length==5) 
		{
			// window.log(zipcode);
			$.cookie('zipcode',zipcode,{ path:'/', expires:7});
			location.reload(true);
		}
		else
		{
			// window.log(zipcode.length);
		}
		return false;
	},
	
	change_shipping: function(){
		
		$.cookie('zipcode',null,{ path:'/', expires:7 });
		location.reload(true);
		return false;
	},
	
	duplicate_info: function(){
		
		$('#shipping_first_name').val($('#billing_first_name').val()).effect('highlight');
		$('#shipping_last_name').val($('#billing_last_name').val()).effect('highlight');
		$('#shipping_street_address').val($('#billing_address').val()).effect('highlight');
		$('#shipping_city').val($('#billing_city').val()).effect('highlight');
		$('#shipping_state').val($('#billing_state').val()).effect('highlight');
		$('#shipping_zipcode').val($('#billing_zip').val()).effect('highlight');
		$('#shipping_phone_number').val($('#billing_phone').val()).effect('highlight');
		$('#shipping_email_address').val($('#billing_email').val()).effect('highlight');
		
		return false;
		
	},
	
	review_order: function(){
		
		if (Site.validate_form()) 
		{
			$.scrollTo('#cart',800,{easing:'easeInOutQuint'});
			$('#revieworder').hide();
			$('#submitorder, #reviewmessage').show();
		}
	},
	
	add_to_cart: function(){
		
		if(Site.updating)
			return false;
			
		Site.updating = true;
		
		var id = parseInt($(this).attr('rel').split('_')[1],10);
		var qty = parseInt($(this).attr('rel').split('_')[2],10) || 1;
		var cart = $.cookie('cart');
		var newcart = [];
		var found = false;
		if(cart != null)
		{
			var products = cart.split('#');
			for (var i=0; i < products.length; i++) {
				var product = products[i];
				var product_id = parseInt(product.split('|')[0],10);
				var product_qty = parseInt(product.split('|')[1],10);
				if (id==product_id) 
				{
					product_qty+=qty;
					found = true;
				}
				newcart.push(product_id+'|'+product_qty);
			};
		}
		if (!found) 
		{
			newcart.push(id+'|'+qty);
		}
		cart = newcart.join('#');
		$.cookie('cart',cart,{ expires:7, path:'/' });
		
		Site.update_cart(cart);
		
		var added = $(this).prev();
		added.animate({'right':'-'+(added.outerWidth()-11)+'px'},200).animate({'opacity':'1'},800).animate({'right':'10px'},200);
		
		return false;
	},
	
	remove_item: function(){
		
		if(Site.updating)
			return false;
			
		Site.updating = true;
		
		var id = parseInt($(this).attr('rel').split('_')[1],10);
		var cart = $.cookie('cart');
		var newcart = [];
		if(cart != null)
		{
			var products = cart.split('#');
			for (var i=0; i < products.length; i++) {
				var product = products[i];
				var product_id = parseInt(product.split('|')[0],10);
				if(id!=product_id)
				{
					newcart.push(product);
				}
			}
		}
		cart = newcart.join('#');
		$.cookie('cart',(cart!='')?cart:null,{ expires:7, path:'/' });
		
		$(this).parent('li').remove();
		
		if ($('#checkout').size()) 
		{
			window.location.reload( true );
		}
		else
		{
			Site.update_cart(cart);
		}
		
		return false;
		
	},
	
	update_cart: function(cart){
		
		var params = {};
		params.cart = (cart!='') ? cart : 0;
		
		$.post('/customajax/update_cart',
			params,
			function(data, textStatus, xhr) 
			{
		  		$('#cart').html(data);
				Site.updating = false;
			}
		);
		
		
	},
	
	click_to_dispenser: function()
	{
		Site.goto_dispenser($(this).attr('rel'));
		return false;
	},
	
	search_dispenser: function()
	{
		Site.goto_dispenser($('#dispensersearchterm').val());
		return false;
	},
	
	goto_dispenser: function(n){
		
		var params = {};
		// params.name = $('#dispensersearchterm').val();
		params.name = n;
		
		$.post('/customajax/get_dispenser_coordinates',
			params,
			function(data, textStatus, xhr) 
			{
				if(data!='0')
				{
					
					var o = $.evalJSON(data);
					var lat = parseFloat(o.lat);
					var lon = parseFloat(o.lon);
					var c = new google.maps.LatLng(lat,lon);
					Site.map.setCenter(c);
					Site.map.setZoom(18);
					
					for (var i=0; i < Site.batch.length; i++) {
						if(Site.batch[i].title == params.name)
						{
							var m = Site.batch[i];
							google.maps.event.trigger(m,'click');
							break;
						}
					};
					
					$.scrollTo('#map', 800, {easing:'easeInOutCubic', offset:{top:-90}});
				}
		  		else
				{
					$('#searchalert').addClass('error').show().delay(1500).fadeOut('fast');
				}
			}
		);
		
		return false;
	},
	
	goto_park: function(){
		
		var params = {};
		params.id = $(this).attr('rel');
		
		$.post('/customajax/get_park_coordinates',
			params,
			function(data, textStatus, xhr) 
			{
		  		var o = $.evalJSON(data);
		
				if (o instanceof Array) 
				{
					var bounds = new google.maps.LatLngBounds();
					var b = [];
					for (var i=0; i < o.length; i++) 
					{
						bounds.extend(new google.maps.LatLng(parseFloat(o[i].lat),parseFloat(o[i].lon)));
						b.push(new google.maps.LatLng(parseFloat(o[i].lat),parseFloat(o[i].lon)));
					};
					Site.map.setCenter(bounds.getCenter());
					
					var z = 19;
					var present = true;
					do
					{
						Site.map.setZoom(z);
						
						present = true;
						for (var i=0; i < b.length; i++) {
							if(!Site.map.getBounds().contains(b[i]))
							{
								present = false;
								z--;
								break;
							}
						};
					}
					while(!present);
					
					$.scrollTo('#map', 800, {easing:'easeInOutCubic', offset:{top:-90}});
				}
			}
		);
		
		
		return false;
	},
	
	refresh_quote: function(){
		$('#loader').show();
		$.post('/customajax/refresh_quote',
			{a:1},
			function(data, textStatus, xhr) 
			{
		  		var o = $.evalJSON(data);
				$('#quote_quote').html(o.quote);
				$('#quote_name').html(o.name);
				$('#loader').hide();
			}
		);
		return false;
	},
	
	current_infowindow:Object,
	infowindow_z:Number = 1000,
	current_dispenser:Number = 0,
	dispenser_int:Number = 0,
	dispenser_data:Object,
	smallmap:Object,
	
	dw:Number = 24,
	dh:Number = 40,
	dx:Number = 12,
	dy:Number = 44,
	
	create_smallmap: function()
	{
		var image = new google.maps.MarkerImage('/images/icons/dispenser.png?a=1',
		      // This marker is 20 pixels wide by 32 pixels tall.
		      new google.maps.Size(Site.dw,Site.dh),
		      // The origin for this image is 0,0.
		      new google.maps.Point(0,0),
		      // The anchor for this image is the base of the flagpole at 0,32.
		      new google.maps.Point(Site.dx, Site.dy));
		
		var inactive = new google.maps.MarkerImage('/images/icons/inactive.png',
		      // This marker is 20 pixels wide by 32 pixels tall.
		      new google.maps.Size(Site.dw,Site.dh),
		      // The origin for this image is 0,0.
		      new google.maps.Point(0,0),
		      // The anchor for this image is the base of the flagpole at 0,32.
		      new google.maps.Point(Site.dx, Site.dy));
		
		var avail = new google.maps.MarkerImage('/images/icons/dispenser.png?a=1',
		      // This marker is 20 pixels wide by 32 pixels tall.
		      new google.maps.Size(Site.dw,Site.dh),
		      // The origin for this image is 0,0.
		      new google.maps.Point(0,0),
		      // The anchor for this image is the base of the flagpole at 0,32.
		      new google.maps.Point(Site.dx, Site.dy));
		
		var shadow = new google.maps.MarkerImage('/images/icons/dispenser_shadow.png?a=1',
		      // This marker is 20 pixels wide by 32 pixels tall.
		      new google.maps.Size(31,18),
		      // The origin for this image is 0,0.
		      new google.maps.Point(0,0),
		      // The anchor for this image is the base of the flagpole at 0,32.
		      new google.maps.Point(24, 28));
		
		$.post('/customajax/create_smallmap',
			{a:1},
			function(data, textStatus, xhr) 
			{
		  		var o = Site.dispenser_data = $.evalJSON(data);
				var myOptions = {
					zoom: 16,
					center: new google.maps.LatLng(parseFloat(o[0].latitude), parseFloat(o[0].longitude)),
					disableDefaultUI: true,
					mapTypeId: google.maps.MapTypeId.ROADMAP
				};
				var map = new google.maps.Map(document.getElementById("smallmap"), myOptions);

				for (var i=0; i < o.length; i++) {
					var d = o[i];

					var marker = new google.maps.Marker({
				        position: new google.maps.LatLng(parseFloat(d.latitude), parseFloat(d.longitude)),
						icon: (d.sponsor=='Sponsorship Available' || d.nonprofit=='Sponsorship Available') ? avail : image,
						shadow: shadow
				    });
					marker.setMap(map);
				};
				
				Site.smallmap = map;
				Site.switch_dispenser();
				Site.dispenser_int = setInterval(Site.switch_dispenser,10000);
				
			}
		);
	},
	
	switch_dispenser: function(){
		var num = Site.current_dispenser++ % Site.dispenser_data.length;
		// window.log(num);
		var d = Site.dispenser_data[num];
		var myLatLng = new google.maps.LatLng(parseFloat(d.latitude), parseFloat(d.longitude));
		Site.smallmap.panTo(myLatLng);
		
		if (d.sponsors=='') 
		{
			$('#avail').slideDown();
		} 
		else
		{
			$('#avail').slideUp();
		}
		
		$('#smallmap_name').html(d.name);
		$('#smallmap_park_name').html(d.park_name);
		$('#smallmap_city').html(d.city);
		$('#smallmap_state').html(d.state);
		$('#smallmap_sponsors').html(d.sponsors);
	},
	
	batch:Array,
	add_dispensers: function(map){
		
		var image = new google.maps.MarkerImage('/images/icons/dispenser.png',
		      // This marker is 20 pixels wide by 32 pixels tall.
		      new google.maps.Size(Site.dw,Site.dh),
		      // The origin for this image is 0,0.
		      new google.maps.Point(0,0),
		      // The anchor for this image is the base of the flagpole at 0,32.
		      new google.maps.Point(Site.dx, Site.dy));
		
		var inactive = new google.maps.MarkerImage('/images/icons/inactive.png',
		      // This marker is 20 pixels wide by 32 pixels tall.
		      new google.maps.Size(Site.dw,Site.dh),
		      // The origin for this image is 0,0.
		      new google.maps.Point(0,0),
		      // The anchor for this image is the base of the flagpole at 0,32.
		      new google.maps.Point(Site.dx, Site.dy));
		
		var avail = new google.maps.MarkerImage('/images/icons/dispenser.png',
		      // This marker is 20 pixels wide by 32 pixels tall.
		      new google.maps.Size(Site.dw,Site.dh),
		      // The origin for this image is 0,0.
		      new google.maps.Point(0,0),
		      // The anchor for this image is the base of the flagpole at 0,32.
		      new google.maps.Point(Site.dx, Site.dy));
		
		var shadow = new google.maps.MarkerImage('/images/icons/dispenser_shadow.png',
		      // This marker is 20 pixels wide by 32 pixels tall.
		      new google.maps.Size(31,18),
		      // The origin for this image is 0,0.
		      new google.maps.Point(0,0),
		      // The anchor for this image is the base of the flagpole at 0,32.
		      new google.maps.Point(24, 28));
		
		Site.batch = [];
		
		var k = Site.dispensers.length;
		for (var j=0; j<k; j++) 
		{
			var disp = Site.dispensers[j];
		    // // window.log(parseFloat(disp.lat)+", "+parseFloat(disp.lon));
		
			var icon = (disp.sponsor=='Sponsorship Available' || disp.nonprofit=='Sponsorship Available') ? avail : image;
			var shdw = shadow;
			if (disp.active!="1")
			{
				icon = inactive;
				shdw = null;
			}
				
			
			var myLatLng = new google.maps.LatLng(parseFloat(disp.lat), parseFloat(disp.lon));
		    var marker = new google.maps.Marker({
		        position: myLatLng,
				icon: icon,
				shadow: shdw,
				title: disp.name
		    });
			marker.setVisible(true);
			Site.attach_infowindow(map,marker,disp);
		
			Site.batch.push(marker);
		}
		mgr = new MarkerManager(map);
		google.maps.event.addListener(mgr, 'loaded', function(){
			mgr.addMarkers(Site.batch,10);
			mgr.refresh();
		});
		
	},
	
	attach_infowindow: function(map,marker,disp){
		
		var infowindow = new InfoBox({
		    content: disp.data,
			pixelOffset: new google.maps.Size(25,-100),
			boxStyle: {
				background: "#FFF",
				border: "1px solid #ACB68B",
				padding: "10px",
				width: "350px"
            }
		});
		
		google.maps.event.addListener(marker, 'click', function() {
			
			if(Site.current_infowindow)
				Site.current_infowindow.close();
			
			infowindow.setContent('<img src="/images/icons/loader.gif" />');
			infowindow.open(map,marker);
			infowindow.setZIndex(Site.infowindow_z++);
			map.panTo(marker.getPosition());

			Site.current_infowindow = infowindow;

			$.post('/customajax/load_infowindow',
				{name:marker.getTitle()},
				function(data, textStatus, xhr) 
				{
			  		infowindow.setContent(data);
					$('a.lightbox').lightBox();
					/*
					google.maps.event.addListener(infowindow,'domready',function()
					{
						$('a.lightbox').lightBox();
					});
					*/
				}
			);
		});
		
		
	},
	
	validate_form : function(form)
	{
		if(!form) form = document.forms[0];
		var submit_it = true;
		var email_pattern = new RegExp(/[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}/i);

		$(form).find(".REQUIRED").each(function(req)
		{
			if(($(this).attr('type')!='checkbox' && this.value == '') || 
				($(this).attr('type')=='checkbox' && !this.checked) || 
				($(this).hasClass('email') && !email_pattern.test($(this).val()))) 
			{
				$(this).parents("div.formfield, div.form").addClass('error');
				submit_it = false;
			}
			else
			{
				$(this).parents("div.formfield, div.form").removeClass('error');
			}			
		});
		if( !submit_it ) 
		{
			$('#error_message').html('Please review the highlighted, required fields and resubmit.').fadeIn(250);
			$.scrollTo('#error_message', 800, {easing:'easeInOutCubic'});
		}
		else
		{
			$('#error_message').hide();
		}
		return submit_it;
	}
};

window.log=function(){log.history=log.history||[];log.history.push(arguments);if(this.console){console.log(Array.prototype.slice.call(arguments));}};

$(document).ready(function() {
	Site.init();
});

