//
//	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)
{
	window.setTimeout((function () { genericFormSubmitDisableForm(form); }), 1);
	giftscomau.alert("Please wait...");
	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.message)
				alert(result.message);	// show an alert using the browser's built-in dialog

			if (result.highlight)
				giftscomau.alert(result.highlight, result.highlightDelay ? result.highlightDelay : 6000);	// show a dhtml highlight alert
			else
				giftscomau.alertFadeOut();

			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 = window.open(result.windowOpen[0], result.windowOpen[1], result.windowOpen[2], result.windowOpen[3]);
						break;
					
					default:
						var w = window.open(result.windowOpen)
						break;
				}
			}

			if (result.eval)
				eval(result.eval);

			if (result.redirect)
			{
				window.location.href = result.redirect;
				break;
			}

			if (result.reload)
			{
				window.setTimeout(function(){window.location.href = window.location;},redd.standardFadeDuration*1.5);
				break;
			}

			break;

		case "error":
			giftscomau.alert("An error occurred when attempting to perform this action. Please try again later.");
			if (request.formNode)
				genericFormResponseEnableForm(request.formNode);
			break;
			
		default:
			giftscomau.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;
}

redd = {};
redd.standardFadeDuration = 400;

mouseProductListItemOver = null;
productListItemRxp = /^productlistitem(\d+)$/i;

function browseListChange (e)
{
	var o = e.options[e.selectedIndex];
	var v = o.value;
	if (!v)
		return;
	window.location.href = "default.asp?mod=browse&parent="+ escape(v);
}

function mouseProductListItem (evt)
{
	/*if (evt.toElement)
		var parent = evt.toElement;
	else */
	if (evt.relatedTarget && evt.target)
		var parent = (evt.type == "mouseout" ? evt.relatedTarget : evt.target);
	else
		return;

	var overProduct = false;
	while (parent)
	{
		if (parent.className == "item")
		{
			overProduct = true;
			break;
		}
		if (parent.className == "productlist")
			break;
		parent = parent.parentNode;
	}

	//
	//	TODO - clean this up

	if (overProduct)
	{
		productListItemRxp.test(parent.id);
		var id = parseInt(RegExp.$1, 10);
		if (id != mouseProductListItemOver)
		{
			if (mouseProductListItemOver)
			{
				var node = dojo.byId("productlistitembuttons"+ mouseProductListItemOver);
				if (node.animation)
					node.animation.stop();
				node.animation = new dojo.lfx.html.fadeHide(node, redd.standardFadeDuration);
				node.animation.play();
				mouseProductListItemOver = null;
			}

			var node = dojo.byId("productlistitembuttons"+ id);
			if (node.animation)
				node.animation.stop();
			node.style.display = "block";
			node.animation = new dojo.lfx.html.fadeShow(node, redd.standardFadeDuration);
			node.animation.play();
			mouseProductListItemOver = id;
		}
	}
	else if (!overProduct && mouseProductListItemOver)
	{
		var node = dojo.byId("productlistitembuttons"+ mouseProductListItemOver);
		if (node.animation)
			node.animation.stop();
		node.animation = new dojo.lfx.html.fadeHide(node, redd.standardFadeDuration);
		node.animation.play();
		mouseProductListItemOver = null;
	}
}

function mouseOverAddToCart (evt)
{
	ddrivetip('add to giftbox');
}

function mouseOverRemFromFavourites (evt)
{
	ddrivetip('remove from favourites');
}

function mouseOverAddToFavourites (evt)
{
	ddrivetip('add to favourites');
}

function cartFormResponseHandler (type, result, evt, request)
{
	if (type == "load")
	{
		if (result.cart)
		{
			site.cart = result.cart;
			giftscomau.renderCart();
			
			//
			//	update full cart form totals etc.
			
			dojo.byId("cartSubtotal").value = numberToCurrency(site.cart.subtotal);
			dojo.byId("cartIncgst").value = numberToCurrency(site.cart.incgst);
			dojo.byId("cartShipping").value = numberToCurrency(site.cart.shipping);
			dojo.byId("cartTotal").value = numberToCurrency(site.cart.total);
			
			for (var i = result.remove.length; i--;)
				(new dojo.lfx.html.fadeHide(dojo.byId("cartitemRow"+ result.remove[i]), redd.standardFadeDuration)).play();
			
			for (i = site.cart.items.length; i--;)
			{
				var item = site.cart.items[i];
				dojo.byId("cartitemQty"+ item.id).value = item.qty;
				dojo.byId("cartitemTotal"+ item.id).value = numberToCurrency(item.total);
			}
		}
	}
	genericFormResponseHandler(type, result, evt, request);
}

function addCartResponseHandler (type, result, evt, request)
{
	if (type == "load")
	{
		if (result.cart)
		{
			site.cart = result.cart;
			giftscomau.renderCart();
		}
	}
	genericFormResponseHandler(type, result, evt, request);
}

addtocartlink_rxp = /^addtocartlink(\d+)$/;
function clickAddToCart (evt)
{
	evt.preventDefault();
	var linkId = evt.currentTarget.id;
	if (!addtocartlink_rxp.test(linkId))
		return;
	var id = parseInt(RegExp.$1, 10);
	var content = {
		"submit.action": "cart-add",
		product: id,
		qty: 1
	};
	giftscomau.alert("Please wait...");
	dojo.io.bind({
		url: "submit.asp",
		method: "POST",
		content: content,
		mimetype: "text/json",
		handle: addCartResponseHandler
	});
}

function remFromFavouritesResponseHandler (type, result, evt, request)
{
	if (type == "load")
	{
		if (result.remove)
			(new dojo.lfx.html.fadeHide(dojo.byId("productlistitem"+ result.remove), redd.standardFadeDuration)).play();
	}
	
	genericFormResponseHandler(type, result, evt, request);
}

remfromfavlink_rxp = /^remfromfavlink(\d+)$/;
function clickRemFromFavourites (evt)
{
	evt.preventDefault();
	var linkId = evt.currentTarget.id;
	if (!remfromfavlink_rxp.test(linkId))
		return;
	var id = parseInt(RegExp.$1, 10);
	var content = {
		"submit.action": "fav-rem",
		product: id
	};
	giftscomau.alert("Please wait...");
	dojo.io.bind({
		url: "submit.asp",
		method: "POST",
		content: content,
		mimetype: "text/json",
		handle: remFromFavouritesResponseHandler
	});
}


addtofavlink_rxp = /^addtofavlink(\d+)$/;
function clickAddToFavourites (evt)
{
	evt.preventDefault();
	var linkId = evt.currentTarget.id;
	if (!addtofavlink_rxp.test(linkId))
		return;
	var id = parseInt(RegExp.$1, 10);
	var content = {
		"submit.action": "fav-add",
		product: id
	};
	giftscomau.alert("Please wait...");
	dojo.io.bind({
		url: "submit.asp",
		method: "POST",
		content: content,
		mimetype: "text/json",
		handle: genericFormResponseHandler
	});
}

function showLogin ()
{
	var node = dojo.byId("loginContainer");
	if (!dojo.html.isShowing(node))
	{
		(new dojo.lfx.html.fadeShow(node, redd.standardFadeDuration)).play();
		return true;
	}
	return false;
}

function clickLogin (evt)
{
	evt.preventDefault();

	if (!showLogin())
		clickLoginCancel(evt);
}

function clickLoginCancel (evt)
{
	evt.preventDefault();
	(new dojo.lfx.html.fadeHide(dojo.byId("loginContainer"))).play();
}

function initPage ()
{
	var listnode, node, i;

	if (node = dojo.byId("loginAnchor"))
	{
		dojo.event.kwConnect({
			once: true,
			srcObj: node,
			srcFunc: "onclick",
			adviceFunc: clickLogin
		});
	}

	if (node = dojo.byId("loginCancelAnchor"))
	{
		dojo.event.kwConnect({
			once: true,
			srcObj: node,
			srcFunc: "onclick",
			adviceFunc: clickLoginCancel
		});
	}

	if (listnode = dojo.byId("productlist"))
	{
		//
		//	connect mouse events to displayed products
		
		for (i = listnode.childNodes.length; i--;)
		{
			node = listnode.childNodes[i];
			if (node.className != "item")
				continue;
				
			dojo.event.kwConnect({
				once: true,
				srcObj: node,
				srcFunc: "onmouseover",
				adviceFunc: mouseProductListItem
			});

			dojo.event.kwConnect({
				once: true,
				srcObj: node,
				srcFunc: "onmouseout",
				adviceFunc: mouseProductListItem
			});
		}
	}

	var links = dojo.html.getElementsByClassName("addtocartlink");
	for (i = links.length; i--;)
	{
		node = links[i];

		dojo.event.kwConnect({
			once: true,
			srcObj: node,
			srcFunc: "onmouseover",
			adviceFunc: mouseOverAddToCart
		});

		dojo.event.kwConnect({
			once: true,
			srcObj: node,
			srcFunc: "onmouseout",
			adviceFunc: hideddrivetip
		});

		dojo.event.kwConnect({
			once: true,
			srcObj: node,
			srcFunc: "onclick",
			adviceFunc: clickAddToCart
		});
	}

	var links = dojo.html.getElementsByClassName("addtofavlink");
	for (i = links.length; i--;)
	{
		node = links[i];

		dojo.event.kwConnect({
			once: true,
			srcObj: node,
			srcFunc: "onmouseover",
			adviceFunc: mouseOverAddToFavourites
		});

		dojo.event.kwConnect({
			once: true,
			srcObj: node,
			srcFunc: "onmouseout",
			adviceFunc: hideddrivetip
		});

		dojo.event.kwConnect({
			once: true,
			srcObj: node,
			srcFunc: "onclick",
			adviceFunc: clickAddToFavourites
		});
	}

	var links = dojo.html.getElementsByClassName("remfromfavlink");
	for (i = links.length; i--;)
	{
		node = links[i];

		dojo.event.kwConnect({
			once: true,
			srcObj: node,
			srcFunc: "onmouseover",
			adviceFunc: mouseOverRemFromFavourites
		});

		dojo.event.kwConnect({
			once: true,
			srcObj: node,
			srcFunc: "onmouseout",
			adviceFunc: hideddrivetip
		});

		dojo.event.kwConnect({
			once: true,
			srcObj: node,
			srcFunc: "onclick",
			adviceFunc: clickRemFromFavourites
		});
	}
	
	if (node = dojo.byId("addToGiftboxForm"))
	{
		node.action = "submit.asp";
		var x = new dojo.io.FormBind
		({
			formNode: node,
			handle: addCartResponseHandler,
			mimetype: "text/json",
			sendTransport: true
		});
		x.onSubmit = genericFormSubmitHandler;
	}

	if (node = dojo.byId("cartForm"))
	{
		node.action = "submit.asp";
		var x = new dojo.io.FormBind
		({
			formNode: node,
			handle: cartFormResponseHandler,
			mimetype: "text/json",
			sendTransport: true
		});
		x.onSubmit = genericFormSubmitHandler;
	}

	var genericFormList = ["addressForm","myEmailForm","myPasswordForm","myDetailsForm","checkoutForm", "checkoutConfirmForm", "searchGiftsForm", "contactForm", "joinForm", "newsletterForm"];
	for (i = genericFormList.length; i--;)
	{
		if (node = dojo.byId(genericFormList[i]))
		{
			node.action = "submit.asp";
			var x = new dojo.io.FormBind
			({
				formNode: node,
				handle: genericFormResponseHandler,
				mimetype: "text/json",
				sendTransport: true
			});
			x.onSubmit = genericFormSubmitHandler;
		}
	}

	giftscomau.renderCart();
}

giftscomau = {};

giftscomau.alertFadeOutTimeout = null;
giftscomau.alertFadeAnim = null;

giftscomau.alert = function (msg, fadeDelay) {
	var node = dojo.byId("alertContainer");
	if (!node)
	{
		alert(msg);
		return;
	}

	giftscomau.alertHide();
	if (typeof fadeDelay == "undefined" || fadeDelay === null)
		var fadeDelay = 6000;

	node.innerHTML = msg;
	giftscomau.alertFadeAnim = new dojo.lfx.html.fadeShow(node, redd.standardFadeDuration);
	giftscomau.alertFadeAnim.play();

	giftscomau.alertFadeOutTimeout = window.setTimeout(giftscomau.alertFadeOut, fadeDelay);
	window.scroll(0,0);
};

giftscomau.alertHalt = function () {
	if (giftscomau.alertFadeOutTimeout)
		window.clearTimeout(giftscomau.alertFadeOutTimeout);
	if (giftscomau.alertFadeAnim)
		giftscomau.alertFadeAnim.stop(false);
};

giftscomau.alertFadeOut = function () {
	var node = dojo.byId("alertContainer");
	giftscomau.alertHalt();
	giftscomau.alertFadeOutTimeout = null;
	giftscomau.alertFadeAnim = new dojo.lfx.html.fadeHide(node, redd.standardFadeDuration);
	giftscomau.alertFadeAnim.play();
};

giftscomau.alertHide = function () {
	var node = dojo.byId("alertContainer");
	giftscomau.alertHalt();
	giftscomau.alertFadeOutTimeout = null;
	dojo.html.hide(node);
};

giftscomau.renderCart = function () {
	var node = dojo.byId("giftboxOverlay");
	if (!node)
		return;

	dojo.html.hide(node);
	dojo.dom.removeChildren(node);

	if (site.cart.qty)
		node.innerHTML = 'Items in Giftbox: '+ site.cart.qty +'<br />Total: '+ numberToCurrency(site.cart.total) +'<br /><a href="default.asp?mod=cart">Checkout</a>';
	else
		node.innerHTML = 'Your giftbox is empty.';

	dojo.html.show(node);
};

function clearInput (e, v)
{
	if (e.value == v)
		e.value = "";
}

function restoreInput (e, v)
{
	if (e.value == "")
		e.value = v;
}

tellafriend = {
	click: function () {
		var node = dojo.byId("tellAFriendContainer");
		if (dojo.html.isShowing(node))
			tellafriend.hide();
		else
			tellafriend.show();
	},
	
	show: function () {
		(new dojo.lfx.html.fadeShow(dojo.byId("tellAFriendContainer"), redd.standardFadeDuration)).play();
		window.scroll(0,65535);
		dojo.byId("tellAFriendForm").elements["url"].value = window.location;
	},
	
	hide: function () {
		(new dojo.lfx.html.fadeHide(dojo.byId("tellAFriendContainer"), redd.standardFadeDuration)).play();
	}
};

forgotpassword = {
	click: function () {
		var node = dojo.byId("forgotPasswordContainer");
		if (dojo.html.isShowing(node))
			forgotpassword.hide();
		else
			forgotpassword.show();
	},
	
	show: function () {
		(new dojo.lfx.html.fadeShow(dojo.byId("forgotPasswordContainer"), redd.standardFadeDuration)).play();
	},
	
	hide: function () {
		(new dojo.lfx.html.fadeHide(dojo.byId("forgotPasswordContainer"), redd.standardFadeDuration)).play();
	}
};

function genericBindHide (divId, formId)
{
	var node;
	if (node = dojo.byId(formId))
	{
		node.action = "submit.asp";
		var x = new dojo.io.FormBind
		({
			formNode: node,
			handle: genericFormResponseHandler,
			mimetype: "text/json",
			sendTransport: true
		});
		x.onSubmit = genericFormSubmitHandler;
	}
	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];
}
