var numb = '0123456789';
var alpha = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
var zip = '- ' + numb + alpha;
var phone = '-' + numb;
var emails = '-_@.' + numb + alpha;
var expiry = '/' + numb;
var filename = '-_' + numb + alpha;
var fullstr = '\'\"-+_@.,&~!#$%^/\\\=()?<> ' + numb + alpha;
var sfullstr = '\'\"-+_@.,&~!#$%^*/\\\=()?<>:\;|{}[] \n' + numb + alpha;

function res(t,v){

	var curpos = 0;
	if (typeof(t.selectionStart)=="number") {
		curpos = t.selectionStart;
	} else if (document.selection) {

		var sel = document.selection.createRange(); 
		var clone = sel.duplicate(); 
		sel.collapse(true);
		try {
			clone.moveToElementText(t);
		}  catch(e) {
			clone.moveStart("character",-10000);
		}
		clone.setEndPoint('EndToEnd', sel);

		var endCorrection = t.value.substr(clone.text.length,t.value.length).match(/\r/g);   
		endCorrection = endCorrection ? endCorrection.length : 0;   

		curpos = clone.text.length + endCorrection;

		if ((clone.text.length + endCorrection + 1) == t.value.length) {
			if (t.value.substr(t.value.length-1,t.value.length) == "\n") curpos++;
		}
	}

	var w = '';
	for (i=0; i < t.value.length; i++) {
		x = t.value.charAt(i);
		if (v.indexOf(x,0) != -1) w += x;
		else curpos--;
	}
	if (v == phone) {
		if (w) {
			w = '+' + w;
			curpos++;
		}
	}
	t.value = w;

	if (curpos < 0) curpos = 0;
	if (typeof(t.selectionStart)=="number") {
		t.setSelectionRange(curpos,curpos);
	} else if (document.selection) {
		//var rng = t.createTextRange();
		//rng.collapse(true);
		//rng.moveEnd('character', curpos);
		//rng.moveStart('character', curpos);
		//rng.select();

		clone.collapse(true);
		clone.moveEnd('character', curpos);
		clone.moveStart('character', curpos);
		clone.select();
	}
}
