POKE.forms = function (j) {
    var 
        form = null,
        errors = []
    ;
    return {
        init : function (form_id) {
            form = j('#'+form_id);
            form.get(0).onsubmit = POKE.forms.submit;
        },
        submit : function () {
            console.log('POKE.forms.submit');
            return POKE.forms.validates();
        },
        validates : function () {
            POKE.forms.clear_errors();
            j('input[type!=radio], textarea, select', form).each(function(){
                if(!POKE.forms.is_element_valid(this)){
                    POKE.forms.add_error(this);
                }
            });
            if (!errors.length){ j('.blur', form).val('');}
            return !errors.length;
        },
        is_element_valid : function (element) {
            for(method_name in POKE.forms.validators) {
                if(j(element).hasClass('v'+method_name)){
                    if(!POKE.forms.validators[method_name](j(element).val(), element)){
                        return false;
                    }
                }
            }
            return true;
        },
        add_error : function (element) {
            errors.push(j(element).parent('div').addClass('error').get(0));
        },
        clear_errors : function () {
            errors = [];
            j('.error', form).removeClass('error');
        },
        click_clear : function (element, value) {
            j(element).focus(function(){
                if($(this).val() == value){
                    $(this).val('').removeClass('blur');;
                }
            }).blur(function(){
                if($(this).val() == ''){
                    $(this).val(value).addClass('blur');
                }
            });
        },
        validators : {
            required : function (value, element) {
                switch(j(element).attr('type')){
                    case 'checkbox':
                        return j(element).attr('checked');
                    break;
                    default:
                        return value !== undefined && value.toString().length > 0;  
                    break;
                }
            },
            email : function (value, element) {
                if(value === undefined || value.toString() == '') {
                    return true;
                }
                return !!value.toString().match(/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{1,100})+$/);
            },
            password : function (value, element) {
                if(value === undefined || value.toString() == '') {
                    return true;
                }
                return value.toString().length >= 6;
            }
        }
    };
}($);
