﻿/// <reference path="jquery-1-6-4-vsdoc.js" />
/// <reference path="scan.js" />
/// <reference path="scan.basket.js" />
/// <reference path="scan.imagepreview.js" />
/// <reference path="scan.layout.js" />
/// <reference path="scan.livesearch.js" />
/// <reference path="scan.navigtion.js" />
/// <reference path="scan.productlist.js" />
/// <reference path="scan.search.js" />
/// <reference path="scan.template.js" />
/// <reference path="scan.video.js" />


/*!
* scan.livesearch.js
*/

(function ($) {
	$.fn.ScanLiveSearch = function (searchResultsHolder, ApplicationRoot) {
		return this.each(function () {
			var searchInput = $(this);

			var xhr = null;
			var TimeoutId = null;
			var SearchDelay = 250;

			var ResultHeader = $("<div class=\"ResultHeader\"></div>");
			var ResultPages = $("<div class=\"ResultPages\"></div>");
			var LastSearchValue = null;

			$(searchResultsHolder).children().remove();
			$(searchResultsHolder).append("<div class=\"LiveS\"><div class=\"ResultContainer\"><div class=\"Ls-Contain\"></div></div></div>");
			$(".Ls-Contain", searchResultsHolder).append(ResultHeader);
			$(".Ls-Contain", searchResultsHolder).append(ResultPages);

			$(searchInput).keypress(function (event) {
				if (event.keyCode == 13) {
					var SelectedItem = $("div.ResultPage:visible li.selected:eq(0) a").attr("href");
					if (SelectedItem != undefined) {
						window.location.href = SelectedItem;
					}
					else {
						window.location.href = "http://www.scan.co.uk/search.aspx?q=" + $.UrlEncode(searchInput.val());
					}
					return false;
				}
			});

			$(searchInput).keydown(function (event) {
				switch (event.keyCode) {
					case 38: //Up
						PreviousResult($("div.ResultPage:visible"));
						break;
					case 40: //Down
						NextResult($("div.ResultPage:visible"));
						break;
					case 33: //Page Up
						PreviousPage($("div.ResultPage:visible"), false);
						break;
					case 34: //Page Down
						NextPage($("div.ResultPage:visible"), false);
						break;
					case 27: //Esc 
						Hide();
						break;
				}
			});

			$(searchInput).keyup(function (event) {
				var Input = $(searchInput).val();
				if (Input == '') {
					Hide();
					return;
				}

				if (LastSearchValue != Input) {
					LastSearchValue = Input;

					clearTimeout(TimeoutId);

					if (xhr) {
						xhr.abort();
					}

					TimeoutId = setTimeout(function () {
						var PostData = { "Query": $(searchInput).val(), "PageSize": 5 };
						xhr = $.ajax({ type: 'POST',
							url: ApplicationRoot + "Scan.asmx/Search",
							data: JSON.stringify(PostData),
							dataType: "json",
							contentType: "application/json; charset=utf-8",
							success: function (result, status) {
								$(searchInput).focus();
								var SearchResultContainer = result.d ? result.d : result;

								if (SearchResultContainer != null) {
									var FirstItem = true;

									$.each(SearchResultContainer, function (index, item) {
										var HeaderItem = $("a.HeaderItem." + item.TypeName, ResultHeader);
										if (HeaderItem.length == 0) {
											HeaderItem = $("<a href=\"javascript:\" class=\"HeaderItem " + item.TypeName + "\">" + item.TabHeader + " <span class=\"TotalResults\">[" + item.TotalResults + "]</span></a>");
											$(ResultHeader).append(HeaderItem);
										}
										else {
											$("span.TotalResults", HeaderItem).html("[" + item.TotalResults + "]");
										}
										var ResultPage = $("div.ResultPage." + item.TypeName);
										if (ResultPage.length == 0) {
											ResultPage = $("<div class=\"ResultPage " + item.TypeName + "\" style=\"display: none;\">" + item.TypeName + "</div>");
											$(ResultPages).append(ResultPage);
											if (FirstItem) {
												$("a", ResultHeader).removeClass("on");
												$("a." + item.TypeName).addClass("on");
												$(ResultPage).show();
											}
										}
										if (FirstItem) FirstItem = false;
										SetResultSet(ResultPage, item);
										SetPageIndex(ResultPage, 0);
										DisplayResultPage(ResultPage);
										$(".HeaderItem." + item.TypeName, ResultHeader).click(function () {
											$("a", ResultHeader).removeClass("on");
											$(this).addClass("on");
											$("div.ResultPage", ResultPages).hide();
											$("div.ResultPage." + item.TypeName, ResultPages).show();
											$(searchInput).focus();
										});
									});

									Show();
								}
								_gaq.push(["_trackEvent", "Live Search Query", $(searchInput).val()]);
							}
						})
					}, SearchDelay);
				}
			});

			function GetResultSet(ResultPage) {
				return $(ResultPage).data("ResultSet");
			}

			function SetResultSet(ResultPage, ResultSet) {
				return $(ResultPage).data("ResultSet", ResultSet);
			}

			function GetPageIndex(ResultPage, PageIndex) {
				return $(ResultPage).data("PageIndex");
			}

			function SetPageIndex(ResultPage, PageIndex) {
				$(ResultPage).data("PageIndex", PageIndex);
			}

			function DisplayResultPage(ResultPage) {
				var PageIndex = GetPageIndex(ResultPage);
				var ResultSet = GetResultSet(ResultPage);

				if (ResultSet.PageList.length > 0) {
					if (PageIndex >= 0 && ResultSet.PageList.length > PageIndex) {
						var html = Scan.Template.GetHtml(ResultSet.TemplateId, ResultSet.PageList[PageIndex]); 

						//if product result page then update buy buttons to pre-order if necessary
						if (ResultSet.TypeName == "Product") {
							$.each(ResultSet.PageList[PageIndex].ResultList, function (index, product) {
								if (!product.InStock) {
									$(".wpid-" + product.WebProductId + " .buy-button img", html).attr("src", Scan.ApplicationRoot + "images/buy-button-preorder.png");
								}
							});
						}

						$(ResultPage).html(html);

						Scan.Basket.UpdateProductLists();

						$(".Paging", ResultPage).html("Page " + (PageIndex + 1) + " of " + ResultSet.PageList.length + " - " + (ResultSet.TooManyResults ? "more than " + ResultSet.TotalResults : ResultSet.TotalResults) + " " + ResultSet.NameP.toLowerCase() + " <span class=\"helper\">[Press ENTER to view all " + ResultSet.NameP.toLowerCase() + "]</span>");

						SelectResult(ResultPage, -1); //Select paging header

						$(ResultPages).click(function () {
							$(searchInput).focus();
						});

						$("li", ResultPage).mouseover(function () {
							var index = $("li", ResultPage).index(this);
							SelectResult(ResultPage, index);
						});

						if (PageIndex > 0) {
							$(".prev", ResultPage).click(function () {
								PreviousPage(ResultPage, false);
								$(searchInput).focus();
							});
						}
						else {
							$(".prev", ResultPage).hide();
							$(".pagingseperator", ResultPage).hide();
						}

						if (PageIndex < ResultSet.PageList.length - 1) {
							$(".next", ResultPage).click(function () {
								NextPage(ResultPage, false);
								$(searchInput).focus();
							});
						}
						else {
							$(".next", ResultPage).hide();
							$(".pagingseperator", ResultPage).hide();
						}

						$(".close", ResultPage).click(function () {
							Hide();
						});
					}
					else {
						alert("PageIndex out of bounds");
					}
				}
				else {
					$(ResultPage).html("<p>Your search returned no " + ResultSet.NameP.toLowerCase() + ".</p>");
				}
			}

			function Show() {
				$(searchResultsHolder).show();
			}

			function Hide() {
				$(searchResultsHolder).hide();
			}

			function PreviousPage(ResultPage, SelectLastItem) {
				var ResultSet = GetResultSet(ResultPage);
				var PageIndex = GetPageIndex(ResultPage);

				if (PageIndex > 0 && PageIndex < ResultSet.PageList.length) {
					PageIndex = PageIndex - 1;
					SetPageIndex(ResultPage, PageIndex);

					DisplayResultPage(ResultPage);

					if (SelectLastItem) {
						var Results = $("li", ResultPage);
						var ResultIndex = $(Results).index($("li:last", ResultPage));
						SelectResult(ResultPage, ResultIndex);
					}
				}
			}

			function NextPage(ResultPage, SelectFirstItem) {
				var ResultSet = GetResultSet(ResultPage);
				var PageIndex = GetPageIndex(ResultPage);

				if (PageIndex < ResultSet.PageList.length - 1) {
					PageIndex = PageIndex + 1;
					SetPageIndex(ResultPage, PageIndex);

					DisplayResultPage(ResultPage);

					if (SelectFirstItem) {
						var Results = $("li", ResultPage);
						var ResultIndex = $(Results).index($("li:first", ResultPage));
						SelectResult(ResultPage, ResultIndex);
					}
				}
			}

			function NextResult(ResultPage) {
				var ResultSet = GetResultSet(ResultPage);
				var PageIndex = GetPageIndex(ResultPage);
				var Results = $("li", ResultPage);
				var SelectedResult = $("li.selected", ResultPage);

				var CurrentIndex = Results.index(SelectedResult);
				CurrentIndex = CurrentIndex + 1;

				if (CurrentIndex < ResultSet.PageList[PageIndex].ResultList.length) {
					SelectResult(ResultPage, CurrentIndex);
				}
				else if (PageIndex < ResultSet.PageList.length - 1) {
					NextPage(ResultPage, true);
				}
			}

			function PreviousResult(ResultPage) {
				var PageIndex = GetPageIndex(ResultPage);
				var Results = $("li", ResultPage);
				var SelectedResult = $("li.selected", ResultPage);

				var CurrentIndex = Results.index(SelectedResult);
				CurrentIndex = CurrentIndex - 1;

				if (CurrentIndex >= -1) {
					SelectResult(ResultPage, CurrentIndex);
				}
				else if (PageIndex > 0) {
					PreviousPage(ResultPage, true);
				}
				else {
					//SelectResult(ResultPage, -1);
				}
			}

			function SelectResult(ResultPage, ResultIndex) {
				var ResultSet = GetResultSet(ResultPage);

				var PagingHeader = $("p.Paging", ResultPage);
				PagingHeader.removeClass("selected");

				var Results = $("li", ResultPage);
				Results.removeClass("selected");

				if (ResultIndex == -1) {
					PagingHeader.addClass("selected");
					if (ResultSet.PromptAllResults) {
						$("span.helper", PagingHeader).html("[Press ENTER to view all " + ResultSet.NameP.toLowerCase() + "]");
					}
					else {
						$("span.helper", PagingHeader).html("");
					}
				}
				else {
					Results.eq(ResultIndex).addClass("selected");
					$("span.helper", PagingHeader).html("[Press ENTER to view highlighted " + ResultSet.NameS.toLowerCase() + "]");
				}
			}

		});
	}
})(jQuery);

