//****************************************************************************
//page:		BBFormFunctions.js
//Author:	B.Wout
//Date:		09-04-2004
//Purpose:	prepare xml from filled in form and send it away
// the user to the return page
//-----------------------------------------------------------------------------
// Date changed:		By who:			Reason:
// 03-04-2004			b.wout			getDomDocumentPrefix & getXmlHttpPrefix added
// 2004 03 08			b.wout			included the redirect function goAway(), htis will redirect
// 2004 12 21			b.wout			capture enter key and if formelement in page, move focus to next element.
// 2005 08 31			Bas Reus		Double opt-in (use Editor 2.3.6 or higher!)
// 2007 03 08			J. Flenter		New type of forms. All functions that are specifically used for the new forms have the nf_ prefix 
// 										(note that some functions for the 'old' forms are also used by the new forms, i.e. the createXmlElement 
// 										function etc)
//****************************************************************************
var strXML;
var strClosedLoop = "";
var bln_ReqularFormPost;
var strFormAction = "";

if(document.addEventListener){ // gecko-dom
	//window.captureEvents(Event.KEYPRESS);
    //window.onKeyPress = edt_Event;
}else{ // ie-dom
	document.attachEvent("onkeydown", edt_Event);
	document.attachEvent("onkeydown", nf_edt_Event);
}

//=============================================================================
// function: edt_Event
// purpose: this eventhandler will stop the enter key event from bubbling up to
//	the hidden submit button which is part of the *NetToolbox when a bbformelement
//	is considered. So instead of submitting the form the next BBFormelement is given focus
//  The definition of a bbformelement is that it's name can NOT 
//	start with an underscore (= "_"). If it does the enter key will result in a postback.
//-----------------------------------------------------------------------------
// Date changed:		By who:			Reason:
//=============================================================================
function edt_Event(ev){

	if(ev.keyCode == 13){
		var elementName = ev.srcElement.name;
		if(elementName.substr(0,1) != "_"){
			if(document.implementation && document.implementation.createDocument){
				ev.stopPropagation();
				ev.cancelBubble=true;
			}else{
				ev.cancelBubble=true;
				ev.returnValue = false; 
			}
			setFocusToNextElement(ev.srcElement.name);
		}
	}
}

//=============================================================================
// function: nf_edt_Event
// purpose: this eventhandler will stop the enter key event from bubbling up to
//	the hidden submit button which is part of the *NetToolbox when a BBNewFormelement
//	is considered. So instead of submitting the form the next BBNewFormelement is given focus
//  The definition of a BBNewFormelement is that it's name can NOT 
//	start with an underscore (= "_"). If it does the enter key will result in a postback.
//-----------------------------------------------------------------------------
// Date changed:		By who:			Reason:
//=============================================================================
function nf_edt_Event(ev){

	if(ev.keyCode == 13){
		var elementName = ev.srcElement.name;
		if(elementName.substr(0,1) != "_"){
			if(document.implementation && document.implementation.createDocument){
				ev.stopPropagation();
				ev.cancelBubble=true;
			}else{
				ev.cancelBubble=true;
				ev.returnValue = false; 
			}
			nf_setFocusToNextElement(ev.srcElement.name);
		}
	}
}

function setFocusToNextElement(elementName){
	var arr_Elements = document.forms[0].elements;
	for(var i = 0;i < arr_Elements.length; i++){
		if(arr_Elements[i].name){
			if(arr_Elements[i].name == elementName){
				if(arr_Elements[i+1]){
					if(arr_Elements[i+1].name.substr(0,1) != "_"){
						arr_Elements[i+1].focus();
					}
				}
				break;
			}
		}
	}
}
function nf_setFocusToNextElement(elementName){
	var arr_Elements = document.forms[0].elements;
	for(var i = 0;i < arr_Elements.length; i++){
		if(arr_Elements[i].name){
			if(arr_Elements[i].name == elementName){
				if(arr_Elements[i+1]){
					if(arr_Elements[i+1].name.substr(0,1) != "_"){
						arr_Elements[i+1].focus();
					}
				}
				break;
			}
		}
	}
}


//=============================================================================
// function: sendForm
// purpose: creates html form the formobject
//-----------------------------------------------------------------------------
// Date changed:		By who:			Reason:
//=============================================================================
function SendForm(){
	if(intitializeXmlDoc()){
		submitBBForm();
	}
}
function nf_SendForm(obj_formElement){

    if(nf_intitializeXmlDoc(obj_formElement)){
		nf_submitBBNewForm();
	}
}

//=============================================================================
// function: intitializeXmlDoc
// purpose: 
//-----------------------------------------------------------------------------
// Date changed:		By who:			Reason:
//=============================================================================
function intitializeXmlDoc(){
var objFormTable = document.getElementById('formTable');
var emailFrom = objFormTable.getAttribute("emailFrom");
var emailTo = objFormTable.getAttribute("emailTo");
var subject = objFormTable.getAttribute("subject");
var returnPage = objFormTable.getAttribute("ReturnPage");
var bbFormName = objFormTable.getAttribute("BBFormName");
var bbFormActionTypeEmail = objFormTable.getAttribute("BBFormActionTypeEmail");
var bbFormActionTypeDb = objFormTable.getAttribute("BBFormActionTypeDb");
var strFormElements = getElements();
strFormAction = objFormTable.action;
	
	if (!strFormElements){
		return false;
	}else{

		// create XML document with default header and primary node 
		strXML = "<?xml version='1.0' ?><bbform xmlns='http://tempuri.org/BBForm.xsd'><bbformproperties>";
		strXML += getProperties(bbFormName, returnPage);
		strXML += "<bbformactions>" + getActions(bbFormActionTypeDb, bbFormActionTypeEmail, emailFrom, emailTo, subject) + "</bbformactions>";
		strXML += "</bbformproperties>";
		strXML += "<bbformelements>" + strFormElements + "</bbformelements>";
		strXML += "</bbform>"; 
		return true;	
	}
}

function nf_intitializeXmlDoc(obj_formElement){
    var obj_formDiv = document.getElementById(obj_formElement.getAttribute("forforms", 0));
    
    var emailFrom = obj_formDiv.getAttribute("emailFrom");
    var emailTo = obj_formDiv.getAttribute("emailTo");
    var subject = obj_formDiv.getAttribute("subject");
    var returnPage = obj_formDiv.getAttribute("returnpage");
    var BBNewFormName = obj_formDiv.getAttribute("value").slice(10);
    var BBNewFormActionTypeEmail = obj_formDiv.getAttribute("actpmail");
    var BBNewFormActionTypeDb = obj_formDiv.getAttribute("actdb");
    var strFormElements = nf_getElements(obj_formElement);
    strFormAction = obj_formDiv.action;
	
	if (!strFormElements){
		return false;
	}else{

		// create XML document with default header and primary node 
		strXML = "<?xml version='1.0' ?><bbform xmlns='http://tempuri.org/BBForm.xsd'><bbformproperties>";
		strXML += getProperties(BBNewFormName, returnPage);
		strXML += "<bbformactions>" + getActions(BBNewFormActionTypeDb, BBNewFormActionTypeEmail, emailFrom, emailTo, subject) + "</bbformactions>";
		strXML += "</bbformproperties>";
		strXML += "<bbformelements>" + strFormElements + "</bbformelements>";
		strXML += "</bbform>"; 
		return true;	
	}
}

//=============================================================================
// function: getProperties
// purpose: 
//-----------------------------------------------------------------------------
// Date changed:		By who:			Reason:
// 2005-08-29			Bas Reus		Added closedloop
//=============================================================================
function getProperties(formName, returnPage){
	var strProperties = "<bbformname>" + formName + "</bbformname>";
	strProperties += "<returnpage><![CDATA[" + returnPage + "]]></returnpage>";
	strProperties += "<closedloop>" + strClosedLoop + "</closedloop>";
	return strProperties;
}

//=============================================================================
// function: getActions
// purpose: 
//-----------------------------------------------------------------------------
// Date changed:		By who:			Reason:
//=============================================================================
function getActions(DB, email, from, to, subject){
	var strActions = "";
	if(email == "true"){
		strActions += "<bbformaction>";
		strActions += "<bbformactiontype>email</bbformactiontype>";
		strActions += "<bbform_emailto>" + to + "</bbform_emailto>";
		strActions += "<bbform_emailfrom>" + from + "</bbform_emailfrom>";
		strActions += "<bbform_emailsubject>" + subject + "</bbform_emailsubject>";
		strActions += "</bbformaction>";
	}
	if(DB == "true"){
		strActions += "<bbformaction>";
		strActions += "<bbformactiontype>db</bbformactiontype>";
		strActions += "</bbformaction>";
	}
	return strActions;
}


//=============================================================================
// function: getElements
// purpose: this function searches the formTable for FormElements and labels.
// formelements are validated against the "required" and "email" attributes.
//-----------------------------------------------------------------------------
// Date changed:		By who:			Reason:
// 2005-08-29			Bas Reus		Find closedloop="true" from INPUT
//=============================================================================
function getElements(){
	var objForm = document.getElementById('formTable');
	var strElements = "";
	
	for(var i=0; i<objForm.rows.length; i++){
		if(objForm.rows[i].cells){
			for (var j=0; j < objForm.rows[i].cells.length; j++){
				if(objForm.rows[i].cells[j].innerHTML != ''){
					var arrFormInput = eval(objForm.rows[i].cells[j]).getElementsByTagName('INPUT');
					var arrFormSelect = eval(objForm.rows[i].cells[j]).getElementsByTagName('select');
					var arrFormTextArea = eval(objForm.rows[i].cells[j]).getElementsByTagName('textarea');
					for(k=0; k < arrFormInput.length; k++){
						if(arrFormInput[k].type != 'button' && arrFormInput[k].type != 'undefined'){
							if(validateBBFormElement(arrFormInput[k])){ 
								switch (arrFormInput[k].type){
									case  'checkbox':
										if(arrFormInput[k].checked){
											strElements += createXmlElement(arrFormInput[k].name, arrFormInput[k].value, arrFormInput[k].id, arrFormInput[k].type); 
										}
										break;
									case 'radio':
										if(arrFormInput[k].checked){
											strElements += createXmlElement(arrFormInput[k].name, arrFormInput[k].value, arrFormInput[k].id, arrFormInput[k].type); 
										}
										break;
									case 'file':
											strElements += converBBFormFileToXML(arrFormInput[k]);
										break;
									default:
										if(arrFormInput[k].closedloop == "true") {
											// handle closed loop
											strClosedLoop = arrFormInput[k].value;
										}
										strElements += createXmlElement(arrFormInput[k].name, arrFormInput[k].value, arrFormInput[k].id, arrFormInput[k].type); // the id is same as content for label
										break;
								}
							}else{
								return false;
							}
						}
					}
					for(k=0; k < arrFormSelect.length; k++){
						if(validateBBFormElement(arrFormSelect[k])){ //
							strElements += converBBFormSelectToXML(arrFormSelect[k]); // the id is same as content for label
						}else{
							return false;
						}
					}
					for(k=0; k < arrFormTextArea.length; k++){
						if(validateBBFormElement(arrFormTextArea[k])){ //
							strElements += converBBFormTextAreaToXML(arrFormTextArea[k]); // the id is same as content for label
						}else{
							return false;
						}
					}
				}
			}
		}
	}
	return strElements;
}
function nf_getElements(obj_formElement){

	// Declare local variables
    var int_counter;
    var html_currentNode;
    var str_forforms;
    var html_formNode;
    var str_currentFormName = obj_formElement.getAttribute("forforms", 0);
	var strElements = "";
        
    html_formNode = obj_formElement.form;
            
    for(int_counter = 0; int_counter < html_formNode.elements.length; int_counter++)
    {
        html_currentNode = html_formNode.elements[int_counter];
        
        str_forforms = html_currentNode.getAttribute('forforms', 0);
        
        if(str_forforms == str_currentFormName)
        {
            switch(html_currentNode.nodeName.toLowerCase())
            {
                case 'input':
                    // Warning: no validation!!!
                    if(html_currentNode.type != 'undefined' && html_currentNode.nodeName.toLowerCase() != 'button')
                    {
                        switch(html_currentNode.type)
                        {
                            case 'checkbox':
                                if(html_currentNode.checked){
                                    strElements += createXmlElement(html_currentNode.name, html_currentNode.value, html_currentNode.id, html_currentNode.type); 
                                }
                                break;
                                
                            case 'radio':
                                if(html_currentNode.checked){
                                    strElements += createXmlElement(html_currentNode.name, html_currentNode.value, html_currentNode.id, html_currentNode.type); 
                                }
                                break;
                            case 'file':
                                    strElements += converBBFormFileToXML(html_currentNode);
                                break;
                            default:
                                if(html_currentNode.closedloop == "true") {
                                    // handle closed loop
                                    strClosedLoop = html_currentNode.value;
                                }
                                strElements += createXmlElement(html_currentNode.name, html_currentNode.value, html_currentNode.id, html_currentNode.type); // the id is same as content for label
                                break;
                        }
                    
                    }
                break;
                case 'select':
                    // No validation!
                    strElements += converBBFormSelectToXML(html_currentNode); // the id is same as content for label
                    break;
                case 'textarea':
                    // No validation
                    strElements += converBBFormTextAreaToXML(html_currentNode); // the id is same as content for label
                    break;
            }
        }
    }
        
    return strElements;
}

//=============================================================================
// function: createXmlElement
// purpose: 
//-----------------------------------------------------------------------------
// Date changed:		By who:			Reason:
//=============================================================================
function createXmlElement(element_name, element_value, element_label, element_type){
	var strXmlElement = "";
	strXmlElement += "<bbformelement>";
	strXmlElement += "<bbformelementname>" + element_name + "</bbformelementname>";
	strXmlElement += "<bbformelementvalue><![CDATA[" + element_value + "]]></bbformelementvalue>";
	strXmlElement += "<bbformelementlabel>" + element_label + "</bbformelementlabel>";
	strXmlElement += "<bbformelementtype>" + element_type + "</bbformelementtype>";
	strXmlElement += "</bbformelement>";
	return strXmlElement;
}

//=============================================================================
// function: validateBBFormElement
// purpose: 
//-----------------------------------------------------------------------------
// Date changed:		By who:			Reason:
//=============================================================================
function validateBBFormElement(element){
	if(element.required){
		if(element.required == "true" && (element.value == "" || element.value == "undefined")){
			alert(element.RequiredMsg);
			element.focus();
			return false;
		}
	}
	if(element.regex  && element.value != "" && element.value != "undefined" && !validateRegEx(element.value, element.regex)){
		alert(element.ValidationMsg);
		element.focus();
		return false;
	}
return true;
}


//=============================================================================
// function: converBBFormSelectToXML
// purpose: 
//-----------------------------------------------------------------------------
// Date changed:		By who:			Reason:
//=============================================================================
function converBBFormSelectToXML(BBFormElement){
	var elementName = BBFormElement.name;
	var elementType = BBFormElement.type;
	var elementLabel = BBFormElement.id;
	var elementValue = "";
		
	for(i=0; i <BBFormElement.options.length; i++){
		if(BBFormElement.options[i].selected){
			if(elementValue == ""){
				elementValue += BBFormElement.options[i].value;
			}else{
				elementValue += ", " + BBFormElement.options[i].value;
			}
		}
	}
	return createXmlElement(elementName, elementValue, elementLabel, elementType);
}

//=============================================================================
// function: converBBFormFileToXML
// purpose: 
//-----------------------------------------------------------------------------
// Date changed:		By who:			Reason:
//=============================================================================
function converBBFormFileToXML(BBFormElement){
	var elementName = BBFormElement.name;
	var elementValue = BBFormElement.value;
	var elementLabel = BBFormElement.id;
	var elementType = BBFormElement.type;
	elementValue = elementValue.substring(elementValue.lastIndexOf('\\')+1);
	return createXmlElement(elementName, elementValue, elementLabel, elementType);
}

//=============================================================================
// function: converBBFormTextAreaToXML
// purpose: 
//-----------------------------------------------------------------------------
// Date changed:		By who:			Reason:
//=============================================================================
function converBBFormTextAreaToXML(BBFormElement){
	var elementName = BBFormElement.name;
	var elementValue = BBFormElement.value; //innerText;
	var elementLabel = BBFormElement.id;
	var elementType = BBFormElement.type;
	return createXmlElement(elementName, elementValue, elementLabel, elementType);
}

//=============================================================================
// function: submitBBForm
// purpose: sends xml document to server
// if the post method is a regular form post, a hidden field should be created and the xml string
// assigned as the value for that hidden field.
//-----------------------------------------------------------------------------
// Date changed:		By who:			Reason:
//=============================================================================
function submitBBForm(){
		var objFormTable = document.getElementById('formTable');
		var newHiddenField = document.createElement("input");
		with(newHiddenField){
			setAttribute("type", "hidden");
			setAttribute("name", "hid_BBForm");
			setAttribute("value", strXML);
		}
		var formRef;
		formRef = document.forms[0]; 
		formRef.appendChild(newHiddenField); 
		formRef.submit();
}
function nf_submitBBNewForm(){
		/*var objFormTable = document.getElementById('formTable');*/
		var newHiddenField = document.createElement("input");
		with(newHiddenField){
			setAttribute("type", "hidden");
			setAttribute("name", "hid_bbform");
			setAttribute("value", strXML);
		}
		var formRef;
		formRef = document.forms[0]; 
		formRef.appendChild(newHiddenField); 
		formRef.submit();
}

//=============================================================================
// function: validateRegEx
// pupose:
//-----------------------------------------------------------------------------
// Date changed:		By who:			Reason:
//=============================================================================
function validateRegEx(src, regex){
	var RegEx = new RegExp(regex);
	return RegEx.test(src);
	}

//window.onerror=myErrorHandler
//        
//function myErrorHandler(strMessage, strLinkURL, intLine){
//        alert('Er is een fout opgetreden in het formulier\n\n' +strMessage + ', regel :' + intLine)
//        return true
//        }
   
//=============================================================================
// function: changeEmailTo
// pupose: change the emailadres the form will be sent to
//-----------------------------------------------------------------------------
// Date changed:		By who: Peter Lamers			Reason:
//=============================================================================      
function changeEmailTo(emailadres) {
		var objForm = document.getElementById('formTable');
		objForm.emailTo=emailadres;
}

//=============================================================================
// function: changeEmailFrom
// pupose: change the value of the From address of the BB Form
//-----------------------------------------------------------------------------
// Date changed:		By who: Peter Lamers			Reason:
//=============================================================================      
function changeEmailFrom(emailadres) {
		var objForm = document.getElementById('formTable');
		objForm.emailFrom=emailadres;
}

