//
// Code by ACe
// Huzza!
//

var patterns = new Array();
patterns['base'] = new Hash('pattern', '(["\'<>])', 'mode', 'filter');

patterns['alpha_numeric'] = new Hash('pattern', '([^a-zA-Z0-9_])', 'mode', 'filter');
patterns['alpha_numeric_ws'] = new Hash('pattern', '([^a-zA-Z0-9_ ])', 'mode', 'filter');
patterns['pure_alpha_numeric'] = new Hash('pattern', '([^a-zA-Z0-9])', 'mode', 'filter');
patterns['pure_alpha_numeric_ws'] = new Hash('pattern', '([^a-zA-Z0-9 ])', 'mode', 'filter');
patterns['alpha'] = new Hash('pattern', '([^a-zA-Z_])', 'mode', 'filter');
patterns['alpha_ws'] = new Hash('pattern', '([^a-zA-Z_ ])', 'mode', 'filter');
// Remember to put a NOT Extended ASCII Code as last character of the regexp (IE6 bug)
patterns['alpha_it'] = new Hash('pattern', '([^a-zA-Z àòèùìé\'])', 'mode', 'filter');
patterns['safe_text'] = new Hash('pattern', '([^\t\r\n \!\#-\&\(-\;\=-\_a-\~\°àáèéìíóòùúÀÁÈÉÌÍÒÓÙÚ\?])', 'mode', 'filter');
patterns['text'] = new Hash('pattern', "([^\t\r\n \!\#-\&\(-\;\=-\_a-\~\°àáèéìíóòùúÀÁÈÉÌÍÒÓÙÚ\?\'\"])", 'mode', 'filter');

patterns['numeric'] = new Hash('pattern', '([^0-9\.\+\-])', 'mode', 'filter');
patterns['numeric_unsigned'] = new Hash('pattern', '([^0-9\.])', 'mode', 'filter');
patterns['numeric_int'] = new Hash('pattern', '([^0-9\+\-])', 'mode', 'filter');
patterns['numeric_int_unsigned'] = new Hash('pattern', '([^0-9])', 'mode', 'filter');

patterns['http_url_set'] = new Hash('pattern', '([^a-zA-Z0-9\$\-_\.\+\!\*\(\),\{\}\|\\\^~\[\]#%;\/\?:@&=])', 'mode', 'filter'); // Heavy unsafe
patterns['safe_http_url_set'] = new Hash('pattern', '([^a-zA-Z0-9_\.\/:;&%#=\-\+\?\(\)\[\]])', 'mode', 'filter');
patterns['email_address_set'] = new Hash('pattern', '([^a-zA-Z0-9\.@\-_~])', 'mode', 'filter');
//var filter_email_address_rfc = '[^\-a-z0-9!#$%&\'*+/=?^_`{|}~@\.]'; // Heavy unsafe
patterns['fs_path_set'] = new Hash('pattern', '([^a-zA-Z0-9\._ \/\-~\(\)\[\]])', 'mode', 'filter');
patterns['fs_name_set'] = new Hash('pattern', '([^a-zA-Z0-9\._ \-~\(\)\[\]])', 'mode', 'filter');

patterns['email_address'] = new Hash('pattern', '^([a-zA-Z0-9_\\-\\.]+)\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$', 'mode', 'validate');

// work on obj.value. Filter radio input or select input is useless: we are client side!
function av_filter(obj, pattern, minlen, maxlen) {
	// Light operations first...
	if (typeof(minlen) != 'undefined' && obj.value.length < minlen)
		return false;
	else if (typeof(maxlen) != 'undefined' && obj.value.length > maxlen)
		return false;

	re = new RegExp(pattern.getItem('pattern'), 'g');

	if (pattern.getItem('mode') == 'filter') {
		aRes = obj.value.match(re);
		if (aRes) {
			aRes.sort();
			l = '';
			res = '';
			for (c=0; c < aRes.length; c++) {
				if (aRes[c] != l) {
					res += aRes[c];
					l = aRes[c];
				}
			}
			//res = aRes.join('');
			res = res.replace(/\s/, '[spazio]');
		//res = obj.value.replace(re, "<u>$1</u>");
		//if (res != obj.value) {
	 		ret = new Array();
			ret[0] = false;
			ret[1] = res;
			return ret;
		}
	} else {
		// Validation (wow!)
		return re.test(obj.value); 
	}

	return true;
}

function av_filter_stack(obj, pats, minlen, maxlen) {
	for (pat in pats.items) {
		if (!av_filter(obj, patterns[pats.getItem(pat)], minlen, maxlen)) {
			ret = new Array();
			ret[0] = false;
			ret[1] = pat;
			return ret;
		}
		// We test them the first time only
		minlen = undefined;
		maxlen = undefined;
	}
	return true;
}