var submit_flag = false;

function submitForm(button, frm)
{
    if (!submit_flag)
    {
        submit_flag = true;
        frm.act.value = button.name;
        frm.submit();
    }
}

function isset(val)
{
    return ((val == null || typeof(val) == "undefined" || val == "null" || val == "NULL" || val == "undefined" || val == "") ? false : true);
}

function isArray(arr)
{
    for (var i in arr)
    {
        return true; 
    }
    return false;
}

function trim(str)
{
    str = ((isset(str)) ? str : "");
    str = str.replace(/[\s\r\n]+$/, "");
    str = str.replace(/^[\s\r\n]+/, "");
    return str;
}

function Validator(frm)
{
    this.frm    = frm;
    this.elems  = new Array();
    this.errors = new Array();

    this.getObj     = validatorGetObj;
    this.req        = validatorReq;
    this.checkReq   = validatorCheckReq;
    this.email      = validatorEmail;
    this.checkEmail = validatorCheckEmail;
    this.url        = validatorUrl;
    this.checkUrl   = validatorCheckUrl;
    this.pass       = validatorPass;
    this.checkPass  = validatorCheckPass;
    this.clear      = validatorClear;
    this.check      = validatorCheck;
}

function validatorGetObj(elem)
{
    eval("var obj = this.frm." + elem);
    return obj;
}

function validatorReq(elem, text)
{
    var arr = {
               "elem" : elem,
               "text" : text,
               "type" : "req"
              };
    this.elems[this.elems.length] = arr;
}

function validatorCheckReq(elem)
{
    var obj = this.getObj(elem["elem"]);
    if (!isset(trim(obj.value)))
    {
        this.errors[this.errors.length] = "Field '" + elem["text"] + "' must be entered";
    } 
}

function validatorEmail(elem, text)
{
    var arr = {
               "elem" : elem,
               "text" : text,
               "type" : "email"
              };
    this.elems[this.elems.length] = arr;
}

function validatorCheckEmail(elem)
{
    var obj = this.getObj(elem["elem"]);
    if (isset(trim(obj.value))) 
    {
        if (!/^[^@]+@[^@\.]+\.[^@]+$/.test(obj.value))
        {
            this.errors[this.errors.length] = "Email address in the field '" + elem["text"] + "' seems incorrect (check @ and .'s)";
        }
    }
}

function validatorUrl(elem, text, proto, end)
{
    var arr = {
               "elem" : elem,
               "text" : text,
               "type" : "url"
              };
    if (isset(proto))
    {
        arr["proto"] = proto;
    } 
    if (isset(end))
    {
        arr["end"] = end;
    } 
    this.elems[this.elems.length] = arr;
}

function validatorCheckUrl(elem)
{
    var obj = this.getObj(elem["elem"]);
    if (isset(trim(obj.value))) 
    {
        if (isset(elem["proto"]))
        {
            var re = new RegExp("^" + elem["proto"] + "://", "i");
            if (!re.test(obj.value))
            {
                this.errors[this.errors.length] = "URL address in the field '" + elem["text"] + "' must start with " + elem["proto"] + "://";
            }
        }
        else
        {
            if (!/^[^\:]+\:/i.test(obj.value))
            {
                this.errors[this.errors.length] = "URL address in the field '" + elem["text"] + "' doesn't seem to be valid";
            }
        }
        if (isset(elem["end"]))
        {
            if (!isArray(elem["end"]))
            {
                elem["end"] = new Array(elem["end"]);
            }
            var matched = false;
            for (var i in elem["end"])
            {
                var re = new RegExp(elem["end"][i] + "$", "i");
                if (re.test(obj.value))
                {
                    matched = true;
                    break;
                }
            }
            if (!matched)
            {
                this.errors[this.errors.length] = "URL address in the field '" + elem["text"] + "' must end with " + elem["end"].join(", ");
            }
        }
    }
}

function validatorPass(elem_1, text_1, elem_2, text_2, len)
{
    var arr = {
               "elem_1" : elem_1,
               "text_1" : text_1,
               "elem_2" : elem_2,
               "text_2" : text_2,
               "type"   : "pass"
              };
    if (isset(len))
    {
        arr["len"] = len;
    } 
    this.elems[this.elems.length] = arr;
}

function validatorCheckPass(elem)
{
    var obj_1 = this.getObj(elem["elem_1"]);
    var obj_2 = this.getObj(elem["elem_2"]);
    if (isset(trim(obj_1.value)) && isset(trim(obj_2.value))) 
    {
        if (isset(elem["len"]) && obj_1.value.length < elem["len"])
        {
            this.errors[this.errors.length] = "Password in the field '" + elem["text_1"] + "' must be at least " + elem["len"] + " characters long";
        }
        if (obj_1.value != obj_2.value)
        {
            this.errors[this.errors.length] = "Passwords in the fields '" + elem["text_1"] + "' and '" + elem["text_2"] + "' must be equal";
        }
    }
}

function validatorClear(elem)
{
    var tmp = this.elems;
    this.elems = new Array();
    for (var i in tmp)
    {
        if (tmp[i]["elem"] != elem)
        {
            this.elems[this.elems.length] = tmp[i];
        }
    }
}

function validatorCheck()
{
    this.errors = new Array();
    for (var i in this.elems)
    {
        var error = false;
        switch (this.elems[i]["type"])
        {
            case "req":
            {
                this.checkReq(this.elems[i]);
                break; 
            }
            case "email":
            {
                this.checkEmail(this.elems[i]);
                break; 
            }
            case "url":
            {
                this.checkUrl(this.elems[i]);
                break; 
            }
            case "pass":
            {
                this.checkPass(this.elems[i]);
                break; 
            }
        }
    }
    if (this.errors.length > 0)
    {
        var error_text = "The form was not submited due to the following error(s):\n\n";
        for (var i in this.errors)
        {
            error_text += "- " + this.errors[i] + "\n";
        } 
        alert(error_text);
        return false; 
    }
    return true;
}

function confirmDelete(text)
{
    return confirm("Are you sure you want to delete " + text + "?");
}

