/*
 * formObject
 * 
 * Generic class to define the custom formObject interface.
 *
 * Usage:
 *      String getFormContent() - return the custom form content.
 *      Array[String] getRequired() - return the required elements list.
 *      void openPopup() - open the popup window.
 *      boolean isValid(name, value) - return true if input elem value is valid. Base method checks for length > 0.
 *
 * In your [formname]_content.js file please create the
 * functions you need to use
 */
function WSP_CF_FormObject() {

    this.getFormContent = function() {
        if (typeof(wsp_cf_getFormContent) == "function") {
            return wsp_cf_getFormContent();
        }
        return "";
    }
    
    this.getRequired = function() {
        if (typeof(wsp_cf_getRequired) == "function") {
            return wsp_cf_getRequired();
        }
        return [];
    }
    
    this.openPopup = function() {
        if (typeof(wsp_cf_openPopup) == "function") {
            wsp_cf_openPopup();
        }
    }
    
    this.isValid = function(name, value) {
        if (typeof(wsp_cf_isValid) == "function") {
            return wsp_cf_isValid(name, value);
        }
        return (value.length > 0);
    }
    
    this.getNextUrl = function() {
        if (typeof(wsp_cf_getNextUrl) == "function") {
            return wsp_cf_getNextUrl();
        }
        return "";
    }
}


/*
 *
 * the custom form handler 
 *
 */
(function () {

    // initialize handler
    var formObject = new WSP_CF_FormObject();
    var formEl = document.wsp_formsgr_frm;

    var errEl = null;
    var currentErr = [];
    var c = "";
    
    if (formEl) {
        formEl.innerHTML = formObject.getFormContent() + formEl.innerHTML;
        errEl = document.getElementById("errormessage");

        if (errEl != null) {
            errEl.style.display = "none";
        }

        c = formEl.onsubmit + "";
        formEl.onsubmit = doSubmit;
        
        // initialize form with params data
        var url = document.location + "";
        url.replace(/([^?=&]+)=([^&]*)/g, function(m,pm1,pm2) { 
            try { 
                pm1 = unescape(pm1);
                if (formEl.elements[pm1].type == "checkbox") {
                    formEl.elements[pm1].checked = (pm2 == "true")? true :false;
                }
                else if (formEl.elements[pm1].length > 0) {
                    for (var i=0;i<formEl.elements[pm1].length;i++) {
                        if (formEl.elements[pm1][i].value == pm2) {
                            formEl.elements[pm1][i].checked = true;
                            break;
                        }
                    }
                }
                else {
                    formEl.elements[pm1].value = unescape(pm2);
                }
            } catch(e) {}
        });
        
        // set next url
        var nu = formObject.getNextUrl();
        if (nu.length > 0) {
            formEl.elements['NextPageURL'].value = nu;
        }
    }

    /*
     * submit handler
     */
    function doSubmit() {
        hideErrors();
        if (formValidate()) { 
            // call needed quicktools forms mgr methods
	    try {
            eval("formEl.f= " + c);
            formEl.f();
} catch(e) {}

            // see form object for more info
            formObject.openPopup();

            return true;
        }

        showErrors();
        return false;
    }

    /*
     * form validation handler
     */
    function formValidate() {
        var isOk = true;
        var reqElems = formObject.getRequired();
        if (reqElems && reqElems.length > 0) {
            for (var i=0; i<reqElems.length;i++) {
                var req = formEl.elements[reqElems[i]];
                if (req) {
                    if (!formObject.isValid(reqElems[i], req.value)) {
                        addErrorElem(req);
                        isOk = false;
                    }
                }
                else {
                    alert('Required elem missing on form!');
                }
            }
        }
        return isOk;

    }

    /*
     *  error handler methods
     */
    function addErrorElem(elem) {
        currentErr[currentErr.length] = elem;
    }

    function hideErrors() {
        if (errEl != null) {
            errEl.style.display = "none";
        }
        if (currentErr.length > 0) {
            for (var i=0;i<currentErr.length;i++) {
                currentErr[i].style.border = "0px";
            }
            currentErr = [];
        }
    }

    function showErrors() {
        if (errEl != null) {
            errEl.style.display = "block";
        }
        for (var i=0;i<currentErr.length;i++) {
            currentErr[i].style.border = "1px solid #ff0000";    
        }
    }
})();
