
/**************************************************
* 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);
			}
		}
	}
}


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;
	var formAjaxInputs = what.getElementsByTagName ("input");

	// Disable the button
	for (var i = 0; i < formAjaxInputs.length; i++) {
		if (formAjaxInputs[i].getAttribute ("type").toLowerCase () == "submit" && formAjaxInputs[i].className.toLowerCase ().indexOf ("submitbutton") > -1) {
			var submitButton = formAjaxInputs[i];
			submitButton.style.visibility = "hidden";
			break;
		}
	}

	// Remove any user messages already displayed
	var userMessage = document.getElementById ("ajaxresponsemsg");
	if (userMessage) {
		userMessage.parentNode.removeChild (userMessage);
		userMessage = null;
	}

	// Create and show the loader image
	var loaderDiv = document.createElement ("p");
	loaderDiv.setAttribute ("class", "ajax_loader_div");
	loaderDiv.className = loaderDiv.getAttribute ("class");

	loaderDiv.style.height='0px';
	loaderDiv.style.overflow='hidden';

	var loaderMsg = document.createTextNode ("Amending your basket, please wait");
	loaderDiv.appendChild (loaderMsg);

	loaderDiv = what.parentNode.insertBefore (loaderDiv, what.parentNode.childNodes[0]);

	expand(1,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 && 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) {
		var callBackDelay = function() {
			hijaxInterceptAddDone (httpTransport, what, loaderDiv, submitButton);
		}

		window.setTimeout(callBackDelay,2000);
	}

	// 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", "message");
	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);
	//addedDiv = what.parentNode.appendChild (addedDiv);
	addedDiv = what.parentNode.insertBefore (addedDiv, what.parentNode.childNodes[0]);

	// 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 expand(increment,scroller) {
	increment += increment;
	var myHeight = scroller.offsetHeight + increment;

	if (scroller.expanding)
		clearTimeout(scroller.expanding);

	//if (myHeight >= maxHeight || myHeight > frameHeight) {
	if (myHeight >= scroller.scrollHeight) {
		scroller.style.height=scroller.scrollHeight+"px";
	}
	else {
		scroller.style.height=(myHeight)+'px';
		scroller.expanding = setTimeout(function(){expand(increment,scroller)},20);
	}

	return true;
}

// Add load events
winAddReadyEvent (hijaxBasketAdd);
