var $j = jQuery.noConflict();

jQuery(document).ready(function() { //Start code ******************************************
	// Decoration - remove border separator on first / last link
	$j("#primaryNavigation li:last-child, #memberNavigation li:last-child, #secondaryNavigation li:last-child, #breadcrumb li:last-child, #dealInformation li:last-child, .teeoffTimesVenueList li:last-child").addClass("last");
	$j("#siteInformation li:first-child").addClass("first");

	// Needs to be functioned out but is only used once sitewide so might as well be here for now
	$j("#additionalInfo textarea").bind("click mouseup keyup change", function() {
		var $this = $j(this);
		var $limit = 750;

		var $textEntered = $j($this).val();
		var $textlength = $textEntered.length;
		var $infoContainer = $j("#additionalInfo label span");

		if ($textlength > $limit) {
			$j($infoContainer).text("Please edit your comments to below " + $limit + " characters");
			return false;
		}
		else {
			$j($infoContainer).text(($limit - $textlength) + " characters remaining");
			return true;
		}
	});

	// TOT - Date picker
	$j(".datepicker").datepicker({
		dateFormat: 'dd/mm/yy',
		minDate: 0,
		showOn: 'button',
		buttonImage: '/Themes/TeeOffTimes/Images/ExtranetIcons/calendar-dropdown.gif',
		buttonImageOnly: true
	});

	$j(".ui-datepicker-trigger")
        .attr("alt", "Calendar")
        .attr("title", "Open calendar");

	// Tabs - used in membership area
	$j(".tabContainer").tabs({ cookie: { expires: 30} });

	// Autocomplete on the location search
	if ($j().autocomplete) {
		$j(".hasAutoComplete").autocomplete("/WebServices/lookup.asmx/GetGeographyByName", {
			parse: function(data) {
				var parsed = [];
				$j(data).find("string").each(function() {
					parsed[parsed.length] = {
						data: [$j(this).text()],
						value: $j(this).text(),
						result: [$j(this).text()]
					};
				});
				return parsed;
			},
			dataType: 'xml',
			datakey: 'string',
			max: 10,
			extraParams: {
				q: '',
				limit: '',
				prefixText: function() { return $j(".hasAutoComplete").val(); },
				count: 10
			}
		});
	}

	// Needs to be looked at to stop multiple firing
	$j(".ac_input").blur(function() {
		// Clear contents of dropdown from previous search
		$j('.venueDropDown >option').remove();
		// Just incase the amount changes put here for ease as code increase in size!!
		var courseDropDownResults = 20;
		$j.ajax({
			type: "POST",
			url: "/WebServices/lookup.asmx/GetCoursesForLocation",
			dataType: "xml",
			data: "courseDropDownResults=" + courseDropDownResults + "&locationText=" + $j(".ac_input").val(),
			success: function(data) {
				var allVenuesOption = document.createElement("option");
				$j(allVenuesOption)
                                .val("0")
                                .html("All Venues");
				$j(".venueDropDown").append(allVenuesOption);
				$j(data).find("SimpleVenue").each(function() {
					var newOption = document.createElement("option");
					var itemValue = $j(this).find("VenueId").text();
					var itemText = $j(this).find("VenueName").text();
					$j(newOption)
                                .val(itemValue)
                                .html(itemText);
					$j(".venueDropDown").append(newOption);
				});
			}
		});
	});

	// Tee sheets - Generate a tee sheet when a "View Tee Sheet" link is clicked / triggered
	$j(".viewTeeSheet").toggle(function(event) {
		event.preventDefault();
		var $eventTrigger = $j(this);
		var $theTeesheet = $j($eventTrigger).closest(".panelContent").find(".teesheet");
		var $delayTime = 0;
		$delayTime = $j.getQueryString({ ID: "delayTime", URL: $eventTrigger.attr("href") });

		$j($eventTrigger).find("span[class!=cosmetic]").text("Close Tee Times");

		if ($j($theTeesheet).length > 0) {
			$j($theTeesheet).slideToggle("medium");
		} else {
			$j.generateTeesheet($eventTrigger, $j($eventTrigger).parent(), $delayTime);
		}
	}, function(event) {
		event.preventDefault();
		var $eventTrigger = $j(this);
		var $theTeesheet = $j($eventTrigger).closest(".panelContent").find(".teesheet");

		$j($eventTrigger).find("span[class!=cosmetic]").text("View Tee Times");
		$j($theTeesheet).slideToggle("medium");
	});

	// Tee sheets - Handle navigation within a tee sheet
	$j(".viewTeeSheet2").live("click", function(event) {
		event.preventDefault();

		var $eventTrigger = $j(this);
		var $teesheetAppearsAfter = $j($eventTrigger).closest(".panelContent").find(".ctaLinkContainer");

		$j($eventTrigger).closest(".panelContent").find(".teesheet").remove();

		if ($j($eventTrigger).closest(".panelContent").find(".scorecard").length > 0) {
			$teesheetAppearsAfter = $j($eventTrigger).closest(".panelContent").find(".scorecard");
		}

		$j.generateTeesheet($eventTrigger, $teesheetAppearsAfter, 0);
	});

	// Datepicker for teesheet navigation
	// Can't have calendar icon because it will only show on focus
	// One for the future
	$j("#[id*=tsCalendarNav]").live("click", function() {
		$j(this).datepicker({
			showOn: "focus",
			dateFormat: 'dd/mm/yy',
			minDate: 0
		}).focus();
	});

	// Really need to function out the live click events - this is yet another dupe of code above with a little tweak.
	// Come back to this as soon as there is time
	$j("#[id*=calendarSubmitLink]").live("click", function(event) {
		event.preventDefault();
		var $eventTrigger = $j(this);

		var $originalHref = $j($eventTrigger).attr("href");

		//var $newDateArr = $j("#tsCalendarNav").val().split("/");
		var $newDateArr = $eventTrigger.closest(".panelContent").find("#[id*=tsCalendarNav]").val().split("/");
		var $newDate = $newDateArr[2] + "-" + $newDateArr[1] + "-" + $newDateArr[0];

		$j($eventTrigger).attr("href", $originalHref + $newDate + "T00:00:01");

		var $teesheetAppearsAfter = $j($eventTrigger).closest(".panelContent").find(".ctaLinkContainer");

		$j($eventTrigger).closest(".panelContent").find(".teesheet").remove();

		if ($j($eventTrigger).closest(".panelContent").find(".scorecard").length > 0) {
			$teesheetAppearsAfter = $j($eventTrigger).closest(".panelContent").find(".scorecard");
		}

		$j.generateTeesheet($eventTrigger, $teesheetAppearsAfter, 0);
	});

	// Add items to the basket.
	// Needs to be a live event since the links are added to the DOM dynamically
	$j(".basketLink").live("click", function(event) {
		event.preventDefault();

		$firingLink = $j(this);

		// From the link itself
		var $fullQuerystring = $firingLink.attr("href");
		var $courseId = $j.getQueryString({ ID: "courseId", URL: $fullQuerystring });
		var $venueName = $j.getQueryString({ ID: "venueName", URL: $fullQuerystring });
		var $courseName = $j.getQueryString({ ID: "courseName", URL: $fullQuerystring });
		var $selectedDate = $j.getQueryString({ ID: "teeDate", URL: $fullQuerystring });
		var $price = $j.getQueryString({ ID: "price", URL: $fullQuerystring });

		// Add to basket using web service
		$j.ajax({
			type: "POST",
			url: "/WebServices/lookup.asmx/AddToBasket",
			dataType: "xml",
			data: "golfcourseid=" + $courseId + "&teetime=" + $selectedDate,
			success: function() {
				$j.addBasketItem($selectedDate, $courseId, $venueName, $courseName, $firingLink, $price);
			}
		});
	});

	$j(".deleteLink").live("click", function(event) {
		event.preventDefault();

		$firingLink = $j(this);

		var $fullQuerystring = $j(this).attr("href");
		var $courseId = $j.getQueryString({ ID: "courseId", URL: $fullQuerystring });
		var $selectedDate = $j.getQueryString({ ID: "teeDate", URL: $fullQuerystring });

		// Remove from basket using web service
		$j.ajax({
			type: "POST",
			url: "/WebServices/lookup.asmx/RemoveFromBasket",
			dataType: "xml",
			data: "golfcourseid=" + $courseId + "&teetime=" + $selectedDate,
			success: function() {
				$j.removeBasketItem($firingLink, $courseId, $selectedDate);
			}
		});
	});

	// Don't let the user add the same teetime twice
	$j(".addedTeeTime").live("click", function(event) {
		event.preventDefault();
	});

	// View the scorecard
	$j(".viewScorecard").toggle(function(event) {
		event.preventDefault();
		var $firingItem = $j(this);
		var $theScorecard = $j($firingItem).closest(".panelContent").find(".scorecard");

		$j($firingItem).find("span[class!=cosmetic]").text("Close Scorecard");

		if ($j($theScorecard).length > 0) {
			$j($theScorecard).slideToggle("medium");
		} else {
			var $fullQuerystring = $j(this).attr("href");
			var $courseId = $j.getQueryString({ ID: "courseId", URL: $fullQuerystring });

			$j.ajax({
				type: "POST",
				url: "/WebServices/lookup.asmx/GetGolfcourseScoreCard",
				dataType: "xml",
				data: "courseId=" + $courseId,
				success: function(data) {
					var $scorecardContainer = document.createElement("div");
					$j($scorecardContainer)
                            .attr("class", "scorecard")
                            .html($j(data).find("string").text());
					$j($firingItem).find("span[class!=cosmetic]").text("Close Scorecard").closest("div").after($scorecardContainer);
				}
			});
		}

	}, function(event) {
		event.preventDefault();
		var $firingItem = $j(this);
		var $theScorecard = $j($firingItem).closest(".panelContent").find(".scorecard");

		$j($firingItem).find("span[class!=cosmetic]").text("View Scorecard");
		$j($theScorecard).slideToggle("medium");

	});

	$j(".minimisedString span").hide();

	$j(".minimisedString a").click(function(event) {
		event.preventDefault();
		var $closeLink = document.createElement("a");
		$j($closeLink)
                .text(" [Less]")
                .attr("href", "#")
                .addClass("closeLink");

		$thisLink = $j(this);
		$thisSpan = $j($thisLink).closest("p").find(".minimisedString span");

		$j($thisLink).toggle();
		$j($thisSpan).append($closeLink).toggle();
	});

	$j(".closeLink").live("click", function(event) {
		event.preventDefault();
		$thisLink = $j(this);

		$thisSpan = $j($thisLink).closest("p").find(".minimisedString span");
		$expandLink = $j($thisLink).closest("p").find(".minimisedString a");
		$j($thisLink).remove();

		$j($expandLink).toggle();
		$j($thisSpan).toggle();
	});

	$j.removeBasketItem = function($firingLink, $courseId, $teetime) {
		var $linkId = "a" + $j($firingLink).attr("href").replace(/[^\d]*/gi, "");
		$j("#" + $linkId).attr("class", "basketLink");

		var $panel = $j($firingLink).closest(".panelContent");
		// If this is the last link in the basket then get rid of teh ul and teh checkout link, and add an empty message
		if ($j($firingLink).closest("ul").children().length === 1) {
			var $emptyInfo = document.createElement("p");
			$j($emptyInfo)
                    .text("Your basket is currently empty.")
                    .addClass("emptyInfo");
			$j($panel).find("ul").remove();
			$j($panel).find("a").remove();
			$j($panel).append($emptyInfo);

			// Remove the checkout button from the teesheet as well
			$j(".teesheet .ctaLink").remove();
		}
		$j($firingLink).parent("li").remove();
	};

	// Various forms don't fire when you use the enter key to submit & usual .net hack doesn't fix it
	$j("#[id*=VenueSearch] input[type=text]").enterKeySubmit($j("#[id*=VenueSearch] input[type=image]"));
	$j("#[id*=RecommendedVenues] input[type=text]").enterKeySubmit($j("#[id*=RecommendedVenues] input[type=image]"));
	$j("#[id*=Login] input[type=password]").enterKeySubmit($j("#[id*=Login] input[id*=SubmitButton]"));
	$j("#[id*=VenueDirections] input[type=text]").enterKeySubmit($j("#[id*=VenueDirections] input[type=image]"));

	// Disable order by option for Recommended sorting
	$j("#[id*=sortDropDownBox]").blur(function(event) {
		var $thisSelect = $j(this);
		var $optionVal = $j($thisSelect).val();

		if ($optionVal.toLowerCase() == "recommended") {
			$j("#[id*=orderByDropDownBox]").attr("disabled", "disabled");
			$j("#[id*=orderByDropDownBox] option[value=Ascending]").attr("selected", "selected");
		} else {
			$j("#[id*=orderByDropDownBox]").removeAttr("disabled");
		}
	});
});

// Map things that should run on window load
$j(window).load(function() {

	// If js is enabled then set the styling on the map container
	// No point taking up loads of the page when non-js users are only going
	// to get a message asking that they enable js
	$j("#[id*=mapContainer]").addClass("jsEnabled");
	$j("#postcodeSearch").show();
	$j("div.venueDirections fieldset").show();

	// If someone enters a postcode then handle the change
	$j("#[id*=uiBtnSearch]").click(function(event) {
		event.preventDefault();

		// Remove error message, if one has been added
		$j("#pcInvalid").remove();

		// Get postcode and validate
		var $postcode = $j("[id*=uiTxtPostcode]").val();
		if (isUkPostcode($postcode)) {
			$j.ajax({
				type: "POST",
				url: "/WebServices/lookup.asmx/GetLatLongFromPostcode",
				dataType: "xml",
				data: "postcode=" + $postcode,
				success: function(data) {
					var $lat = $j(data).find("Latitude").text();
					var $lon = $j(data).find("Longitude").text();

					// Some postcodes may be valid according to the regex 
					// but invalid according to the geocoding
					if ($lat == 0 && $lon == 0) {
						$j("#[id*=GoogleMapVenues] legend").after("<p id=\"pcInvalid\">Please check the postcode is valid.</p>");
						return false;
					} else {
					$j("#googleMapPart").googleMap({
							latitude: $lat,
							longitude: $lon
						});
					}
				}
			});
		} else {
			$j("#[id*=GoogleMapVenues] legend").after("<p id=\"pcInvalid\">Please check the postcode is valid.</p>");
		}
	});
});