/*******************************************
 * Validation functions, JavaScript File 
 * Made by Finansis - Artur Tomaszewski    
 *******************************************/

// patterns
var PAT_EMPTY     = /^\s*$/; // '',' '
var PAT_INT       = /^-?\d+(\s|$)/; // '1','-10'
var PAT_INT_POS   = /^\d+(\s|$)/; // '10'
var PAT_FLOAT     = /(^-?\d+$)|(^-?\d+\.\d+(\s|$))/; // '0.1','-0.1'
var PAT_FLOAT_POS = /(^\d+$)|(^\d+\.\d+(\s|$))/; // '0.1'

var PAT_ZIPCODE   = /^\d{2}-\d{3}(\s|$)/;
var HINT_ZIPCODE  = 'xx-xxx';

//var PAT_EMAIL     = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
var PAT_EMAIL     = /^(\w+\.)*\w+@(\w+\.)*\w+(\.\w{2,3})+$/;
var HINT_EMAIL    = 'user@domena.pl';

var PAT_DATE      = /^([12]\d\d\d)-([01]\d)-([0-3]\d)(\s|$)/;
var HINT_DATE     = 'yyyy-mm-dd';
var PAT_DOT_DATE  = /^([12]\d\d\d)\.([01]\d)\.([0-3]\d)(\s|$)/;
var HINT_DOT_DATE = 'yyyy.mm.dd';

var PAT_HOUR      = /^(\d|([01]\d)|(2[0-3])):(\d|[0-5]\d)(\s|$)/; // '12:20','08:15','3:00','23:5'
var HINT_HOUR     = 'hh:mm';

// error message functions

/**
 * Shows message and focuses given field
 * @fld Field to focus
 * @msg Message to show
 * @return false
 */
function showError(fld,msg) {
    alert(msg);
    try {fld.focus();} catch(e) {};
    return false;
}

/**
 * Adds validation message to error messages
 * @return error messagess
 */ 
function addError(msg,errmsgs) {
    if (msg) {
        if (!errmsgs) errmsgs='';
        if (errmsgs.length>0) errmsgs+='\n';
        errmsgs+=msg;
    }
    return errmsgs;
}

/**
 * Check if there are any error messages
 */ 
function isError(errmsgs) {
    if (errmsgs) 
        return !isEmptyValue(errmsgs);
    else 
        return false;
}

// validation functions

/**
 * Validates value vs pattern
 */
function matchPattern(pattern,val) {
    return pattern.test(val);
}

// empty value validators
function isEmptyValue(val) {
    return matchPattern(PAT_EMPTY,val);
}
function isEmpty(fld) {
    return fld ? isEmptyValue(fld.value) : true;
}

// integer validators
function isIntValue(val) {
    return matchPattern(PAT_INT,val);
}
function isInt(fld) {
    return fld ? isIntValue(fld.value) : false;
}
function isPositiveIntValue(val) {
    return matchPattern(PAT_INT_POS,val);
}
function isPositiveInt(fld) {
    return fld ? isPositiveIntValue(fld.value) : false;
}

// float validators
function isFloatValue(val) {
    return matchPattern(PAT_FLOAT,val);
}
function isFloat(fld) {
    return fld ? isFloatValue(fld.value) : false;
}
function isPositiveFloatValue(val) {
    return matchPattern(PAT_FLOAT_POS,val);
}
function isPositiveFloat(fld) {
    return fld ? isPositiveFloatValue(fld.value) : false;
}

// zip-code validators
function isZipCodeValue(val) {
    return matchPattern(PAT_ZIPCODE,val);
}
function isZipCode(fld) {
    return fld ? isZipCodeValue(fld.value) : false;
}
function getZipCodeHint() {
    return HINT_ZIPCODE;
}

// e-mail validators
function isEmailValue(val) {
    return matchPattern(PAT_EMAIL,val);
}
function isEmail(fld) {
    return fld ? isEmailValue(fld.value) : false;
}
function getEmailHint() {
    return HINT_EMAIL;
}

// date validators
function isDateValue(val) {
    return matchPattern(PAT_DATE,val);
}
function isDate(fld) {
    return fld ? isDateValue(fld.value) : false;
}
function getDateHint() {
    return HINT_DATE;
}
function isDotDateValue(val) {
    return matchPattern(PAT_DOT_DATE,val);
}
function isDotDate(fld) {
    return fld ? isDotDateValue(fld.value) : false;
}
function getDotDateHint() {
    return HINT_DOT_DATE;
}

// hour validators
function isHourValue(val) {
    return matchPattern(PAT_HOUR,val);
}
function isHour(fld) {
    return fld ? isHourValue(fld.value) : false;
}
function getHourHint() {
    return HINT_HOUR;
}


// other validators

function isEnabled(fld) {
    return fld && fld.disabled==false ? true : false;
}

/**
 * Checks if select field is selected, radio is checked or checkbox is checked
 */
function isSelected(fld) {
    if (isSelectCtrl(fld)) {
        return fld.selectedIndex>=0 && fld.value!=null ? true : false;
    }
    else if (isCheckboxCtrl(fld)) {
        return fld.checked && fld.value!=null ? true : false;
    }
    else if (isRadioCtrl(fld)) {
        try { 
            for (var i=0;fld.length;++i) {
                if (fld[i].checked==true && fld[i].value!=null) {
                    return true;
                }
            }
        }
        catch(e){};
    }
    return false;
}

function isChecked(fld) {
    return isSelected(fld);
}

// useful functions

function isSelectCtrl(fld) {
    return fld && fld.type && fld.type.indexOf('select')!=-1 ? true : false;
}

function isCheckboxCtrl(fld) {
    return fld && fld.type && fld.type=='checkbox' ? true : false;
}

function isRadioCtrl(fld) {
    if (fld && fld.type && fld.type=='radio') {
        return true;
    }
    else if (fld && fld.length && fld.length>0) {
        return true;
    }
    else return false;
}

function trim(str) {
    return rTrim(lTrim(str));
}

function lTrim(str) {
    var whitespace=new String(" \t\n\r");
    var s=new String(str);
    if (whitespace.indexOf(s.charAt(0))!=-1) {
        var j=0, i=s.length;
        while (j<i && whitespace.indexOf(s.charAt(j))!=-1) j++;
        s=s.substring(j,i);
    }
    return s;
}

function rTrim(str) {
    var whitespace=new String(" \t\n\r");
    var s=new String(str);
    if (whitespace.indexOf(s.charAt(s.length-1))!=-1) {
        var i=s.length-1;
        while (i>=0 && whitespace.indexOf(s.charAt(i))!=-1) i--;
        s=s.substring(0,i+1);
    }
    return s;
}

// the end
