var Form = function(f)
{
	var f = typeof f == "string" ? $(f) : f;

	this.form = f;
	this._validate = null
}
Form.prototype.validate = function()
{
	if(this._validate==null)
	{
		this._validate = new ValidateForm(this.form.getAttribute("id"));
	}
	return this._validate;
}
Form.prototype.addMask = function(f, m, fixlength)
{
	if(f.indexOf("/") > -1)
	{
		f = f.split("/");
		f = "data[" + f[0] + "][" + f[1] + "]";
	}
	Form.MaskInput(this.form[f], m, fixlength);
	return this;
}

//+ Jonas Raoni Soares Silva
//@ http://jsfromhell.com/forms/masked-input [v1.0]
Form.MaskInput = function(f, m, fixlength)
{
    function mask(e)
    {
        var patterns = {"1": /[A-Z]/i, "2": /[0-9]/, "4": /[\xC0-\xFF]/i, "8": /./ },
            rules = { "a": 3, "A": 7, "9": 2, "C":5, "c": 1, "*": 8};
        
        function accept(c, rule)
        {        
            for(var i = 1, r = (rules[rule] || 0); i <= r; i<<=1)
            {
                if(r & i && patterns[i].test(c)) break;
            }   
            return (i <= r || c == rule);
        }
        
        (e = (e || window.event)).key = (e.which+1 || e.keyCode+1)-1 || 0;
        
        var k, mC, r, c = String.fromCharCode(k = e.key), l = f.value.length;
        (!k || k == 8 ? 1 : (r = /^(.)\^(.*)$/.exec(m)) && (r[0] = r[2].indexOf(c) + 1) + 1 ?
            r[1] == "O" ? r[0] : r[1] == "E" ? !r[0] : accept(c, r[1]) || r[0]
            : (l = (f.value += m.substr(l, (r = /[A|9|C|\*]/i.exec(m.substr(l))) ?
            r.index : l)).length) < m.length && accept(c, m.charAt(l))) || e.preventDefault();
    }
    
    if(fixlength||fixlength==undefined) f.maxLength = m.length;
    
    for(var i in !/^(.)\^(.*)$/.test(m), {keypress: 0, keyup: 0}) Event.add(f, i, mask);
}