var xmlDelayMin = 400;
var xmlDelayMax = 1500;

var xmlDelay = xmlDelayMin;

var xmlHTTP = false;
try {
	xmlHTTP = new XMLHttpRequest();
} catch (trymicrosoft) {
	try {
		xmlHTTP = new ActiveXObject("Msxml2.XMLHTTP");
	} catch (othermicrosoft) {
		try {
			xmlHTTP = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (failed) {
			xmlHTTP = false;
		}
	}
}

if( !xmlHTTP )
	alert("Error initializing XMLHttpRequest!");

var timerActive = false;
var timerEvent = 0;

function ajaxReturn() {
	var httpStatus = 0;
	var httpReady = 0;
	var rndReturn = "xxxx";

	if( xmlHTTP.readyState == 4 ) {
		if( timerActive ) {
			timerActive = false;
			clearInterval( timerEvent );
		}

		try {
			// check return http status
			// set delay to minimum
			httpStatus = xmlHTTP.status;
			xmlDelay = xmlDelayMin;
		} catch( noStatus ) {
			// unable to check status, requery
			// set delay to maximum
			httpStatus = 0;
			xmlDelay = xmlDelayMax;

			quoteGenerate();
			return false;
		}

		if( httpStatus == 200 ) {
			var xmlDOM
			try {
				xmlDOM = xmlHTTP.responseXML.documentElement;
			} catch( noStatus ) {
				alert( xmlHTTP.responseText );
				return false;
			}

			if( !(document.getElementById("cprint") === null) ) {
				document.getElementById("cprint").innerHTML = xmlDOM.getElementsByTagName("print")[0].firstChild.data;
				document.getElementById("cfinish").innerHTML = xmlDOM.getElementsByTagName("finish")[0].firstChild.data;
				document.getElementById("cextra").innerHTML = xmlDOM.getElementsByTagName("extra")[0].firstChild.data;
				document.getElementById("cdelivery").innerHTML = xmlDOM.getElementsByTagName("delivery")[0].firstChild.data;
				document.getElementById("csetup").innerHTML = xmlDOM.getElementsByTagName("setup")[0].firstChild.data;
			}

			document.getElementById("tsub").innerHTML = "<b>" + xmlDOM.getElementsByTagName("subtotal")[0].firstChild.data + "</b>";

			if( !(document.getElementById("tend") === null) ) {
				document.getElementById("ttax").innerHTML = xmlDOM.getElementsByTagName("tax")[0].firstChild.data;
				document.getElementById("tend").innerHTML = xmlDOM.getElementsByTagName("total")[0].firstChild.data;
			}

			if( xmlDOM.getElementsByTagName("feedback")[0].hasChildNodes() ) {
				document.getElementById("matrixFeedback").innerHTML = xmlDOM.getElementsByTagName("feedback")[0].firstChild.data;
			} else {
				document.getElementById("matrixFeedback").innerHTML = "";
			}

			rndReturn = xmlDOM.getElementsByTagName("random")[0].firstChild.data;
			document.PriceCalc.randomQuery.value = rndReturn;

			if( document.PriceCalc.random.value != rndReturn ) {
				quoteGenerate(); // requote
			} else {
				document.PriceCalc.dataQuery.value = ajaxFormData( document.PriceCalc ); // store request data
			}

			if( xmlDOM.getElementsByTagName("login")[0].firstChild.data != document.PriceCalc.loginPrice.value ) {
				if( document.PriceCalc.expired.value == "0" ) {
					document.PriceCalc.expired.value = "1";
					alert( "Attention...\n\nYou are not seeing your true price as your session has expired.\n\nPlease refresh the page and log in again." );
				}
			}

		} else if( httpStatus != 0 ) {
			alert("Encountered a problem estimating cost.  Please contact us.");
		}
	}
}

function ajaxRequest() {
	var formData = "";

	if( timerActive ) {
		timerActive = false;
		clearInterval( timerEvent );
	}

	if( xmlHTTP.readyState == 1 || xmlHTTP.readyState == 2 || xmlHTTP.readyState == 3 ) {
		xmlHTTP.onreadystatechange = function(){};
		xmlHTTP.abort();
	}

	document.PriceCalc.mode.value = "quote";
	formData = ajaxFormData( document.PriceCalc );

	xmlHTTP.open("POST", "/pricing/core_ajax.asp", true);
	xmlHTTP.setRequestHeader( "Content-Type","application/x-www-form-urlencoded" );
	xmlHTTP.onreadystatechange = ajaxReturn;
	xmlHTTP.send( formData );
}

function ajaxFormData( objForm ){
	var formData = "";
	var ignoreList = "|JobName|JobOrderRef|randomQuery|dataQuery|traceEnable|";

	objForm.mode.value = "quote";
	for( var i=0; i<objForm.elements.length; i++ ) {
		// check element name is not blank and isnt set to ignore
		if( objForm.elements[i].name != "" && ignoreList.indexOf( "|"+objForm.elements[i].name+"|" ) == -1 ) {
			// check element is not a text area
			if( objForm.elements[i].type != "textarea" ) {
				if( formData != "" )
					formData += "&";
				
				if( objForm.elements[i].type != "checkbox" )
					formData += objForm.elements[i].name+"="+escape(objForm.elements[i].value);
				else if( objForm.elements[i].type == "checkbox" && objForm.elements[i].checked )
					formData += objForm.elements[i].name+"="+escape(objForm.elements[i].value);
				else
					formData += objForm.elements[i].name+"=";
			}
		}
	}
	
	return formData;
}

function quoteGenerate(){

	if( !quoteChanged( document.PriceCalc.dataQuery.value, document.PriceCalc, document.getElementById("tsub") ) ) {
		return false;
	}

	document.PriceCalc.random.value = randomString();

	if( timerActive ) {
		clearInterval( timerEvent );
	}
	timerActive = true;
	timerEvent = setInterval( ajaxRequest, xmlDelay );

	if( !(document.getElementById("cprint") === null) ) {
		document.getElementById("cprint").innerHTML = "-";
		document.getElementById("cfinish").innerHTML = "-";
		document.getElementById("cextra").innerHTML = "-";
		document.getElementById("cdelivery").innerHTML = "-";
		document.getElementById("csetup").innerHTML = "-";
	}

	document.getElementById("tsub").innerHTML = "<b>calculating</b>";

	if( !(document.getElementById("tend") === null) ) {
		document.getElementById("ttax").innerHTML = "-";
		document.getElementById("tend").innerHTML = "calculating";
	}
}

function quoteChanged( stringRequest, objForm, objPrice ) {

	// compare previous request to current request	
	if( stringRequest == ajaxFormData( objForm ) ) {
		// data has not changed, but confirm a price was generated
		if( objPrice.innerHTML == "" || objPrice.innerHTML == "<b>-</b>" || objPrice.innerHTML == "<b>calculating</b>" ) {
			// price not displayed + data not changed
			return true;
		} else {
			// price displayed + data not changed
			//alert("Data changed?  No, subtotal available");
			return false;
		}
	} else {
		// data changed
		//alert("Data changed?  Yes");
		return true;
	}
	return true;
}

function randomString() {
	var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ";
	var string_length = 8;
	var randomstring = "";
	for (var i=0; i<string_length; i++) {
		var rnum = Math.floor(Math.random() * chars.length);
		randomstring += chars.substring(rnum,rnum+1);
	}
	return randomstring;
}

quoteGenerate();

