/// <reference path="Resource\Js\jquery-1.3.2-vsdoc.js" />
/// <reference path="Resource\Js\HashDispatch.js" />

(function() {
	var SEARCH_SVC = AppGlobal.siteRoot + "Service/Public/DirectorySearchService.ashx/";
	var FILTER_DATA = {};
	var ROW_COUNT = 10;
	var DEFAULT_RADIUS = 5.0;
	var mon = null;
	var isReload = false;
	var resultFilterText = "";
	var SearchCommands = { "Text": "SearchBySearchText", "Location": "SearchByLocation", "AreaCode": "SearchByAreaCode", "ZipCode": "SearchByZipCode", "Country": "SearchByCountry" };
	var hLoading = null;

	$(document).ready(function() {
		initEvents();

		var onselect = function(event, ui) {
			var elem = $($("input,select", $(ui.panel))[0]);
			elem.select();
			elem.focus();
		};

		$("#searchTabs").tabs({
			show: onselect
		});

		$.ajax({
			url: SEARCH_SVC + "GetSearchFilterData",
			cache: true,
			dataType: "json",
			success: onGetSearchFilterDataComplete
		});
		$("#btm").scroll();
	});

	function initEvents() {
		$.each($(".anyCheckbox"), function(idx, elem) {
			var parentDiv = $("#" + $(elem).attr("id").split(/_/)[0]);
			$(elem).click(function() {
				$("input[value!='*']", parentDiv).removeAttr("checked");
			});
		});

		var fncpop = function() { populateFormByCommand(mon.getCurrentCommand()) };
		mon = new HashDispatch(clearAll);
		$("#freeSearch").click(onFreeSearchClick);
		$("#locationSearch").click(onLocationSearchClick);
		$("#acSearch").click(onAreaCodeSearchClick);
		$("#zipCodeSearch").click(onZipCodeSearchClick);
		$("#intlSearch").click(onIntlSearchClick);

		$("input,select", $("#tabFree")).keyup(function(evt) {
			if (evt.keyCode == 13) $("#freeSearch").click();
		});

		$("input,select", $("#tabLocation")).keyup(function(evt) {
			if (evt.keyCode == 13) $("#locationSearch").click();
		});

		$("input,select", $("#tabAreaCode")).keyup(function(evt) {
			if (evt.keyCode == 13) $("#acSearch").click();
		});

		$("input,select", $("#tabZipCode")).keyup(function(evt) {
			if (evt.keyCode == 13) $("#zipCodeSearch").click();
		});

		$("input,select", $("#tabIntl")).keyup(function(evt) {
			if (evt.keyCode == 13) $("#intlSearch").click();
		});

		mon.addHandler(fncpop, SearchCommands.Text);
		mon.addHandler(doSearchTextSearch, SearchCommands.Text);

		mon.addHandler(fncpop, SearchCommands.Location);
		mon.addHandler(doLocationSearch, SearchCommands.Location);

		mon.addHandler(fncpop, SearchCommands.AreaCode);
		mon.addHandler(doAreaCodeSearch, SearchCommands.AreaCode);

		mon.addHandler(fncpop, SearchCommands.ZipCode);
		mon.addHandler(doZipCodeSearch, SearchCommands.ZipCode);

		mon.addHandler(fncpop, SearchCommands.Country);
		mon.addHandler(doIntlSearch, SearchCommands.Country);
		isReload = (mon.getCurrentCommand().Command != mon.DEFAULT_COMMAND);
	}

	function onGetSearchFilterDataComplete(data) {
		FILTER_DATA = data.result;
		$.each(FILTER_DATA.RerralCodes, function(idx, row) {
			$.each($(".rc"), function() {
				if (row.Description == "UNKNOWN")
					return;
				var parentDiv = $(this);
				var id = $(this).attr("id") + "_chkbx" + row.Code;
				var item = $("<span />").css("white-space", "nowrap");
				var cb = $("<input />").attr("id", id).attr("type", "checkbox").css("cursor", "pointer").addClass("rccb").val(row.Code);
				cb.click(function() { $("input[value='*']", parentDiv).removeAttr("checked"); });
				cb.appendTo(item);
				$("<label />").attr("for", id).html(row.Description).css("padding-left", "0.2em").css("cursor", "pointer").appendTo(item);
				$(this).append(item);
				$(this).append($("<span> </span>"));
			});
		});

		$.each(FILTER_DATA.States, function() {
			if (this.State != "") $("<option />").val(this.State).html(this.State).appendTo($(".state"));
		});

		$.each(FILTER_DATA.Countries, function() {
			if (this.Country != "") $("<option />").val(this.Country).html(this.Country).appendTo($(".country"));
		});

		$("#searchTabs").show();
		$("#freeSearchText").focus();

		// Start the monitor here. It has been defferred until the filter data gets loaded.
		if (isReload) clearAll();
		mon.start();
	}

	function clearAll() {
		$("#searchTabs").tabs("select", 0);

		$("#freeSearchText").val("");

		$("#acAreaCode").val("");

		$("#locationState").val("");
		$("#locationCity").val("");

		$("#zipZipCode").val("");

		$("#intlCountry").val("");

		$(".rc input:checkbox[value!='*']").removeAttr("checked");
		$(".rc input:checkbox[value='*']").attr("checked", "checked");

		$("#resultBlock").hide();
	}

	function setReferralCodeInputsChecked(targetScope, referralCodeObj) {
		if (!referralCodeObj) return;
		if (referralCodeObj instanceof String || referralCodeObj.toString().indexOf(",") > -1)
			referralCodeObj = referralCodeObj.split(",");

		$("input:checkbox", targetScope).attr("checked", false);
		
		if (referralCodeObj instanceof Array) {
			$.each(referralCodeObj, function(idx, item) {
				console.log(item);
				$("input:checkbox[value='" + item + "']", targetScope).attr("checked", true);
			});
		}
		else {
			$("input:checkbox[value='" + referralCodeObj + "']", targetScope).attr("checked", true);
		}
	}

	function populateFormByCommand(cmd) {
		switch (cmd.Command.toLowerCase()) {
			case SearchCommands.Text.toLowerCase():
				$("#searchTabs").tabs("select", 0);
				$("#freeSearchText").val(cmd.Parameters["SearchText"])
				setReferralCodeInputsChecked($("#freeRC"), cmd.Parameters["ReferralCodes"]);
				break;
			case SearchCommands.Location.toLowerCase():
				$("#searchTabs").tabs("select", 1);
				$("#locationState").val(cmd.Parameters["State"]);
				$("#locationCity").val(cmd.Parameters["City"]);
				setReferralCodeInputsChecked($("#locationRC"), cmd.Parameters["ReferralCodes"]);
				break;
			case SearchCommands.AreaCode.toLowerCase():
				$("#searchTabs").tabs("select", 2);
				$("#acAreaCode").val(cmd.Parameters["AreaCode"]);
				setReferralCodeInputsChecked($("#acRC"), cmd.Parameters["ReferralCodes"]);
				break;
			case SearchCommands.ZipCode.toLowerCase():
				$("#searchTabs").tabs("select", 3);
				$("#zipZipCode").val(cmd.Parameters["ZipCode"]);
				setReferralCodeInputsChecked($("#zipRC"), cmd.Parameters["ReferralCodes"]);
				break;
			case SearchCommands.Country.toLowerCase():
				$("#searchTabs").tabs("select", 4);
				$("#intlCountry").val(cmd.Parameters["Country"]);
				setReferralCodeInputsChecked($("#intlRC"), cmd.Parameters["ReferralCodes"]);
				break;
			default:
				clearAll();
				break;
		}
	}

	function onFreeSearchClick() {
		$("#freeSearchTextError").hide();
		$("#freeRCError").hide();
		var rcvals = [];
		$.each($("#freeRC :checked"), function() {
			rcvals.push($(this).val());
		});
		var errcnt = 0;
		var searchText = $.trim($("#freeSearchText").val());
		if (searchText == "") {
			$("#freeSearchTextError").show();
			errcnt++;
		}

		if (rcvals.length == 0) {
			$("#freeRCError").show();
			errcnt++;
		}

		if (errcnt > 0) return;

		var params = { "SearchText": searchText, "ReferralCodes": rcvals.join(",") };
		mon.setHash("#" + SearchCommands.Text + "/" + HashDispatch.parameterEncode(params));
	}

	function onLocationSearchClick() {
		$("#locationRCError").hide();
		var rcvals = [];
		$.each($("#locationRC :checked"), function() {
			rcvals.push($(this).val());
		});

		if (rcvals.length == 0) {
			$("#locationRCError").show();
			return;
		}

		var params = { "City": $.trim($("#locationCity").val()), "State": $("#locationState").val(), "ReferralCodes": rcvals.join(",") };
		mon.setHash("#" + SearchCommands.Location + "/" + HashDispatch.parameterEncode(params));
	}

	function onAreaCodeSearchClick() {
		$("#acAreaCodeError").hide();
		$("#acRCError").hide();

		var rcvals = [];
		$.each($("#acRC :checked"), function() {
			rcvals.push($(this).val());
		});

		var errcnt = 0;

		var areaCode = $.trim($("#acAreaCode").val());
		var acmatches = areaCode.match(/\d/g);
		if (!acmatches || acmatches.length != 3) {
			$("#acAreaCodeError").show();
			errcnt++;
		}

		if (rcvals.length == 0) {
			$("#acRCError").show();
			errcnt++;
		}

		if (errcnt > 0) return;

		var params = { "AreaCode": areaCode, "ReferralCodes": rcvals.join(",") };
		mon.setHash("#" + SearchCommands.AreaCode + "/" + HashDispatch.parameterEncode(params));
	}

	function onZipCodeSearchClick() {
		$("#zipZipCodeError").hide();
		$("#zipRCError").hide();

		var rcvals = [];
		$.each($("#zipRC :checked"), function() {
			rcvals.push($(this).val());
		});

		var errcnt = 0;

		var zipCode = $.trim($("#zipZipCode").val());
		var zipmatches = zipCode.match(/\d/g);
		if (!zipmatches || zipmatches.length != 5) {
			$("#zipZipCodeError").show();
			errcnt++;
		}

		if (rcvals.length == 0) {
			$("#zipRCError").show();
			errcnt++;
		}

		if (errcnt > 0) return;

		var params = { "ZipCode": zipCode, "RadiusInMiles": DEFAULT_RADIUS, "ReferralCodes": rcvals.join(",") };
		mon.setHash("#" + SearchCommands.ZipCode + "/" + HashDispatch.parameterEncode(params));
	}

	function onIntlSearchClick() {
		var rcvals = [];
		$.each($("#intlRC :checked"), function() {
			rcvals.push($(this).val());
		});

		if (rcvals.length == 0) {
			$("#intlRCError").show();
			return;
		}

		var params = { "Country": $("#intlCountry").val(), "ReferralCodes": rcvals.join(",") };
		mon.setHash("#" + SearchCommands.Country + "/" + HashDispatch.parameterEncode(params));
	}

	function doSearchTextSearch(args) {
		getSearchResults(SearchCommands.Text, args);
	}

	function doLocationSearch(args) {
		getSearchResults(SearchCommands.Location, args);
	}

	function doAreaCodeSearch(args) {
		getSearchResults(SearchCommands.AreaCode, args);
	}

	function doZipCodeSearch(args) {
		getSearchResults(SearchCommands.ZipCode, args);
	}

	function doIntlSearch(args) {
		getSearchResults(SearchCommands.Country, args);
	}

	function getSearchResults(searchTypeString, args) {
		if (!args["Offset"]) args["Offset"] = 0;
		if (!args["RowCount"]) args["RowCount"] = ROW_COUNT;
		$("#resultBlock").fadeOut(150, function() {
			hLoading = self.setTimeout(showLoading, 500);
			$.ajax({
				url: SEARCH_SVC + searchTypeString,
				cache: true,
				dataType: "json",
				data: args,
				success: function(resp) { onGetSearchResultsComplete(resp, searchTypeString, args); },
				error: onSearchError
			});
		});
	}

	function onSearchError() {
		alert("error");
	}

	function onGetSearchResultsComplete(data, searchType, searchArgs) {
		if (hLoading) {
			window.clearTimeout(hLoading);
			hLoading = null;
		}
		var result = data.result;
		$("#resultTable tbody").empty();
		$("#resultTable tfoot").empty();

		$("#searchResultCount").html(result.totalRowCount);

		$("#resultTable").css("width", "100%");

		if (Number(result.totalRowCount) == 0)
			$("#resultTable").hide();
		else
			$("#resultTable").show();

		$.each(result.rows, function(idx, item) {
			var firm = $("<td></td>");
			firm.css("padding", "10px");
			firm.text(item.FirmName).html();

			var addr = $("<td></td>");
			addr.css("padding", "10px");
			var html = htmlEncode(item.address1);
			if (item["address 2"] && $.trim(item["address 2"]) != "")
				html += " " + htmlEncode(item["address 2"]);
			html += "<br />" + htmlEncode(item.city) + "<br />" + htmlEncode(item.st) + " " + htmlEncode(item.zip);
			addr.html(html);

			var phone = $("<td></td>");
			phone.css("text-align", "center");
			phone.html(htmlEncode(item.phone));
			var cssclass = ((idx + 1) % 2 == 0) ? "row2" : "row1";

			var tablerow = $("<tr />").addClass(cssclass).css("cursor", "pointer").append(firm).append(addr).append(phone);
			tablerow.mouseover(function() { $("td", $(this)).addClass("rowSelected"); });
			tablerow.mouseout(function() { $("td", $(this)).removeClass("rowSelected"); });
			tablerow.click(function() { self.location.href = 'DirectoryEntry.aspx?Id=' + item.ID.toString() + '&ReturnUrl=' + encodeURIComponent("Search.aspx" + self.location.hash) });
			tablerow.appendTo($("#resultTableBody"));
		});

		var pageCount = Math.ceil((Number(result.totalRowCount) / ROW_COUNT));
		var pageNo = Math.ceil(Number(searchArgs.Offset) / ROW_COUNT) + 1;
		var pageLabel = $("<span />").css("font-size", "10pt").css("font-weight", "bold").html("Page " + pageNo.toString() + " of " + pageCount.toString() + " : ");

		$("#topPager").empty();
		if ((Number(result.totalRowCount) > 0)) $("<span />").css("font-size", "10pt").css("font-weight", "bold").html("Page " + pageNo.toString() + " of " + pageCount.toString()).appendTo($("#topPager"));

		var pager = $("<td colspan='3'></td>").addClass("colHead").css("text-align", "left");
		pageNav = $("<span />").css("padding-left", "1em");
		for (var i = 0; i < pageCount; i++) {
			var a = $("<a />").attr("href", "javascript:void(0);").css("font-size", "10pt").css("margin", "0.25em").css("color", "#fff").html((i + 1));
			a.click(
				(function(i) {
					return function() {
						$.scrollTo($("#resultBlock"), { axis: "xy", duration: 150, easing: "swing", "offset": { top: -100, left: 0} });
						var args = clone(searchArgs);
						args["Offset"] = (i * ROW_COUNT).toString();
						mon.setHash("#" + searchType + "/" + HashDispatch.parameterEncode(args));
					};
				})(i)
			);
			pageNav.append(a).append($("<span/>").html(" "));
		}

		pager.append(pageLabel).append(pageNav);
		$("<tr />").append(pager).appendTo($("tfoot", $("#resultTable")))

		$("#loadingBlock").fadeOut(150, function() {
			$("#resultBlock").fadeIn(150, function() {
				$.scrollTo($("#resultBlock"), { axis: "xy", duration: 150, easing: "swing", "offset": { top: -100, left: 0} });
			});
		});
	}

	function showLoading() {
		$("#loadingBlock").fadeIn(150);
	}

	function clone(obj) {
		return JSON.parse(JSON.stringify(obj));
	}

	function htmlEncode(value) {
		value = value || "";
		return $('<div/>').text(value).html();
	}

	function htmlDecode(value) {
		value = value || "";
		return $('<div/>').html(value).text();
	}
})();
