//
//	form handlers

function genericFormSubmitDisableForm (form)
{
	var e;
	for (var i = form.elements.length; i--;)
	{
		e = form.elements[i];
		
		switch (e.type)
		{
			case "hidden":
				break;
			
			default:
				if (!e.disabled)
				{
					e._genericFormSubmit_enableMe = true;
					e.disabled = true;
				}
				break;
		}
	}
}

function genericFormSubmitHandler (form)
{
	setTimeout((function () { genericFormSubmitDisableForm(form); }), 1);
	return true;
}

function genericFormResponseEnableForm (form)
{
	var e;
	for (var i = form.elements.length; i--;)
	{
		e = form.elements[i];
		
		switch (e.type)
		{
			case "hidden":
				break;
			
			default:
				if (e.disabled && e._genericFormSubmit_enableMe) 
				{
					e._genericFormSubmit_enableMe = false;
					e.disabled = false;
				}
				break;
		}
	}
}

function genericFormResponseHandler (type, result, evt, request)
{
	switch (type)
	{
		case "load":
			if (result.alert)
				alert(result.alert);	// show an alert using the browser's built-in dialog

			if (request.formNode)
				genericFormResponseEnableForm(request.formNode);	// if this response is bound to a form, re-enable the form elements

			if (result.reset && request.formNode)
				request.formNode.reset();

			if (result.windowOpen)
			{
				switch (typeof result.windowOpen)
				{
					case "array":
						var w = open(result.windowOpen[0], result.windowOpen[1], result.windowOpen[2], result.windowOpen[3]);
						break;
					
					default:
						var w = open(result.windowOpen)
						break;
				}
			}

			if (result.eval)
				eval(result.eval);

			if (result.redirect)
			{
				location.href = result.redirect;
				break;
			}

			if (result.reload)
			{
				setTimeout(function(){location.reload();},redd.standardFadeDuration*1.5);
				break;
			}

			break;

		case "error":
			alert("An error occurred when attempting to perform this action. Please try again later.");
			//console.debug(arguments);
			dojo.debug(JSON.stringify(result));
			if (request.formNode)
				genericFormResponseEnableForm(request.formNode);
			break;
			
		default:
			alert("Unhandled form result type: "+ type);
			if (request.formNode)
				genericFormResponseEnableForm(request.formNode);
			break;
	}
}

function numberToCurrency (n)
{
	//
	//	very basic number-to-currency function, only works for this format: -$...,000,000.00
	
	if (isNaN(n))
		return "";
	
	var sign = (n < 0 ? "-" : "") +"$";
	
	var dollars = Math.floor(Math.abs(n)).toString();
	var cents = Math.round((n * 100) % 100);
	
	if (cents < 10)
		cents = "0"+ cents;
	else
		cents = cents.toString();
	
	var rxp = /(\d+)(\d{3})/;
	while (rxp.test(dollars))
		dollars = dollars.replace(rxp, "$1,$2");
	
	return sign + dollars +"."+ cents;
}

function clearInput (e, v)
{
	if (e.value == v)
		e.value = "";
}

function restoreInput (e, v)
{
	if (redd.trimString(e.value) == "")
		e.value = v;
}

function genericBind (formId, handler)
{
	var node;
	if (node = dojo.byId(formId))
	{
		node.action = redd.defaultBind;
		var x = new dojo.io.FormBind
		({
			formNode: node,
			handle: handler ? handler : genericFormResponseHandler,
			mimetype: "text/json",
			sendTransport: true
		});
		x.onSubmit = genericFormSubmitHandler;
		return x;
	}
}

function genericBindHide (divId, formId)
{
	genericBind(formId);
	var node;
	if (node = dojo.byId(divId))
		dojo.html.hide(node);
}

function findPos(obj)
{
	//
	//	http://www.quirksmode.org/js/findpos.html
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}

function randomString (length, choice)
{
	//
	//	returns a string of random letters and numbers
	//	by default it will return 16 random upper- and lower-case letters and numbers but this can be overridden by providing the length (int) and choice (str) arguments

	if (typeof length == "undefined")
		var length = 16;
	if (typeof choice == "undefined")
		var choice = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".split("");
	else if (typeof choice == "string")
		choice = choice.split("");
	var ret = new Array(length);
	for (i = length; i--;)
		ret[i] = choice[Math.floor(Math.random()*choice.length)];
	ret = ret.join("");
	return ret;
}

//
//	----

redd.images = {};
redd.defaultBind = "submit.asp";
redd.images.newImage = function (src) {
	var img = new Image();
	img.src = src;
	return img;
};

//
//	dom shortcuts

redd.d = {
	ce: function (t,c) { var n = document.createElement(t); if (c) { n.className = c; } return n; },
	ct: function (t) { return document.createTextNode(t); },
	ac: function (p,n) { p.appendChild(n); return n; },
	ceac: function (p,t,c) { var n = redd.d.ce(t,c); redd.d.ac(p,n); return n; },
	ctac: function (p,t) { var n = redd.d.ct(t); redd.d.ac(p,n); return n; },
	oblit: function (n,t) {
		//	use dojo to destroy node n's children (and their children, etc.) and optionally node n itself (if bool t is true)
		//	dojo.dom.destroyNode prevents memory leaks in IE when removing nodes that are no longer needed
		for (var i = n.childNodes.length; i--;) { redd.d.oblit(n.childNodes[i],true); }	// destroy children
		if (t) { dojo.dom.destroyNode(n); }	// destroy self
	},
	ent: function (str, mode) {
		//	http://blog.skyzyx.com/2006/02/25/document-createtextnode-and-entities/
		var str = (str) ? str : "";
		var mode = (mode) ? mode : "string";

		var e = document.createElement("div");
		e.innerHTML = str;

		if (mode == "numeric") {
			return "&#" + e.innerHTML.charCodeAt(0) + ";";
		}
		else if (mode == "utf16") {
			var un = e.innerHTML.charCodeAt(0).toString(16);
			while (un.length < 4) un = "0" + un;
			return "\\u" + un;
		}
		else return e.innerHTML;
	}
};

//
//	----

Trusty.tradeList = false;	//	placeholder, to be populated dynamically as necessary
Trusty.searchResults = false;
Trusty.subTrades = {};

loginpanel = {};

loginpanel.showConsumer = function () {
	dojo.html.hide('loginBoxConsumerSignup');
	dojo.html.show('loginBoxConsumer');
};

loginpanel.hideConsumer = function () {
	dojo.html.hide('loginBoxConsumer');
	dojo.html.show('loginBoxConsumerSignup');
};

loginpanel.showTrade = function () {
	dojo.html.hide('loginBoxTradeSignup');
	dojo.html.show('loginBoxTrade');
};

loginpanel.hideTrade = function () {
	dojo.html.hide('loginBoxTrade');
	dojo.html.show('loginBoxTradeSignup');
};

searchpanel = {};

searchpanel.slideDuration = 500;
searchpanel.slideRate = 10;
searchpanel.slideEase = typeof dojo == "undefined" ? null : dojo.lfx.easeOut;
searchpanel.finalWidth = 575;

searchpanel.initialAppState = function (result) {
	this.changeUrl = "blank";
	this.back = function () { searchpanel.hideResults(); }
	this.forward = this.back;
};

searchpanel.appStates = [];

searchpanel.appState = function (result) {
	this.changeUrl = "search_"+ result.id;
	this.result = result;
	this.back = function () { searchpanel.renderResults(this.result); searchpanel.showResults(this.result); }
	this.forward = this.back;
	
	searchpanel.appStates.push(this);
};

searchpanel.advancedClick = function (a) {
	var node = dojo.byId("advsearchPanel");
	if (!node) { return; }
	if (node.style.width == searchpanel.finalWidth+"px")
		searchpanel.hideAdvanced();
	else if (node.style.width == "" || node.style.width == "36px")
		searchpanel.showAdvanced();
	if (a) { a.blur(); }
};

searchpanel.showAdvanced = function () {
	var node = dojo.byId("advsearchPanel");
	if (!node) { return; }
	
	searchpanel.hideQuick();
	
	if (node._trusty_show === undefined)
	{
		node._trusty_show = new dojo.lfx.propertyAnimation(node, {"width": {start:36, end:searchpanel.finalWidth}}, searchpanel.slideDuration);
		node._trusty_show.easing = searchpanel.slideEase;
		node._trusty_show.rate = searchpanel.slideRate;
	}
	
	node._trusty_show.play();
};

searchpanel.hideAdvanced = function () {
	var node = dojo.byId("advsearchPanel");
	if (!node) { return; }
	
	searchpanel.showQuick();
	
	if (node._trusty_hide === undefined)
	{
		node._trusty_hide = new dojo.lfx.propertyAnimation(node, {"width": {start:searchpanel.finalWidth, end:36}}, searchpanel.slideDuration);
		node._trusty_hide.easing = searchpanel.slideEase;
		node._trusty_hide.rate = searchpanel.slideRate;
	}
	
	node._trusty_hide.play();
};

searchpanel.showQuick = function () {
	var node = dojo.byId("quicksearchPanel");
	if (!node) { return; }
	if (node._trusty_show === undefined)
		node._trusty_show = new dojo.lfx.html.fadeShow(node, searchpanel.slideDuration*0.3);
	node._trusty_show.play();
};

searchpanel.hideQuick = function () {
	var node = dojo.byId("quicksearchPanel");
	if (!node) { return; }
	if (node._trusty_hide === undefined)
		node._trusty_hide = new dojo.lfx.html.fadeHide(node, searchpanel.slideDuration*0.3);
	node._trusty_hide.play();
};

searchpanel.imgStarOn = redd.images.newImage("images/star_on_red.gif");
searchpanel.imgStarOff = redd.images.newImage("images/star_off_red.gif");
searchpanel.imgStarOnGray = redd.images.newImage("images/star_on_gray.gif");
searchpanel.imgStarOffGray = redd.images.newImage("images/star_off_gray.gif");
searchpanel.imgStarHalfGray = redd.images.newImage("images/star_half_gray.gif");
searchpanel.imgIcons = {
	"f": redd.images.newImage("images/ic_f.gif"),
	"m": redd.images.newImage("images/ic_m.gif"),
	"p": redd.images.newImage("images/ic_p.gif"),
	"w": redd.images.newImage("images/ic_w.gif")
};

searchpanel.rankClick = function (rank, value, a) {
	var f, e, i, current;
	f = dojo.byId("advsearchForm");
	if (!f)
		return;
	
	e = f.elements["rank"+ rank];
	current = parseInt(e.value, 10);
	
	if (current == value)
		value = 0;
	
	for (i = 1; i <= value; i++)
		dojo.byId("advrank_"+ rank +"_"+ i).src = searchpanel.imgStarOn.src;
	for (i = value+1; i <= Trusty.maxRank; i++)
		dojo.byId("advrank_"+ rank +"_"+ i).src = searchpanel.imgStarOff.src;
	
	e.value = value;
};

searchpanel.showProgress = function () {
	var node = dojo.byId("searchProgressContainer");
	if (!node)
		return true;
	
	if (node._trusty_show === undefined)
	{
		node._trusty_show = dojo.lfx.html.fadeShow(node, searchpanel.slideDuration);
		node._trusty_show.rate = searchpanel.slideRate;
	}
	node._trusty_show.play();
	
	return true;
};

searchpanel.hideProgress = function () {
	var node;
	if (node = dojo.byId("searchProgressContainer"))
		dojo.html.hide(node);
	return true;
};

searchpanel.contentShowing = function () {
	return dojo.html.isShowing("contentContainer");
};

searchpanel.showContent = function () {
	var node;
	if (node = dojo.byId("contentContainer"))
		dojo.html.show(node);
};

searchpanel.hideContent = function () {
	var node;
	if (node = dojo.byId("contentContainer"))
		dojo.html.hide(node);
};

searchpanel.clearCache = function () {
	if (dojo.storage.manager.isInitialized() == false)	//	if dojo storage is available
	{
		//	storage not available yet, stop and wait
		dojo.event.connect(dojo.storage.manager, "loaded", searchpanel, "clearCache");
	}
	else
	{
		dojo.storage.clear();
	}
};

searchpanel.checkPreviousSearchKey = null;
searchpanel.checkPreviousSearch = function (key) {

	//
	//	checks for a previous search, intended for showing search results on page load

	if (key === undefined)
		var key = searchpanel.checkPreviousSearchKey;	//	key will be undefined if this is being called a second time by dojo.storage.manager.loaded

	if (!key) { return; }

	if (dojo.storage.manager.isInitialized() == false)	//	if dojo storage is available
	{
		//	storage not available yet, stop and wait
		searchpanel.checkPreviousSearchKey = key;
		dojo.event.connect(dojo.storage.manager, "loaded", searchpanel, "checkPreviousSearch");
	}
	else
	{
		var result = dojo.storage.get(key);
		if (result !== null && result.groups)	//	if result is valid
		{
			//	render and show results
			searchpanel.renderResults(result);
			searchpanel.showResults(result);
		}
	}
};

searchpanel.showResults = function (result) {
	searchpanel.hideContent();
	dojo.html.show("resultsContainer");
	filterpanel.showFilter(result);
};

searchpanel.hideResults = function (result) {
	searchpanel.showContent();
	dojo.html.hide("resultsContainer");
	filterpanel.hideFilter();
};

searchpanel.scrollToResults = function () {
	/*
	//	this code is obsolete, be sure to update it if it's ever uncommented (create the animation earlier, play it now)
	var anim = new dojo.lfx.Animation(searchpanel.slideDuration, [[window.scrollX,window.scrollY],[window.scrollX,112]]);
	dojo.event.connect(anim, "onAnimate", function (e) { window.scrollTo(e[0], e[1]); });
	anim.easing = searchpanel.slideEase;
	anim.rate = searchpanel.slideRate;
	anim.play();
	*/
};

searchpanel.storeSearch = function (result) {
	if (dojo.storage.manager.isInitialized())
	{
		try
		{
			dojo.storage.put("search_"+ result.id, result, function(){});
		}
		catch (e) { /* */ }
	}

};

searchpanel.searchDone = function (type, result, evt, request) {
	genericFormResponseHandler(type, result, evt, request);
	
	if (result.groups)
	{
		result.id = (new Date()).getTime();

		//searchpanel.renderResults(result);
		//searchpanel.showResults(result);
		//searchpanel.scrollToResults();

		//dojo.undo.browser.addToHistory(new searchpanel.appState(result))

		searchpanel.storeSearch(result);

		location.href = "default.asp?mod=search&search="+ result.id;
	}
	else
		searchpanel.hideProgress();
};

searchpanel.populateSubtrades = function (f, en, subtrades, defaultText, noneText)
{
	var subcat = f.elements[en];

	dojo.html.hide(subcat);
	subcat.disabled = false;
	redd.d.oblit(subcat);

	var option, subtrade;
	if (subtrades.length)
	{
		option = redd.d.ceac(subcat, "option");
		option.text = defaultText;
		option = redd.d.ceac(subcat, "option");
		option.text = "";
		for (var i = 0; i < subtrades.length; i++)
		{
			subtrade = subtrades[i];
			option = redd.d.ceac(subcat, "option");
			option.value = subtrade.i;
			option.text = subtrade.n;
		}
	}
	else
	{
		option = redd.d.ceac(subcat, "option");
		option.text = noneText;
		subcat.disabled = true;
	}

	dojo.html.show(subcat);
}

searchpanel.receiveSubtrades = function (type, result, evt, request) {	
	Trusty.subTrades[result.parent] = result.subtrades;
	searchpanel.populateSubtrades(dojo.byId("advsearchForm"), "subcat", result.subtrades, "choose a sub category...", "no sub categories");
};

searchpanel.changeTrade = function () {
	var f = dojo.byId("advsearchForm");
	var cat = parseInt(f.elements["cat"].value, 10);
	var subcat = f.elements["subcat"];
	var option;

	if (!cat)
	{
		subcat.disabled = false;
		redd.d.oblit(subcat);
		option = redd.d.ceac(subcat, "option");
		option.text = "choose a trade above";
		subcat.disabled = true;
	}
	else
	{
		if (Trusty.subTrades[cat])
		{
			searchpanel.populateSubtrades(f, "subcat", Trusty.subTrades[cat], "choose a sub category...", "no sub categories");
		}
		else
		{
			subcat.disabled = false;
			redd.d.oblit(subcat);
			option = redd.d.ceac(subcat, "option");
			option.text = "loading...";
			subcat.disabled = true;

			dojo.io.bind({
				url: redd.defaultBind,
				method: "POST",
				content: {"submit.action":"subtradelist", "parent":cat},
				handle: searchpanel.receiveSubtrades,
				mimetype: "text/json",
				sendTransport: true
			});
		}
	}
};

searchpanel.resultSorter = function (a, b) {
	var a_rank = a.r[0];
	var b_rank = b.r[0];
	var a_votes = a.v;
	var b_votes = b.v;

	if (a_rank > b_rank)
		return -1;
	if (a_rank < b_rank)
		return 1;
	
	if (a_votes > b_votes)
		return -1;
	if (a_votes < b_votes)
		return 1;
	
	return 0;
};

searchpanel.sortResults = function (res) {
	for (var i = res.groups.length; i--;)
		res.groups[i].results.sort(searchpanel.resultSorter);
	
	return res;
};

searchpanel.renderCompactResults = function (searchResults) {
	searchResults = searchpanel.sortResults(searchResults);
	
	var tbody = dojo.byId("searchResultsTbody");
	dojo.html.hide(tbody);
	redd.d.oblit(tbody);

	Trusty.searchResults = searchResults;
	
	var i, j, group, result, row, cell, div, other, span;
	var maxResults = 3;
	var count = 0;
	
	for (i = 0; i < searchResults.groups.length; i++)
	{
		if (count >= maxResults)
			break;
				
		group = searchResults.groups[i];
		
		for (j = 0; j < group.results.length; j++)
		{
			if (count >= maxResults)
				break;
				
			result = group.results[j];
			
			url = "default.asp?mod=viewtrade&member="+ result.i;

			//	result
			row = redd.d.ceac(tbody, "tr", "result resultm2-"+ (count%2));
			
			cell = redd.d.ceac(row, "td");
			
			div = redd.d.ceac(cell, "div", "name");
			
			other = redd.d.ceac(div, "a");
			other.target = "_top";
			other.href = url;
			redd.d.ctac(other, result.n);
			
			//	rank
		
			div = redd.d.ceac(cell, "div", "rank");
			
			other = redd.d.ceac(div, "a", "stars");
			other.href = url;
			other.target = "_top";
			other.title = result.r[0].toFixed(1);
			
			if (result.v)
			{
				for (k = 1; k <= Trusty.maxRank; k++)
				{
					img = redd.d.ceac(other, "img");
					if (result.r[0] >= k)
						img.src = searchpanel.imgStarOnGray.src;
					else if (Math.ceil(result.r[0]) >= k)
						img.src = searchpanel.imgStarHalfGray.src;
					else
						img.src = searchpanel.imgStarOffGray.src;
				}
			}
			else
			{
				img = redd.d.ceac(other, "img");
				img.src = "images/gr_norank.gif";
			}
			
			//	enquire
			
			div = redd.d.ceac(cell, "div", "enquire");
			
			other = redd.d.ceac(div, "a");
			other.target = "_top";
			other.href = url +"&view=enquiry";
			
			redd.d.ctac(redd.d.ceac(other, "span"), "enquire");
			
			div = redd.d.ceac(cell, "div", "clear");
			
			count++;
		}
	}
	
	row = redd.d.ceac(tbody, "tr", "footer");

	cell = redd.d.ceac(row, "td");

	other = redd.d.ceac(cell, "a");
	other.target = "_top";
	other.href = "default.asp?mod=search&search="+ searchResults.id;
	redd.d.ctac(redd.d.ceac(other, "span"), "View full results on Trusty Tradesman \u00bb");	//	\u00bb == &raquo;
			
	dojo.html.show(tbody);
	dojo.html.show("searchResultsTable");
	dojo.html.show("resultsContainer");
};

searchpanel.renderResults = function (searchResults) {
	searchResults = searchpanel.sortResults(searchResults);
	
	var tbody = dojo.byId("searchResultsTbody");
	dojo.html.hide(tbody);
	redd.d.oblit(tbody);
	
	Trusty.searchResults = searchResults;
	
	var group, result, hrow, row, cell, other, img, i, j, k, url, count, icons;
	var allcount = 0;
	var filtered = false;
	var states = [];
	
	for (i = 0; i < searchResults.groups.length; i++)
	{
		group = searchResults.groups[i];
		
		//	group header
		hrow = row = redd.d.ceac(tbody, "tr", "group");
		cell = redd.d.ceac(row, "th"); redd.d.ctac(cell, group.name);
		cell = redd.d.ceac(row, "th"); redd.d.ctac(cell, "Contact");
		cell = redd.d.ceac(row, "th"); redd.d.ctac(cell, "Rank");
		
		count = 0;
		for (j = 0; j < group.results.length; j++)
		{
			result = group.results[j];
			
			if (!result._v)
			{
				filtered = true;
				continue;
			}

			var state = Trusty.stateList[result.st - 1];
			if (redd.arrayFind(state, states) === null)
				states.push(state);

			count++;
			allcount++;
			
			url = "default.asp?mod=viewtrade&member="+ result.i;
			
			//	result
			row = redd.d.ceac(tbody, "tr", "result resultm2-"+ (j%2));
			
			//	name
			cell = redd.d.ceac(row, "td", "name");
			other = redd.d.ceac(cell, "a"); other.target = "_top"; other.href = url; redd.d.ctac(other, result.n); other.title = "Click for more details";
			
			other = redd.d.ceac(cell, "div", "loc");
			if (Trusty.tradeList[result.c])
				if (result.sct)
					redd.d.ctac(other, Trusty.tradeList[result.c] +" ("+ result.sct +") in ");
				else
					redd.d.ctac(other, Trusty.tradeList[result.c] +" in ");
			redd.d.ctac(other, result.s +", "+ Trusty.stateList[result.st-1].code);
			
			//	contact icons
			cell = redd.d.ceac(row, "td", "contact");
			if (typeof result.ic == "string")
			{
				icons = result.ic.split("");
				other = redd.d.ceac(cell, "a");
				other.href = url;
				other.target = "_top";
				other.title = "Click for contact details";
				for (k = 0; k < icons.length; k++)
				{
					img = redd.d.ceac(other, "img");
					img.align = "absmiddle";
					img.src = searchpanel.imgIcons[icons[k]].src;
				}
			}
			
			//	rank
			cell = redd.d.ceac(row, "td", "rank");
			
			other = redd.d.ceac(cell, "a", "stars");
			other.href = url;
			other.target = "_top";
			other.title = result.r[0].toFixed(1);
			
			if (result.v)
			{
				for (k = 1; k <= Trusty.maxRank; k++)
				{
					img = redd.d.ceac(other, "img");
					if (result.r[0] >= k)
						img.src = searchpanel.imgStarOnGray.src;
					else if (Math.ceil(result.r[0]) >= k)
						img.src = searchpanel.imgStarHalfGray.src;
					else
						img.src = searchpanel.imgStarOffGray.src;
				}
			}
			else
			{
				img = redd.d.ceac(other, "img");
				img.src = "images/gr_norank.gif";
			}
			
			other = redd.d.ceac(cell, "div", "votes"); redd.d.ctac(other, result.v +" vote"+ (result.v==1?"":"s"));
		}

		if (!count)
			redd.d.oblit(hrow, true);
	}
	
	if (!allcount)
	{
		row = redd.d.ceac(tbody, "tr", "result resultm2-0");
		cell = redd.d.ceac(row, "td", "name notice");
		cell.colSpan = "3";
		redd.d.ctac(cell, filtered ? "Your search found some results, but none were qualified based on the 'refine your search' settings, so they have all been hidden. You may need to broaden your options to display more results." : "We have just launched the site and do not yet have a Trusty Tradesman of this nature in your area. However we are advertising and trying to find them, so please signup as a consumer by clicking on the link on the left and check back soon.");
	}
	
	if (states.length > 1)
	{
		states = states.sort(Trusty.stateSortCode);
		dojo.html.show(dojo.byId("statesNotice"));
		var ul = dojo.byId("stateListContainer");
		redd.d.oblit(ul);
		for (var i = 0; i < states.length; i++)
		{
			var li = redd.d.ceac(ul, "li");
			redd.d.ctac(li, redd.d.ent("&raquo;") +" ");
			var a = redd.d.ceac(li, "a");
			a.href = "#";
			a.trusty = {state:states[i]};
			dojo.event.connect(a, "onclick", filterpanel.directStateFilter);
			redd.d.ctac(a, states[i].code);
		}
	}
	else
	{
		dojo.html.hide(dojo.byId("statesNotice"));
	}

	dojo.html.show(tbody);
	dojo.html.show("searchResultsTable");
	dojo.html.show("resultsContainer");
};

filterpanel = {};

filterpanel.filterReceiveSubtrades = function (type, result, evt, request) {
	Trusty.subTrades[result.parent] = result.subtrades;
	searchpanel.populateSubtrades(dojo.byId("filterSearchForm"), "subcat", result.subtrades, "Filter by sub category...", "No sub categories available");
};

filterpanel.directStateFilter = function (evt) {
	evt.preventDefault();
	var a = evt.target;
	var id = a.trusty.state.id;
	var f = dojo.byId("filterSearchForm");
	var e = f.elements["state"];
	for (var i = e.options.length; i--;)
		if (e.options[i].value == id)
		{
			e.selectedIndex = i;
			break;
		}
	
	filterpanel.filterResults(f);
};

filterpanel.showFilter = function (results) {
	var cat = results.cat;
	var f = dojo.byId("filterSearchForm");
	if (!f)
		return;
	
	filterpanel.filterReset(f);
	
	dojo.html.show("filterSearchContainer");

	var subcat = f.elements["subcat"];
	if (cat)
	{
		if (Trusty.subTrades[cat])
		{
			searchpanel.populateSubtrades(f, "subcat", Trusty.subTrades[cat], "Filter by sub category...", "No sub categories available");
		}
		else
		{
			dojo.html.hide(subcat);
			redd.d.oblit(subcat);
			var option = redd.d.ceac(subcat, "option");
			option.text = "Loading...";
			subcat.disabled = true;
			var node = dojo.byId("filterSearchCategoryName");
			redd.d.oblit(node);
			redd.d.ctac(node, Trusty.tradeList[cat]);
			dojo.html.show(subcat);
			dojo.io.bind({
				url: redd.defaultBind,
				method: "POST",
				content: {"submit.action":"subtradelist", "parent":cat},
				handle: filterpanel.filterReceiveSubtrades,
				mimetype: "text/json",
				sendTransport: true
			});
			dojo.html.show(dojo.byId("subcatContainer"));
		}
	}
	else
		dojo.html.hide(dojo.byId("subcatContainer"));	

	var states = [];
	for (var i = results.groups.length; i--;)
	{
		var group = results.groups[i];
		for (var j = group.results.length; j--;)
		{
			var result = group.results[j];
			var state = Trusty.stateList[result.st - 1];
			var found = (redd.arrayFind(state, states) !== null);
			if (!found)
				states.push(state);
		}
	}
	
	if (states.length > 1)
	{
		states = states.sort(Trusty.stateSortCode);
		var stateselect = f.elements["state"];
		redd.d.oblit(stateselect);
		var option = redd.d.ceac(stateselect, "option");
		option.text = "Filter by state...";
		redd.d.ceac(stateselect, "option");
		for (var i = 0; i < states.length; i++)
		{
			option = redd.d.ceac(stateselect, "option");
			option.value = states[i].id;
			option.text = states[i].code;
		}
		dojo.html.show(dojo.byId("stateContainer"));
	}
	else
	{
		dojo.html.hide(dojo.byId("stateContainer"));
	}
};

filterpanel.hideFilter = function () {
	var node = dojo.byId("filterSearchContainer");
	if (node)
		dojo.html.hide;
};

filterpanel.lastFilter = {
	subcat: null,
	rank: null
};

filterpanel.filterResults = function (f) {
	var rank = parseInt(f.elements["rank0"].value, 10);
	var subcat = parseInt(f.elements["subcat"].value, 10);
	var state = parseInt(f.elements["state"].value, 10);
	var i,j,group,result,was;
	var changed = false;
	for (i = Trusty.searchResults.groups.length;i--;)
	{
		group = Trusty.searchResults.groups[i];
		for (j = group.results.length; j--;)
		{
			result = group.results[j];
			was = result._v;
			result._v = true;
			
			if (rank && result.r[0] < rank)
				result._v = false;
			
			if (result._v && state && result.st != state)
				result._v = false;
			
			if (result._v && subcat && result.sc != subcat)
				result._v = false;
			
			if (!changed && result._v != was)
				changed = true;
		}
	}
	
	filterpanel.lastFilter.rank = rank;
	filterpanel.lastFilter.subcat = subcat;
	
	if (changed)
		searchpanel.renderResults(Trusty.searchResults);
};

filterpanel.rankClick = function (rank, value, a) {
	var f, e, i, current;
	f = dojo.byId("filterSearchForm");
	if (!f)
		return;
		
	e = f.elements["rank"+ rank];
	current = parseInt(e.value, 10);
	
	if (current == value)
		value = 0;
	
	for (i = 1; i <= value; i++)
		dojo.byId("filterrank_"+ rank +"_"+ i).src = searchpanel.imgStarOnGray.src;
	for (i = value+1; i <= Trusty.maxRank; i++)
		dojo.byId("filterrank_"+ rank +"_"+ i).src = searchpanel.imgStarOffGray.src;
	
	e.value = value;
	filterpanel.filterResults(f);
};

filterpanel.filterReset = function (f) {
	if (f)
		f.reset();
	filterpanel.rankClick(0,0);
};

faq = {};

faq.show = function (id) {
	var div;
	if (div = dojo.byId("faq-"+ id))
		dojo.html.toggleDisplay(div);
};

portfolio = {};

portfolio.drop = function (evt) {
	var source = evt.dragSource;
	var target = evt.dropTarget;
	//dojo.debug(source.domNode.id +" -> "+ target.id);
	console.debug(evt);
};

formPreSelect = function (f)
{
	//
	//	sets the selectedIndex option of all select elements of a given form (f)

	var i, j;
	var e, v, ol;
	for (i = f.elements.length; i--;)
	{
		e = f.elements[i];
		if (e.type == "select-one")
		{
			v = dojo.html.getAttribute(e, "value");
			if (!v)
				continue;

			for (j = e.options.length; j--;)
			{
				o = e.options[j];
				if (o.value == v)
				{
					e.selectedIndex = j;
					break;
				}
			}
		}
	}
}


mytradesmandisplay = {};

mytradesmandisplay.nodes = ["banner", "overview", "service", "testimonials", "contact"];

mytradesmandisplay.logoUploaded = function (type, result, request) {
	if (type == "load" && result.success)
	{
		mytradesmandisplay.placeLogo(result.file);
	}
	reddjs.forms.defaultIframeIOResponseHandler(type, result, request);
};

mytradesmandisplay.fixLogoContainer = function () {
	var container = dojo.byId("logoContainer");
	var img = container.firstChild;
	if (!img) { return; }
	
	var dims = {width:img.width, height:img.height};
	dojo.html.setContentBox(container, dims);
	dojo.html.setStyle(container, "backgroundImage", "none");
};

mytradesmandisplay.placeLogo = function (filename) {
	var container = dojo.byId("logoContainer");
	reddjs.d.oblit(container);
	var img = reddjs.d.ce("img");
	img.src = "contentfiles/"+ site_tradesman_id +"/"+ filename +"?"+ (new Date()).getTime();
	reddjs.d.ac(container, img);
	dojo.event.connect(img, 'onload', mytradesmandisplay.fixLogoContainer);
};

mytradesmandisplay.showAddressChanged = function (type, result, evt, request) {
	var node = dojo.byId("addressShowNotice");
	if (node)
		(mytradesmandisplay.showAddressAnimation = new dojo.lfx.html.fadeHide(node, 1000, dojo.lfx.easeIn)).play();
	
	if (type == "load" && result.success)
	{
		if (node)
			node.innerHTML = '<span style="font-size:0;"><img src="images/ajaxblacksavingok.gif" width="54" height="12" /></span>';
	}
	
	genericFormResponseHandler(type, result, evt, request);
};

mytradesmandisplay.showAddressChange = function (evt) {
	var value = (evt.target.value == "Y");
	if (value == mytradesmandisplay_showaddresswas) { return; }
	mytradesmandisplay_showaddresswas = value;
	
	var node;
	if (node = dojo.byId("addressShowNotice"))
	{
		if (mytradesmandisplay.showAddressAnimation && mytradesmandisplay.showAddressAnimation.status() != "stopped")
			mytradesmandisplay.showAddressAnimation.stop();
		
		dojo.html.show(node);
		dojo.html.setOpacity(node, 1);
		node.innerHTML = '<span style="font-size:0;"><img src="images/ajaxblacksaving.gif" width="54" height="12" /></span>';
	}
	
	dojo.io.bind({
		url: redd.defaultBind,
		method: "POST",
		content: {"submit.action":"tradesman-my-showaddress", "show": value},
		handle: mytradesmandisplay.showAddressChanged,
		mimetype: "text/json",
		sendTransport: true
	});
};

mytradesmandisplay.logoPositionChanged = function (type, result, evt, request) {
	var node = dojo.byId("logoPositionNotice");
	if (node)
		(mytradesmandisplay.logoPositionAnimation = new dojo.lfx.html.fadeHide(node, 1000, dojo.lfx.easeIn)).play();
	
	if (type == "load" && result.success)
	{
		if (node)
			node.innerHTML = '<span style="font-size:0;"><img src="images/ajaxblacksavingok.gif" width="54" height="12" /></span>';
	}
	
	genericFormResponseHandler(type, result, evt, request);
};

mytradesmandisplay.logoPositionChange = function (evt) {
	if (evt.target.value == mytradesmandisplay_logopositionwas) { return; }
	mytradesmandisplay_logopositionwas = evt.target.value;

	var node;
	if (node = dojo.byId("logoPositionNotice"))
	{
		if (mytradesmandisplay.logoPositionAnimation && mytradesmandisplay.logoPositionAnimation.status() != "stopped")
			mytradesmandisplay.logoPositionAnimation.stop();
		
		dojo.html.show(node);
		dojo.html.setOpacity(node, 1);
		node.innerHTML = '<span style="font-size:0;"><img src="images/ajaxblacksaving.gif" width="54" height="12" /></span>';
	}
	
	dojo.io.bind({
		url: redd.defaultBind,
		method: "POST",
		content: {"submit.action":"tradesman-my-logoposition", "position": evt.target.value},
		handle: mytradesmandisplay.logoPositionChanged,
		mimetype: "text/json",
		sendTransport: true
	});
};

mytradesmandisplay.init = function () {
	reddjs.forms.bind("overviewForm");
	reddjs.forms.bind("testimonialsForm");
	
	reddjs.forms.bind(dojo.byId("logoUploadForm"), mytradesmandisplay.logoUploaded, "submitMultipart.asp");
	
	var node, nodeName;
	for (var i = mytradesmandisplay.nodes.length; i--;)
	{
		nodeName = mytradesmandisplay.nodes[i];
		node = dojo.byId(nodeName +"Container");
		node._trusty_show = new dojo.lfx.html.wipeIn(node, 300);
		node._trusty_hide = new dojo.lfx.html.wipeOut(node, 300);
		
		node = dojo.byId(nodeName +"Link");
		dojo.event.connect(node, "onclick", mytradesmandisplay, nodeName +"SectionClick");
	}
	
	var hash = location.hash;
	if (hash && typeof hash.substr == "function" && typeof hash.split == "function" && hash.substr(0,1) == "#" && (hash = hash.substr(1).split("=")).length && hash[0] == "view")
		mytradesmandisplay[hash[1].toLowerCase() +"SectionClick"]();
	
	if (node = dojo.byId("logoPositionL"))
		dojo.event.connect(node, "onclick", mytradesmandisplay, "logoPositionChange");
	if (node = dojo.byId("logoPositionC"))
		dojo.event.connect(node, "onclick", mytradesmandisplay, "logoPositionChange");
	if (node = dojo.byId("logoPositionR"))
		dojo.event.connect(node, "onclick", mytradesmandisplay, "logoPositionChange");
	
	if (node = dojo.byId("addressShowY"))
		dojo.event.connect(node, "onclick", mytradesmandisplay, "showAddressChange");
	if (node = dojo.byId("addressShowN"))
		dojo.event.connect(node, "onclick", mytradesmandisplay, "showAddressChange");
};

mytradesmandisplay.bannerSectionClick = function (evt) { mytradesmandisplay.sectionClick(evt, "banner"); }
mytradesmandisplay.overviewSectionClick = function (evt) { mytradesmandisplay.sectionClick(evt, "overview"); }
mytradesmandisplay.serviceSectionClick = function (evt) { mytradesmandisplay.sectionClick(evt, "service"); }
mytradesmandisplay.testimonialsSectionClick = function (evt) { mytradesmandisplay.sectionClick(evt, "testimonials"); }
mytradesmandisplay.portfolioSectionClick = function (evt) { mytradesmandisplay.sectionClick(evt, "portfolio"); }
mytradesmandisplay.contactSectionClick = function (evt) { mytradesmandisplay.sectionClick(evt, "contact"); }

mytradesmandisplay.sectionClick = function (evt, section) {
	if (evt !== undefined) { evt.preventDefault(); }
	var sectionNode = dojo.byId(section +"Container");
	
	var nodeName, node;
	for (var i = mytradesmandisplay.nodes.length; i--;)
	{
		nodeName = mytradesmandisplay.nodes[i];
		node = dojo.byId(nodeName +"Container");
		
		if (node._trusty_show.status() != "stopped" || node._trusty_hide.status() != "stopped") { continue; }	//	skip animating nodes
		
		if (node == sectionNode)
		{
			location.replace("#view="+ section.toLowerCase());
			
			if (dojo.html.isShowing(node))
				node._trusty_hide.play();
			else
			{
				node._trusty_show.play();
				if (section == "banner")
					mytradesmandisplay.fixLogoContainer();
			}
		}
		else
			if (dojo.html.isShowing(node))
				node._trusty_hide.play();
	}
};

mytradesman = {};

mytradesman.nodes = ["myDetailsContainer", "myAttributesContainer", "myEnquiriesContainer", "myInvitesContainer"];

mytradesman.init = function () {
	genericBind("myPasswordForm");
	genericBind("myEmailForm1");
	genericBind("myInvitesForm");
	genericBindHide("myEmailForm2Container", "myEmailForm2");
	
	if (dojo.byId("myAttributesForm"))
	{
		genericBind("myAttributesForm");
	}

	var node;
	for (var i = mytradesman.nodes.length; i--;)
	{
		//alert("node: "+mytradesman.nodes[i]);
		node = dojo.byId(mytradesman.nodes[i]);
		node._trusty_show = new dojo.lfx.html.wipeIn(node, 300);
		node._trusty_hide = new dojo.lfx.html.wipeOut(node, 300);
		dojo.html.hide(node);
	}
	
	dojo.event.connect(dojo.byId("myDetailsLink"), "onclick", mytradesman, "detailsSectionClick");
	dojo.event.connect(dojo.byId("myEnquiriesLink"), "onclick", mytradesman, "enquiriesSectionClick");
	dojo.event.connect(dojo.byId("myInvitesLink"), "onclick", mytradesman, "invitesSectionClick");
	if (dojo.byId("myAttributesLink"))
	{
		dojo.event.connect(dojo.byId("myAttributesLink"), "onclick", mytradesman, "attributesSectionClick");
	}

	dojo.event.connect(dojo.byId("loggedInDetailsLink"), "onclick", mytradesman, "detailsSectionClick");
	dojo.event.connect(dojo.byId("loggedInEnquiriesLink"), "onclick", mytradesman, "enquiriesSectionClick");
	dojo.event.connect(dojo.byId("loggedInInvitesLink"), "onclick", mytradesman, "invitesSectionClick");
	
	var hash = location.hash;
	//alert("hash: "+hash);
	if (hash && typeof hash.substr == "function" && typeof hash.split == "function" && hash.substr(0,1) == "#" && (hash = hash.substr(1).split("=")).length && hash[0] == "view")
	{
		switch (hash[1].toLowerCase())
		{
			case "details":
				mytradesman.detailsSectionClick();
				break;
			
			case "enquiries":
				mytradesman.enquiriesSectionClick();
				break;
			
			case "invites":
				mytradesman.invitesSectionClick();
				break;
		}
	}
};

mytradesman.sectionClick = function (evt, section) {
	if (evt !== undefined) { evt.preventDefault(); }
	var sectionNode = dojo.byId("my"+ section +"Container");
	
	if (!sectionNode || !searchpanel.contentShowing())
	{
		var rand = (new Date().getTime());
		location.href = "default.asp?mod=tradesman-my&"+ rand +"="+ rand +"#view="+ section.toLowerCase();
		return;
	}
	
	var node;
	for (var i = mytradesman.nodes.length; i--;)
	{
		node = dojo.byId(mytradesman.nodes[i]);
		
		if (node._trusty_show.status() != "stopped" || node._trusty_hide.status() != "stopped") { continue; }	//	 skip animating nodes
		
		if (node == sectionNode)
		{
			location.replace("#view="+ section.toLowerCase());

			if (dojo.html.isShowing(node))
				node._trusty_hide.play();
			else
				node._trusty_show.play();
		}
		else
			if (dojo.html.isShowing(node))
				node._trusty_hide.play();
	}
};

mytradesman.detailsSectionClick = function (evt) {
	mytradesman.sectionClick(evt, "Details");
};

mytradesman.attributesSectionClick = function (evt) {
	mytradesman.sectionClick(evt, "Attributes");
};

mytradesman.enquiriesSectionClick = function (evt) {
	mytradesman.sectionClick(evt, "Enquiries");
};

mytradesman.invitesSectionClick = function (evt) {
	mytradesman.sectionClick(evt, "Invites");
};

myconsumer = {};

myconsumer.nodes = ["myDetailsContainer", "myEnquiriesContainer", "myFavouritesContainer"];

myconsumer.init = function () {
	genericBind("myPasswordForm");
	genericBind("myEmailForm1");
	genericBindHide("myEmailForm2Container", "myEmailForm2");

	var node;
	for (var i = myconsumer.nodes.length; i--;)
	{
		node = dojo.byId(myconsumer.nodes[i]);
		node._trusty_show = new dojo.lfx.html.wipeIn(node, 300);
		node._trusty_hide = new dojo.lfx.html.wipeOut(node, 300);
		dojo.html.hide(node);
	}
	
	dojo.event.connect(dojo.byId("myDetailsLink"), "onclick", myconsumer, "detailsSectionClick");
	dojo.event.connect(dojo.byId("myEnquiriesLink"), "onclick", myconsumer, "enquiriesSectionClick");
	dojo.event.connect(dojo.byId("myFavouritesLink"), "onclick", myconsumer, "favouritesSectionClick");

	dojo.event.connect(dojo.byId("loggedInDetailsLink"), "onclick", myconsumer, "detailsSectionClick");
	dojo.event.connect(dojo.byId("loggedInEnquiriesLink"), "onclick", myconsumer, "enquiriesSectionClick");
	dojo.event.connect(dojo.byId("loggedInFavouritesLink"), "onclick", myconsumer, "favouritesSectionClick");
	
	var hash = location.hash;
	if (hash && typeof hash.substr == "function" && typeof hash.split == "function" && hash.substr(0,1) == "#" && (hash = hash.substr(1).split("=")).length && hash[0] == "view")
	{
		switch (hash[1].toLowerCase())
		{
			case "details":
				myconsumer.detailsSectionClick();
				break;
			
			case "enquiries":
				myconsumer.enquiriesSectionClick();
				break;
			
			case "favourites":
				myconsumer.favouritesSectionClick();
				break;
		}
	}
};

myconsumer.sectionClick = function (evt, section) {
	if (evt !== undefined) { evt.preventDefault(); }
	var sectionNode = dojo.byId("my"+ section +"Container");
	
	if (!sectionNode || !searchpanel.contentShowing())
	{
		var rand = (new Date().getTime());
		location.href = "default.asp?mod=consumer-my&"+ rand +"="+ rand +"#view="+ section.toLowerCase();
		return;
	}
	
	var node;
	for (var i = myconsumer.nodes.length; i--;)
	{
		node = dojo.byId(myconsumer.nodes[i]);
		
		if (node._trusty_show.status() != "stopped" || node._trusty_hide.status() != "stopped") { continue; }	//	 skip animating nodes
		
		if (node == sectionNode)
		{
			location.replace("#view="+ section.toLowerCase());
			
			if (dojo.html.isShowing(node))
				node._trusty_hide.play();
			else
				node._trusty_show.play();
		}
		else
			if (dojo.html.isShowing(node))
				node._trusty_hide.play();
	}
};

myconsumer.detailsSectionClick = function (evt) {
	myconsumer.sectionClick(evt, "Details");
};

myconsumer.enquiriesSectionClick = function (evt) {
	myconsumer.sectionClick(evt, "Enquiries");
};

myconsumer.favouritesSectionClick = function (evt) {
	myconsumer.sectionClick(evt, "Favourites");
};

myconsumer.favouritesRemoved = function (type, result, evt, request) {
	if (type == "load" && result.success)
	{
		var node = dojo.byId("favourite-"+ result.tradesman);
		if (node._trusty_hide === undefined)
			node._trusty_hide = new dojo.lfx.html.fadeHide(node, 300);
		node._trusty_hide.play();

		if (!(--myconsumer.favouritesLength))
			dojo.html.show("myFavouritesEmpty");
	}
	
	genericFormResponseHandler(type, result, evt, request);
};

myconsumer.favouritesRemove = function (id) {
	dojo.io.bind({
		url: redd.defaultBind,
		method: "POST",
		content: {"submit.action":"consumer-favourite-remove", "tradesman":id},
		handle: myconsumer.favouritesRemoved,
		mimetype: "text/json",
		sendTransport: true
	});
};

myconsumer.favouritesAdd = function (id) {
	dojo.io.bind({
		url: redd.defaultBind,
		method: "POST",
		content: {"submit.action":"consumer-favourite-add", "tradesman":id},
		handle: genericFormResponseHandler,
		mimetype: "text/json",
		sendTransport: true
	});
};

rankform = {};

rankform.rankClick = function (rank, value, a) {
	var f, e, i, current;
	f = dojo.byId("rankForm");
	if (!f)
		return;
	
	e = f.elements["rank"+ rank];
	current = parseInt(e.value, 10);
	
	if (current == value)
		value = 0;
	
	for (i = 1; i <= value; i++)
		dojo.byId("rank_"+ rank +"_"+ i).src = searchpanel.imgStarOnGray.src;
	for (i = value+1; i <= Trusty.maxRank; i++)
		dojo.byId("rank_"+ rank +"_"+ i).src = searchpanel.imgStarOffGray.src;
	
	dojo.byId("rank"+ rank +"-text").innerHTML = value +" star"+ (value==1?"":"s");
	
	e.value = value;
};

tradesman = {};

tradesman.recommendClickHandle = function (type, result, evt, request) {
	genericFormResponseHandler(type, result, evt, request);
	
	if (result.forId)
		location.reload();
};

tradesman.recommendClick = function (forId) {
	dojo.io.bind({
		url: redd.defaultBind,
		method: "POST",
		content: {
			"submit.action": "recommend",
			"forId": forId
		},
		handle: tradesman.recommendClickHandle,
		mimetype: "text/json",
		sendTransport: true
	});
	
	return false;
};

tradesman.recommendRevokeClickHandle = function (type, result, evt, request) {
	genericFormResponseHandler(type, result, evt, request);
	
	if (result.forId)
		location.reload();
};

tradesman.recommendRevokeClick = function (forId) {
	dojo.io.bind({
		url: redd.defaultBind,
		method: "POST",
		content: {
			"submit.action": "recommend-del",
			"forId": forId
		},
		handle: tradesman.recommendRevokeClickHandle,
		mimetype: "text/json",
		sendTransport: true
	});
	
	return false;
};

