/*!
 * Seed CMS form validation service
 *
 * http://www.janberanek.com/
 *
 * Copyright (c) 2009 Jan Beránek
 *
 * Release: April 2009
 */

 var FormValidator = (function(){
    var oValidator = {
        HINT_COLOR : '#aaa',
        DEFAULT_INPUT_COLOR : '#363636',

        init : function(){
            var oThis = this;
            //input hints and validation
            this.AddHints();
            this.AddValidation();
            
            for(var i=0; i < document.forms.length; i++){
                if(document.forms[i].className.indexOf('validate-form') != -1){
                    document.forms[i].onsubmit = function(){
                        return oThis.ValidateForm(this.id);
                    };
                }
            }
        },
        AddValidation : function(){
            var oThis = this;
            $(".validate-form .validation").each(function(){
                oThis.validateField(document.getElementById(this.id.substring(4)),this.value);
            });
        },
        AddHints : function(){
            var oThis = this;
            $(".validate-form .hint").each(function(){
                oThis.setPredefinedText(document.getElementById(this.id.substring(5)),this.value);
            });
        },
        ValidateForm : function(id){
            var frmMain = document.getElementById(id);
            var requiredFields = document.getElementById(id + '-required').value;
            var emptyReqFields = new Array();
            var blnValid = true;
            for(var i=0; i < frmMain.elements.length; i++){
                var field = frmMain.elements[i];
                if(document.getElementById('hint-' + field.id))
                    if(field.value == document.getElementById('hint-' + field.id).value)
                        field.value = '';

                if(field.className.indexOf('not-valid') != -1)
                    blnValid = false;
                if(requiredFields.indexOf(field.id) != -1 && field.value == ''){
                    blnValid = false;
                    emptyReqFields.push(field.id);
                }
            }
            if(!blnValid){
                this.AddHints();
            }
            if(emptyReqFields[0])
                alert('Vyplněte prosím všechna pole označená hvězdičkou.');
            return blnValid;
        },
        setPredefinedText : function(oNode,sText){
            var oThis = this;
            //if(oNode.value == '') {
                oNode.value = sText;
                oNode.style.color = oThis.HINT_COLOR;
            //}
            addListener('click', function(e){
                if(oNode.value == sText) oNode.value = '';
                oNode.style.color = oThis.DEFAULT_INPUT_COLOR;
            }, oNode, false);
            addListener('focus', function(e){
                if(oNode.value == sText) oNode.value = '';
                oNode.style.color = oThis.DEFAULT_INPUT_COLOR;
            }, oNode, false);
            addListener('blur', function(e){
                if(oNode.value == ''){
                    oNode.value = sText;
                    oNode.style.color = oThis.HINT_COLOR;
                }
            }, oNode, false);
        },
        validateField : function(oNode,sType){
            var parts = sType.split('-');
            var oThis = this;
            switch(parts[0]){
                case 'max':
                        addListener('change', function(e){
                            if(oThis.removeResultClass(oNode)) return true;
                            oThis.attachResultClass(this,this.value.length > parseInt(parts[1]));
                        }, oNode, false);
                        break;
                case 'min':
                        addListener('change', function(e){
                            if(oThis.removeResultClass(oNode)) return true;
                            oThis.attachResultClass(this,this.value.length < parseInt(parts[1]));
                        }, oNode, false);
                        break;
                case 'eq':
                        addListener('change', function(e){
                            if(oThis.removeResultClass(oNode)) return true;
                            oThis.attachResultClass(this,this.value.length == parseInt(parts[1]));
                        }, oNode, false);
                        break;
                default:
                        break;
            }
        },
        attachResultClass : function(oNode,bool){
            if(bool){
                oNode.valid = false;
                $('#' + oNode.id).removeClass('valid').addClass('not-valid');
            }else{
                oNode.valid = true;
                $('#' + oNode.id).removeClass('not-valid').addClass('valid');
            }
        },
        removeResultClass : function(oNode){
            if(oNode.value == ''){
                $('#' + oNode.id).removeClass('valid').removeClass('not-valid');
                return true;
            }
            return false;
        }
    }
    return oValidator;
})();


