// jQuery Shuffle Plugin
(function($){
  $.fn.shuffle = function() {
    return this.each(function(){
      var items = $(this).children();
      return (items.length)
        ? $(this).html($.shuffle(items))
        : this;
    });
  }
  $.shuffle = function(arr) {
    for(
      var j, x, i = arr.length; i;
      j = parseInt(Math.random() * i),
      x = arr[--i], arr[i] = arr[j], arr[j] = x
    );
    return arr;
  }
})(jQuery);


var stateNames = {YT: 'Yukon', SK: 'Saskatchewan', QC: 'Quebec', PE: 'Prince Edward Island', ON: 'Ontario', NU: 'Nunavut', NT: 'Northwest Territories', NS: 'Nova Scotia', NL: 'Newfoundland and Labrador', NB: 'New Brunswick', MB: 'Manitoba', BC: 'British Columbia', AB: 'Alberta', AL: 'Alabama', AK: 'Alaska', AZ: 'Arizona', AR: 'Arkansas', CA: 'California', CO: 'Colorado', CT: 'Connecticut', DE: 'Delaware', DC: 'District of Columbia', FL: 'Florida', GA: 'Georgia', HI: 'Hawaii', ID: 'Idaho', IL: 'Illinois', IN: 'Indiana', IA: 'Iowa', KS: 'Kansas', KY: 'Kentucky', LA: 'Louisiana', ME: 'Maine', MD: 'Maryland', MA: 'Massachusetts', MI: 'Michigan', MN: 'Minnesota', MO: 'Missouri', MT: 'Montana', NE: 'Nebraska', NV: 'Nevada', NH: 'New Hampshire', NJ: 'New Jersey', NM: 'New Mexico', NY: 'New York', NC: 'North Carolina', ND: 'North Dakota', OH: 'Ohio', OK: 'Oklahoma', OR: 'Oregon', PA: 'Pennsylvania', RI: 'Rhode Island', SC: 'South Carolina', SD: 'South Dakota', TN: 'Tennessee', TX: 'Texas', UT: 'Utah', VT: 'Vermont', VA: 'Virginia', WA: 'Washington', WV: 'West Virginia', WI: 'Wisconsin', WY: 'Wyoming'};

var map;
// Create a base icon for all of our markers that specifies the
// shadow, icon dimensions, etc.
var baseIcon = new GIcon(G_DEFAULT_ICON);
baseIcon.shadow = "/images/map_images/marker_shadow.png";
baseIcon.iconSize = new GSize(51, 34);
baseIcon.shadowSize = new GSize(51, 34);
baseIcon.iconAnchor = new GPoint(9, 34);
baseIcon.infoWindowAnchor = new GPoint(9, 2);

// Creates a marker whose info window displays the letter corresponding
// to the given index.
function createMarker(point, index, contents, results) {
	// Create a lettered icon for this point using our icon class
	var letter = String.fromCharCode("A".charCodeAt(0) + index);
	var letteredIcon = new GIcon(baseIcon);
	letteredIcon.image = "/images/map_images/marker" + letter + ".png";
		
	// Set up our GMarkerOptions object
	var marker = new GMarker(point, { icon: letteredIcon });
	
	$(results[index]).find('.markerImage, ul.location li:first-child a').click(function(event){
		event.preventDefault();
		marker.openInfoWindowHtml(contents);
	});
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowHtml(contents);
	});
	
	return marker;
}

var shippingEstimateForm;
$(document).ready(function() {
	
	// FAQ
	if($("#faqs").length){
		var questions = $("#faqs li .question");
		var answers = $("#faqs li dd");
		var slideSpeed = "fast";
		
		answers.hide();
		answers.children(".answer").append('<a class="close" href="#close">Close</a>');
		
		$("#faqs .close").click(function(event){
			event.preventDefault();
			$(this).parent(".answer").parent("dd").slideUp(slideSpeed);
		});
		
		questions.each(function(index){
			$(questions[index]).click(function(event){
				event.preventDefault();
				$(answers[index]).slideToggle(slideSpeed);
			});
		});
	}
	
	// email lookup, form hardening, validation
	if($("#shipping_estimate").length){
		
		shippingEstimateForm = new FormValidator('shipping_estimate', {
			name: 'Error: Please enter your full name',
			email: 'Error: Please enter a valid email address',
			phone: 'Error: Please enter a valid number',
			ship_date: 'Error: Please enter a ship date',
			shipping_from: '<p>Error: Please use US or Canadian postal codes only</p><a href="JavaScript:;" onClick="window.open(\'http://zip4.usps.com/zip4/citytown.jsp\', \'USPS\', \'width=750, height=500\'); return false;">Find US zip codes</a><br /><a href="JavaScript:;" onClick="window.open(\'http://www.canadapost.ca/cpotools/apps/fpc/personal/findByCity?execution=e1s1\', \'Canada\', \'width=750, height=500\'); return false;">Find Canadian postal codes</a>',
			shipping_to: '<p>Error: Please use US or Canadian postal codes only</p><a href="JavaScript:;" onClick="window.open(\'http://zip4.usps.com/zip4/citytown.jsp\', \'USPS\', \'width=750, height=500\'); return false;">Find US zip codes</a><br /><a href="JavaScript:;" onClick="window.open(\'http://www.canadapost.ca/cpotools/apps/fpc/personal/findByCity?execution=e1s1\', \'Canada\', \'width=750, height=500\'); return false;">Find Canadian postal codes</a>',
					
			
		});
		
		
		
		$("#cerberus").attr('value',"ef713e69f0eb7ebb1160f077bc237389");
		$("#shipping_from").blur(function(){
			var shipToInput = $('#form-bot #shipping_from_email');
			$.post('/processors/franchise_lookup.php',{location: this.value},function(response){
				if(response.found){
					shipToInput.attr('value',response.email);
				}else{
					shipToInput.attr('value','');
				}
				if( response.nls ){
					$('#form-bot').append('<input id="nls" name="nls" type="hidden" value="yes" />');
				}else{
					$('#form-bot #nls').remove();
				}
			}, "json");
		});
	}
	
	// Nav dropdown menu
	if($('#nav ul.menu').length){
		var menus = $('#nav ul.menu');
		
		menus.each(function(index){
			var menuParent = $(this).parent('li');
			var menu = $(this);
			menuParent.mouseenter(function(){
				$(this).addClass("menuHover");
				menu.show();
			});
			menuParent.mouseleave(function(){
				$(this).removeClass("menuHover");
				menu.hide();
			});
		});
	}
	
	// shipped items gallery
	if($('div#shipped_gallery').length){
		$('div#shipped_gallery ul').cycle({
			timeout: 10000,
			fx: 'scrollHorz',
			next: $('div#shipped_gallery .next'),
			prev: $('div#shipped_gallery .prev')
		});
		
		$('div#shipped_gallery').mouseenter(function(){
			$('div#shipped_gallery ul').cycle('pause');
		});
		$('div#shipped_gallery').mouseleave(function(){
			$('div#shipped_gallery ul').cycle('resume');
		});
	}
	
	$('form#shipping_estimate').submit(function(event){
		$('#form-zip span.error').hide();
		$('#form-zip span.error:eq(0)').show()
		$('#form-zip span.error:eq(1)').show()
	})
	
	// auto statename population
	if($('input#keywords').length){
		$('form#searchform').submit(function(event){
			var searchTerm = $('input#keywords').val().toUpperCase();
			var inputField = $('input#keywords');
			
			var postalMatch = searchTerm.match(/[A-Z][0-9][A-Z]/);
			var zipMatch = searchTerm.match(/[0-9]{5}/);
			
			if(postalMatch){ // Postal Code
				inputField.val(postalMatch[0]);
			}else if(zipMatch){ // Zip Code
				inputField.val(zipMatch[0]);
			}else if( searchTerm.length == 2 ){ // State Match
				
				var found = false;
				var valid = true;
				var stateSearch = (' ' + searchTerm + ' ').match(/[^A-Z0-9]([A-Z][A-Z])[^A-Z0-9]/);
				if (stateSearch[1]) {
					for (k in stateNames) {
						if (k == stateSearch[1]) {
							found = true;
							inputField.val(stateNames[k]);
						}
					}
					if (!found){
						valid = false;
					}
				}
				else if (searchTerm.length < 2) {
					valid = false;
				}
				
				if(!valid){
					event.preventDefault();
					$('input#keywords').addClass('error');
					$('span#custom_error').show();
				}
			}
		});
		
		// Required for a special case where the search terms are being cleared.
		$('input.clearFieldNavis').focus(function(){
			if(this.value == 'Search by City, State, Province, Zip or Postal Code'){
				this.value='';
				$(this).addClass('entered');
			}
		}).blur(function(){
			if(this.value == ''){
				this.value = 'Search by City, State, Province, Zip or Postal Code';
				$(this).removeClass('entered');
			}
		});
	}
	
	if($('#search_results_map').length){
		// a necessary hack:
		// kick user to the "No Results" page if they end up here and the results list is in fact empty for some reason...
		if($('#search_results li').length < 1){
			document.location.href = "/search/no_results";
		}
		
        map = new GMap2(document.getElementById("search_results_map"));
        map.setCenter(new GLatLng(37.4419, -122.1419), 13);
		map.addControl(new GLargeMapControl3D());
		map.myBounds = new GLatLngBounds(); 
		
		$('#search_results').shuffle(); // jQuery Shuffle
		var results = $('#search_results>li');
		$('#search_results li.latlong').each(function(i){
			var markerImage = '/images/map_images/marker' + String.fromCharCode("A".charCodeAt(0) + i) + '.png';
			var point = new GLatLng.fromUrlValue($(this).text());
			
			// add number to list
			var itemContents = $(results[i]).html();
			$(results[i]).html('<div class="markerImage"><img src="'+markerImage+'" /></div>' + itemContents);
			
			// add marker to map
			map.addOverlay(createMarker(point, i, '<div class="result">' + $(results[i]).html() + '</div>', results));
			map.myBounds.extend(point);
			
			
		});
        // Manually set a zoom level if there's only one result.
        if(results.length == 1){
    		map.setZoom(10);
        }else{
    		map.setZoom(map.getBoundsZoomLevel(map.myBounds));
        }
		map.setCenter(map.myBounds.getCenter());
   	}
	
	
	$("#quickform .field_date").datepicker();
	
	function sortObject(o) {
		var sorted = {},
		key, a = [];

		for (key in o) {
			if (o.hasOwnProperty(key)) {
					a.push(key);
			}
		}

		a.sort();

		for (key = 0; key < a.length; key++) {
			sorted[a[key]] = o[a[key]];
		}
		return sorted;
	}
	
	
	// region grouping.
	if( $("#browse_by_region").length ){
		listItems = $("#browse_by_region li");
		newListItems = [];
		
		for( i=0 ; i < listItems.length ; i++ ){
		    var state = $(listItems[i]).find('a')[0].innerHTML.split(',')[1];
			var cityName = $(listItems[i]).find('a')[0].innerHTML.split(',')[0];
			var cityUrl = $(listItems[i]).find('a')[0].href;
			var city = '<a href="' + cityUrl + '">' + cityName + '</a>'
			
			if( typeof(newListItems[state]) == 'undefined' ){
				newListItems[state] = [];
			}
			newListItems[state].push(city);
		}
		
		newListItems = sortObject(newListItems);
		
		$("#browse_by_region ul")[0].innerHTML = '';
		
		for( var state in newListItems ){
			var heading = state;
			var cities = newListItems[state];
			var unorderedList = $("#browse_by_region ul")[0];
			var string = '';
			string += "<li><h4>"+heading+"</h4><ul>";
			for( var i in cities ){
				var city = cities[i];
				string += "<li>" + city + "</li>";
			}
			string += "</ul></li>";
			
			unorderedList.innerHTML += string;
		}
	}
	
});


