﻿/// by lichun 200906
/// ren.forever@gmail.com

var $validators = [];
var $validateTarget = [];
function validateAll(onPassed) {
 
    var passed = true;
    $validators.each(
        function(s) {
            s.target.validateStatus = 1;
        });
        $validators.each(
        function(s) {
            if(s.target.validateStatus!=2)
                s.target.validateStatus = 1;
            if (s.target.validateStatus < 2)
                s.validate();
            else s.error.style.display = 'none';
            if (s.status > 0)
                passed = false;
        });
    if (passed == true && onPassed) {
        onPassed();
    }

    return passed;
}

function validator(target, errorHTML, validateMethod, events, errorTemplate) {
    if (!errorTemplate) errorTemplate = '<small>#{error}</small>'
    var v = {
        'target': target,
        'errorHTML': new Template(errorTemplate).evaluate({ 'error': errorHTML }),
        'error': document.createElement('div'),
        'validate': validateMethod,
        'status': 1,
        'set_status': function(value) {
            this.status = value;
            if (value == 2 && this.target.validateStatus < 2)
                this.ShowError();
            else if (value == 0 && this.target.validateStatus < 2) {
                this.error.style.display = 'none';
                this.target.validateStatus = 0;
                this.ShowOk();
            }
            else if(value == -1 && this.target.validateStatus < 2){
                this.error.style.display = 'none';
                this.target.correct.style.display = 'none';
                this.target.tip.style.display='';
                this.target.validateStatus = 0;
            }
        },
        'get_status': function() { return this.status; }
    };
    v.error.className = 'error';
    v.error.innerHTML = new Template(errorTemplate).evaluate({ 'error': errorHTML });
    v.error.style.display = 'none';
    v.target.parentNode.appendChild(v.error);
    v.ShowError = function() {
        v.error.style.display = '';
        v.target.tip.style.display = 'none';
        v.target.correct.style.display = 'none';
        v.target.validateStatus = 2;
    };
    v.ShowOk = function() {
        var allPassed = true;
        v.target.validators.each(function(s) {
            if (s.status != 0) { allPassed = false; }
        });
        if (allPassed == true) {
            v.target.correct.style.display = '';
            v.target.tip.style.display = 'none';
        }
    };
    $(target).observe('blur',
        function(event) {
            if (v.target.validateStatus < 2)
                v.validate();
            else v.error.style.display = 'none';
            if(v.target.tip.style.display!='none'){
                v.target.tip.className='';
            }
        });

    $(target).observe('focus',
        function(event) {
            v.target.validateStatus = 1;
            if(v.target.tip.style.display!='none' && v.target.tip.innerHTML!=''){
                v.target.tip.className='msg';
            }
        });

    if (events) {
        events.each(
            function(s) {
                $(target).observe(s,
                    function(event) {
                        v.target.blur();
                        v.target.focus();
                    });
            });
    }
    $validators.push(v);
    return v;
}

function BindValidate(target, tip, validators, tipTag) {
    if (!tipTag) tipTag = 'p';
    target.tip = document.createElement(tipTag);
    target.tip.innerHTML = tip;
    target.parentNode.appendChild(target.tip);
    target.correct = document.createElement('div');
    target.correct.className = 'correct';
    target.correct.style.display = 'none';
    target.parentNode.appendChild(target.correct);
    target.validators = validators;
    target.validateStatus = 1;
    $validateTarget.push(target);
}