﻿/* ----------------------------------------------------------------------------
	Suggestive Text
---------------------------------------------------------------------------- */
var raSuggest;

ra.Suggest = function() {
	// variables and constants
	var HTML_ELEMENT_SUGGEST_FORM = "suggest-form";
	var TIMEOUT_KEYPRESS = 700;
	var MAX_RESULTS = 12;

	var oDataSelected;
	var aSuggestElements = "promoter,artist,label,flyer,club".split(",");
	var sSection;
	var sArea;
	var sPage;
	var sText = "";
	var oTimeout;
	var oRequest;
	var eForm;
	var eSuggest;
	var eSource;
	var eItem;
	var eInput;
	var eHidden;
	var eResult;
	var iHighlight = 0;
	var eHighlightItem;

	this.initAdd = function() {
		var oLinks;
		var eSection;
		for (var a in aSuggestElements) {
			eSection = document.getElementById(aSuggestElements[a]);
			if (eSection) {
				oLinks = eSection.getElementsByTagName("a");
				for (var e in oLinks)
					if (oLinks[e].nodeType == 1) {
					if (oLinks[e].className == "add")
						manageEvents("add", oLinks[e], "click", raSuggest.addText);
					else if (oLinks[e].className == "delete")
						manageEvents("add", oLinks[e], "click", raSuggest.deleteRecord);
				}
			}
		}
	};

	this.addText = function(e) {
		eSource = e.srcElement;
		eHidden = eSource.parentNode.getElementsByTagName("input")[0];
		eSuggest = (eSource.parentNode.getAttribute("id")) ? eSource.parentNode : eSource.parentNode.parentNode;
		var oOffsets = new raDOM.getOffsets(eSource, "body");

		var oMatch = eSource.getAttribute("href").match(/(?:javascript:void\(')([a-z]+)/);
		sSection = oMatch[1];

		eItem = document.createElement("div");
		eItem.setAttribute("id", HTML_ELEMENT_SUGGEST_FORM);
		eItem.style.top = oOffsets.iTop + "px";
		eItem.style.left = oOffsets.iLeft + "px";

		eInput = document.createElement("input");
		eInput.setAttribute("type", "text");
		eInput.value = (parseInt(eHidden.value) > 0 && sSection != "flyer") ? eSource.firstChild.nodeValue : "";
		eInput.onkeyup = function() { raSuggest.initSuggest(this); };
		eInput.onblur = function() { raSuggest.selectItem(this); };
		eItem.appendChild(eInput);
		document.body.appendChild(eItem);

		eInput.focus();
		eForm = raDOM.findParentNode(eSource, "form");
		sArea = (typeof eForm.area != "undefined") ? eForm.area.value : 0;
		sPage = (eForm.page) ? eForm.page.value : "";

		manageEvents("add", document, "keyup", raSuggest.moveSelect);
	};

	this.initSuggest = function(eInput) {
		if (sText == eInput.value) return;
		sText = eInput.value;

		if (sText.length > 0) {
			if (oTimeout) clearTimeout(oTimeout);
			oTimeout = setTimeout(raSuggest.requestSearch, TIMEOUT_KEYPRESS);
		}
		else
			raSuggest.clearResults();
	};

	this.requestSearch = function() {
		raSuggest.clearResults();
		//var sPostVars = "s=" + sSection + "&t=" + encodeURI(sText);
		//if (sText.length > 0) raAJAX.Load("suggest.aspx", "POST", raSuggest.displayResults, null, sPostVars);
		if (sText.length > 0) raAJAX.Load("suggest.ashx?s=" + sSection + "&t=" + encodeURI(sText), "GET", raSuggest.displayResults);
	};

	this.displayResults = function() {
		var oData = eval("(" + raAJAX.oLoader.responseText + ")");
		var sOutput = "";
		var iCount = 0;

		eResult = document.createElement("ul");
		var eLI;
		if (sPage == "chart" || sPage == "news") {
			eLI = document.createElement("li");
			eLI.innerHTML = "CLEAR SEARCH";
			eLI.setAttribute("id", "0");
			eLI.onmouseover = function() { this.style.backgroundColor = "#FFF"; this.style.color = "#000"; eInput.onblur = null; };
			eLI.onmouseout = function() { this.style.backgroundColor = "#000"; this.style.color = "#FFF"; eInput.onblur = function() { raSuggest.selectItem(eInput); }; };
			eLI.onclick = function() { raSuggest.selectItem(this); };
			eResult.appendChild(eLI);
		}

		if (oData.empty) {
			eLI = document.createElement("li");
			eLI.innerHTML = "NO MATCHES";
			eResult.appendChild(eLI);
		} else
			switch (sSection) {
			case "promoter":
				for (var e in oData) {
					iCount += 1;
					eLI = document.createElement("li");
					eLI.setAttribute("id", oData[e].PromoterID);
					eLI.setAttribute("title", "promoter id: " + oData[e].PromoterID);
					eLI.onmouseover = function() { this.style.backgroundColor = "#FFF"; this.style.color = "#000"; eInput.onblur = null; };
					eLI.onmouseout = function() { this.style.backgroundColor = "#000"; this.style.color = "#FFF"; eInput.onblur = function() { raSuggest.selectItem(eInput); }; };
					eLI.onclick = function() { raSuggest.selectItem(this); };
					eLI.innerHTML = oData[e].PromoterName;
					eResult.appendChild(eLI);
					if (iCount == MAX_RESULTS) break;
				}
				break;

			case "flyer":
				for (var e in oData) {
					iCount += 1;
					eLI = document.createElement("li");
					eLI.setAttribute("id", oData[e].DJID);
					eLI.setAttribute("title", "dj id: " + oData[e].DJID);
					eLI.onmouseover = function() { this.style.backgroundColor = "#FFF"; this.style.color = "#000"; eInput.onblur = null; };
					eLI.onmouseout = function() { this.style.backgroundColor = "#000"; this.style.color = "#FFF"; eInput.onblur = function() { raSuggest.selectItem(eInput); }; };
					eLI.onclick = function() { raSuggest.selectItem(this); };
					eLI.innerHTML = oData[e].DJName + "<input type=\"hidden\" value=\"" + oData[e].ImageName + "\" />";
					eResult.appendChild(eLI);
					if (iCount == MAX_RESULTS) break;
				}
				break;

			case "artist":
				for (var e in oData) {
					iCount += 1;
					eLI = document.createElement("li");
					eLI.setAttribute("id", oData[e].DJID);
					eLI.setAttribute("title", "dj id: " + oData[e].DJID);
					eLI.onmouseover = function() { this.style.backgroundColor = "#FFF"; this.style.color = "#000"; eInput.onblur = null; };
					eLI.onmouseout = function() { this.style.backgroundColor = "#000"; this.style.color = "#FFF"; eInput.onblur = function() { raSuggest.selectItem(eInput); }; };
					eLI.onclick = function() { raSuggest.selectItem(this); };
					eLI.innerHTML = oData[e].DJName;
					eResult.appendChild(eLI);
					if (iCount == MAX_RESULTS) break;
				}
				break;

			case "label":
				for (var e in oData) {
					iCount += 1;
					eLI = document.createElement("li");
					eLI.setAttribute("id", oData[e].RLID);
					eLI.setAttribute("title", "label id: " + oData[e].RLID);
					eLI.onmouseover = function() { this.style.backgroundColor = "#FFF"; this.style.color = "#000"; eInput.onblur = null; };
					eLI.onmouseout = function() { this.style.backgroundColor = "#000"; this.style.color = "#FFF"; eInput.onblur = function() { raSuggest.selectItem(eInput); }; };
					eLI.onclick = function() { raSuggest.selectItem(this); };
					eLI.innerHTML = oData[e].LabelName;
					eResult.appendChild(eLI);
					if (iCount == MAX_RESULTS) break;
				}
				break;

			case "club":
				var sClubName;
				for (var e in oData) {
					iCount += 1;
					sClubName = oData[e].ClubName;
					if (sClubName.indexOf(", The") != -1) sClubName = "The " + sClubName.replace(/, The/, "");
					eLI = document.createElement("li");
					eLI.setAttribute("id", oData[e].VID);
					eLI.onmouseover = function() { this.style.backgroundColor = "#FFF"; this.style.color = "#000"; eInput.onblur = null; };
					eLI.onmouseout = function() { this.style.backgroundColor = "#000"; this.style.color = "#FFF"; eInput.onblur = function() { raSuggest.selectItem(eInput); }; };
					eLI.onclick = function() { raSuggest.selectItem(this); };
					eLI.innerHTML = sClubName + ", " + ((oData[e].AreaName.toLowerCase() != "all") ? oData[e].AreaName + " " : "") + oData[e].CCode.toUpperCase();
					eResult.appendChild(eLI);
					if (iCount == MAX_RESULTS) break;
				}
				break;
		};

		eItem.appendChild(eResult);
	};

	this.selectItem = function(eElement) {
		if (eElement.nodeName.toLowerCase() == "li") {
			switch (sSection) {
				case "promoter":
					if (eHidden.value == "") {
						eSource.parentNode.getElementsByTagName("a")[1].style.display = "inline";
						raSuggest.createAdd("Add a promoter", "PromoterID");
					}
					eHidden.value = eElement.getAttribute("id");
					eSource.innerHTML = eElement.firstChild.nodeValue;
					break;

				case "flyer":
					eHidden.value = eElement.getAttribute("id");
					eForm.Imagelisting.value = "/images/events/flyer/dj/" + eElement.getElementsByTagName("input")[0].value + "-list.jpg";
					document.getElementById("imagelisting").innerHTML = "<img src=\"/images/events/flyer/dj/" + eElement.getElementsByTagName("input")[0].value + "-list.jpg\" alt=\"\" border=0 width=152 height=76 />";
					break;

				case "artist":
					if (eHidden.value == "" && (sPage == "review" || sPage == "create-label")) {
						eSource.parentNode.getElementsByTagName("a")[1].style.display = "inline";
						raSuggest.createAdd("Add a DJ", "DJID");

						if (sPage == "create-label") raAJAX.Load("suggest-save.ashx?t=save&rl=" + eForm.RLID.value + "&dj=" + eElement.getAttribute("id"), "GET", raSuggest.empty);
					}
					if (sPage == "news") document.getElementById("DJIDdisplay").value = eElement.getAttribute("id");
					eHidden.value = eElement.getAttribute("id");
					eSource.innerHTML = (eElement.getAttribute("id") != "0") ? eElement.firstChild.nodeValue : ((sPage == "review") ? "Add a DJ" : "Select a DJ");
					break;

				case "label":
					if (eHidden.value == "" && sPage == "review") {
						eSource.parentNode.getElementsByTagName("a")[1].style.display = "inline";
						raSuggest.createAdd("Add a Label", "RLID");
					}
					eHidden.value = eElement.getAttribute("id");
					eSource.innerHTML = (eElement.getAttribute("id") != "0") ? eElement.firstChild.nodeValue : "Select a Label";
					break;

				case "club":
					eSource.parentNode.getElementsByTagName("a")[1].style.display = "inline";
					eSource.parentNode.parentNode.getElementsByTagName("select")[0].selectedIndex = 0;
					eHidden.value = eElement.getAttribute("id");
					eSource.innerHTML = eElement.firstChild.nodeValue.split(",")[0];
					break;
			};
		}
		document.body.removeChild(eItem);
		eSource.blur();
		manageEvents("remove", document, "keyup", raSuggest.moveSelect);
		iHighlight = 0;
	};

	this.createAdd = function(sLinkText, sHiddenName) {
		var eDiv = document.createElement("div");
		eDiv.innerHTML = "<a href=\"javascript:void('" + sSection + "');\" class=\"add\">" + sLinkText + "</a> &nbsp; "
			+ "<a href=\"javascript:void(0);\" class=\"delete\" style=\"display:none;\">del</a>"
			+ "<input type=\"hidden\" name=\"" + sHiddenName + "\" value=\"\" />";
		eSuggest.appendChild(eDiv);
		manageEvents("add", eDiv.getElementsByTagName("a")[0], "click", raSuggest.addText);
		manageEvents("add", eDiv.getElementsByTagName("a")[1], "click", raSuggest.deleteRecord);
	};

	this.clearResults = function() {
		try { eItem.removeChild(eResult); }
		catch (e) { }
		iHighlight = 0;
		eHighlightItem = null;
	};

	this.deleteRecord = function(e) {
		eSource = e.srcElement;
		if (sSection == "club") {
			eHidden.value = 0;
			eSource.style.display = "none";
			eSource.parentNode.getElementsByTagName("a")[0].innerHTML = "Search for a club";
		} else {
			eForm = raDOM.findParentNode(eSource, "form");
			sPage = (eForm.page) ? eForm.page.value : "";
			if (sPage == "create-label") {
				eHidden = eSource.parentNode.getElementsByTagName("input")[0];
				raAJAX.Load("suggest-save.ashx?t=delete&rl=" + eForm.RLID.value + "&dj=" + eHidden.value, "GET", raSuggest.empty);
			}

			eSuggest = (eSource.parentNode.getAttribute("id")) ? eSource.parentNode : eSource.parentNode.parentNode;
			if (eSuggest.getElementsByTagName("div").length == 1) raSuggest.createAdd();
			eSource = e.srcElement.parentNode;
			eSuggest.removeChild(eSource);
		}
	};

	this.moveSelect = function(e) {
		var iTotalItems;
		if (eResult) iTotalItems = eResult.childNodes.length;

		switch (e.keyCode) {
			case 40: // down
				try {
					if (iHighlight == 0 || iHighlight < iTotalItems) {
						iHighlight += 1;
						eHighlightItem = eResult.childNodes[iHighlight - 1];
						raSuggest.highlightItem(eResult.childNodes[iHighlight - 1], true);
					}
					if (iHighlight > 1) raSuggest.highlightItem(eResult.childNodes[iHighlight - 2], false);
				}
				catch (e) { }
				break;

			case 38: // up
				try {
					if (iHighlight > 1 || iHighlight == iTotalItems) {
						iHighlight += -1;
						eHighlightItem = eResult.childNodes[iHighlight - 1];
						raSuggest.highlightItem(eResult.childNodes[iHighlight - 1], true);
					}
					if (iHighlight > 0) raSuggest.highlightItem(eResult.childNodes[iHighlight], false);
				}
				catch (e) { }
				break;

			case 13: // enter
				if (typeof eHighlightItem != "undefined") raSuggest.selectItem(eHighlightItem);
				break;

			case 27: // escape
				document.body.removeChild(eItem);
				eSource.blur();
				manageEvents("remove", document, "keyup", raSuggest.moveSelect);
				iHighlight = 0;
				break;
		};
	};

	this.highlightItem = function(eElement, bOn) {
		eElement.style.backgroundColor = (bOn) ? "#FFF" : "#000";
		eElement.style.color = (bOn) ? "#000" : "#FFF";
	};

	this.empty = function() { };
};

ra.namespace("Suggest");
raSuggest = new ra.Suggest();