var new_ProspectCreated = false;
var new_ProspectCreatedId;
var maskedAttributes = null;

//For masking 
var arrayElements = new Array();
var errorString = "";
var UID = 0;

function EncodeHtml(s) {
    s = s.replace(/&/g, "~amp;");
    s = s.replace(/</g, "~lt;");
    s = s.replace(/>/g, "~gt;");
    s = s.replace(/\"/g, "~quot;");
    s = s.replace(/\'/g, "~apos;");

    return s;
}

function DecodeHtml(s) {
    s = s.replace(/~amp;/g, "&");
    s = s.replace(/~lt;/g, "<");
    s = s.replace(/~gt;/g, ">");
    s = s.replace(/\~quot;/g, "&quot;");
    s = s.replace(/\~apos;/g, "'");

    return s;
}

function next(path) {
    var strResult = xmlConverter(1);

    if (strResult == false)
        return;

    var startIndex = path.lastIndexOf("webform");
    var new_vid = path.substring(startIndex);
    var dotIndex = new_vid.lastIndexOf(".");
    new_vid = new_vid.substring(7, dotIndex);
    var idx;
    var qString;
    try {
        qString = parent.location.href;
        idx = qString.indexOf('#');
        if (idx > 0) {
            qString = qString.substring(0, idx);
        }
    }
    catch (ex)//handle permission denied
	{
        qString = location.href;
    }

    // This query string part is built only if a chained webform is opened from Interface URL
    var partialQS = '';
    if (new_ProspectCreated == true) {
        partialQS = '&newpid=' + new_ProspectCreatedId;
    }

    var temp = qString.split('?');
    var forwardPath = 'ChainedWebFormQSBuilder.aspx?' + temp[1] + '&newvid=' + new_vid + partialQS;

    try {
        parent.location.href = forwardPath;
    }
    catch (ex)//handle permission denied
	{
        location.href = forwardPath;
    }
}

function xmlConverter(isNext) {
    var header = Header();
    var footer = Footer();
    var xmlData;
    var xmlString = "";
    var xml;
    var targetText;
    var targetIdentifers;
    var field;
    var attribute;
    errorString = "";
    var mulchk_id = 0;
    //Masking validation and error string
    var validateMaskField = null;

    var selectTags = document.getElementsByTagName("select");

    var inputTags = document.getElementsByTagName("input");

    var textAreaTag = document.getElementsByTagName("TEXTAREA");

    // For Select Elements
    var selectFieldValue = "";
    for (j = 0; j < selectTags.length; j++) {
        if (selectTags.item(j).attributes["target"])   // ** if(selectTags.item(j).target)
        {
            targetText = selectTags.item(j).attributes["target"].value; // ** text= selectTags.item(j).target;
            targetIdentifers = targetText.split(".");
            if (targetIdentifers && targetIdentifers.length && targetIdentifers.length > 1) {
                field = targetIdentifers[0]; // prospect/webform
                attribute = targetIdentifers[targetIdentifers.length - 1]; // firstname/company/country or any custom attribute
            }
            else {
                field = targetIdentifers[0]; // prospect/webform
                attribute = targetIdentifers[1]; // firstname/company/country or any custom attribute
            }
        }
        else {
            field = "";
            attribute = "";

        }
        //Changes for masked elements select
        //Unmask element value
        var fieldValue = getUnnMaskValues(selectTags.item(j).id);

        if (fieldValue != null) {
            selectFieldValue = fieldValue;
        }
        else {
            if (selectTags.item(j).options.length) {
                selectFieldValue = selectTags.item(j).options[selectTags.item(j).selectedIndex].text
            }
        }

        xmlData = '<record' +
					' id="' + selectTags.item(j).id + '"' +
					' name="' + selectTags.item(j).name + '"' +
					' type="' + selectTags.item(j).type + '"' +
					' value="' + EncodeHtml(selectTags.item(j).options[selectTags.item(j).selectedIndex].text) + '"' +
					' Field="' + field + '"' +
					' Attribute="' + attribute.toLowerCase() + '"' +
					'/>';
        xmlString += xmlData;
    }

    // For TextArea Elements

    for (j = 0; j < textAreaTag.length; j++) {
        if (textAreaTag.item(j).attributes["target"])	// ** if(textAreaTag.item(j).target)
        {
            targetText = textAreaTag.item(j).attributes["target"].value; // ** text= textAreaTag.item(j).target;
            targetIdentifers = targetText.split(".");
            if (targetIdentifers && targetIdentifers.length && targetIdentifers.length > 1) {
                field = targetIdentifers[0]; // prospect/webform
                attribute = targetIdentifers[targetIdentifers.length - 1]; // firstname/company/country or any custom attribute
            }
            else {
                field = targetIdentifers[0]; // prospect/webform
                attribute = targetIdentifers[1]; // firstname/company/country or any custom attribute
            }
        }
        else {
            field = "";
            attribute = "";
        }

        //Changes for masked elements select
        //Unmask element value
        var textfieldValue = getUnnMaskValues(textAreaTag.item(j).maskid);

        if (textfieldValue == null) {
            textfieldValue = textAreaTag.item(j).value;
        }
        /////////
        xmlData = '<record' +
				            ' id="' + textAreaTag.item(j).id + '"' +
				            ' name="' + textAreaTag.item(j).name + '"' +
				            ' type="' + textAreaTag.item(j).type + '"' +
				            ' value="' + EncodeHtml(textfieldValue) + '"' +
				            ' Field="' + field + '"' +
				            ' Attribute="' + attribute.toLowerCase() + '"';

        if (textAreaTag.item(j).mask != null && typeof (textAreaTag.item(j).mask) != 'undefined') {
            xmlData += ' mask="' + textAreaTag.item(j).mask + '" />';
        }
        else {
            xmlData += ' />';
        }

        xmlString += xmlData;

    }

    // For Input Elements
    xmlData = "";
    var inputType;
    var multiCheckboxes = new Array();
    var isMultiValueCheckbox = false;
    for (i = 0; i < inputTags.length; i++) {
        inputType = inputTags.item(i).type;

        if (inputTags.item(i).attributes["target"])        // ** if(inputTags.item(i).target)
        {
            targetText = inputTags.item(i).attributes["target"].value; // ** text= inputTags.item(i).target;
            targetIdentifers = targetText.split(".");
            if (targetIdentifers && targetIdentifers.length && targetIdentifers.length > 1) {
                field = targetIdentifers[0]; // prospect/webform
                attribute = targetIdentifers[targetIdentifers.length - 1]; // firstname/company/country or any custom attribute
            }
            else {
                field = targetIdentifers[0]; // prospect/webform
                attribute = targetIdentifers[1]; // firstname/company/country or any custom attribute
            }
        }
        else {
            field = "";
            attribute = "";
            targetText = "";
        }
        //Changes for masked elements INPUT - text

        var fieldValue = null;

        if (inputType === "text") {
            //Unmask element value
            fieldValue = getUnnMaskValues(inputTags.item(i).maskid);

        }

        if (fieldValue != null) {
            inputValue = fieldValue;
        }
        else {
            inputValue = inputTags.item(i).value;
        }
        // For radio button value			
        if (inputType == 'radio') {
            var inputid;
            var loop;
            loop = 1;
            inputValue = "";
            try {
                inputid = inputTags.item(i).name;
                while (loop == 1) {
                    if (inputTags.item(i).checked) {
                        inputValue = inputTags.item(i).value;
                        loop = 0;

                        try {
                            while (inputTags.item(i + 1).type == 'radio' && inputTags.item(i + 1).name == inputid)
                                i++;
                        }
                        catch (ex) { }
                    }
                    else {
                        try {
                            if (inputTags.item(i + 1).type == 'radio' && inputTags.item(i + 1).name == inputid)
                                i++;
                            else
                                loop = 0;
                        }
                        catch (ex) {
                            loop = 0;
                        }
                    }
                }
            }
            catch (Ex) { }
        }

        // For checkbox value
        isMultiValueCheckbox = false;
        if (inputType == 'checkbox') {
            var checkboxTarget = '';
            var checkboxName = '';
            // multicheckbox
            if (inputTags.item(i).attributes["value"] && inputTags.item(i).attributes["value"].value != 'on') {
                if (targetText != '') {
                    checkboxName = inputTags.item(i).attributes["name"].value.toLowerCase();
                    checkboxTarget = targetText.toLowerCase();
                    var checkboxValue = inputTags.item(i).attributes["value"].value;
                    isMultiValueCheckbox = true;
                    if (inputTags.item(i).checked) {
                        if (typeof multiCheckboxes[checkboxName] == 'undefined') {
                            multiCheckboxes[checkboxName] = new Array();
                            multiCheckboxes[checkboxName][checkboxTarget] = checkboxValue;
                        }
                        else {
                            if (typeof multiCheckboxes[checkboxName][checkboxTarget] == 'undefined') {
                                multiCheckboxes[checkboxName][checkboxTarget] = checkboxValue;
                            }
                            else {
                                multiCheckboxes[checkboxName][checkboxTarget] = multiCheckboxes[checkboxName][checkboxTarget] + ';' + checkboxValue;
                            }
                        }
                    }
                }
            }

            if (isMultiValueCheckbox == false) {
                if (inputTags.item(i).checked) {
                    inputValue = "True";
                }
                else {
                    inputValue = "False";
                }
            }
        } //end of if it is a check box


        if (isMultiValueCheckbox == false) {

            // Build xml string at here with attributes.
            xmlData = '<record' +
					' id="' + inputTags.item(i).id + '"' +
					' name="' + inputTags.item(i).name + '"' +
					' type="' + inputTags.item(i).type + '"' +
					' value="' + EncodeHtml(inputValue) + '"' +
					' Field="' + field + '"' +
					' Attribute="' + attribute.toLowerCase() + '"';

            if (inputTags.item(i).mask != null && typeof (inputTags.item(i).mask) != 'undefined') {
                xmlData += ' mask="' + inputTags.item(i).mask + '" />';
            }
            else {
                xmlData += ' />';
            }
            xmlString += xmlData;
        }

    } // end of for loop of input tags

    // append multivalue checkboxes masks should not be applied
    for (var mulchkName in multiCheckboxes) {
        inputValue = '';
        for (var multichkTarget in multiCheckboxes[mulchkName]) {
            targetIdentifers = multichkTarget.split(".");
            if (targetIdentifers && targetIdentifers.length && targetIdentifers.length > 1) {
                field = targetIdentifers[0]; // prospect/webform
                attribute = targetIdentifers[targetIdentifers.length - 1]; // firstname/company/country or any custom attribute
            }
            else {
                field = targetIdentifers[0]; // prospect/webform
                attribute = targetIdentifers[1]; // firstname/company/country or any custom attribute
            }

            xmlData = '<record' +
					' id="multichk_' + mulchk_id + '"' +
					' name="' + mulchkName + '"' +
					' type="checkbox"' +
					' value="' + EncodeHtml(multiCheckboxes[mulchkName][multichkTarget]) + '"' +
					' Field="' + field + '"' +
					' Attribute="' + attribute.toLowerCase() + '" />';
            xmlString += xmlData;
            mulchk_id = mulchk_id + 1;

        }
    }

    if (errorString) {
        alert(errorString);
        return false;
    }
    var xml = header + xmlString + footer;
    var qString;

    try {
        qString = parent.location.href;
    }
    catch (ex)//handle permission denied
    {
        qString = location.href;
    }
    var temp = qString.split('?');
    var forwardPath = 'WebFormListener.aspx?' + temp[1];
    var errDesc = sendData(xml, forwardPath);
    if (errDesc != '') {
        alert('Error: ' + errDesc);
        return false;
    }
    else if (isNext != 1) {
        alert("Your Information Has Been Saved.");
        window.close();
    }
    return true;
}

function sendData(xml, forwardPath) {
    var browser = window.navigator.appName;
    var agent = window.navigator.userAgent;
    var result = '';
    if (browser == 'Netscape') {
        result = sendData_NS(xml, forwardPath);
    }
    else {
        if (agent.indexOf('Opera') > 0) {
            result = sendData_NS(xml, forwardPath);
        }
        else {
            result = sendData_IE(xml, forwardPath);
        }
    }
    return result;
}

function sendData_IE(xml, forwardPath) {
    var objXMLHTTP = new ActiveXObject("Microsoft.XMLHTTP");
    objXMLHTTP.Open("POST", forwardPath, false);
    objXMLHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    objXMLHTTP.Send(xml);

    var objXMLDOM = new ActiveXObject("Microsoft.XMLDOM");
    objXMLDOM.loadXML(objXMLHTTP.responseText);

    var ActionNode = objXMLDOM.getElementsByTagName("action");
    var errDesc = '';

    if (ActionNode && ActionNode(0) && (ActionNode(0).text.toLowerCase() == "insert" || ActionNode(0).text.toLowerCase() == "update")) {
        var IDNode = objXMLDOM.getElementsByTagName("id");
        id = IDNode(0).text;
        new_ProspectCreated = true;
        new_ProspectCreatedId = id;
    }
    else if (ActionNode && ActionNode(0) && ActionNode(0).text.toLowerCase() == "error") {
        errDesc = objXMLDOM.getElementsByTagName("id")(0).text;
    } else {
        errDesc = "Error occured while saving.";
    }


    ActionNode = null;
    objXMLDOM = null;
    objHMLHTTP = null;

    return errDesc;
}

function sendData_NS(xml, forwardPath) {
    try {
        var oXML = new XMLHttpRequest();
        oXML.open("POST", forwardPath, false);
        oXML.send(xml);

        var resText = oXML.responseText;
        var errDesc = '';

        var tempStart = resText.indexOf("<id>");
        var tempEnd = resText.indexOf("</id>");
        var tempID = resText.substr(tempStart + 4, tempEnd - (tempStart + 4));
        if (resText.indexOf("error") > 0) {
            errDesc = tempID;
        }
        else {
            new_ProspectCreated = true;
            new_ProspectCreatedId = tempID;
        }

        return errDesc;
    }
    catch (ex) {
        return ex;
    }
}

function updateProspectData(fsXML) {
    var qString;

    try {
        qString = parent.location.href;
    }
    catch (ex)//handle permission denied
	{
        qString = location.href;
    }

    var temp = qString.split('?');

    var forwardPath = 'WebFormListener.aspx?' + temp[1];
    sendData(fsXML, forwardPath);
}

function Header() {
    var head = "<mmm>";
    return head;
}

function Footer() {
    var foot = "</mmm>";
    return foot;
}

function onLoad()	// ** an ordinary function which is assigned to 'onload event' for the window
{
    try {
        var inputTags = document.getElementsByTagName("input");
        var selectIDTags = document.getElementsByTagName("select");

        for (i = 0; i < inputTags.length; i++) {
            var objCtrl = inputTags.item(i);
            var inputType = objCtrl.type;

            if (inputType == "checkbox") {
                // if(objCtrl.customValue && objCtrl.customValue == "True")
                if (objCtrl.attributes["customValue"]) {
                    var customValue = objCtrl.attributes["customValue"].value.toLowerCase();
                    if ((customValue == "true") || (customValue == "t") || (customValue == "yes") || (customValue == "y") || (customValue == "1") || (customValue == "ja")) {
                        inputTags.item(i).checked = true;
                    }
                    else if ((customValue == "false") || (customValue == "f") || (customValue == "no") || (customValue == "n") || (customValue == "0") || (customValue == "nej")) {
                        inputTags.item(i).checked = false;
                    }
                    else if (objCtrl.attributes["value"]) {

                        var chkvalue = objCtrl.attributes["value"].value.toLowerCase();
                        if (customValue.indexOf(chkvalue) != -1) {
                            var values = customValue.split(';');
                            var idx_count = 0;
                            for (idx_count = 0; idx_count < values.length; idx_count++) {
                                if (chkvalue == values[idx_count]) {
                                    inputTags.item(i).checked = true;
                                    break;
                                }
                            }
                        }
                    }
                }
            }

            if (inputType == "radio") {
                if (objCtrl) {
                    if (objCtrl.attributes["customValue"] && objCtrl.attributes["customValue"].value == objCtrl.value) {
                        inputTags.item(i).checked = true;
                    } else {
                        var target = $(objCtrl).attr("target");
                        if (attributes != null && target != null && target != "") {
                            var maskInfo = attributes[target.toLowerCase()];
                            if (maskInfo && maskInfo.datatype) {
                                if (maskInfo.datatype.toLowerCase().indexOf("bool") != -1) {
                                    var booleanType = new BooleanBehaviour();
                                    var unmaskedValue = booleanType.validValues[objCtrl.value];
                                    if (unmaskedValue) {
                                        if (unmaskedValue == objCtrl.attributes["customValue"].value.toLowerCase()) {
                                            inputTags.item(i).checked = true;
                                        }
                                    }
                                }
                            }
                        }
                    }

                }
            }
        }
        // ** newly added line of code, 02-06-2010
        for (j = 0; j < selectIDTags.length; j++) {
            var objCtrlselect = selectIDTags.item(j);
            var inputTypeselect = objCtrlselect.type;
            var IdValue = selectIDTags.item(j).attributes["id"].value;
            var IdSelect = document.getElementById(IdValue);
            var SelectOptions = IdSelect.getElementsByTagName("option");

            var ValueArray = new Array();

            for (i = 0; i < SelectOptions.length; i++) {
                ValueArray.push(SelectOptions[i].value);

                if (inputTypeselect == "select-one") {
                    if (objCtrlselect.attributes["customValue"]) {

                        var targetText = selectIDTags.item(j).attributes["customValue"].value;
                        var string = getPosition(ValueArray, targetText);
                        document.getElementById(IdValue).selectedIndex = string;
                    }
                }
            }
        }
        //Changes for masking.
        maskInputFields();

    }
    catch (ex) { }
}

function getPosition(arrayName, arrayItem) {
    for (var i = 0; i < arrayName.length; i++) {
        if (arrayName[i] == arrayItem)
            return i;
    }
}


// ** newly added line of code

//Changes for Masking
function maskInputFields() {
    //this function depends on JQuery
    maskedAttributes = new MaskedAttributeContainer();
    var inputControls = (window.navigator.userAgent.indexOf("Opera") === -1) ? $(":text,textarea") : $(":text");
    try {
        fillMaskedElementArray(inputControls);
        $(arrayElements).each(function(i, v) {
            var ele = arrayElements[i];
            maskedAttributes.AddItem(ele.id, ele.mask, ele.datatype, ele.value, ele.control);
        });
    }
    catch (e) {
    }
}

function fillMaskedElementArray(controls) {
    //Need to get mask and datatype
    var elementObj = null;
    controls.each(function(i, v) {
        controls[i].maskid = "control_" + UID;
        var value = $(controls[i]).val();
        var target = $(controls[i]).attr("target");
        var overrideMask = $(controls[i]).attr("mask");
        if (attributes != null && target != null && target != "") {
            var maskInfo = attributes[target.toLowerCase()];
            if (maskInfo && maskInfo.datatype) {
                elementObj = {
                    "id": controls[i].maskid,
                    "mask": (overrideMask != null && typeof (overrideMask) != 'undefined') ? overrideMask : maskInfo.mask,
                    "datatype": maskInfo.datatype,
                    "value": value,
                    "control": $(controls[i])
                }

                if (!controls[i].title && controls[i].title == "") {
                    controls[i].title = (overrideMask != null && typeof (overrideMask) != 'undefined') ? overrideMask : maskInfo.mask;
                }

                arrayElements.push(elementObj);
            }
        }
        UID = UID + 1;
    });
}

// fieldid - takes field id as parameter.
function getUnnMaskValues(fieldid) {
    var fieldValue;
    var validateMaskField = null;
    if (fieldid) {
        var maskedItem = maskedAttributes.GetItem(fieldid);
        if (maskedItem != null) {
            fieldValue = maskedItem.GetValue();
            validateMaskField = maskedItem.Validate(fieldValue);
            if (validateMaskField) {
                if (validateMaskField.HasError == 1) {
                    errorString += "- [" + fieldValue + "]: " + validateMaskField.Error + "\n";
                }
            }
        }
        else {
            return maskedItem;
        }
    }

    return fieldValue;
}




window.onload = onLoad;
