function require(cntrl){
	if (!cntrl) cntrl = this;
    cntrl = $(cntrl);
    var err_txt = (arguments.length > 1)? arguments[1] : '';
    var is_req = cntrl.hasClassName('required') || cntrl.up('.required') != undefined || cntrl.readAttribute('required');
    if(is_req && !$F(cntrl).strip()) {
    	if(err_txt) show_error(cntrl, err_txt);
    	cntrl.addClassName('notset');
    	return false;
    }
    cntrl.removeClassName('notset');
    clear_error(cntrl);
    return true;
}

function validate_string(cntrl){
    return true;
}

function validate_text(cntrl){
    return true;
}

function validate_html(cntrl){
    return true;
}

function validate_url(cntrl){
    return true;
}

function validate_email(cntrl){
    if (!cntrl) cntrl = this;
    cntrl = $(cntrl);
    var err_txt = (arguments.length > 1)? arguments[1] : '';
    require(cntrl);
    var v =$F(cntrl);
    if(!is_email(v)){
            if(err_txt) show_error(cntrl, err_txt);
            cntrl.addClassName('invalid');
            return false;
        }
        cntrl.removeClassName('invalid');
        clear_error(cntrl);
        return true;
}

function is_email(v){
	var atom = '[-a-z0-9!#var %&\'*+\/=?^_`{|}~]';    // allowed characters for part before "at" character
    var domain = '([a-z]([-a-z0-9]*[a-z0-9]+)?)'; // allowed characters for part after "at" character
        var regex = '^' +atom + '+'+        // One or more atom characters.
        '(\.' + atom + '+)*'+               // Followed by zero or more dot separated sets of one or more atom characters.
        '@'+                                 // Followed by an "at" character.
        '(' + domain + '{1,63}\.)+'+       // Followed by one or max 63 domain characters (dot separated).
        domain + '{2,63}'+                  // Must be followed by one set consisting a period of two
        '$';
        var re = new RegExp(regex, 'i');
        return re.test(v);
}

/*
function validate_sysname(cntrl){
    if (!cntrl) cntrl = this;
    var v =$F(cntrl);
    cntrl = $(cntrl);
    var err_txt = (arguments.length > 1)? arguments[1] : '';
    require(cntrl);


    var re = /^[a-z][0-9a-z_\-]{0,31}$/i;
    cntrl.removeClassName('invalid');
    clear_error(cntrl);
    if(v.length > 32 || !v.match(re)){
        if(err_txt) show_error(cntrl, err_txt);
        cntrl.addClassName('invalid');
        return false;
    }
    return true;
}


function validate_date(cntrl){
    return true;
}

function validate_integer(cntrl){
    if (!cntrl) cntrl = this;
    var v =$F(cntrl);
    cntrl = $(cntrl);
    var err_txt = (arguments.length > 1)? arguments[1] : '';
    require(cntrl);

    var re = /^[0-9]{0,19}$/;
    cntrl.removeClassName('invalid');
    clear_error(cntrl);
    if(!v.match(re)){
    	if(err_txt) show_error(cntrl, err_txt);
        cntrl.addClassName('invalid');
        return false;
    }
    return true;
}

function validate_float(cntrl){
    if (!cntrl) cntrl = this;
    var v =$F(cntrl);
    cntrl = $(cntrl);
    var err_txt = (arguments.length > 1)? arguments[1] : '';
    require(cntrl);

    var re = /^[0-9., \-\+]{0,32}$/;
    cntrl.removeClassName('invalid');
    clear_error(cntrl);
    if(!v.match(re) ||(v != ('' + parseInt(v)) && v != ('' + parseFloat(v))){
    	if(err_txt) show_error(cntrl, err_txt);
        cntrl.addClassName('invalid');
        return false;
    }
    return true;
}

function validate_id(cntrl){
    if (!cntrl) cntrl = this;
    cntrl = $(cntrl);
    var v =$F(cntrl);
    var err_txt = (arguments.length > 1)? arguments[1] : '';
    require(cntrl);

    var re = /^[0-9]{0,19}$/;
    cntrl.removeClassName('invalid');
    clear_error(cntrl);
    if(!v.match(re)){
    	if(err_txt) show_error(cntrl, err_txt);
        cntrl.addClassName('invalid');
        return false;
    }
    return true;
}
*/

function show_error(cntrl, text){
	cntrl = $(cntrl);
    if(! $('err_'+cntrl.id)) new Insertion.Before(cntrl, '<div id="err_'+cntrl.id+'" class="error_msg">'+text+'</div>');
    else $('err_'+cntrl.id).innerHTML +='<br />'+ text;
    Field.activate(cntrl);
}

function clear_error(cntrl){
   cntrl = $(cntrl);
   if($("err_"+cntrl.id)) Element.remove("err_"+cntrl.id);
}

function check_length (cntrl, len){
	if (!cntrl) cntrl = this;
    cntrl = $(cntrl);
    var v =$F(cntrl);
    var err_txt = (arguments.length > 2)? arguments[2] : '';
    clear_error(cntrl);
    cntrl.removeClassName('short');
    if (v.strip().length < len){
    	if(err_txt) show_error(cntrl, err_txt);
        cntrl.addClassName('short');
        return false;
    }
    return true;
}

function is_equal(cntrl1, cntrl2) {
	 cntrl1 = $(cntrl1);
	 cntrl2 = $(cntrl2);
	 var err_txt = (arguments.length > 2)? arguments[2] : '';
	 if ($F(cntrl1) != $F(cntrl2)){
	    	if(err_txt) show_error(cntrl1, err_txt);
	        cntrl1.addClassName('invalid');
	        cntrl2.addClassName('invalid');
	        return false;
	    }
	    cntrl1.removeClassName('invalid');
	    cntrl2.removeClassName('invalid');
	    clear_error(cntrl1);
	    return true;
}

