var console;

if(!console) {
	var empty = function(){};
	var newConsole = [];
	newConsole.log = newConsole.error = newConsole.warn = newConsole.info = empty;
	console = newConsole;
}

var map;
var geocoder;

function showAddress(address, level, placeMarker) {
	geocoder.getLatLng(
		address,
		function(point) {
			if (!point) {
			} else {	
				map.setCenter(point, level);
				
				if(placeMarker){
					var marker = new GMarker(point);
					marker.bindInfoWindow(address+"");
					map.addOverlay(marker);
				}
			}
		}
	);
}

function initMap () {
	if($('#store-locator>#map_canvas').size() != 0) {
		console.log("In here.");
	
		geocoder = new GClientGeocoder();
		geocoder.setBaseCountryCode("us"); 
		map = new GMap2(document.getElementById("map_canvas"));
		map.addControl(new GSmallZoomControl());
		
		showAddress("United States", 3, false);
	} else if($('#map_canvas').size() != 0) {
		console.log("In there.");
	
		geocoder = new GClientGeocoder();
		geocoder.setBaseCountryCode("us"); 
		map = new GMap2(document.getElementById("map_canvas"));
		
		var info = $('#info-and-directions').get(0);
		console.log(info);
		
		geocoder.getLatLng(
			"Laguna Gloria, Austin, TX",
			function(point) {
				if (!point) {
				} else {	
					map.setCenter(point, 14);
					$(info).addClass("info");
				
					var marker = new GMarker(point);
					map.addOverlay(marker);
					marker.openInfoWindow(info, {noCloseOnClick:true});
					$(info).show();
				}
			}
		);
	}
}

$(document).ready(function() {
	$('a[href^=mailto]').defuscate();
	
	$("a[rel^='lightbox']").slimbox({/* Put custom options here */}, null, function(el) {
		return (this == el) || ((this.rel.length > 8) && (this.rel == el.rel));
	});
	
	var options = [];
	options.api_key = '82d945d23c90c2095ed7e62252cb9f1b';
	options.type = 'search';
	options.per_page = 6;
	options.user_id = '34999933@N06';
	options.tags = "";
	options.tag_mode="all";
	options.thumb_size = 's';
	options.sort = 'date-taken-desc';
	options.params = '&media=photos';
	
	$("div.viewer div.navigation a:eq(0)").click(function() {
		var gallery = $(this).closest("div.navigation").siblings("div.gallery");
	
		var currentPage = $(gallery).data("currentPage");
		
		if(currentPage)
			currentPage--;
			
		$(gallery).data("currentPage", currentPage);
		
		updateViewer.apply(gallery);
		
		return false;
	});
	
	$("div.viewer div.navigation a:eq(1)").click(function() {
		var gallery = $(this).closest("div.navigation").siblings("div.gallery");
	
		var currentPage = $(gallery).data("currentPage");
		
		if(currentPage)
			currentPage++;
			
		$(gallery).data("currentPage", currentPage);
		
		updateViewer.apply(gallery);
		
		return false;
	});
	
	options.callback = function(ul) {
		$("li>a",ul).click(function() {
			var anchor = this;
			
			$(this).parent().siblings().children().removeClass("displayed");
			$(this).addClass("displayed");
			
			$('#zoomed img').fadeOut("normal", function() {
				var img = new Image();
				
				$(img).load(function() {
					$(this).hide();
					$('#zoomed').empty();
					$('#zoomed').append(this);
					$(this).fadeIn("normal");
				}).error(function() {
					console.error("OMG");
				}).attr('src', $(anchor).attr('href'));
			});
		
			return false;
		});

		var gallery = $(ul).closest("div.gallery");
		var navigation = $(gallery).siblings("div.navigation");

		var currentPage = $("input:eq(0)", gallery).val();
		var totalPages = $("input:eq(1)", gallery).val();
		
		$(gallery).data("currentPage", currentPage);
		$(gallery).data("totalPages", totalPages);
		console.log(currentPage);
		console.log(totalPages);
				
		$("span", navigation).text("Page " + currentPage + " of " + totalPages);
		
		var prev = $("a:eq(0)", navigation);
		var next = $("a:eq(1)", navigation);
		
		(currentPage == 1)?$(prev).hide():$(prev).show();
		(currentPage == totalPages)?$(next).hide():$(next).show();
	};	


	var updateViewer = function() {
		var viewer = $(this).closest("div.viewer");

		options.tags = $("form.options input:checked", viewer).map(function() {
			return $(this).val();
		}).get();
		
		options.tags.push("website");
		options.tags = options.tags.join(',');
	
		options.sort = $("form.options select#sort", viewer).val();

		var currentPage = $("div.gallery", viewer).data("currentPage");

		options.page = currentPage;
			
		$("div.gallery", viewer).empty();
			
		$("div.gallery", viewer).flickr(options);
	};
	
	$("div.viewer>form.options *:input").change(function() {
		var gallery = $(this).closest("form.options").siblings("div.gallery");
		$(gallery).removeData("currentPage");
		$(gallery).removeData("totalPages");
	
		updateViewer.apply(this);
	});
	
	$("div.viewer").each(function() {
		updateViewer.apply(this);
	});
	
	$("a.toggler").next().hide();
	$("a.toggler").click(function() {
		$(this).next().slideToggle("normal");
		return false;
	});
	
	function loadJS (jsurl) { 
		var script = document.createElement('script'); 
		script.setAttribute('type', 'text/javascript'); 
		script.setAttribute('src', jsurl); 
		var parent = document.getElementsByTagName('head')[0]; 
		parent.appendChild(script); 
	} 
	
	loadJS('http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAXC3pSFrGXKlFIl2ickI7IhTkFDpimK3B4PVrdLjiCdgZFE9hHxT6_Ihtfy_u6hfLfy4Bgx0hklAVjw&async=2&callback=initMap');
	
	$.tablesorter.defaults.widgets = ['zebra'];
	
	var houseIcon;
	var storeIcon;
	var startAddress;

	$('div#store-locator form').submit(function() {
		if(!houseIcon) {
			houseIcon = new GIcon(G_DEFAULT_ICON);
			houseIcon.shadow = "../images/maps/home.shadow.png";
			houseIcon.image = "../images/maps/home.png";
			houseIcon.iconSize = new GSize(32, 32);
			houseIcon.shadowSize = new GSize(59, 32);
			houseIcon.iconAnchor = new GPoint(16, 32);
			houseIcon.infoWindowAnchor = new GPoint(16, 2);
		}
	
		var address = $(this).find("input:first").val();
		startAddress = address;
		
		geocoder.getLocations(address, function(response) {
			if(response.Status.code == 200) {
				var place = response.Placemark[0];
				var point = new GLatLng(place.Point.coordinates[1], place.Point.coordinates[0]);
	
				var zip;
				var area = place.AddressDetails.Country.AdministrativeArea;
				
				if(area.PostalCode)
					zip = area.PostalCode.PostalCodeNumber;
				else if(area.Locality.PostalCode)
					zip = area.Locality.PostalCode.PostalCodeNumber;
				else {
					geocoder.getLocations(point, arguments.callee);
					return;
				}
					
				zip = /\d{5}/.exec(zip)[0];
				
				var bounds = locateStores(zip, point);
				
				var markerOptions = {icon:houseIcon};
				var marker = new GMarker(point, markerOptions);
				address = address.replace(/&/, "&amp;").replace(/</, "&lt;").replace(/>/, "&gt;");
				marker.bindInfoWindow("<div class='info'><h3>" + address + "</h3></div>");
				map.addOverlay(marker);
			}
		});
		
		return false;
	});

	var textExt = function(node) {
		var text;
	
		if(node.childNodes[0] && node.childNodes[0].hasChildNodes()) {
			text = node.childNodes[0].innerHTML;
		} else {
			text = node.innerHTML;
		}
		
		if(text == "Unknown")
			text = "99999999";
		
		return text;
	};

	$('table.tablesorter').tablesorter({sortList: [[4, 0]], textExtraction: textExt});
	
	function locateStores(zip, origin) {
		if(!storeIcon) {
			storeIcon = new GIcon(G_DEFAULT_ICON);
			storeIcon.shadow = "../images/maps/blue.shadow.png";
			storeIcon.image = "../images/maps/blue.png";
			storeIcon.iconSize = new GSize(32, 32);
			storeIcon.shadowSize = new GSize(59, 32);
			storeIcon.iconAnchor = new GPoint(16, 32);
			storeIcon.infoWindowAnchor = new GPoint(16, 2);
		}

		map.clearOverlays();
		var min = [180, 180];
		var max = [-180, -180];
		
		var dirStart = 'http://maps.google.com/maps?saddr=';
		var dirEnd = '&daddr=';
	
		GDownloadUrl("../cgi-bin/locateStores?zip=" + zip, function(data, responseCode) {
			var xml = GXml.parse(data);
	
	        var rowPrototype = $('tr#row-prototype');
	        $(rowPrototype).siblings().remove();
	
			$(xml).find("store").each(function() {
				var newRow = $(rowPrototype).clone();
			
				var storeId = $(this).find("storeId").eq(0).text();
				var addr1 = $(this).find("addr1").eq(0).text();
				var addr2 = $(this).find("addr2").eq(0).text();
				var phone = $(this).find("phone").eq(0).text();
				var weekdays = $(this).find("weekdays").eq(0).text();
				var saturday = $(this).find("saturday").eq(0).text();
				var sunday = $(this).find("sunday").eq(0).text();
	
				var lat = $(this).find("latitude");
				var long = $(this).find("longitude");
				
				var hasChina = $(this).find("hasChina");
				var hasHealth = $(this).find("hasHealth");
				var hasDelivery = $(this).find("hasDelivery");
				var distance = "Unknown";
				
				var marker = null;
				if(lat.length && long.length) {
					lat = parseFloat(lat.eq(0).text());
					long = parseFloat(long.eq(0).text());
				
					if(lat < min[0]) min[0] = lat;
					if(long < min[1]) min[1] = long;
					if(lat > max[0]) max[0] = lat;
					if(long > max[1]) max[1] = long;
				
					var point = new GLatLng(lat, long);
					
					var infoHtml = "<div class='info'><h3>Bed Bath and Beyond #" + storeId + "</h3>\n";
					infoHtml += "<dl>\n";
					infoHtml += "<dt>Address</dt>\n<dd>" + addr1 + "<br />" + addr2 + "</dd>\n";
					infoHtml += "<dt>Phone</dt>\n<dd>" + phone + "</dd>\n";
					infoHtml += "</dl>\n<a href='" + dirStart + escape(startAddress);
					infoHtml += dirEnd + escape(addr1 + ' ' + addr2) + "'>Directions</a>\n";
					infoHtml += "</div>\n";
					infoHtml = infoHtml.replace(/&/, "&amp;");					
					
					var markerOptions = {icon:storeIcon};
					marker = new GMarker(point, markerOptions);
					marker.bindInfoWindow(infoHtml);
					map.addOverlay(marker);
					
					distance = origin.distanceFrom(point);
					distance /= 1609.344;
					distance = distance.toFixed(2);
				}
				
				$(newRow).find("td:eq(0)").text(storeId);
				$(newRow).find("td:eq(1) span:eq(0)").text(addr1);
				$(newRow).find("td:eq(1) span:eq(1)").text(addr2);
				$(newRow).find("td:eq(2)").text(phone);
				$(newRow).find("td:eq(3) li:eq(0)").text("Weekdays: " + weekdays);
				$(newRow).find("td:eq(3) li:eq(1)").text("Saturday: " + saturday);
				$(newRow).find("td:eq(3) li:eq(2)").text("Sunday: " + sunday);
				$(newRow).find("td:eq(4)").text(distance);
				
				if(newRow != null) {
					$(newRow).click(function() {
						GEvent.trigger(marker, "click");
					});
				}
				
				$(newRow).hover(
					function(){
						$(this).addClass("hover");
					},
					function(){
						$(this).removeClass("hover");
					}
				)
											
				$(newRow).attr('id', null);
				$(newRow).css('display', '');
				
				$(rowPrototype).after(newRow);
			});
			
			$('table.tablesorter').trigger("update");
			$('table.tablesorter').trigger("sorton", [[[4, 0]]]);
			
			var bounds = new GLatLngBounds();
			bounds.extend(new GLatLng(min[0], min[1]));
			bounds.extend(new GLatLng(max[0], max[1]));
			map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));						
		});
		return false;
	}
	
	$('#info-and-directions').hide();
});
