///////////////////////////////////////////////////////////////////////////////
// VDaemon PHP Library version 2.3.0
// Copyright (C) 2002-2004 Alexander Orlov and Andrei Stepanuga
//
// VDaemon client-side validation file
//
///////////////////////////////////////////////////////////////////////////////

function VDSymError()
{
  return true;
}
window.onerror = VDSymError;

var vdAllForms = new Array();
var vdForm = null;
var vdDelimiter = "~";
var vderrclass=null;

function VDValidateForm(formName)
{
    if (typeof(vdAllForms[formName]) == "undefined")
        return true;

    vdForm = vdAllForms[formName];
    var isPageValid = true;
    for (var key in vdForm.validators)
    {
        VDValidateValidator(vdForm.validators[key]);
        isPageValid = isPageValid && vdForm.validators[key].isvalid;
    }
    vdForm.isvalid = isPageValid;
    VDUpdateLabels();
    VDUpdateSummaries();

    vdForm = null;
    return isPageValid;
}

function VDValidateValidator(validator)
{
    validator.isvalid = true;
    switch (validator.type)
    {
        case "required":
            validator.isvalid = VDEvaluateRequired(validator);
            break;
        case "checktype":
            validator.isvalid = VDEvaluateChecktype(validator);
            break;
        case "range":
            validator.isvalid = VDEvaluateRange(validator);
            break;
        case "compare":
            validator.isvalid = VDEvaluateCompare(validator);
            break;
        case "regexp":
            validator.isvalid = VDEvaluateRegExp(validator);
            break;
        case "email":
            validator.isvalid = VDEvaluateEmail(validator);
            break;
        case "custom":
            validator.isvalid = VDEvaluateCustom(validator);
            break;
        case "group":
            validator.isvalid = false;
            for (var i in validator.items)
            {
                VDValidateValidator(validator.items[i]);
                validator.isvalid = validator.isvalid || validator.items[i].isvalid;
            }
            break;
    }
}

function VDUpdateLabels()
{
    if (typeof(vdForm.labels) == "undefined")
        return;
    var i, j;
    for (i in vdForm.labels)
    {
        var oLabel = vdForm.labels[i];
        var label = document.getElementById(oLabel.id);
        if (label != null)
        {
            var isValid = true;
            for (j in oLabel.validators)
            {
                var valName = oLabel.validators[j];
                if (typeof(vdForm.validators[valName]) != "undefined")
                {
                    isValid = isValid && vdForm.validators[valName].isvalid;
                }
            }

            label.innerHTML = "";
            if (isValid)
            {
                label.innerHTML = oLabel.oktext;
                label.className = oLabel.okclass;
            }
            else
            {
                label.innerHTML = oLabel.errtext;
                label.className = oLabel.errclass;
				vderrclass=label.className; //save error class
            }
        }
    }
}

function VDUpdateSummaries()
{
    if (typeof(vdForm.summaries) == "undefined")
        return;

    for (var i in vdForm.summaries)
    {
        var headerSep, first, pre, post, last, s;
        var oSummary = vdForm.summaries[i];
        var summary = document.getElementById(oSummary.id);
        if (summary != null)
        {
            if (vdForm.isvalid)
            {
                //summary.innerHTML = oSummary.showsummary ? "&nbsp;" : "";
                summary.innerHTML = "";
                summary.style.display = "none";
                loading.style.display = "";
            }
            else
            {
                if (oSummary.showsummary)
                {
                    switch (oSummary.displaymode)
                    {
                        case "list":
                        default:
                            headerSep = "<br>";
                            first = "";
                            pre = "&#8226; ";
                            post = "<br>";
                            last = "";
                            break;
                        case "bulletlist":
                            headerSep = "";
                            first = "<ul>";
                            pre = "<li>";
                            post = "</li>";
                            last = "</ul>";
                            break;
                        case "paragraph":
                            headerSep = " ";
                            first = "";
                            pre = "";
                            post = ", ";
                            last = ".";
                            break;
                        case "paragraph-a":
                            headerSep = " ";
                            first = "";
                            pre = "";
                            post = " ";
                            last = "";
                            break;
                    }

                    s = "";
                    for (var j in vdForm.validators)
                    {
                        var val = vdForm.validators[j];
                        if (!val.isvalid && val.errmsg)
                        {
                            s += pre + val.errmsg + post;
                        }
                    }
                    if (s != "")
                    {
						if(s.lastIndexOf(post)==s.length-2){
							s=s.substring(0, s.length-2);
						}
                        s = headerSep + first + s + last;
                    }
                    if (oSummary.headertext != "")
                    {
						if(vderrclass!=null){
	                        s = oSummary.headertext + s;							
						}else{
	                        s = "<a class='error'>"+ oSummary.headertext + s+"</a>";
						}
                    }
                    
                    summary.innerHTML = s;
                    summary.style.display = (s == "") ? "none" : "";
                    //window.scrollTo(0,0);
                }

                if (oSummary.messagebox)
                {
                    s = "";
                    if (oSummary.headertext != "")
                    {
                        s += oSummary.headertext + "\n";
                    }
                    for (var j in vdForm.validators)
                    {
                        var val = vdForm.validators[j];
                        if (!val.isvalid && val.errmsg != null)
                        {
                            switch (oSummary.displaymode)
                            {
                                case "list":
                                default:
                                    s += val.errmsg + "\n";
                                    break;
                                case "bulletlist":
                                    s += "  - " + val.errmsg + "\n";
                                    break;
                                case "paragraph":
                                    s += val.errmsg + " ";
                                    break;
                            }
                        }
                    }
                    alert(s);
                }
            }
        }
    }
}

function VDGetControlValue(formName, controlName)
{
    var control;
    control = document.forms[formName].elements[controlName];
    if (typeof(control) == "undefined")
        return "";
    
    var isArray = false;
    if (controlName.length > 2)
        isArray = controlName.substring(controlName.length - 2, controlName.length) == "[]";
    
    return VDGetControlValueRecursive(control, isArray);
 }

function VDGetControlValueRecursive(control, isArray)
{
    var result = "";
    if (typeof(control.type) == "undefined")
    {
        if (typeof(control.tagName) == "undefined" && typeof(control.length) == "number")
        {
            for (var j = 0; j < control.length; j++)
            {
                var value = VDGetControlValueRecursive(control[j], isArray);
                if (value != "")
                {
                    if (isArray && result != "")
                        result += vdDelimiter + value;
                    else
                        result = value;
                }
            }
        }
        else if (typeof(control.tagName) == "string" && control.tagName.toLowerCase() == "option")
        {
            if (control.selected)
            {
                if (typeof(control.value) == "string")
                {
                    if (control.getAttribute("VALUE") == "")
                        result = VDTrim(control.text);
                    else
                        result = VDTrim(control.value);
                }
                else
                {
                    result = VDTrim(control.text);
                }
            }
        }
    }
    else
    {
        if (control.type == "select-multiple")
        {
            var children = control.getElementsByTagName("OPTION");
            result = VDGetControlValueRecursive(children, isArray);
        }
        else if (typeof(control.value) == "string")
        {
            if (control.type == "checkbox" || control.type == "radio")
            {
                if (control.checked)
                    result = VDTrim(control.value);
            }
            else
                result = VDTrim(control.value);
        }
    }
    return result;
}

function VDTrim(str)
{
    var match = str.match(/^\s*(\S+(\s+\S+)*)\s*$/);
    return (match == null) ? "" : match[1];
}

function VDConvert(op, val)
{
    function GetFullYear(year)
    {
        return (year + 2000) - ((year < 30) ? 0 : 100);
    }
    
    var dataType = val.validtype;
    var num, cleanInput, m, exp;
    if (dataType == "integer")
    {
        exp = /^\s*[-\+]?\d+\s*$/;
        if (op.match(exp) == null) 
            return null;
        num = parseInt(op, 10);
        return (isNaN(num) ? null : num);
    }
    else if(dataType == "float")
    {
        exp = new RegExp("^\\s*([-\\+])?(\\d+)?(\\.\\d+)?\\s*$");
        m = op.match(exp);
        if (m == null)
            return null;
        cleanInput = m[1] + (m[2].length > 0 ? m[2] : "0") + m[3];
        num = parseFloat(cleanInput);
        return (isNaN(num) ? null : num);            
    } 
    else if (dataType == "currency")
    {
        exp = new RegExp("^\\s*([-\\+])?(((\\d+)\\,)*)(\\d+)(\\.\\d{1,2})?\\s*$");
        m = op.match(exp);
        if (m == null)
            return null;
        var intermed = m[2] + m[5];
        cleanInput = m[1] + intermed.replace(new RegExp("(\\,)", "g"), "") + m[6];
        num = parseFloat(cleanInput);
        return (isNaN(num) ? null : num);            
    }
    else if (dataType == "date")
    {
        var day, month, year;
        if (val.dateorder == "ymd")
        {
            exp = new RegExp("^\\s*((\\d{4})|(\\d{2}))([-./])(\\d{1,2})\\4(\\d{1,2})\\s*$");
            m = op.match(exp);
            if (m == null)
                return null;
            day = m[6];
            month = m[5];
            year = (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10));
        }
        else
        {
            exp = new RegExp("^\\s*(\\d{1,2})([-./])(\\d{1,2})\\2((\\d{4})|(\\d{2}))\\s*$");
            m = op.match(exp);
            if (m == null)
                return null;
            if (val.dateorder == "dmy")
            {
                day = m[1];
                month = m[3];
            }
            else
            {
                day = m[3];
                month = m[1];
            }
            year = (m[5].length == 4) ? m[5] : GetFullYear(parseInt(m[6], 10));
        }
        month -= 1;
        var date = new Date(year, month, day);
        return (typeof(date) == "object" && year == date.getFullYear() && month == date.getMonth() && day == date.getDate()) ? date.valueOf() : null;
    }
    else
    {
        return op.toString();
    }
}

function VDCompare(operand1, operand2, operator, val)
{
    var op1, op2;
    if ((op1 = VDConvert(operand1, val)) == null)
        return false;    
    if ((op2 = VDConvert(operand2, val)) == null)
        return true;

    if (val.validtype == "string" && !val.casesensitive)
    {
        op1 = op1.toLowerCase();
        op2 = op2.toLowerCase();
    }    
    switch (operator)
    {
        case "ne":
            return (op1 != op2);
        case "g":
            return (op1 > op2);
        case "ge":
            return (op1 >= op2);
        case "l":
            return (op1 < op2);
        case "le":
            return (op1 <= op2);
        case "e":
        default:
            return (op1 == op2);            
    }
}

function VDEvaluateRequired(validator)
{
    var value = VDGetControlValue(vdForm.name, validator.control);
    if (value.length < validator.minlength)
        return false;
    if (validator.maxlength != -1)
        return (value.length <= validator.maxlength);
    
    return true;
}

function VDEvaluateChecktype(validator)
{
    var value = VDGetControlValue(vdForm.name, validator.control);
    if (value.length == 0)
        return true;
    
    return (VDConvert(value, validator) != null);
}

function VDEvaluateRange(validator)
{
    var value = VDGetControlValue(vdForm.name, validator.control);
    if (value.length == 0) 
        return true;
    
    return (VDCompare(value, validator.minvalue, "ge", validator) &&
            VDCompare(value, validator.maxvalue, "le", validator));
}

function VDEvaluateCompare(validator)
{
    var value = VDGetControlValue(vdForm.name, validator.control);
    if (value.length == 0) 
        return true;
    
    var compareTo = "";
    if (typeof(validator.comparevalue) != "undefined")
    {
        compareTo = validator.comparevalue;
    }
    else if (typeof(validator.comparecontrol) != "undefined")
    {
        compareTo = VDGetControlValue(vdForm.name, validator.comparecontrol);
    }
    else
        return false;

    return VDCompare(value, compareTo, validator.operator, validator);
}

function VDEvaluateRegExp(validator)
{
    var result = true;
    
    var value = VDGetControlValue(vdForm.name, validator.control);
    if (value.length > 0)
    {
        var rx;
        try
        {
            eval("rx = " + validator.clientregexp + ";");
            var matches = rx.exec(value);
            result = (matches != null);
        }
        catch(e)
        {
            result = true;
        }
    }
    
    return result;
}

function VDEvaluateEmail(validator)
{
    var value = VDGetControlValue(vdForm.name, validator.control);
    if (value.length == 0) 
        return true;        
    var rx = /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)*\.\w{2,8}$/;
    var matches = rx.exec(value);
    return (matches != null);
}

function VDEvaluateCustom(validator)
{
    var value = null;
    if (typeof(validator.control) == "string")
    {
        value = VDGetControlValue(vdForm.name, validator.control);
    }
    
    var args = new Object();
    args.isvalid = true;
    args.errmsg = validator.errmsg;
    args.value = value;
    if (typeof(validator.clientfunction) == "string")
    {
        var rx = /^[a-zA-Z_]\w*$/;
        var m = rx.exec(validator.clientfunction);
        var isfunc;
        if (m != null)
        {
            eval("isfunc = typeof(" + validator.clientfunction + ") == 'function';");
            if (isfunc)
            {
                eval(validator.clientfunction + "(args);");
                args.isvalid = (args.isvalid === true);
                if (typeof(args.errmsg) == "string" && validator.type != "group")
                {
                    validator.errmsg = args.errmsg;
                }
            }
        }
    }        
    return args.isvalid;
}