/*
**************************************
* Restrict Class v1.0                *
* Autor: Carlos R. L. Rodrigues      *
* http://jsfromhell.com/forms/restrict -------------
**************************************
*/
/*
Se implementa con:
<script src="admin/JS/Classes/FormRestrict/event.js" type="text/javascript"></script>
<script src="admin/JS/Classes/FormRestrict/urchin.js" type="text/javascript"></script>
<script src="admin/JS/Classes/FormRestrict/restrict.js" type="text/javascript"></script>

(en este orden estrictamente)

y

<form id="form" action=" " method="post">
	<input type="text" name="a" maxlength="10" /><br />
	Restrição = (\\d/) Somente números e "/"<br />Máscara = ##/##/####<br /><br />
	<input type="text" name="b" maxlength="14" /><br />
	Restrição = (\\d.-) Somente números, ponto e hífen<br />Máscara = ###.###.###-##<br /><br />
	<textarea name="c" cols="4" rows="5" style="width: 300px; height: 120px;"></textarea><br />

	Restrição = (a\\^bc) Somente os caracteres "a", "b", "c" e "^"
</form>

<script type="text/javascript">
//<![CDATA[

	var r = new Restrict("form");
	r.field.a = "\\d/";
	r.mask.a = "##/##/####";
	r.field.b = "\\d.-";
	r.mask.b = "###.###.###-##";
	r.field.c = "a\\^bc";
	r.onKeyRefuse = function(o, k){
		o.style.backgroundColor = "#fdc";
	}
	r.onKeyAccept = function(o, k){
		if(k > 30)
			o.style.backgroundColor = "transparent";
	}
	r.start();

//]]>
</script>

Despues de haber creado el formulario, siendo "form" el nombre del formulario, y a,b y c los campos.

Las últimas dos clases son indispensables para que funcione. Se incluyen en este orden (estricto).

Tabla de restricciones:
----------------------
"." = Any character
"w": Only A-z, a-z, 0-9 and _
"W": Any character, except: A-z, a-z, 0-9 and _
"d": 0-9
"D": Any character, except 0-9
"s": Allows white space, tab, line break, etc. (\f\n\r\t\v)
"a": Allows only letters with accent
"A": Allows any character, except letters with accent

*/
//========================================================
// REQUIRES http://www.jsfromhell.com/geral/event-listener
//========================================================
//<![CDATA[

_uacct = "UA-163788-1";
urchinTracker();

//]]>
Restrict = function(form){
	this.form = form, this.field = {}, this.mask = {};
}
Restrict.field = Restrict.inst = Restrict.c = null;
Restrict.prototype.start = function(){
	var $, __ = document.forms[this.form], s, x, j, c, sp, o = this, l;
	var p = {".":/./, w:/\w/, W:/\W/, d:/\d/, D:/\D/, s:/\s/, a:/[\xc0-\xff]/, A:/[^\xc0-\xff]/};
	for(var _ in $ = this.field)
		if(/text|textarea|password/i.test(__[_].type)){
			x = $[_].split(""), c = j = 0, sp, s = [[],[]];
			for(var i = 0, l = x.length; i < l; i++)
				if(x[i] == "\\" || sp){
					if(sp = !sp) continue;
					s[j][c++] = p[x[i]] || x[i];
				}
				else if(x[i] == "^") c = (j = 1) - 1;
				else s[j][c++] = x[i];
			o.mask[__[_].name] && (__[_].maxLength = o.mask[__[_].name].length);
			__[_].pt = s, addEvent(__[_], "keydown", function(e){
				var r = Restrict.field = e.target;
				if(!o.mask[r.name]) return;
				r.l = r.value.length, Restrict.inst = o; Restrict.c = e.key;
				setTimeout(o.onchanged, r.e = 1);
			});
			addEvent(__[_], "keyup", function(e){
				(Restrict.field = e.target).e = 0;
			});
			addEvent(__[_], "keypress", function(e){
				o.restrict(e) || e.preventDefault();
				var r = Restrict.field = e.target;
				if(!o.mask[r.name]) return;
				if(!r.e){
					r.l = r.value.length, Restrict.inst = o, Restrict.c = e.key || 0;
					setTimeout(o.onchanged, 1);
				}
			});
		}
}
Restrict.prototype.restrict = function(e){
	var o, c = e.key, n = (o = e.target).name, r;
	var has = function(c, r){
		for(var i = r.length; i--;)
			if((r[i] instanceof RegExp && r[i].test(c)) || r[i] == c) return true;
		return false;
	}
	var inRange = function(c){
		return has(c, o.pt[0]) && !has(c, o.pt[1]);
	}
	return (c < 30 || inRange(String.fromCharCode(c))) ?
		(this.onKeyAccept && this.onKeyAccept(o, c), !0) :
		(this.onKeyRefuse && this.onKeyRefuse(o, c),  !1);
}
Restrict.prototype.onchanged = function(){
	var ob = Restrict, si, moz = false, o = ob.field, t, lt = (t = o.value).length, m = ob.inst.mask[o.name];
	if(o.l == o.value.length) return;
	if(si = o.selectionStart) moz = true;
	else if(o.createTextRange){
		var obj = document.selection.createRange(), r = o.createTextRange();
		if(!r.setEndPoint) return false;
		r.setEndPoint("EndToStart", obj); si = r.text.length;
	}
	else return false;
	for(var i in m = m.split(""))
		if(m[i] != "#")
			t = t.replace(m[i] == "\\" ? m[++i] : m[i], "");
	var j = 0, h = "", l = m.length, ini = si == 1, t = t.split("");
	for(i = 0; i < l; i++)
		if(m[i] != "#"){
			if(m[i] == "\\" && (h += m[++i])) continue;
			h += m[i], i + 1 == l && (t[j - 1] += h, h = "");
		}
		else{
			if(!t[j] && !(h = "")) break;
			(t[j] = h + t[j++]) && (h = "");
		}
	o.value = o.maxLength > -1 && o.maxLength < (t = t.join("")).length ? t.slice(0, o.maxLength) : t;
	if(ob.c && ob.c != 46 && ob.c != 8){
		if(si != lt){
			while(m[si] != "#" && m[si]) si++;
			ini && m[0] != "#" && si++;
		}
		else si = o.value.length;
	}
	!moz ? (obj.move("character", si), obj.select()) : o.setSelectionRange(si, si);
}
