// Scripts for Dynamic Inline Contact Form using a PHP back-end
// TODO: try hidding form instead of disposing
//		 try asynchronos with a timer to test return

// constants
var path_to_images = '/img/page_elements/' ;
var path_to_script = '/dynamic/contact/contact.php?contact=true&xml=true' ;
var this_domain = 'livepower.org' ;
var cntcXMLdata = '' ;
var recipient = '';
var justHideModal = true ; 
var replaceFormOnSubmit = true ; 
var testDontSend = false ; // For Debug Only

function doSendMessage() {
	if ( fieldsValid() ) {
		sendContactEmail ();
	}
}

function sendContactEmail() {
	var who_to = convertEscapesToEqvs(recipient);
	var page_URI = convertEscapesToEqvs(location.pathname) ;
	var page_title = convertEscapesToEqvs(location.pathname) ;
	var name = convertEscapesToEqvs(document.getElementById('cntcName').value) ;
	var email = convertEscapesToEqvs(document.getElementById('cntcEmail').value) ;
	var subject = convertEscapesToEqvs(document.getElementById('cntcSubject').value) ;
	var message = convertEscapesToEqvs(document.getElementById('cntcMessage').value) ;
	var data = "who_to="+who_to+"&name="+name+"&email="+email+"&subject="+subject+"&message="+message+"&page_URI="+page_URI ;
	if (testDontSend) data = data + '&test=true' ;
	
	// alert(data);
		
	showContactTimer() ; // quickly begin the load bar
	
	// set up the XML object 

	if(window.XMLHttpRequest) {
    	try {
			cntcXMLdata = new XMLHttpRequest();
        } catch(e) {
			cntcXMLdata = false;
        }
    // branch for IE/Windows ActiveX version
    } else if(window.ActiveXObject) {
       	try {
        	cntcXMLdata = new ActiveXObject("Msxml2.XMLHTTP");
      	} catch(e) {
        	try {
          		cntcXMLdata = new ActiveXObject("Microsoft.XMLHTTP");
        	} catch(e) {
          		cntcXMLdata = false;
        	}
		}
    }
	if (cntcXMLdata) {
		cntcXMLdata.onreadystatechange = handleXMLChange ;
		cntcXMLdata.open("POST", path_to_script, false) ;
		cntcXMLdata.setRequestHeader("Content-Type", "application/x-www-form-urlencoded") ;
		cntcXMLdata.send(data) ;
    } else {
		alert("There was an unknown script error in creating the XML request object");
	}
}

function returnXMLelementByName(tagName) {
	return cntcXMLdata.responseXML.documentElement.getElementsByTagName(tagName)[0].childNodes[0].nodeValue;
}

function handleXMLChange() {
    // page loaded "complete"
    if (cntcXMLdata.readyState == 4) {
        // page is "OK"
        if (cntcXMLdata.status == 200) {
			if ( returnXMLelementByName("posStatus") == 'NOTOK' ) { 
				alert('There were problems sending your message. Please check back in a couple minutes');
			}
		}
	}
}

function convertEscapesToEqvs(string) {
	// convert (&, +, =) to string equivs. Needed so URL encoded POST won't choke.
	string = string.replace(/&/g,"**am**");
	string = string.replace(/=/g,"**eq**");
	string = string.replace(/\+/g,"**pl**");
	return string;
}

function showContactTimer () {
	document.getElementById('loadBar').style.display = 'block';
	document.getElementById('contactFormArea').style.display = 'none';
	sentTimer = setTimeout("hideContactTimer()",6000);
}

function hideContactTimer () {
	// Hide the load bar alas! Done Loading
	document.getElementById('loadBar').style.display = "none";
	document.getElementById('emailSuccess').innerHTML = returnXMLelementByName("confirmation") ;
	document.getElementById('responseMessage').style.display = "block";
	// clear the subject
	document.getElementById('cntcSubject').value = '';
	// clear the message
	document.getElementById('cntcMessage').value = '';
	// leave the name and e-mail in case of multiples. 
}

function resetModal() {
	document.getElementById('responseMessage').style.display = 'none';
	document.getElementById('contactFormArea').style.display = 'block';
}
	


/* Field Validation */

function fieldsValid() {

	var ok_to_send = true ; 
	
	document.getElementById('responseMessage').style.display = "none";
	
	// validation
	ok_to_send = standardValidation('cntcName', 'Please provide us with your name.');
	
	var email = document.getElementById('cntcEmail').value;
	if (email == '') {
		showRemediation('cntcEmail',true,'A valid e-mail address is required to send a message so that we can reply.') ;
		ok_to_send = false ; 
	} else if (!isValidEmail(email)) {
		showRemediation('cntcEmail',true,'That does not appear to be a <b>valid</b> e-mail address. Please enter a <b>complete</b> e-mail address. Example: jsmith@'+this_domain+'.') ;
		ok_to_send = false ; 
	} else {
		showRemediation('cntcEmail',false) ;
	}
	
	ok_to_send = standardValidation('cntcSubject', 'Please tell us what your message regards.');
	
	ok_to_send = standardValidation('cntcMessage', 'Please enter your message in the field above.');
	
	return ok_to_send;
}		

function standardValidation(field_id, message) {
	stringValue = trim(document.getElementById(field_id).value);
	document.getElementById(field_id).value = stringValue;
	if (stringValue == '') {
		showRemediation(field_id,true,message) ;
		return false;
	} else {
		showRemediation(field_id,false) ;
		return true;
	}
}

function showRemediation(which, TorF, text) {
	if (TorF) {
		document.getElementById(which+'_remediateText').innerHTML = '&nbsp;'+text ; 
		document.getElementById(which+'_remediate').style.display = 'block';
	} else {
		document.getElementById(which+'_remediate').style.display = 'none';
	}
}

function isValidEmail(str) {
	return (str.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1);
}

/* BUILDING THE DIALOG */

function returnFieldObj(labelText, idName, elmLength, elmSize ) {
	fieldObj = d.createElement("div");
	fieldObj.className = "field_element";
	labelObj = fieldObj.appendChild(d.createElement("label"));
	labelObj.setAttribute("for",idName);
	labelObj.appendChild(d.createTextNode( labelText ));
	inputObj = fieldObj.appendChild(d.createElement("input"));
	inputObj.id = idName;
	inputObj.name = idName;
	inputObj.type = "text";
	if (elmLength != '') inputObj.setAttribute('maxLength',elmLength); // maxLength must have a capital L to work in IE
	if (elmSize != '') inputObj.size = elmSize ;
	//alert(elmEvent+inputObj+elmAction);
	fieldObj.appendChild(returnRemediationObj( idName ));
	return fieldObj ;
}

function returnRemediationObj( idName ) {
	remediationObj = d.createElement("div") ;
	remediationObj.id = idName+'_remediate' ;
	remediationObj.className = 'remediation' ;
	imgObj = remediationObj.appendChild(d.createElement("img"));
	imgObj.src = path_to_images+'attention.gif' ;
	imgObj.alt = 'Error';
	imgObj.align = 'absmiddle';
	imgObj.height = '9';
	imgObj.width = '9';
	spanObj = remediationObj.appendChild(d.createElement("span"));
	spanObj.id = idName+'_remediateText';
	spanObj.appendChild(d.createTextNode( ' La La La' ));
	return remediationObj;
}

function send_message(who_to) {
	recipient = who_to;
	var title = 'Send a message to '+who_to;
	// build content object
	d = document;
	if (!document.getElementById('message_form')) {
		contentObj = d.createElement("div");
		contentObj.id = "message_form" ;
		h1 = contentObj.appendChild(d.createElement("h1"));
		/* build the hidden load bar */
		loadBar =  contentObj.appendChild(d.createElement("div"));
		loadBar.id = "loadBar";
		loadBarLineOne = loadBar.appendChild(d.createElement("p"));
		loadBarImage = loadBarLineOne.appendChild(d.createElement("img"));
		loadBarImage.src = path_to_images+"busy_yellow.gif";
		loadBarImage.alt = "Loading..";
		loadBarImage.title = "Sending Email";
		loadBarImage.align = 'absmiddle';
		loadBarImage.hspace = "6";
		loadBarLineOne.appendChild(d.createTextNode( "Sending your message. Hold on just a sec ..." ));
		/* build the feedback message */
		responseBar = contentObj.appendChild(d.createElement("div"));
		responseBar.id = "responseMessage";
		feedback =  responseBar.appendChild(d.createElement("p"));
		feedback.id = "emailSuccess";
		feedback.appendChild(d.createTextNode( "ERROR: Script did not finish." ));
		andNext =  responseBar.appendChild(d.createElement("p"));
		btn = andNext.appendChild(alertButton("Done", "removeCustomAlert()"));
		//btn = andNext.appendChild(alertButton("Send Another Message", "resetModal()"));
		/* build form element */
		contactDivObj =  contentObj.appendChild(d.createElement("div"));
		contactDivObj.id = "contactFormArea";
		formObj =  contactDivObj.appendChild(d.createElement("form"));
		formObj.action = "" ;
		formObj.method = "post" ;
		formObj.id = "cForm" ;
		fieldSetObj = formObj.appendChild(d.createElement("fieldset"));
		
		/* create Name field */
		fldOne = fieldSetObj.appendChild(returnFieldObj("Your Name:", "cntcName", 30, 30, 'blur' ));
		/* create Email field */
		fldTwo = fieldSetObj.appendChild(returnFieldObj("Your Email:", "cntcEmail", 30, 30, 'blur' ));
		/* create Regards field */
		fldThree = fieldSetObj.appendChild(returnFieldObj("Regarding:", "cntcSubject", 30, 30, 'blur' ));
		/* create Message text area */
		fldFour = fieldSetObj.appendChild(d.createElement("div"));
		fldFour.className = "field_element";
		labelObj = fldFour.appendChild(d.createElement("label"));
		labelObj.setAttribute("for","cntcMessage");
		labelObj.appendChild(d.createTextNode( "Message:" ));
		textAreaObj = fldFour.appendChild(d.createElement("TEXTAREA"));
		textAreaObj.id = "cntcMessage";
		textAreaObj.name = "cntcMessage";
		textAreaObj.rows = "5";
		fldFour.appendChild(returnRemediationObj( "cntcMessage" ));
	
		btnOne = formObj.appendChild(alertButton("Send Message", "doSendMessage()",'save_dialog_btn'));
		btnTwo = formObj.appendChild(alertButton("Cancel", "removeCustomAlert()"));
	} else {
		d.getElementById('loadBar').style.display = 'none';
		d.getElementById('responseMessage').style.display = 'none';
		d.getElementById('contactFormArea').style.display = 'block';
	}
	h1.innerHTML = title;
	
	// display the modal
	displayModal(contentObj,title);
	
	// setDialogSaveBtn();
	
	document.getElementById('cntcName').focus();
}

/* MODAL DIALOG FUNCTIONS */

function mPrompt(htmlTxt,btnArray,title,modalWidth) {
	// build content object
	d = document;
	contentObj = d.createElement("div");
	h1 = contentObj.appendChild(d.createElement("h1"));
	h1.appendChild(d.createTextNode(title));

	// create a paragraph element to contain the txt argument
	msg = contentObj.appendChild(d.createElement("div"));
	msg.id = "modalText" ; 
	msg.innerHTML = htmlTxt;
	
	// build buttons 
	for (count in btnArray){
		btn = contentObj.appendChild(alertButton(btnArray[count][0],btnArray[count][1]));
	}
	
	// display the modal
	displayModal(contentObj,title,modalWidth);
}

function displayModal(contentObj,title,modalWidth) {
	if (!window.innerHeight) toggleSelectElements(true); // hide selects if IE, z-index bug

	if (modalWidth == null) modalWidth = '320';
	if (title == null) title = 'Live Power Alert';	
	// shortcut reference to the document object
	d = document;
	bodyObj =  d.getElementsByTagName("body")[0];
	var windowInnerHeight = browserSafeDocHeight();

	// if the modalContainer object already exists in the DOM, bail out.
	displayPageMask() ;	
	if (!d.getElementById("modalContainer")) { 
		
		// create the modalContainer div as a child of the BODY element
		mObj = bodyObj.appendChild(d.createElement("div"));
	
		mObj.id = "modalContainer";
		 // make sure its as tall as it needs to be to overlay all the content on the page
		
		mObj.style.height = windowInnerHeight + "px";
	
		// create the DIV that will be the alert 
		modalObj = mObj.appendChild(d.createElement("div"));
		modalObj.id = "modalBox";
		// MSIE doesnt treat position:fixed correctly, so this compensates for positioning the alert
	
		if(d.all && !window.opera) modalObj.style.top = document.documentElement.scrollTop + "px";
		modalObj.style.width = modalWidth + "px";
	
		// center the alert box
		modalObj.style.left = (d.documentElement.scrollWidth - modalWidth)/2 + "px";
		
		// attach the content object from whoever called us
		
		// set up the onclick event to remove the alert when the anchor is clicked
		modalObj.appendChild(contentObj);
		modalObj.style.display = 'block';
	}
	d.getElementById("modalContainer").style.display = 'block';
}

function displayPageMask() { 
	if(document.getElementById("modalMask")) {
		document.getElementById("modalMask").style.display = 'block' ;
	} else {
		mMask = document.getElementsByTagName("body")[0].appendChild(d.createElement("div"));
		mMask.id = "modalMask";
		mMask.style.height = browserSafeDocHeight() + "px";
		mMask.style.width = document.documentElement.scrollWidth + "px";
		if (!window.innerHeight) mMask.style.filter = 'alpha(opacity=40)'; // IE only 
	}
}

function hidePageMask() {
	document.getElementById("modalMask").style.display = 'none' ;
}


function mConfirm(message,action,windowTitle) {
	btnArray = new Array(new Array("OK",action),new Array("Cancel","removeCustomAlert()"));
	mPrompt(message,btnArray,windowTitle);
}

function mAlert(message,windowTitle) {
	if (typeof windowTitle == 'undefined') windowTitle = "Alert";
	btnArray = new Array(new Array("OK","removeCustomAlert()"));
	mPrompt(message,btnArray,windowTitle);
}

function alertButton(btnText, btnAction, btnID) {
	btnObject = d.createElement("div");
	btnObject.className = "textbuttonright";
	innerBtnObject = btnObject.appendChild(d.createElement("a"));
	if (btnID != null) innerBtnObject.id = btnID;
	btnText = padText(btnText);
	innerBtnObject.innerHTML = btnText;
	innerBtnObject.href = "javascript:"+btnAction;
	return btnObject;
}

// removes the custom alert from the DOM
function removeCustomAlert() {
	if (justHideModal) document.getElementById("modalContainer").style.display = 'none' ;
	else document.getElementsByTagName("body")[0].removeChild(document.getElementById("modalContainer"));
	hidePageMask() ;
	if (!window.innerHeight) toggleSelectElements(false);
}

function hideModal() {
	document.getElementById('modalContainer').style.display = 'none';
	document.getElementById('modalMask').style.display = 'none';
}

function showModal() {
	document.getElementById('modalContainer').style.display = 'block';
	document.getElementById('modalMask').style.display = 'block';
}

/**
* Hides all drop down form select boxes on the screen so they do not appear above the mask layer.
* IE has a problem with wanted select form tags to always be the topmost z-index or layer
*/

function toggleSelectElements(hide) {
	var visibilityState = (hide) ? "hidden": "visible";
	for(var i = 0; i < document.forms.length; i++) {
		for(var e = 0; e < document.forms[i].length; e++){
			if(document.forms[i].elements[e].tagName == "SELECT") {
				document.forms[i].elements[e].style.visibility = visibilityState;
			}
		}
	}
}

function resizeMask() {
	if (window.innerHeight) windowInnerHeight = window.innerHeight; // IE
	else windowInnerHeight = (document.documentElement.offsetHeight - 4); 
	document.getElementById('modalContainer').height = windowInnerHeight + "px";
	document.getElementById('modalContainer').width = document.documentElement.scrollWidth + "px";
	document.getElementById('modalMask').height = windowInnerHeight + "px";
	document.getElementById('modalMask').width = document.documentElement.scrollWidth + "px";
}

function browserSafeDocHeight() {
	if (window.innerHeight) {
		return document.documentElement.scrollHeight; 
	} else {
		sHeight = document.documentElement.scrollHeight;
		cHeight = document.documentElement.clientHeight;
		return Math.max(cHeight,sHeight); 
	}
}

function padText(btnText) {
	padNum = 12;
	btnSize = btnText.length;
	if (btnSize >= padNum) return btnText;
	padBy = parseInt((padNum - btnSize - 2)/2);
	for(count = 0; count < padBy; count++) btnText = '&nbsp;'+btnText+'&nbsp;';
	return btnText;
}
