$.Form = {
    init: function(){
        $('.required, .htmlrequired').siblings('label').prepend('*');
    },
    
    val: function(name){
        var obj = document.getElementsByName(name)[0];
        
        if (!obj || $(obj).attr('lang') == 1) {
            obj = $('.field[name=' + name + ']').get(0);
        }
        
        if (obj.type == 'text') 
            return obj.value;
        else 
            if (obj.type == 'select-multiple') 
                obj = $('select[name=' + name + '] option:selected').get();
            else 
                if (obj.type == 'checkbox' || obj.type == 'radio') 
                    obj = $('input[name=' + name + ']:checked').get();
                else 
                    return obj.value || '';
        
        for (var i = 0, result = []; i < obj.length; i++) 
            result.push(obj[i].value);
        
        return result.join('#');
    }
}

$.Form.Validations = {
    init: function(f, showMsgIn){
		$(showMsgIn).html('');
		$.Form.Validations.added = '';
        $.Form.Validations.objmsg = showMsgIn;
        $.Form.Validations.ok = true;
		$('.error', f).removeClass('error');
        $('.required', f).each(function(){
            $.Form.Validations.required(this);
        });
        
        $('.htmlrequired', f).each(function(){
            $.Form.Validations.requiredHtml(this);
        });
        
        $('.url', f).each(function(){
            $.Form.Validations.url(this);
        });
        
        $('.email', f).each(function(){
            $.Form.Validations.email(this);
        })
		$('.cnpj', f).each(function(){
            $.Form.Validations.cnpj(this);
        })
        // upload fields
        $('.fileinputs .file').change(function(){
            $(this).siblings().children('input:first').val(this.value);
        });
        $('.fileinputs .file').mouseout($(this).change());
    },
    required: function(obj){
        if (obj.type == 'checkbox' || obj.type == 'radio') {
			if ($('input[name=' + obj.name + ']:checked').length < 1) {
				$.Form.Validations.ok = false;
				$.Form.Validations.markAsError(obj);
			}
		}
		else if ($(obj).val().trim() == '') {
			$.Form.Validations.ok = false;
			$.Form.Validations.markAsError(obj, 'Preencha os campos obrigatórios', 'norequired');
		}
    },
    requiredHtml: function(obj){
        var editor = FCKeditorAPI.GetInstance(obj.name);
        if (editor.GetData().trim() == "") {
            $.Form.Validations.ok = false;
            $.Form.Validations.markAsError(obj, 'Preencha os campos obrigatórios', 'norequired');
        }
    },
    url: function(obj){
        if (obj.value == '') // em branco, OK
            return;
        
        var re = /^((http|https|ftp):\/\/([\d\w\-]+)\.(.+))$|^\/.*/;
        if (!re.test(obj.value) > 0) {
            $.Form.Validations.markAsError(obj, 'URL inválida', 'nourl');
            $.Form.Validations.ok = false;
        }
    },
    email: function(obj){
        if (obj.value == '') // em branco, OK
            return;
        
        var re = /^[a-z-_\.]+@.+(\.[a-z]{2,})$/;
        if (!re.test(obj.value) > 0) {
            $.Form.Validations.markAsError(obj, 'E-mail inválido', 'noemail');
            $.Form.Validations.ok = false;
        }
    },
    cnpj: function(obj){
        if (obj.value == '') // em branco, OK
            return;

		var cnpjModulo11 = function(val, c){
			var sum=0;
			for (var i=0; i < val.length; i++) 
				sum += parseFloat(val.charAt(i)) * c[i];
    		var mod = sum % 11;
			return mod < 2 ? 0 : 11 - mod; 
		}

		var markAsError = function(){
			$.Form.Validations.markAsError(obj, 'Cnpj inválido', 'nocnpj');
            $.Form.Validations.ok = false;
		}

		var cnpj = obj.value.lpad('0', 14);
		var base = cnpj.substring(0, 12);
		var basedv = cnpj.substring(12, 14);
		var founded = cnpj.match(/(\d+)\1/);
		for (var i=0; founded != null & i < founded.length; i++)
			if (founded[i].length >= 12){
				markAsError();
				return;
			}

		var dv1 = cnpjModulo11(base, [5,4,3,2,9,8,7,6,5,4,3,2]);
		var dv2 = cnpjModulo11(base + dv1, [6,5,4,3,2,9,8,7,6,5,4,3,2]);
		if (basedv != dv1+''+dv2)
			markAsError();            
    },    
    ok: true,
    objmsg: null,
    added: '',
    
    markAsError: function(obj, msg, cl){
		var errAlias = $.Form.Validations.objmsg;
        $(errAlias).fadeIn('slow');
		var regexp = new RegExp('\\b' + cl + '\\b');
        if (!regexp.test($.Form.Validations.added)) {
            $.Form.Validations.added += cl + '|';
            $(errAlias).append('<div>&#149; ' + msg + '</div>');
        }
        $(obj).parent().addClass('error ' + cl);
    }
}
$($.Form.init);
