/**
 * 
 * @fileOverview  WHL plugins
 *  
 * @author WHL Member
 */
(function($){
    $.fn.extend({
        /**
         * Check required field
         * 
         * @returns {Boolean}
         */
        isBlank: function() {
            var value = $.trim(this.val());
            if (value == '' || value == '-1') {
                return false;
            }
            return true;
        },
        /**
         * Check the valid URL
         * 
         * @returns {Boolean}
         */
        isUrl: function() {
            var value = $.trim(this.val());
            if (value == '') return true;
            else return (value.search(/^(http|https)(:\/\/)[a-z0-9_-]*\.?[a-z0-9_-]+\.[a-z0-9_-]+$/) == -1) ? false : true ;
        },
        isDomain: function(){
            var val = $.trim(this.val());
            if(val == '') return true;
            return (val.search(/^(http|https):\/\/(([a-z0-9][a-z0-9_-]*)(\.[a-z0-9][a-z0-9_-]*)+)$/i) == -1 ? false : true);
        },
        /**
         * Check valid email
         * 
         * @returns {Boolean}
         */
        isEmail: function() {
            var val = $.trim(this.val());
            if (val == '') return true;
            else return (val.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]{2,6}$/) == -1) ? false : true ;
        },
        /**
         * Compare with other element date. (greater than : gt)
         * 
         * @param {String} elmId The element id that contains date to compare 
         */
        gtDate: function(elmId, equal) {
            equal = equal || false;
            if (equal) {
                return (Date.compareDate2(this.val(), $(elmId).val()) >= 0);
            }
            return (Date.compareDate2(this.val(), $(elmId).val()) > 0);
        },
        /**
         * Compare with other element date. (less than : gt)
         * 
         * @param {String} elmId The element id that contains date to compare 
         */
        ltDate: function(elmId, equal) {
            equal = equal || false;
            if (equal) {
                return (Date.compareDate2(this.val(), $(elmId).val()) <= 0);
            }
            return (Date.compareDate2(this.val(), $(elmId).val()) < 0);
        },
        /**
         * Compare with other element date. (less than : gt)
         * 
         * @param {String} dateVal The comparative date value 
         */
        ltDate2: function(dateVal, equal) {
            equal = equal || false;
            if (equal) {
                return (Date.compareDate2(this.val(), dateVal) <= 0);
            }
            return (Date.compareDate2(this.val(), dateVal) < 0);
        },
        /**
         * Compare with other element (Equal: eq)
         * 
         * @param {String} elmId
         * @returns {Boolean}
         */
        eqString: function(elmId) {
            return this.val().compare($(elmId).val());
        },
        /**
         * Compare with other element (greater than: gt)
         * 
         * @param {String} elmId
         * @returns {Boolean}
         */
        gtNumber: function(elmId) {
            return (Number.compareFloat(this.val(), $(elmId).val()) > 0);
        },
        /**
         * Check numeric value
         * 
         * @returns {Boolean}
         */
        isOnlyNumeric: function() {
            return ($.trim(this.val()).search(/^\d*(\.\d+)?$/) == -1) ? false : true ;
        },
        /**
         * Check integer value
         * 
         * @returns {Boolean}
         */
         isValidInteger: function() {
            return ($.trim(this.val()).search(/^((\+|-)\d)?\d*$/) == -1) ? false : true ;
         },
         /**
         * Check float value
         * 
         * @returns {Boolean}
         */
         isValidFloat: function() {
             return ($.trim(this.val()).search(/^((\+|-)\d)?\d*(\.\d+)?$/) == -1) ? false : true ;
         },
         /**
         * Check alphabetic value
         * 
         * @returns {Boolean}
         */
         isOnlyAlphabetic: function() {
             return ($.trim(this.val()).search(/[a-z ]/i) == -1) ? false : true ;
         },
         /**
         * Check match between 2 values
         * 
         * @returns {Boolean}
         */
         isMatch: function(comparedId) {
             return $('#'+comparedId).val()==this.val() ? true : false ;
         },
         /**
          * Check the element does exist
          * 
          * @returns {Boolean} True element exists, otherwise not exist
          */
         isExist: function() {
             return (this.length > 0);
         },
         /**
          * Test input data have to be number integer
          * 
          * @returns {Boolean}
          */
         forceNumber: function() {
             return this.each(function(){
                 $(this).keypress(function(event){
                     var arrowCode = 0;
                     var keyCode = 0;
                     if ($.browser.msie) {       
                         keyCode = event.keyCode;
                     } else {
                         keyCode = event.which;
                         arrowCode = event.keyCode;
                     }
                     if (37<=arrowCode && arrowCode<=40 ) return true;
                     if (8==arrowCode || arrowCode==46 || arrowCode==35|| arrowCode==36) return true;
                     
                     if (48<=keyCode && keyCode<=57 || (keyCode==9) || (keyCode==13)) return true;
                     return false;
                 });
             });
         },
         /**
          * Test input data have to be float number
          * 
          * @returns {Boolean}
          */
         forceFloat: function() {
             return this.each(function(){
                 $(this).keypress(function(event){
                     var arrowCode = 0;
                     var keyCode = 0;
                     if ($.browser.msie) {       
                         keyCode = event.keyCode;
                     } else {
                         keyCode = event.which;
                         arrowCode = event.keyCode;
                     }
                     if (37<=arrowCode && arrowCode<=40 ) return true;
                     if (8==arrowCode || arrowCode==46 || arrowCode==35|| arrowCode==36 || arrowCode == 9) return true;
                     
                     if ((48<=keyCode && keyCode<=57) || keyCode == 46 || keyCode == 118) return true;
                     return false;
                 });
             });
         },
         /**
          * allow only [0-9][a-z][A-Z][.-_]
          * 
          * @returns {void}
          */
         forceAlphaNumber: function() {
             return this.each(function(){
                 $(this).keypress(function(event){
                     var keyCode = 0;
                     if (window.event) {
                         // IE
                         keyCode = event.keyCode;
                     } else if (event.which) {
                         // Netscape/Firefox/Opera
                         keyCode = event.which;
                     }
                     if ((48 <= keyCode && keyCode <= 57) || (keyCode >= 65 && keyCode <= 90) || (keyCode >= 97 && keyCode <= 122) || (keyCode == 8) || (keyCode == 9)) {
                         return true;
                     }
                     return false;
                 });
             });
             
         },
         /**
          * Remove the validator error message
          * 
          * @returns {void}
          */
         removeError: function() {
             return this.each(function() {
                 $(this).removeClass('error').html('');
             });
         }
    });
})(jQuery);