// Hold an instance of XMLHttpRequestvar xmlHttp = createXmlHttpRequestObject();// Display error messages (true) or degrade to non-AJAX behavior (false) var showErrors = true;// Contain link or form clicked/submitted by visitorvar actionObject = '';// True when place order button clicked else flasevar placingOrder = false;// Create XMLHttpRequest instancefunction createXmlHttpRequestObject() {	// Store XMLHttpRequest object	var xmlHttp;	// Create XMLHttpRequest object	try {		// Try to create native XMLHttpRequest object 		xmlHttp = new XMLHttpRequest();	}	catch(e) {		// Assume IE6 or older		var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0", "MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP");		// Try every id until one works		for (i = 0; i < XmlHttpVersions.length && !xmlHttp; i++) {			try {				// Try to create XMLHttpRequest object				xmlHttp = new ActiveXObject(XmlHttpVersions[i]);			}			catch(e) {} // Ignore potential error		}	}	// If XMLHttpRequest object created successfully, return it 	if (xmlHttp) {		return xmlHttp;	}	// If error, pass to handleError	else {		handleError("Error creating the XMLHttpRequest object.");	}}// Display error message or degrade to non-AJAX behaviorfunction handleError($message) {	// Ignore errors if showErrors is false	if (showErrors) {		// Display error message		alert("Error encountered: \n" + $message);		return false;	}	// Fall back to non-AJAX behavior 	else if (!actionObject.tagName) {		return true;	}	// Fall back to non-AJAX behavior by following link	else if (actionObject.tagName == 'A') {		window.location = actionObject.href;	}	// Fall back to non-AJAX behavior by submitting form	else if (actionObject.tagName == 'FORM') {		actionObject.submit();	}}// Add product to shopping cartfunction addProductToCart(form) {	// Display updating message	document.getElementById('updating').style.visibility = 'visible';	// Degrade to old skool form submit if XMLHttpRequest not available 	if (!xmlHttp) return true;	// Create asynchronous URL	request = form.action + '&AjaxRequest';	params = '';	// Obtain selected attributes	formSelects = form.getElementsByTagName('SELECT');	if (formSelects) {		for (i = 0; i < formSelects.length; i++) {			params += '&' + formSelects[i].name + '=';			selected_index = formSelects[i].selectedIndex;			params += encodeURIComponent(formSelects[i][selected_index].text);		}	}	// Try connecting to server	try {		// Continue only if XMLHttpRequest object not busy		if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0) {			// Make server request to validate extracted data			xmlHttp.open("POST", request, true);			xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");			xmlHttp.onreadystatechange = addToCartStateChange;			xmlHttp.send(params);		}	}	catch(e) {		// Handle error		handleError(e.toString());	}	// Stop old skool form submit if AJAX action succeeded	return false;}// Retrieve HTTP responsefunction addToCartStateChange() {	// When readyState 4, also read server response	if (xmlHttp.readyState == 4) {		// Continue only if HTTP status okay		if (xmlHttp.status == 200) {			try {				updateCartSummary();			}			catch(e) {				handleError(e.toString());			}		}		else {			handleError(xmlHttp.statusText);		}	}}// Process server responsefunction updateCartSummary() {	// Read the response	response = xmlHttp.responseText;	// Server error?	if (response.indexOf("ERRNO") >= 0 || response.indexOf("error") >= 0) {		handleError(response);	}	else {		// Extract content of cart div element		var cartSummaryRegEx = /^<div class="box base-mini" id="cart-summary">([\s\S]*)<\/div>$/m;		matches = cartSummaryRegEx.exec(response);		response = matches[1];		// Update cart box and hide loading message		document.getElementById("cart-summary").innerHTML = response;		// Hide updating message		document.getElementById('updating').style.visibility = 'hidden';	}}// Called on shopping cart update actionsfunction executeCartAction(obj) {	// Degrade to old skool form submit for place order action	if (placingOrder) return true;	// Display updating message	document.getElementById('updating').style.visibility = 'visible';	// Degrade to old skool form submit if XMLHttpRequest is not available 	if (!xmlHttp) return true;	// Save object reference 	actionObject = obj;	// Initialise response and parameters	response = '';	params = '';	// If link was clicked, get href attribute	if (obj.tagName == 'A') {		url = obj.href + '&AjaxRequest';	}	// If form submitted, get elements	else {		url = obj.action + '&AjaxRequest';		formElements = obj.getElementsByTagName('INPUT');		if (formElements) {			for (i = 0; i < formElements.length; i++) {				if (formElements[i].name != 'place_order') {					params += '&' + formElements[i].name + '=';					params += encodeURIComponent(formElements[i].value);				}			}		}	}	// Try connecting to server	try {		// Make server request only if XMLHttpRequest object isn't busy		if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0) {			xmlHttp.open("POST", url, true);			xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");			xmlHttp.onreadystatechange = cartActionStateChange;			xmlHttp.send(params);		}	}	catch(e) {		// Handle error		handleError(e.toString());	}	// Stop old skool form submit if AJAX action succeeded	return false;}// Retrieve HTTP responsefunction cartActionStateChange() {	// When readyState 4, read server response	if (xmlHttp.readyState == 4) {		// Continue only if HTTP status ok		if (xmlHttp.status == 200) {			try {				// Read the response				response = xmlHttp.responseText;				// Server error?				if (response.indexOf("ERRNO") >= 0 || response.indexOf("error") >= 0) {					handleError(response);				}				else {					// Update cart					document.getElementById("contents").innerHTML = response;					// Hide updating message					document.getElementById('updating').style.visibility = 'hidden';				}			}			catch(e) {				// Handle error				handleError(e.toString());			}		}		else {			// Handle error			handleError(xmlHttp.statusText);		}	}}