
var categoryCache = new Object();

function searchInitEvent()
{
	loadCategories(0, initPrimaryCategoryDropdown);
	var searchMode = document.getElementById("searchMode");
	searchMode.value = searchParameters["searchMode"];
	//initPrimaryCategoryDropdown();
	//initLocationDropdown();
}

function loadCategories(parentId, handler)
{
	var url = "/" + categoryListPage + "?parentId=" + parentId;
	var ajax = new Ajax(handler);
	ajax.get(url);
}

function initPrimaryCategoryDropdown(response)
{
	var cats = eval("(" + response.responseText + ")");
	//var cats = categories[0];
	categoryCache[0] = cats;
	var dropdown = document.getElementById("category");
	var option = document.createElement("option");
	option.value = "";
	option.appendChild(document.createTextNode("All Categories"));
	dropdown.appendChild(option);
	// load the top level categories
	for (var i = 0; i < cats.length; i++)
	{
		option = document.createElement("option");
		option.value = cats[i].id;
		option.innerHTML = cats[i].name;
		//option.appendChild(document.createTextNode(cats[i].name));
		if (cats[i]["id"] == searchParameters["category"])
		{
			option.selected = true;
			//option.setAttribute("selected", "selected");
		}
		dropdown.appendChild(option);
	}
	if (dropdown.attachEvent)
	{
		dropdown.attachEvent("onchange", primaryCategoryChangeEvent);
	}
	else if (dropdown.addEventListener)
	{
		dropdown.addEventListener("change", primaryCategoryChangeEvent, false);
	}
	else
	{
		dropdown.onclick = primaryCategoryChangeEvent;
	}
	// pre-select the selected primary category
	// for mozilla
	if (document.createEvent)
	{
		var evObj = document.createEvent('HtmlEvents');
		evObj.initEvent("change", true, true);
		dropdown.dispatchEvent(evObj);		
	}
	else if (document.createEventObject)
	{
		dropdown.fireEvent("onchange");
	}
}



function primaryCategoryChangeEvent(evt)
{
	if (evt == undefined)
	{
		evt = event;
	}
	if (evt.stopPropagation)
	{
		evt.stopPropagation();
	}
	else if (evt.cancelBubble)
	{
		evt.cancelBubble = true;
	}
	clearDropdown("secondaryCategory");
	loadSecondaryCategoryDropdown();
	var primary = evt.srcElement || evt.target;
	if (primary.value != "")
	{
		startWaiting();
		loadCategories(primary.value, loadSubCategories);
	}
	else
	{
		clearDropdown("subCategories");
		var option = document.createElement("option");
		option.value = "";
		option.appendChild(document.createTextNode("No sub-categories"));
		var subCategory = document.getElementById("subCategories");
		subCategory.appendChild(option);
	}
}

function loadSubCategories(response)
{
	var primary = document.getElementById("category");
	var subCategory = document.getElementById("subCategories");
	clearDropdown("subCategories");
	// load the sub-categories if necessary
	if (primary.value != "")
	{
		var option = document.createElement("option");
		option.value = "";
		option.appendChild(document.createTextNode("All sub-categories"));
		subCategory.appendChild(option);
		var cats = eval("(" + response.responseText + ")");
		categoryCache[primary.value] = cats;
		for (varName in cats)
		{
			option = document.createElement("option");
			option.value = cats[varName].id;
			option.appendChild(document.createTextNode(cats[varName].name));
			for (var i = 0; i < searchParameters["subCategories"].length; i++)
			{
				if (searchParameters["subCategories"][i] == cats[varName].id)
				{
					option.selected = true;
				}
			}
			subCategory.appendChild(option);
		}
	}
	else
	{
		var option = document.createElement("option");
		option.value = "";
		option.appendChild(document.createTextNode("No sub-categories"));
		subCategory.appendChild(option);		
	}
	stopWaiting();
}

/**
 * Loads the secondary category dropdown from the option available in the primary dropdown (excluding the currently selected one)
 */
function loadSecondaryCategoryDropdown()
{
	var primary = document.getElementById("category");
	var nodes = primary.getElementsByTagName("option");
	var dropdown = document.getElementById("secondaryCategory");
	var option = document.createElement("option");
	option.value = "";
	option.appendChild(document.createTextNode("Secondary Category"));
	dropdown.appendChild(option);
	for (var i = 1; i < nodes.length; i++)
	{
		if (primary.selectedIndex != i)
		{
			var opt = nodes.item(i).cloneNode(true);
			if (opt.value == searchParameters["secondaryCategory"])
			{
				opt.setAttribute("selected", "selected");
			}
			dropdown.appendChild(opt);
		}
	}
}

function initLocationDropdown()
{
	var dropdown = document.getElementById("location");
	// clear old entries
	for (var i = (dropdown.childNodes.length - 1); i >= 0; i--)
	{
		dropdown.removeChild(dropdown.childNodes[i]);
	}
	// add an empty option
	var option = document.createElement("option");
	option.value = "";
	option.appendChild(document.createTextNode("All Locations"));
	dropdown.appendChild(option);
	for (var i = 0; i < locationList.length; i++)
	{
		option = document.createElement("option");
		option.value = locationList[i].id;
		option.appendChild(document.createTextNode(locationList[i].name));
		if (LOCATIONS[locationList[i].id] == 1)
		{
			option.setAttribute("selected", "selected");
		}
		dropdown.appendChild(option);
	}
}


// doesnt actually submit data, just writes it to a new url to stop page expiration
// could be solved using a get operation instead
function submitSearch()
{
	// make sure the offset is reset to normal
	var offset = document.getElementById("offset");
	offset.value = 0;
	var orderBy = document.getElementById("orderBy");
	orderBy.value = "";
	// find the form
	var form = undefined;
	for (var i = 0; i < document.forms.length; i++)
	{
		if (document.forms[i].id == "searchForm")
		{
			form = document.forms[i];
			break;
		}
	}
	form.submit();
}


var waitingStack = new Array();

function waitingStackMouseMoveHandler(evt)
{
	if (waiting)
	{
		if (evt == undefined)
		{
			evt = event;
		}
		var source = evt.srcElement || evt.target;
		if (source.style.cursor != "wait")
		{
			var obj = new Object();
			obj.currentCursor = source.style.cursor;
			obj.source = source;
			waitingStack[waitingStack.length] = obj;
			source.style.cursor = "wait";
		}
	}
}

function startWaiting()
{
	waiting = true;
	var body = document.getElementsByTagName("body").item(0);
	if (body.attachEvent)
	{
		body.attachEvent("onmousemove", waitingStackMouseMoveHandler);
	}
	else if (body.addEventListener)
	{
		body.addEventListener("mousemove", waitingStackMouseMoveHandler, false);
	}
	else
	{
		// old browsers suck balls
	}
}

function stopWaiting()
{
	waiting = false;
	var body = document.getElementsByTagName("body").item(0);
	if (body.detachEvent)
	{
		body.detachEvent("onmousemove", waitingStackMouseMoveHandler);
	}
	else if (body.removeEventListener)
	{
		body.removeEventListener("mousemove", waitingStackMouseMoveHandler, false);
	}
	for (var i = 0; i < waitingStack.length; i++)
	{
		waitingStack[i].source.style.cursor = waitingStack[i].currentCursor;
	}
	waitingStack = new Array();
}


function changeOrderOfResults(field)
{
	var regex = "/" + field + "/i";
	// get the order field and direction from the form
	var order = document.getElementById("orderBy");
	var regex = new RegExp(field, "i");
	if (order.value == "" || !regex.test(order.value))
	{
		order.value = field + " ASC";
	}
	else if (order.value.match(/ASC/i))
	{
		order.value = field + " DESC";
	}
	else
	{
		order.value = field + " ASC";
	}
	for (var i = 0; i < document.forms.length; i++)
	{
		if (document.forms[i].id == "searchForm")
		{
			document.forms[i].submit();
		}
	}
}


function clearDropdown(dropdownId)
{
	var dropdown = document.getElementById(dropdownId);
	// clear the sub-category list
	for (var i = (dropdown.childNodes.length - 1); i >= 0; i--)
	{
		dropdown.removeChild(dropdown.childNodes[i]);
	}
}