// JavaScript Document

/* 
	SET GLOBALS VARIABLES
*/
fieldErrorBgColor = '#FFB9B9';
fieldBgColor = '#FFFFFF';

/*
   FUNCTIONS
*/
function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}
function MM_goToURL() { //v3.0
  var i, args=MM_goToURL.arguments; document.MM_returnValue = false;
  for (i=0; i<(args.length-1); i+=2) eval(args[i]+".location='"+args[i+1]+"'");
}
function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

function MM_openBrWindow(theURL,winName,features) { //v2.0
  window.open(theURL,winName,features);
}

function MM_showHideLayers() { //v6.0
  var i,p,v,obj,args=MM_showHideLayers.arguments;
  for (i=0; i<(args.length-2); i+=3) if ((obj=MM_findObj(args[i]))!=null) { v=args[i+2];
    if (obj.style) { obj=obj.style; v=(v=='show')?'visible':(v=='hide')?'hidden':v; }
    obj.visibility=v; }
}
/* cross-browser function to get an object's style object given its id*/
function getStyleObject(objectId) {
	if(document.getElementById && document.getElementById(objectId)) {
		/* W3C DOM*/
		return document.getElementById(objectId).style;
	} else if (document.all && document.all(objectId)) {
		/* MSIE 4 DOM*/
		return document.all(objectId).style;
	} else if (document.layers && document.layers[objectId]) {
		/* NN 4 DOM.. note: this won't find nested layers*/
		return document.layers[objectId];
	} else {
		return false;
	}
};

function setRelLayerPos(objectId,xOffset,yOffset,e) {
    // get the event object
	if (e && e.which){
		e = e;
	} else {
		e = event;
	}
	// get the correct property; browser differences ;-)
	if (e.clientX > 0 && e.clientY > 0) {
		var newX = e.clientX + xOffset;
		var newY = e.clientY + yOffset;
	} else if (e.pageX > 0 && e.pageY > 0) {
		var newX = e.pageX + xOffset;
		var newY = e.pageY + yOffset;
	} else {
		return false;
	}
	var layer = getStyleObject(objectId);
	if(layer) {
		layer.left = newX + "px";
		layer.top = newY + "px";
	} else {
		return false;
	}
	
}

// returns true if date appears to be valid
// returns false if the date appears to be invalid
// 1arg; = text input object, string should be like: yyyy-mm-dd
function ckDate(textObject) {
	var x = 0;
	var fieldVal = textObject.value;
	var isError = 0;
	var errorMsg = "Date must be in YYYY-MM-DD format.\nExample: 2004-04-29";
	if (fieldVal.length === 0 || !fieldVal.length) {
		return true;
	}
	if (fieldVal.length != 10) {	// all dates should be exactly 10 digits
		isError = 1;
	}
	for (x=0; x<fieldVal.length; x++) {
		if (x == 4 || x == 7) {	// delimeter digits must be '-'
			if(fieldVal.charCodeAt(x) != 45){
				isError = 1;
				break;
			} else { continue; }
		}
		if (x == 5) {	// first digit for a month must be 0 or 1
			if(fieldVal.charCodeAt(x) != 48 && fieldVal.charCodeAt(x) != 49){
				isError = 1;
				break;
			} else { continue; }
		}
		if (x == 6) {	// second digit for a month must be 0,1,2 if the first is 1
			if(fieldVal.charCodeAt(5) == 49){
				if(fieldVal.charCodeAt(x) != 48 && fieldVal.charCodeAt(x) != 49 && fieldVal.charCodeAt(x) != 50){
					isError = 1;
					break;
				} else { continue; }
			}
		}
		if (x == 8) {	// first digit for a day must be 0,1,2,3
			if(fieldVal.charCodeAt(x) != 48 && fieldVal.charCodeAt(x) != 49 && fieldVal.charCodeAt(x) != 50 && fieldVal.charCodeAt(x) != 51){
				isError = 1;
				break;
			} else { continue; }
		}
		if (x == 9) {	// second digit for a day must be 0 or 1 if the first is 3
			if(fieldVal.charCodeAt(8) == 51){
				if(fieldVal.charCodeAt(x) != 48 && fieldVal.charCodeAt(x) != 49){
					isError = 1;
					break;
				} else { continue; }
			}
		}
		// all other digits must be between 0-9
		if(fieldVal.charCodeAt(x) < 48 || fieldVal.charCodeAt(x) > 57){
			isError = 1;
			break;
		}
	}
	if (isError == 1) {
		textObject.select();
		alert(errorMsg);
		return false;
	} else {
		return true;
	}
}

// function that only allows input of 0-9,backspace
function numbersOnly(e) {
	var characterCode;
	if (e && e.which){
		e = e;
		characterCode = e.which;
	} else {
		e = event;
		characterCode = e.keyCode;
	}	 
	if(characterCode >= 48 && characterCode <= 57){
		return true;
	}
	if(characterCode == 8 || characterCode == 46){
		return true;
	} else {
		return false;
	}
}

// function that only allows input of 0-9,.,backspace
function numbersDashesOnly(e) {
	var characterCode;
	if (e && e.which){
		e = e;
		characterCode = e.which;
	} else {
		e = event;
		characterCode = e.keyCode;
	}	 
	if(characterCode >= 48 && characterCode <= 57){
		return true;
	}
	if(characterCode == 45 || characterCode == 46 || characterCode == 8){
		return true;
	} else {
		return false;
	}
}

function submitQuote() {
	if (document.submitQuoteForm.ccNumber.value.length < 1 && document.submitQuoteForm.purchaseOrder.value.length < 1) {
		alert("You must enter a credit card or purchase order number.");
		return false;
	}
	if (document.submitQuoteForm.agree_to_terms.checked != true) {
		alert("You must indicate that you have read and agree to the Terms of Service.");
		return false;
	}
	return true;
}

/*
 +----------------------------------+
 | GLOBAL AJAX Functions            |
 +----------------------------------+
*/

// The following function creates an XMLHttpRequest object...
function createRequestObject() {
	var request_o; //declare the variable to hold the object.
	var browser = navigator.appName; //find the browser name
	if (browser == "Microsoft Internet Explorer") {
		request_o = new ActiveXObject("Microsoft.XMLHTTP"); /* Create the object using MSIE's method */
	} else {
		request_o = new XMLHttpRequest(); /* Create the object using other browser's method */
	}
	return request_o; //return the object
}

// get the xmlreq object asa global var
var http = createRequestObject();

function clearSubSteps(subLayerIds) {
	if (subLayerIds.length >= 1) {
		var subIds = subLayerIds.split(',');
		for (i=0; i<subIds.length; i++) {
			document.getElementById(subIds[i]).innerHTML = '&nbsp;';
		}
	}
	return true;
}

function setFinalOpts(nextLayerId) {
	if (nextLayerId == "addToQuote") {
		document.getElementById("addToQuote").style.visibility = "visible";
		//return false;
	} else {
		// always turn off the final options layer
		document.getElementById("addToQuote").style.visibility = "hidden";
	}
	return true;
}

function getNextStep(formObj, selectObj, nextLayerId, subLayerIds, currentStep) {
	
	// clear out all subsequent steps if needed and reset currentStep
	clearSubSteps(subLayerIds);
	
	// setup some vars
	var pLine = formObj.pLine.value;
	var pType = formObj.pType.value;
					//var section = formObj.section.value;
					//var currentStep = parseInt(formObj.currentStep.value);
	var currentStepValue = selectObj.options[selectObj.selectedIndex].value;
	var totalSteps = formObj.totalSteps.value;
	
	// basic error checking
	if (!formObj) { alert("Unknown Error: please try again."); return false; }
	// if next step is to add to quote, turn on the finial options layer
	setFinalOpts(nextLayerId);
	
	// if a default has been selected, no reason to continue
	if (currentStepValue == "--Select One--") { return false; }
	
	http.abort();
	http.open('post', 'quote_mgr.php');
	http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	http.onreadystatechange = function () {
		if (http.readyState == 4) { //Finished loading the response
			var response = http.responseText;
			if (response.substr(0, 5) == "Error") {
				selectObj.selectedIndex = 0;
				setFinalOpts();	// clear the final options layer
				alert(response);
			} else {
				if (nextLayerId == "addToQuote") {
					if (pLine == "Extrusion") {
						document.forms[formObj.name].section.value = response;
					} else if (pLine == "Sheet") {
						document.forms[formObj.name].description.value = response;
					}
					document.forms[formObj.name].action.value = "addToQuote";
				} else {
					document.getElementById(nextLayerId).innerHTML = response;
				}
			}
		}
	};
	http.send('action=getModule' + 
			  '&subaction=getNextStep' + 
			  '&pLine=' + pLine + 
			  '&pType=' + pType + 
			  '&currentStep=' + currentStep + 
			  '&currentStepValue=' + currentStepValue);
	return false;
}

function ckAddToQuote(formObj) {
	// check the pLine
	if (formObj.pLine.value.length < 1) {
		alert("Unknown product line error. Please try again.");
		return false;
	}
	// check the pLine
	if (formObj.pType.value.length < 1) {
		alert("Unknown product type error. Please try again.");
		return false;
	}
	// check the section (number)
	if (formObj.section.value.length < 1 && formObj.pLine.value == "Extrusion") {
		alert("Unknown product section error. Please try again.");
		return false;
	}
	// check the quantity
	if (formObj.quantity.value < 1 || isNaN(parseInt(formObj.quantity.value))) {
		alert("You must enter a valid numerical part quantity error. Please try again.");
		formObj.quantity.select();
		return false;
	}
	// check the finish
	if (formObj.pLine.value == "Extrusion" && formObj.finish) {
		if (formObj.finish.value.length < 1 || formObj.finish.value == "--Select One--") {
			alert("You must select a valid finish option. Please try again.");
			formObj.finish.focus();
			return false;
		}
	}
	// no errors, return true;
	return true;
}

function pauseProcessing(millis) {
	var date = new Date();
	var curDate = null;
	
	do { curDate = new Date(); }
	while(curDate-date < millis);
}

function doesQuoteHaveOtherPLines(formObj) {
	// add to session via ajax
	var http2 = createRequestObject();
	http2.abort();
	http2.open('GET', 'quote_mgr.php?paction=ckPLines&pLine=' + formObj.pLine.value);
	http2.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	http2.onreadystatechange = function  () {
		if (http2.readyState == 4) { //Finished loading the response
			if (http2.responseText == "1") {
				if(!confirm("Sheet and Extrusion products may not be combined on a single quote. \nAdding this product(s) to your quote will cause all products from other \nproduct lines to be removed from this quote.\n\nDo you wish to continue adding this product(s) to the current quote?")) {
					window.location = '/quote_mgr.php?action=showQuote';
					return false;
				}
			}
			return commitToQuote(formObj);
		}
	};
	http2.send(null);
	return true;
}

function addToQuote(formObj) {
	// basic error checking
	if (!formObj) { alert("Unknown Error: please try again."); return false; }
	
	/* validate the required fields */
	if (!ckAddToQuote(formObj)) {
		return false;
	}
	/* see if the user is adding products from a different pLine and give option to back out */
	return doesQuoteHaveOtherPLines(formObj);
}

function commitToQuote(formObj) {
	// add to session via ajax
	http = null;
	var http = createRequestObject();
	http.abort();
	http.open('post', 'quote_mgr.php');
	http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
	http.onreadystatechange = function () {
		if (http.readyState == 4) { //Finished loading the response
			if (http.responseText == "Part Successfully Added To Your Quote.") {
				window.location = '/quote_mgr.php?action=showQuote';
			} else {
				alert(http.responseText);
			}
		}
	};
	if (formObj.pLine.value == "Extrusion") {
		http.send('action=addToQuote' + 
			  '&pLine=' + formObj.pLine.value + 
			  '&pType=' + formObj.pType.value + 
			  '&section=' + formObj.section.value + 
			  '&finish=' + formObj.finish.value + 
			  '&quantity=' + formObj.quantity.value + 
			  '&po=' + formObj.po.value);
	} else if (formObj.pLine.value == "Sheet") {
		http.send('action=addToQuote' + 
			  '&pLine=' + formObj.pLine.value + 
			  '&pType=' + formObj.pType.value + 
			  '&description=' + formObj.description.value + 
			  '&finish=' + formObj.finish.value + 
			  '&quantity=' + formObj.quantity.value + 
			  '&po=' + formObj.po.value);
	}
	return false;
}

/*function getFinalOptions(prod_id, productLine, productCat) {
	
	http.open('get', 'quote_mgr.php?action=getFinalOpts&prod_id=' + prod_id + '&prod_line_code=' + productLine + '&prod_cat_code=' + productCat);
	http.onreadystatechange = function () {
		if (http.readyState == 4) { // Finished loading the response
			response = http.responseText;
			var content = '<p class="bodyRegular">Color: ' + colorMenu + '</p>' + 
					'<p class="bodyRegular">Quantity: <input type="text" name="qty" class="formInputBoxes" value="1" size="10" maxlength="5" onKeyPress="return numbersOnly(event)"></p>' +
					'<p class="footerLinks">*Note: Hardware & Accessories sold seperately.</p>' +
					'<p class="footerLinks"><input name="Submit" type="button" class="formSubmitButtons" value="Add To Quote" onClick="return addToQuote();"> &nbsp;' +
					'<input name="prod_id" type="hidden" id="prod_id" value="' + prod_id + '"></p>';
			document.getElementById('final_opts').innerHTML = response;
		}
	};
	http.send(null);
}

function clearFinalOpts() {
	document.getElementById('final_opts').innerHTML = '';
}
*/
/* 
 +---------------------------+
 | Form Validation Functions | 
 +---------------------------+
*/

// evaluate the results of a form validation function and 
// alert any errors and return false;
// submit form and return true if no errors
function evalFormErrors(theForm, isError, errMsg) {
	if (isError >= 1) {	// spit up the error and return false
		alert(errMsg);
		return false;
	} else {	// no erros, submit and return true
		theForm.submit();
		return true;
	}
}

// clear out all error indicators
function clearFormErrors(formObject) {
	for (i=0; i<formObject.elements.length; i++) {
		if (formObject.elements[i].style.backgroundColor != fieldBgColor) {
			formObject.elements[i].style.backgroundColor = fieldBgColor;
		}
	}
}

// validate required fields for new account requests
function ckNewAcctReq() {
	
	var is_error = 0;
	var error_msg = "The following fields have errors that need to be corrected before continuing:\n\n";
	var formObject = document.getNewCustomerForm;
	
	clearFormErrors(formObject);	// clear out all previous errors and re-evaluate
	
	// Evaluate the fullname field
	if (formObject.fullname.value.length < 1) {
		formObject.fullname.style.backgroundColor = fieldErrorBgColor;
		error_msg = error_msg + "- Name\n";
		is_error = 1;
	}
	// Evaluate the email field
	if (formObject.email.value.length < 1) {
		formObject.email.style.backgroundColor = fieldErrorBgColor;
		error_msg = error_msg + "- Email\n";
		is_error = 1;
	}
	// Evaluate the login field
	if (formObject.login.value.length < 1) {
		formObject.login.style.backgroundColor = fieldErrorBgColor;
		error_msg = error_msg + "- Login\n";
		is_error = 1;
	}
	// Evaluate the password field
	if (formObject.password.value.length < 1) {
		formObject.password.style.backgroundColor = fieldErrorBgColor;
		error_msg = error_msg + "- Password\n";
		is_error = 1;
	}
	if (formObject.password2.value != formObject.password.value) {
		formObject.password2.style.backgroundColor = fieldErrorBgColor;
		error_msg = error_msg + "- Repeat Password Mismatch\n";
		is_error = 1;
	}
	// Evaluate the address1 field
	if (formObject.address1.value.length < 1) {
		formObject.address1.style.backgroundColor = fieldErrorBgColor;
		error_msg = error_msg + "- Address 1\n";
		is_error = 1;
	}
	// Evaluate the city field
	if (formObject.city.value.length < 1) {
		formObject.city.style.backgroundColor = fieldErrorBgColor;
		error_msg = error_msg + "- City\n";
		is_error = 1;
	}
	// Evaluate the state field
	if (formObject.state.value.length < 1) {
		formObject.state.style.backgroundColor = fieldErrorBgColor;
		error_msg = error_msg + "- State\n";
		is_error = 1;
	}
	// Evaluate the zip field
	if (formObject.zip.value.length < 1) {
		formObject.zip.style.backgroundColor = fieldErrorBgColor;
		error_msg = error_msg + "- Zip/Province Code\n";
		is_error = 1;
	}
	// Evaluate the country field
	if (formObject.country.value.length < 1) {
		formObject.country.style.backgroundColor = fieldErrorBgColor;
		error_msg = error_msg + "- Country\n";
		is_error = 1;
	}
	// Evaluate the phone field
	if (formObject.phone.value.length < 1) {
		formObject.phone.style.backgroundColor = fieldErrorBgColor;
		error_msg = error_msg + "- Telephone\n";
		is_error = 1;
	}
	/* evaluate test results and act accordingly */
	return evalFormErrors(formObject, is_error, error_msg);
}

function ckLogin() {
	
	var is_error = 0;
	var error_msg = "The following fields have errors that need to be corrected before continuing:\n\n";
	var formObject = document.loginForm;
	
	clearFormErrors(formObject);	// clear out all previous errors and re-evaluate
	
	// Evaluate the login field
	if (formObject.login.value.length < 1) {
		formObject.login.style.backgroundColor = fieldErrorBgColor;
		error_msg = error_msg + "- Login\n";
		is_error = 1;
	}
	// Evaluate the password field
	if (formObject.password.value.length < 1) {
		formObject.password.style.backgroundColor = fieldErrorBgColor;
		error_msg = error_msg + "- Password\n";
		is_error = 1;
	}
	/* evaluate test results and act accordingly */
	return evalFormErrors(formObject, is_error, error_msg);
}

function ckRootLogin() {
	
	var is_error = 0;
	var error_msg = "The following fields have errors that need to be corrected before continuing:\n\n";
	var formObject = document.login;
	
	clearFormErrors(formObject);	// clear out all previous errors and re-evaluate
	
	// Evaluate the login field
	if (formObject.username.value.length < 1) {
		formObject.username.style.backgroundColor = fieldErrorBgColor;
		error_msg = error_msg + "- Username\n";
		is_error = 1;
	}
	// Evaluate the password field
	if (formObject.password.value.length < 1) {
		formObject.password.style.backgroundColor = fieldErrorBgColor;
		error_msg = error_msg + "- Password\n";
		is_error = 1;
	}
	/* evaluate test results and act accordingly */
	return evalFormErrors(formObject, is_error, error_msg);
}

function ckModifyShipTo() {
	
	var is_error = 0;
	var error_msg = "The following fields have errors that need to be corrected before continuing:\n\n";
	var formObject = document.updateShipAddress;
	
	clearFormErrors(formObject);	// clear out all previous errors and re-evaluate
	
	// Evaluate the name field
	if (formObject.shipToName.value.length < 1) {
		formObject.shipToName.style.backgroundColor = fieldErrorBgColor;
		error_msg = error_msg + "- Name\n";
		is_error = 1;
	}
	// Evaluate the address 1 field
	if (formObject.shipToAddress1.value.length < 1) {
		formObject.shipToAddress1.style.backgroundColor = fieldErrorBgColor;
		error_msg = error_msg + "- Address\n";
		is_error = 1;
	}
	// Evaluate the city field
	if (formObject.shipToCity.value.length < 1) {
		formObject.shipToCity.style.backgroundColor = fieldErrorBgColor;
		error_msg = error_msg + "- City\n";
		is_error = 1;
	}
	// Evaluate the state field
	if (formObject.shipToState.value.length < 1 || formObject.shipToState.value == "--Select--") {
		formObject.shipToState.style.backgroundColor = fieldErrorBgColor;
		error_msg = error_msg + "- State\n";
		is_error = 1;
	}
	// Evaluate the zip field
	if (formObject.shipToZip.value.length < 1) {
		formObject.shipToZip.style.backgroundColor = fieldErrorBgColor;
		error_msg = error_msg + "- Zip Code\n";
		is_error = 1;
	}
	// Evaluate the country field
	//if (formObject.shipToCountry.value.length < 1 && formObject.shipToState.value.length < 1) {
	//	formObject.shipToCountry.style.backgroundColor = fieldErrorBgColor;
	//	error_msg = error_msg + "- Country\n";
	//	is_error = 1;
	//}
	// Evaluate the phone field
	if (formObject.shipToPhone.value.length < 1) {
		formObject.shipToPhone.style.backgroundColor = fieldErrorBgColor;
		error_msg = error_msg + "- Phone\n";
		is_error = 1;
	}
	/* evaluate test results and act accordingly */
	return evalFormErrors(formObject, is_error, error_msg);
}

function ckForgotPassReq() {
	
	var is_error = 0;
	var error_msg = "The following fields have errors that need to be corrected before continuing:\n\n";
	var formObject = document.getLostPasswordForm;
	
	clearFormErrors(formObject);	// clear out all previous errors and re-evaluate
	
	// Evaluate the login field
	if (formObject.email.value.length < 1) {
		formObject.email.style.backgroundColor = fieldErrorBgColor;
		error_msg = error_msg + "- Email\n";
		is_error = 1;
	}
	/* evaluate test results and act accordingly */
	return evalFormErrors(formObject, is_error, error_msg);
}

function ckQuotePartUpdate(formName) {
	var is_error = 0;
	var formObject = document.forms[formName];
	var maxPartLengthInches = parseFloat(formObject.maxPartLengthInches.value);
	var error_msg = "Sum of lengths and kerfs must be less than or equal to "+maxPartLengthInches+" inches.\n\n";
	var i = 1;
	var totalCuts = 0;
	var totalLengths = 0;
	var kerfLength = 0.125;
	var totalKerf = 0;
	var overallLength = 0;
	
	// sum up user entered cut lengths
	while(i <= 6) {
		var numPieces = parseInt(formObject["CutPieces"+i].value);
		var cutLength = parseFloat(formObject["CutSize"+i].value);
		if (numPieces > 0 && cutLength > 0) {	// both need to be greater than zero to be valid
			totalCuts = totalCuts + numPieces;
			totalLengths = totalLengths + (cutLength*numPieces);
		}
		i++;
	}
	totalKerf = totalCuts*kerfLength;
	overallLength = totalLengths+totalKerf;
	if (overallLength > maxPartLengthInches) {
		is_error = 1;
		error_msg = error_msg + "\nTotal Defined Length: "+overallLength+"\n" + 
		"Number of Cuts Defined: "+totalCuts+"\n" +
		"Total Kerf Length Defined: "+totalKerf+"\n" + 
		"Total Cut Lengths Defined: "+totalLengths+"\n";
	}
	/* evaluate test results and act accordingly */
	return evalFormErrors(formObject, is_error, error_msg);
}