function validateByte(value, unsigned) {
    if (value.length > 0) {
        if (!isAllDigits(value)) return false;
        else {
            var iValue = parseInt(value);
            if (isNaN(iValue) || !(iValue >= (unsigned ? 0 : -128) && iValue <= 127)) return false;
        }
    }
    return true;
}

function validateShort(value, unsigned) {
    if (value.length > 0) {
        if (!isAllDigits(value)) return false;
        else {
            var iValue = parseInt(value);
            if (isNaN(iValue) || !(iValue >= (unsigned ? 0 : -32768) && iValue <= 32767)) return false;
        }
    }
    return true;
}

function validateInteger(value, unsigned) {
    if (value.length > 0) {
        if (!isAllDigits(value)) return false;
        else {
            var iValue = parseInt(value);
            if (isNaN(iValue) || !(iValue >= (unsigned ? 0 : -2147483648) && iValue <= 2147483647)) return false;
        }
    }
    return true;
}

function validateFloat(value) {
    if (value.length > 0) {
        // remove '.' before checking digits
        var tempArray = value.split('.');
        //Strip off leading '0'
        var zeroIndex = 0;
        var joinedString= tempArray.join('');
        while (joinedString.charAt(zeroIndex) == '0') {
            zeroIndex++;
        }
        var noZeroString = joinedString.substring(zeroIndex,joinedString.length);

        if (!isAllDigits(noZeroString)) return false;
        else {
            var fValue = parseFloat(value);
            if (isNaN(fValue)) return false;
        }
    }
    return true;
}

function validateMoney (value) {
    if (value.length > 0) {
        var re=/^[0-9]{1,10}(\.[0-9][0-9]?)?$/;
        return re.test (value);
    }
    return true;
}

function isPositiveMoney (value) {
    if (value.length > 0) {
        var re=/^[0-9]{1,10}(\.[0-9][0-9]?)?$/;
        return re.test (value) && parseFloat(value)>0;
    }
    return true;
}

function validateSignedMoney (value) {
    if (value.length > 0) {
        var re=/^-?[0-9]{1,10}(\.[0-9][0-9]?)?$/;
        return re.test (value) && parseFloat(value)>0;
    }
    return true;
}

function validateFileName(value) {
    var re=/^[^\/\?\:\"\*\|\<\>\\]*$/;
    return re.test(value);
}

function validateDate(value) {
    var result = false;
    var reg = new RegExp("^"+
                         "([0-9]{1,2})(?:\\/|-|\\.)"+
                         "([0-9]{1,2})(?:\\/|-|\\.)"+
                         "([0-9]{1,2}|[0-9]{4})"+
                         "$", "ig");
    var value = trim(value);
    if (reg.test(value)) {
        value = reg.exec(value);
        var day = parseInt(RegExp.$1,10);
        var month = parseInt(RegExp.$2,10);
        var year = RegExp.$3;
        year = year.length<4 ? (parseInt(year,10) < 70 ? parseInt(year,10)+2000 : parseInt(year,10)+1900) : parseInt(year,10);
        if (!(month == 2 && day>29 && (year%4)==0) && 
            !(month == 2 && day>28 && (year%4)!=0) && 
            !(month>12) && 
            !((month == 4 || month == 6 || month == 9 || month == 11) && day>30) && 
            !(day>31))
            result = true;
    }
    return result;
}

/**
 * Reference: Sandeep V. Tamhankar (stamhankar@hotmail.com),
 * http://javascript.internet.com
 */
function validateEmail(value) {
    if (value.length == 0) {
        return true;
    }
    var emailPat=/^(.+)@(.+)$/;
    var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
    var validChars="\[^\\s" + specialChars + "\]";
    var quotedUser="(\"[^\"]*\")";
    var ipDomainPat=/^(\d{1,3})[.](\d{1,3})[.](\d{1,3})[.](\d{1,3})$/;
    var atom=validChars + '+';
    var word="(" + atom + "|" + quotedUser + ")";
    var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
    var domainPat=new RegExp("^" + atom + "(\\." + atom + ")*$");
    var matchArray=value.match(emailPat);
    if (matchArray == null) {
        return false;
    }
    var user=matchArray[1];
    var domain=matchArray[2];
    if (user.match(userPat) == null) {
        return false;
    }
    var IPArray = domain.match(ipDomainPat);
    if (IPArray != null) {
        for (var i = 1; i <= 4; i++) {
           if (IPArray[i] > 255) {
              return false;
           }
        }
        return true;
    }

    var domainArray=domain.match(domainPat);
    if (domainArray == null) {
        return false;
    }
    var tst = new RegExp("(^[A-Za-z0-9-.]+\\.[A-Za-z0-9-]{2,}$)", "ig");

    if (!tst.test(domain)) {
        return false;
    }

    var atomPat=new RegExp(atom,"g");
    var domArr=domain.match(atomPat);
    var len=domArr.length;

    if ((domArr[domArr.length-1].length < 2) ||
        (domArr[domArr.length-1].length > 6)) {
        return false;
    }
    if (len < 2) {
        return false;
    }
    return true;
}

/**
 * Checks whether a given credit card number has a valid Luhn checksum.
 * This allows you to spot most randomly made-up or garbled credit card numbers immediately.
 * Reference: http://www.speech.cs.cmu.edu/~sburke/pub/luhn_lib.html
 */
function validateCreditCard(value) {
    if (isLuhnNum(value)) {
        var no_digit = value.length;
        var oddoeven = no_digit & 1;
        var sum = 0;
        for (var count = 0; count < no_digit; count++) {
            var digit = parseInt(value.charAt(count));
            if (!((count & 1) ^ oddoeven)) {
                digit *= 2;
                if (digit > 9) digit -= 9;
            };
            sum += digit;
        };
        if (sum == 0) return false;
        if (sum % 10 == 0) return true;
    };
    return false;
}

function isLuhnNum(value) {
    value = value.toString();
    if (value.length == 0) {
        return false;
    }
    for (var n = 0; n < value.length; n++) {
        if ((value.substring(n, n+1) < "0") ||
            (value.substring(n,n+1) > "9")) {
            return false;
        }
    }
    return true;
}

// Trim whitespace from left and right sides of s.
function trim(s) {
    return s.replace( /^\s*/, "" ).replace( /\s*$/, "" );
}

function isAllDigits(value) {
    value = value.toString();
    var validChars = "0123456789";
    var startFrom = 0;
    if (value.substring(0, 2) == "0x") {
       validChars = "0123456789abcdefABCDEF";
       startFrom = 2;
    } else if (value.charAt(0) == "0") {
       validChars = "01234567";
       startFrom = 1;
    } else if (value.charAt(0) == "-") {
        startFrom = 1;
    }

    for (var n = startFrom; n < value.length; n++) {
        if (validChars.indexOf(value.substring(n, n+1)) == -1) return false;
    }
    return true;
}

function isPhoneNumber(value, delimited) {
    if (value.indexOf("-")==0 || value.lastIndexOf("-")==value.length-1)
        return false;
    value = value.toString();
    var validChars = delimited ? "0123456789 -" : "0123456789";

    for (var n = 0; n < value.length; n++) {
        if (validChars.indexOf(value.substring(n, n+1)) == -1)
            return false;
    }
    return true;
}

function validateURL(value) {
    var reg = new RegExp("(^(?:http+s?://)?(?:[A-Za-z0-9-_.]+)(?:[.])(?:[A-Za-z0-9-_]{2,})(?::[0-9]{1,5})?/?[^:]*$)", "ig");
    return reg.test(value);
}

function convertUrl(value) {
    var reg = new RegExp("^http+s?://");
    if (!reg.test(value))
        return 'http://' + value;
    else 
        return value;
}

function deleteProtocol(value){
    return value.replace(/^http+s?:\/\//, "");
}

