
/**************************************************
* Name: shop_ajax.js
* Author: 
* Modified: 2009-06-25 15:42:46
* Overview:
* Copyright: WLD
* Notes: 
**************************************************/

// Gets a message from an XML fragment
function hijaxGetMessage (httpTransport) {
	if (!httpTransport) return false;

	// The XML response
	var responseXML = httpTransport.responseXML;
	if (!responseXML) return false;

	// The response container
	var responseTag = responseXML.getElementsByTagName ("response")[0];
	if (!responseTag) return false;

	// The message container
	var responseMessage = responseTag.getElementsByTagName ("message")[0];
	return (responseMessage ? responseMessage.firstChild.nodeValue : false);
}

// Add hooks to basket addition forms
function hijaxBasketAdd () {
	// Get all the forms in the document
	var basketForms = document.getElementsByTagName ("form");

	// Look for that form elements that contain the magic class name
	for (var i = 0; i < basketForms.length; i++) {
		if (basketForms[i].className.toLowerCase ().indexOf ("ajax_intercept") > -1) {
			// Add our hooks to it
			basketForms[i].onsubmit = function () {
				return hijaxInterceptAdd (this);
			}
		}
	}
}

// Add hooks to checkout delivery form
function hijaxCheckoutDelivery () {
	// Get the checkout form
	var checkoutForm = document.getElementById ("checkout");
	if (!checkoutForm) return false;

	// Look for form elements that contatin the magic class name
	var checkoutElems = checkoutForm.getElementsByTagName ("input");
	for (var i = 0; i < checkoutElems.length; i++) {
		if (checkoutElems[i].className.toLowerCase ().indexOf ("ajax_intercept") > -1) {
			// Add our hooks to it
			checkoutElems[i].onclick = function () {
				hijaxInterceptUpdate (this);
				return true;
			}
		}
	}

	// Hide the update button for delivery upgrade
	var deliverySubmit = document.getElementById ("deliverysubmit");
	if (deliverySubmit)
		deliverySubmit.style.visibility = "hidden";
}

function hijaxInterceptAdd (what) {
	// NOTE: Function always returns true to enable failover default form submission
	// Return false is AJAXing was successful and the traditional form submission is to be aborted

	// Ensure we have the form host objects
	var formAjax = what;
	if (!formAjax.elements) return true; // Continue normal page loading

	// Disable the button
	for (var i = 0; i < formAjax.elements.length; i++) {
		if (formAjax.elements[i].type.toLowerCase () == "submit" && formAjax.elements[i].className.toLowerCase ().indexOf ("submitbutton") > -1) {
			var submitButton = formAjax.elements[i];
			submitButton.style.visibility = "hidden";
			break;
		}
	}

	// Create and show the loader image
	var loaderDiv = document.createElement ("p");
	loaderDiv.setAttribute ("class", "ajax-loader-div");
	loaderDiv.className = loaderDiv.getAttribute ("class");
	var loaderMsg = document.createTextNode (" Adding item to basket");
	var loaderImg = document.createElement ("img");
	loaderImg.setAttribute ("src", "/images/ajax-loader.gif");
	loaderImg.setAttribute ("alt", "[Working]");
	loaderImg.setAttribute ("title", loaderImg.getAttribute ("alt"));
	loaderImg.setAttribute ("class", "ajax-loader-img");
	loaderImg.className = loaderImg.getAttribute ("class");
	loaderDiv.appendChild (loaderImg);
	loaderDiv.appendChild (loaderMsg);
	loaderDiv = submitButton.parentNode.appendChild (loaderDiv);

	// Get all the input fields and loop through them
	var formAjaxRequest = formAjax.getAttribute ("action") + "?ajax=1&";
	for (i = 0; i < formAjax.elements.length; i++) {
		// Had to use this obscure logic structure because of several weird browser errors
		// Probably some throwback from the forms host object with regards to the new DOM methods
		if (formAjax.elements[i].name.length > 0) {
			if ((formAjax.elements[i].type.toLowerCase () == "checkbox" && formAjax.elements[i].checked == false) || (formAjax.elements[i].type.toLowerCase () == "radio" && formAjax.elements[i].checked == false)) {
				 // Pwnt
			} else {
				formAjaxRequest += formAjax.elements[i].name + "=" + escape (formAjax.elements[i].value) + "&";
			}
		}
	}

	// Prepare the callback with closures
	var hijaxInterceptAddCallBack = function (httpTransport) {
		hijaxInterceptAddDone (httpTransport, what, loaderDiv, submitButton);
	}

	// Make the request
	var formAjaxSuccess = new httpDo ("GET", formAjaxRequest, hijaxInterceptAddCallBack);

	return !formAjaxSuccess;
}

// Inform the user the action is executed
function hijaxInterceptAddDone (httpTransport, what, loaderDiv, submitButton) {
	// Check we have our parameters
	if (!httpTransport || !what) return false;

	// Remove any user messages already displayed
	var userMessage = document.getElementById ("ajaxresponsemsg");
	if (userMessage) {
		userMessage.parentNode.removeChild (userMessage);
		userMessage = null;
	}

	// Show the response as a user message
	var responseMessage = hijaxGetMessage (httpTransport);
	if (!responseMessage)
		responseMessage = "Completed";
	var addedDiv = document.createElement ("p");
	addedDiv.setAttribute ("id", "ajaxresponsemsg");
	addedDiv.id = addedDiv.getAttribute ("id");
	addedDiv.setAttribute ("class", "notice");
	addedDiv.className = addedDiv.getAttribute ("class");
	var addedMsg = document.createTextNode (responseMessage + " ");
	addedDiv.appendChild (addedMsg);
	var addedLink = document.createElement ("a");
	addedLink.setAttribute ("href", "/basket.php");
	addedLinkMsg = document.createTextNode ("View your basket");
	addedLink.appendChild (addedLinkMsg);
	addedDiv.appendChild (addedLink);
	addedDiv = what.parentNode.parentNode.insertBefore (addedDiv, what.parentNode);

	// Remover the loader and re-enable the submit button
	loaderDiv.parentNode.removeChild (loaderDiv);
	submitButton.style.visibility = "";

	// Tell screen readers that part of the page has changed
	addedDiv.tabindex = -1;

	// Tell the humans that part of the page has been changed
	fadeUp (addedDiv, 255, 255, 0, 100, 228, 255, 255);

	// Reset the form
	var doFormReset = function () { formHardReset (what.parentNode); }
	setTimeout (doFormReset, 500);
}

function hijaxInterceptUpdate (what) {
	// NOTE: Function always returns true to enable failover default form submission
	// Return false is AJAXing was successful and the traditional form submission is to be aborted

	// Ensure we have the form host objects
	if (!what.form) return true;
	var formAjax = what.form;
	if (!formAjax.elements) return true; // Continue normal page loading

	// Create and show the loader image
	var loaderDiv = document.createElement ("p");
	loaderDiv.setAttribute ("class", "ajax-loader-div");
	loaderDiv.className = loaderDiv.getAttribute ("class");
	var loaderMsg = document.createTextNode (" Updating delivery");
	var loaderImg = document.createElement ("img");
	loaderImg.setAttribute ("src", "/images/ajax-loader.gif");
	loaderImg.setAttribute ("alt", "[Working]");
	loaderImg.setAttribute ("title", loaderImg.getAttribute ("alt"));
	loaderImg.setAttribute ("class", "ajax-loader-img");
	loaderImg.className = loaderImg.getAttribute ("class");
	loaderDiv.appendChild (loaderImg);
	loaderDiv.appendChild (loaderMsg);
	loaderDiv = document.getElementById ("deliverysubmit").parentNode.appendChild (loaderDiv);

	// Get all the input fields and loop through them
	var formAjaxRequest = formAjax.getAttribute ("action") + "?ajax=1";
	var formAjaxData = "";
	for (i = 0; i < formAjax.elements.length; i++) {
		// Had to use this obscure logic structure because of several weird browser errors
		// Probably some throwback from the forms host object with regards to the new DOM methods
		if (formAjax.elements[i].name.length > 0) {
			if ((formAjax.elements[i].type.toLowerCase () == "checkbox" && formAjax.elements[i].checked == false) || (formAjax.elements[i].type.toLowerCase () == "radio" && formAjax.elements[i].checked == false)) {
				 // Pwnt
			} else {
				formAjaxData += formAjax.elements[i].name + "=" + escape (formAjax.elements[i].value) + "&";
			}
		}
	}

	// Prepare the callback with closures
	var hijaxInterceptUpdateCallBack = function (httpTransport) {
		hijaxInterceptUpdateDone (httpTransport, formAjax, loaderDiv);
	}

	// Make the request
	var formAjaxSuccess = new httpDo ("POST", formAjaxRequest, hijaxInterceptUpdateCallBack, formAjaxData);

	return !formAjaxSuccess;
}

// Inform the user the action is executed
function hijaxInterceptUpdateDone (httpTransport, what, loaderDiv) {
	// Check we have our parameters
	var deliveryCell = document.getElementById ("deliverycell");
	var grandTotalCell = document.getElementById ("grandtotalcell");
	if (!httpTransport || !what || !deliveryCell || !grandTotalCell) return false;

	// Display new delivery
	var responseXML = httpTransport.responseXML;
	if (responseXML) {
		// The response container
		var responseTag = responseXML.getElementsByTagName ("response")[0];
		if (responseTag) {
			// The delivery element
			var responseValue = responseTag.getElementsByTagName ("delivery")[0];
			deliveryCell.firstChild.nodeValue = (responseValue.firstChild.nodeValue == "0.00" ? "FREE" : "£" + responseValue.firstChild.nodeValue);

			// The grandtotal element
			responseValue = responseTag.getElementsByTagName ("grandtotal")[0];
			grandTotalCell.firstChild.nodeValue = "£" + responseValue.firstChild.nodeValue + " GBP";
		}
	}

	// Remover the loader
	loaderDiv.parentNode.removeChild (loaderDiv);

	// Tell screen readers that part of the page has changed
	what.parentNode.tabindex = -1;

	// Tell the humans that part of the page has been changed
	fadeUp (deliveryCell, 255, 255, 0, 100);
	fadeUp (grandTotalCell, 255, 255, 0, 100);
}

// Add load events
winAddReadyEvent (hijaxBasketAdd);
winAddReadyEvent (hijaxCheckoutDelivery);
