if(!window['stand']) {
	window['stand'] = {};
	var stand = window['stand'];
}

(function($) {
	$(document).ready(function() {
		$.ajaxSetup({
			'cache': 'true'
		});
		$('body').addClass('scripted');
		stand.tables();
		stand.maps();
		stand.forms();
		if(!Modernizr.input.placeholder) {
			$('input[placeholder]').each(function() {
				var input = $(this),
					defaultText = input.attr('placeholder');
				input.focus(function() {
					if(input.val() == defaultText) {
						input.val('');
					}
				}).blur(function() {
					if(input.val() == '') {
						input.val(defaultText);
					}
				});
				if(input.val() == '') {
					input.val(defaultText);
				}
			});
		}
	});
	
	protos = {
		'div': $('<div />'),
		'a': $('<a />'),
		'ul': $('<ul />'),
		'li': $('<li />'),
		'span': $('<span />')
	}
	
	stand.tables = function() {
		$('table.statistics').each(function() {
			var table = $(this);

			// list and graph view
			var header = table.prev('h2,h3');
			var showGraph = protos.a.clone().attr({'href': '#show-graph', 'title': 'View as a Graph'}).addClass('ui-icon ui-icon-signal');
			var showTable = protos.a.clone().attr({'href': '#show-list', 'title': 'View as a List'}).addClass('ui-icon ui-state-focus ui-icon-grip-solid-horizontal');
			header.append(
				protos.ul.clone().append(
					protos.li.clone().addClass('ui-state-default ui-corner-all').append(showGraph)
				).append(
					protos.li.clone().addClass('ui-state-default ui-corner-all').append(showTable)
				)
			);
			var container = protos.div.clone().addClass('graph').hide();
			header.after(container);
			var list = protos.ul.clone().appendTo(container);
			table.find('tbody tr').each(function() {
				var row = $(this);
				var label = row.children('td:first-child').text();
				var percentage = row.children('td:last-child').text();
				protos.li.clone().append(
					protos.span.clone().addClass('label').text(label).css({'width': percentage}).addClass('ui-progressbar-value ui-widget-header ui-corner-left' + ( percentage == '100%' ? ' ui-corner-right' : '' ) )
				).append(
					protos.span.clone().addClass('percentage').text(percentage)
				).appendTo(list).addClass('ui-progressbar ui-widget ui-widget-content ui-corner-all');
			});
			
			showGraph.click(function(c) {
				c.preventDefault();
				showGraph.addClass('ui-state-focus');
				showTable.removeClass('ui-state-focus');
				container.fadeIn(500);
				table.fadeOut(500);
			});

			showTable.click(function(c) {
				c.preventDefault();
				showGraph.removeClass('ui-state-focus');
				showTable.addClass('ui-state-focus');
				container.fadeOut(500);
				table.fadeIn(500);
			});
			
			showGraph.add(showTable).hover(function() {
				$(this).addClass('ui-state-hover');
			}, function() {
				$(this).removeClass('ui-state-hover');
			});
			
			// sortable tables
			container.height(table.outerHeight());
			var itemMargin = Math.floor( ( container.height() - ( list.children().size() * 28 ) ) / ( list.children().size() - 1 ) );
			list.children(':not(:first-child)').css({'margin-top': itemMargin + 'px'});
			var module = table.parents('.module');
			module.height(module.height()).addClass('scripted');
			table.add(container).css({'top': table.position().top + 'px'});
			table.find('tbody td.number').each(function() {
				$(this).text(django.intcomma($(this).text()));
			});
			showGraph.click();
		});
	}
	
	stand.maps = function() {
		var placeholder = $('#map');
		var geocoder = new google.maps.Geocoder();
		if(!placeholder.size() || !geocoder) return;
		var zipcode = placeholder.attr('data-zip-code'),
			map = false;
		if(!zipcode) {
			var map = new google.maps.Map(placeholder.get(0), {'zoom': 12, 'mapTypeId': google.maps.MapTypeId.TERRAIN, 'scrollwheel': false, 'center': new google.maps.LatLng(35.111484,-85.253627), 'disableDefaultUI': true, 'navigationControl': true, 'scaleControl': true});
			var bounds = new google.maps.LatLngBounds();
			$('#module-zip-code tbody tr').each(function() {
				var row = $(this),
					zip = row.find('td:first-child').text(),
					percentage = row.find('td.percentage').text();
				geocoder.geocode({'address': zip}, function(results, status){
					$.get(
						placeholder.attr('data-js-root') + 'tn.kml',
						function(data) {
							data = $(data);
							var placemarks = data.find('Placemark:has(ExtendedData:has(Data[name=NAME]))').filter(function() { var placemark = $(this); return (placemark.find('ExtendedData').find('Data[name=NAME]').find('value').text() == zip); });
							placemarks.each(function() {
								var placemark = $(this);
								var coords = [];
								latLongs = placemark.find('MultiGeometry Polygon outerBoundaryIs LinearRing coordinates').text().split(' ');
								$.each(latLongs, function(index) {
									var x_y = latLongs[index].split(',');
									var latLong = new google.maps.LatLng(x_y[1], x_y[0]);
									coords.push(latLong);
								});
								var polygon = new google.maps.Polygon({
									'paths': coords,
									'strokeColor': '#fff200',
									'strokeOpacity': 1,
									'strokeWeight': 2,
									'fillColor': '#fff200',
									'fillOpacity': parseFloat(percentage, 10) / 10
								});
								polygon.setMap(map);
								for (var i = coords.length - 1; i >= 0; i--){
									bounds.extend(coords[i]);
								};
								map.fitBounds(bounds);
							});
						},
						'xml'
					);
					$.get(
						placeholder.attr('data-js-root') + 'ga.kml',
						function(data) {
							data = $(data);
							var placemarks = data.find('Placemark:has(ExtendedData:has(Data[name=NAME]))').filter(function() { var placemark = $(this); return (placemark.find('ExtendedData').find('Data[name=NAME]').find('value').text() == zip); });
							placemarks.each(function() {
								var placemark = $(this);
								var coords = [];
								latLongs = placemark.find('MultiGeometry Polygon outerBoundaryIs LinearRing coordinates').text().split(' ');
								$.each(latLongs, function(index) {
									var x_y = latLongs[index].split(',');
									var latLong = new google.maps.LatLng(x_y[1], x_y[0]);
									coords.push(latLong);
								});
								var polygon = new google.maps.Polygon({
									'paths': coords,
									'strokeColor': '#fff200',
									'strokeOpacity': 1,
									'strokeWeight': 2,
									'fillColor': '#fff200',
									'fillOpacity': parseFloat(percentage, 10) / 10
								})
								polygon.setMap(map);
								for (var i = coords.length - 1; i >= 0; i--){
									bounds.extend(coords[i]);
								};
								map.fitBounds(bounds);
							});
						},
						'xml'
					);
				});
			});
		} else {
			geocoder.geocode({'address': zipcode}, function(results, status){
				map = new google.maps.Map(placeholder.get(0), {'zoom': 12, 'mapTypeId': google.maps.MapTypeId.TERRAIN, 'scrollwheel': false, 'center': results[0].geometry.location, 'disableDefaultUI': true, 'navigationControl': true, 'scaleControl': true});
				$.get(
					placeholder.attr('data-js-root') + 'tn.kml',
					function(data) {
						data = $(data);
						var placemarks = data.find('Placemark:has(ExtendedData:has(Data[name=NAME]))').filter(function() { var placemark = $(this); return (placemark.find('ExtendedData').find('Data[name=NAME]').find('value').text() == zipcode); });
						placemarks.each(function() {
							var placemark = $(this);
							var coords = [];
							latLongs = placemark.find('MultiGeometry Polygon outerBoundaryIs LinearRing coordinates').text().split(' ');
							$.each(latLongs, function(index) {
								var x_y = latLongs[index].split(',');
								var latLong = new google.maps.LatLng(x_y[1], x_y[0]);
								coords.push(latLong);
							});
							var polygon = new google.maps.Polygon({
								'paths': coords,
								'strokeColor': '#fff200',
								'strokeOpacity': 1,
								'strokeWeight': 2,
								'fillColor': '#fff200',
								'fillOpacity': 0.5
							})
							polygon.setMap(map);
							var bounds = new google.maps.LatLngBounds();
							for (var i = coords.length - 1; i >= 0; i--){
								bounds.extend(coords[i])
							};
							map.fitBounds(bounds);
						});
					},
					'xml'
				);
				$.get(
					placeholder.attr('data-js-root') + 'ga.kml',
					function(data) {
						data = $(data);
						var placemarks = data.find('Placemark:has(ExtendedData:has(Data[name=NAME]))').filter(function() { var placemark = $(this); return (placemark.find('ExtendedData').find('Data[name=NAME]').find('value').text() == zipcode); });
						placemarks.each(function() {
							var placemark = $(this);
							var coords = [];
							latLongs = placemark.find('MultiGeometry Polygon outerBoundaryIs LinearRing coordinates').text().split(' ');
							$.each(latLongs, function(index) {
								var x_y = latLongs[index].split(',');
								var latLong = new google.maps.LatLng(x_y[1], x_y[0]);
								coords.push(latLong);
							});
							var polygon = new google.maps.Polygon({
								'paths': coords,
								'strokeColor': '#fff200',
								'strokeOpacity': 1,
								'strokeWeight': 2,
								'fillColor': '#fff200',
								'fillOpacity': 0.5
							})
							polygon.setMap(map);
							var bounds = new google.maps.LatLngBounds();
							for (var i = coords.length - 1; i >= 0; i--){
								bounds.extend(coords[i])
							};
							map.fitBounds(bounds);
						});
					},
					'xml'
				);
			});
		}
	}
	
	stand.forms = function() {
		var overlay = protos.div.clone().attr({'id': 'overlay'}).appendTo($('body')),
			lightbox = protos.div.clone().attr({'id': 'lightbox'}).appendTo($('body')),
			form = $('form#search_form');
		lightbox.text('Processing Your Results');
		form.submit(function() {
			overlay.add(lightbox).show();
		});
		$(window).unload(function(){
			overlay.add(lightbox).show();
		});
		var themes = $('input[type=radio][name=theme]');
		var anyTheme = $('input[type=radio][name=theme][value=]');
		var currentTheme = themes.filter(':checked');
		var categories = $('select[name=categories]');
		var anyCategory = categories.find('option[value=]');
		var currentCategory = categories.find('option[value=' + categories.val() + ']');
		if(currentTheme.size()) {
			categories.val('').find('option[selected]').removeAttr('selected');
		}
		categories.change(function() {
			themes.filter(':checked').removeAttr('checked');
			anyTheme.attr({'checked': 'checked'});
		});
		themes.click(function() {
			if($(this).val()) {
				categories.val('').find('option[selected]').removeAttr('selected');
			}
		});
	}
	
})(jQuery);
