﻿/// <reference path="jquery-1.4.2.min.js" />


(function () {
    var validator = {

        pattern: {
            'email': '\\w+@\\w+(\\.\\w+$)+',
            'tel': '^\\d+$',
            'url':/((http|ftp|https|file):\/\/([\w\-]+\.)+[\w\-]+(\/[\w\-\.\/?\@\%\!\&=\+\~\:\#\;\,]*)?)/
        },

        method: {
            'kooboo-required': function (el, callback) {
                var result;
                if ($(el).is('input:checkbox')) {
                    result = el.attr('checked');
                } else {
                    result = el.val() && el.val().length > 0;
                }
                var errMsg = el.attr('kooboo-required');
                if (callback) {
                    callback(el, !!result, errMsg);
                }
                return result;
            },
            'kooboo-regex': function (el, callback) {
                var val = el.val();

                if (!val) {
                    return true;
                }
              
                var pattern = el.attr('kooboo-pattern');
              
              

                var regStr = validator.pattern[pattern] || pattern;

                var errMsg = el.attr('kooboo-regex');

              var reg = (regStr instanceof RegExp )? regStr :( new RegExp(regStr));

                var result = reg.test(val);

                if (callback) {
                    callback(el, result, errMsg);
                }
                return result;
            }
        }
    };

    var validatorAPI = {

        registerMethod: function (name, func) {
            validator.method[name] = func;
        },

        registerPattern: function (name, pattern) {
            validator.pattern[name] = pattern;
        }
    };

    // API 
    //    option = {
    //        'valid-selector': '[data-val=true]' , // html attr that decides to valid the field or not 
    //        'elSuccess': function ($el) { // callback on field valid success .
    //        },
    //        'elFailed': function ($el) { // callback on field valid failed .
    //        }
    //    }
    // 
    function valid(option) {

        var config = $.extend({
            'valid-selector': '[kooboo-valid=true]',
            'elSuccess': function ($el) {

            },
            'elFailed': function ($el) {

            },
		context:'form'
        }, option);

        var inputs = $(option.context).find(config['valid-selector']);

        var fields = [];

        var validQueue = [];

        inputs.each(function () {

            var current = $(this);

            var attr = current.get(0).attributes;

            for (var i = 0; i < attr.length; i++) {
                (function () {
                    var validMethod = validator.method[attr[i].name];
                    if (validMethod != null) {
                        var m = function () {
                            return validMethod(current, function (el, result, errMsg) {
                                var $el = $(el);
                                if (!result) {
                                    $el.data('valid-success', false);
                                    config.elFailed($el, errMsg);
                                } else {
                                    $el.data('valid-success', true);
                                    config.elSuccess($el);
                                }
                            });
                        };
                        validQueue.push(m);
                        //current.blur(m);
                    }
                })();
            }
        });

        var cansubmit = function () {
            var r = true;
            for (var i = 0; i < validQueue.length; i++) {
                var tempResult = (!!validQueue[i]());
                r = tempResult && r;
            }
            return r;
        };

        var validResult = {
            result: cansubmit(),
            cansubmit: cansubmit,
            fields: []
        };

        return validResult;
    }

    window.valid = valid;
    valid.validatorAPI = validatorAPI;
})();

