var pc_default = 'Enter Postcode';

$(document).ready(function() {
	/** HDR PC **/
	var pc = $('#postcode');
	
	if (pc.val() == '') {
		pc.val(pc_default);
	}
	
	pc.focus(function() {
		if (pc.val() == pc_default) {
			pc.val('');
		}
	});
	
	pc.blur(function() {
		if (pc.val() == '') {
			pc.val(pc_default);
		}
	});
	
	/** ANALYTICS **/
	$('#hdr ul li a[href="http://www.wrenkitchens.com/"]').click(function() {
		_gaq.push(['_trackPageview', '/view-our-kitchens/']);
	});
	
	$('#cnt a[href="mailto:enquiries@wrenkitchens.com"]').click(function() {
		_gaq.push(['_trackPageview', '/customer-services/enquiries@wrenkitchens.com']);
	});
	
	if ($('ul.home-pods').length > 0) {
		$('ul.home-pods li a').click(function() {
			var track_url = '';
			
			switch($(this).attr('href')) {
				case '/gallery/#3':
					track_url = 'traditional-furniture';
					break;
					
				case '/gallery/#huddersfield-4':
					track_url = 'glossy-furniture';
					break;
					
				case '/gallery/#huddersfield-1':
					track_url = 'bedding-sets';
					break;
					
				case '/gallery/#huddersfield-3':
					track_url = 'wardrobe-planner';
					break;
					
				case '/gallery/#huddersfield-6':
					track_url = 'mattress-sales';
					break;
			}
			
			if (track_url !== '') {
				_gaq.push(['_trackPageview', '/homepage-pod/' + track_url + '/']);
			}
		});
	}
	
	/** LIGHTBOX **/
	if ($('ul.gallery-thumbs').length > 0) {
		$('ul.gallery-thumbs a').lightBox({
			imageLoading: '/img/lightbox/loading.gif',
			imageBtnClose: '/img/lightbox/btn-close.gif',
			imageBtnPrev: '/img/lightbox/btn-prev.gif',
			imageBtnNext: '/img/lightbox/btn-next.gif'
		});
		
		$('ul.gallery-thumbs a').bind('click', function() {
			var track_url = $(this).find('img').attr('src').split('/');
			track_url = track_url[track_url.length-1];
			_gaq.push(['_trackPageview', '/gallery/' + track_url + '/']);
		});
		
		if (window.location.hash !== '') {
			var selected = $('ul.gallery-thumbs a img[src$="/' + window.location.hash.substring(1) + '.jpg"]')
			selected.parent().click();
		}
	}
	
	if ($('#listFilter').length > 0) {
		$('#listFilter')
			.focus(
				function() {
					$(this).val('');
				})
			.keyup(
				function() {
					filter_list(this.value)
				});
		$('#contact-quick')
			.keyup(
				function() {
					do_search(this.value)
				});
	}
	
	/** MAP **/
	if ($('#map_canvas').length > 0) {
		// Loads Google Maps api
		var objApi = $('<script>')
			.attr(
			{
				type : 'text/javascript',
				src  : 'http://maps.google.com/maps/api/js?v=3.2&sensor=false&region=GB&callback=WrenStoreLocator'
			});
		$('body').append(objApi);
	}
});

function filter_list(strMatch) {
	var strMatch = new RegExp(strMatch, 'i');
	var results = 0;
	$('.store-list-box').each(
	function() {
		strId = $(this).attr('id');
		if (strId.match(strMatch)) {
			$(this).show();
			results +=1;
		} else {
			$(this).hide();
			$('#no-results').show();
		}
		
		if (results) {
			$('#no-results').hide();
		} else {
			$('#no-results').show();
		}
		$('#resultSet').text(results);
		$('#plural').text(((results == 1) ? '' : 's'));
	});
}

function do_search(strMatch) {
	var strMatch = new RegExp('^'+strMatch, 'i');

	$('#quicklist').find('li').each(
	function() {
		strRel = $(this).attr('rel');
		if (strRel.match(strMatch)) {
			$(this).show();
		} else {
			$(this).hide();
		}
	});
}

/** STORE LOCATOR **/

/*
 *	Wren Kitchens Store Locator
 */

function WrenStoreLocator(options) {
	var objData = {
		strStorePostcode     : (typeof(strStorePostcode) == 'undefined') ? '' : strStorePostcode,
		strStoreName         : (typeof(strStoreName) == 'undefined') ? false : strStoreName,
		strStoreCleanName    : (typeof(strStoreCleanName) == 'undefined') ? false : strStoreCleanName,
		strUserPostcode      : (typeof(strUserPostcode) == 'undefined') ? false : strUserPostcode,
		strCoords            : (typeof(strCoords) == 'undefined') ? false : strCoords,
		suppressMarkers      : false,
		bolStatusOk          : false,
		strErrorMessage      : false,
		bolInit              : false,
		strDirectionsDisplay : '#map_directions',
		strMapCanvas         : 'map_canvas',
		map                  : null,
		iconPath             : (typeof(iconPath) == 'undefined') ? '' : iconPath
	};

	// Activate store selection.
	$('.directions')
	.live('click',function (e) {
		e.preventDefault();

		objData.strStorePostcode = $(this).attr('rel');
		objData.strStoreName     = $(this).attr('title');
		objData.strCoords        = $(this).attr('data');
		objData.bolInit          = true;

		setCurrent($(this).parents('.showroom_box'));
		showMap();
	});

	function createStoreDetails (store) {
		var storeDetails =  '<div>';
		storeDetails +=  '<h4>' + store.name + ' Showroom</h4>';
		storeDetails +=  '<li><strong>Tel:</strong> ' + store.telephone +'</li>';
		//storeDetails +=  '<li><strong>Manager:</strong> ' + store.storeManager +'</li>';
		storeDetails +=  '<table>';
		storeDetails +=  '<thead><tr><th>Opening hours:</th><th>Open</th><th>Close</th></thead><tbody>';


		var intRowCount = 1;
		for (var day in store.openingHours) {
			if (intRowCount%2 == 0) {
				storeDetails +=  '<tr class="alt">';
			} else {
				storeDetails +=  '<tr>';
			}
			
			storeDetails +=  '<td>' + day + '</td>';

			if (day == 'Sunday') {
				storeDetails += '<td>*' + store.openingHours[day].open + '</td>';
			} else {
				storeDetails += '<td>' + store.openingHours[day].open + '</td>';
			}

			storeDetails += '<td>' + store.openingHours[day].close +'</td>';
			storeDetails +=  '</tr>'
			intRowCount++;
		}

		storeDetails +=  '</tbody></table>';
		storeDetails +=  '<p class="viewingOnlyHours">*(10:30 - 11:00 Viewing Only)</p>';
		storeDetails += '</div>';

		return storeDetails;
	}

	// Highlight Currently Selected Store.
	function setCurrent(store) {
		$('.active').removeClass('active');
		$(store).addClass('active');
	}

	// Render the Directions
	function displayInstructions(response) {
		$(objData.strDirectionsDisplay).empty();

		var objDirections = {
			copyright : response.routes[0].copyrights,
			distance  : response.routes[0].legs[0].distance.text,
			steps     : response.routes[0].legs[0].steps,
			start     : response.routes[0].legs[0].start_location,
			end       : response.routes[0].legs[0].end_location
		}

		var destination =
			$('<h3>')
				.html('Directions to our <span class="branch_name">' + objData.strStoreName + '</span> showroom: <span class="total_distance">Total Distance: ' + objDirections.distance + '</span>');

		var directionList = $('<ul>').attr('id', 'legs');

		// Put each leg of the journey into an <li>
		var alt = 0;
		for (step in objDirections.steps) {
			var listItem = parseInt(step) + 1;
			var leg = $('<li>');
			var legHtml = '<span class="distance">';
				legHtml += objDirections.steps[step].distance.text;
				legHtml += '</span>';
				legHtml +=  '<span class="bullet">';
				legHtml += listItem;
				legHtml += '</span>';
				legHtml += objDirections.steps[step].instructions.replace(/<div[^>]+>/g,', ');
			if (alt==1) {
				$(leg).addClass('alt');
				alt=0;
			} else {
				alt=1;
			}

			$(leg).html(legHtml);
			$(directionList).append(leg);

		}
		
		var legal = $('<h5>').attr('id', 'map_legal').text(objDirections.copyright);
		var directions = $(objData.strDirectionsDisplay);

		setMarkers(objDirections.start,objDirections.end, objData.strStoreName, false);
		directions.append(destination,directionList,legal);

		if (directions.siblings('#map_directions_print').length == 0) {
			// Add the print button, as needed.
			addPrintButton();
		}
	}

	// Add the print button to the directions.
	function addPrintButton() {
		/*
		var printButton = $('<div class="print_button" id="map_directions_print" />');

		printButton.click(function() {
			var cssFiles = [
				SERVER.staticPath + '/css/global.css',
				SERVER.staticPath + '/css/store_locator/print.css'
			];

			if ($.browser.msie) {
				cssFiles.push(SERVER.staticPath + '/css/store_locator/print_ie_fixes.css');
			} else if ($.browser.opera) {
				cssFiles.push(SERVER.staticPath + '/css/store_locator/print_opera_fixes.css');
			}

			common.print(objData.strDirectionsDisplay, cssFiles);
		});

		$(objData.strDirectionsDisplay).before(printButton);
		*/
		return true;
	}

	// Controls which type of map we display
	function showMap() {
		if (strSelectedStore) {
			objData.strStoreName = wrenStores[strSelectedStore].name;
			objData.strStorePostcode = wrenStores[strSelectedStore].cleanPostcode;
			$('.directions[title="'+ strSelectedStore +'"]').trigger('click');
		}
		// Generic Map Options
		var objOptions = {
			zoom             :14,
			mapTypeId        : google.maps.MapTypeId.ROADMAP,
			disableDefaultUI : false,
			streetViewControl : true,
			mapTypeControl: true,
			mapTypeControlOptions: {
				style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
				position: google.maps.ControlPosition.TOP_RIGHT,
				mapTypeIds : [google.maps.MapTypeId.ROADMAP, google.maps.MapTypeId.SATELLITE]
			}

		}

		// If we dont have a valid postcode
		// We can still offer the map locations
		// Without rendering directions, just use the Stores Coords
		if (!objData.bolStatusOk) {
			var objCoords = getLatLng(objData.strCoords);
			objOptions.center = new google.maps.LatLng(objCoords.lat,objCoords.lng);
		}

		objData.map = new google.maps.Map(document.getElementById(objData.strMapCanvas), objOptions);

		if (objData.bolStatusOk) {
			objData.suppressMarkers = true;
			directionsService = new google.maps.DirectionsService();
			directionsDisplay = new google.maps.DirectionsRenderer();
			directionsDisplay.setMap(objData.map);
			calcRoute();
		} else {
			// The user has clicked a store box
			// show the location of the store
			if(objData.bolInit) {
				// Mark the Store out
				objData.suppressMarkers = false;
				setMarkers(null,objOptions.center, objData.strStoreName);

				$(objData.strDirectionsDisplay +' h4')
					.text('Wren Kitchens ' + objData.strStoreName + ' Showroom: ');

				$('#' +objData.strMapCanvas).show();
			}
		}
	}

	// Parses the latlng string to return
	// an object, so we can query the maps api
	function getLatLng (strData) {
		var arrCoords = strData.split(',');
		var objCoords = {
			lat : parseFloat(arrCoords[0]),
			lng : parseFloat(arrCoords[1])
		}
		return objCoords;
	}


	function setMarkers(start, end, name, iconSize) {
		// Icom Images
		var icons = {
			storeIcon   : objData.iconPath + 'map_icon.png',
			storeShadow : objData.iconPath + 'map_shadow.png',
			homeIcon    : objData.iconPath + 'home_icon.png',
			homeShadow  : objData.iconPath + 'home_shadow.png'
		}

		if (iconSize) {
			icons.storeIcon = objData.iconPath + 'small_map_icon.png';
			icons.storeShadow = objData.iconPath + 'small_map_shadow.png';
		}

		// Clear Default Markers
		if (objData.suppressMarkers) {
			directionsDisplay.setOptions ({suppressMarkers  : true});
		}

		// Add custom end marker
		var endMarker = new google.maps.Marker({
			position : end,
			icon     : icons.storeIcon,
			shadow   : icons.storeShadow,
			map      : objData.map,
			title    : name + ' Showroom'
		});

		// Add event listener, so the UK map view has clickable
		// Icons that reveal the store location clicked
		if (!objData.bolStatusOk) {
			google.maps.event.addListener(endMarker, 'click',
				function() {
					// Find the store box, click it, show it
					// Remove it from the list, and insert at the top
					// Gotta love jQuery Chaining :)
					$('.directions[title=' + name +']')
						.trigger('click')
						.parents('.showroom_box')
						.removeClass('hidden_store')
						.clone(true)
						.end()
						.remove()
						.prependTo('ol.showroom_list');
				});
		} else {
			var thisStore = wrenStores[objData.strStoreCleanName];
			var infowindow =
				new google.maps.InfoWindow({
					content: '<div class="google-info-window">' + createStoreDetails(thisStore) +'</div>'
				});

			google.maps.event.addListener(endMarker, 'click',
				function() {
					infowindow.open(objData.map, endMarker);
				});
		}

		// Add custom start marker
		var startMarker = new google.maps.Marker({
			position : start,
			map      : objData.map,
			icon     : icons.homeIcon,
			shadow   : icons.homeShadow,
			title    : 'Your Location'
		});
	}

	function calcRoute() {
		// Construct the request Object
		var request = {
			origin                  : objData.strUserPostcode,
			destination             : objData.strStorePostcode,
			travelMode              : google.maps.DirectionsTravelMode.DRIVING,
			unitSystem              : google.maps.DirectionsUnitSystem.IMPERIAL,
			provideRouteAlternatives: false,
			avoidHighways           : false,
			avoidTolls              : false,
			region: "GB"
		}

		// Send the request
		directionsService.route(request,
			function(response, status) {
				if (status == google.maps.DirectionsStatus.OK) {
					// Use googles api to render the map/routes
					directionsDisplay.setDirections(response);

					// We only requested a single route...
					// but if something DOES go wrong, let google handle it
					if (response.routes[1]) {
						directionsDisplay.setPanel(document.getElementById(objData.strDirectionsDisplay));
						directionsDisplay.setPanel(response);
					} else {
						// handle the response output ourselves
						displayInstructions(response);
					}
				}
			});
	}

	// Run
	(function run() {
		// Check to see if the global errorMessage exits
		// and deal with it.
		if (typeof(errorMessage) != 'undefined')
		{
			if (errorMessage == '' && objData.strStorePostcode && objData.strUserPostcode)
			{
				objData.bolStatusOk = true;
			}
			else
			{
				objData.errorMessage = errorMessage;
				objData.bolStatusOk = false;
				$('.nearest').removeClass();
				objData.strStorePostcode = '';
			}
		}
		showMap();
	})();
}
