/* * * Extensions * * */
String.prototype.is_email = function() {
	return (-1 != this.toString().search(/^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/i))
}
function isArray(a) {
	return a.constructor == Array;
}

/* * * Validation object and methods * * */
function Validator(options) {
	options = options || { }
	this.message = options["warn_str"] || I18N._('HayQueValidar')
	this.invalid_class_name = options['class_name'] || "invalid__"
	this.errors = []
	this.first_responder = null
}
Validator.prototype.validate = function() {
	if (this.errors.length > 0) {
		alert(this.message + "\n\n - " + this.errors.join("\n - "))
		this.first_responder.focus()
	}
	return (this.errors.length == 0)
}
Validator.prototype.process = function(passed_test, ele, err_str, options) {
	options = options || {}
	eles = (isArray(ele) || options.treat_as_array) ? ele : [ele]
	if (passed_test) {
		for (var i = 0; i < eles.length; i++) {
			eles[i].className = eles[i].className.replace(this.invalid_class_name, '')	
		}
	} else {
		for (var i = 0; i < eles.length; i++) {
			if (-1 == eles[i].className.search(this.invalid_class_name)) eles[i].className += ' '+this.invalid_class_name
			this.first_responder = this.first_responder || eles[i]
		}
		this.errors.push(err_str)
	}
	return passed_test
}

// Works with: Text field
Validator.prototype.val_email = function(myEle, errStr) {
	return this.process(myEle.value.is_email(), myEle, errStr)
}
// Works with: Select
Validator.prototype.val_not_selected = function(myEle, bad_index, errStr) {
	return this.process((myEle.selectedIndex != bad_index), myEle, errStr)
}
// Works with: One or more Selects
Validator.prototype.val_not_selected_multiple = function(myEle, bad_index, errStr) {
	eles = isArray(myEle) ? myEle : [myEle]
	valid = false
	for (i = 0; i < eles.length; i++) {
		if (eles[i].selectedIndex != bad_index) valid = true
	}
	return this.process(valid, eles, errStr)
}
// Works with: Select
Validator.prototype.val_at_least_one_selected = function(myEle, errStr) {
	var valid = false
	for (var i = 0; i < myEle.length; i++) {
		if (myEle[i].selected) valid = true
	}
	return this.process(valid, myEle, errStr)
}
// Works with: Checkbox, radio
Validator.prototype.val_at_least_one_checked = function(myEle, errStr) {
	var valid = false
	if (myEle.length) {
		for (var i = 0; i < myEle.length; i++) {
			if (myEle[i].checked) valid = true
		}
		treat_as_array = true
	} else {
		if (myEle.checked) valid = true
		treat_as_array = false
	}
	return this.process(valid, myEle, errStr, {treat_as_array: treat_as_array})
}
// Works with: Select
Validator.prototype.val_at_least_one_option = function(myEle, errStr) {
	return this.process(myEle.options.length > 0, myEle, errStr)
}

// Works with: Text field
Validator.prototype.val_length = function(myEle, min, max, errStr) {
	min_ok = myEle.value.length >= min
	max_ok = max ? (myEle.value.length <= max) : true
	return this.process((min_ok && max_ok), myEle, errStr)
}
Validator.prototype.val_equal = function(myEle1, myEle2, errStr) {
	return this.process((myEle1.value == myEle2.value), [myEle1, myEle2], errStr, {treat_as_array: true})
}
// Works with: Text field
Validator.prototype.val_format = function(myEle, format, errStr) {
	return this.process((-1 != myEle.value.search(format)), myEle, errStr)
}
// Works with: Text field
Validator.prototype.val_not_format = function(myEle, format, errStr) {
	return this.process((-1 == myEle.value.search(format)), myEle, errStr)
}
// Works with: Date Selects (.day, .month, .year)
Validator.prototype.val_real_date = function(myForm, stub, errStr) {
	date = myForm[stub+"[day]"]
	month = myForm[stub+"[month]"]
	year = myForm[stub+"[year]"]
	dd = parseInt(date[date.selectedIndex].text)
	mm = parseInt(month[month.selectedIndex].value) - 1
	yyyy = parseInt(year[year.selectedIndex].text)
	selected_date = new Date(yyyy, mm, dd)
	valid = (selected_date.getDate() == dd && selected_date.getMonth() == mm && selected_date.getFullYear() == yyyy)
	return this.process(valid, [date, month, year], errStr)
}
// Works with: Input (text)
Validator.prototype.val_date_picker = function(myEle, errStr) {
	var valid = (Date.parse(myEle.value))
	return this.process(valid, myEle, errStr)
}
// Works with: Radio, Checkbox
Validator.prototype.val_checked = function(myEle, errStr) {
	var valid = false
	var myEles = (myEle.length) ? $A(myEle) : [myEle]

	myEles.each(function(e) {
		if (e.checked)
			valid = true		
	})
	
	return this.process(valid, myEle, errStr)
}

Validator.prototype.val_numeric = function(myEle, errStr) {
	var valid = (!isNaN(parseFloat(myEle.value)))
	return this.process(valid, myEle, errStr)
}

Validator.prototype.val_domain = function(myEle, errStr) {
	var valid = myEle.value.match("http://") == null && myEle.value.indexOf('.') != -1
	return this.process(valid, myEle, errStr)
}

Validator.prototype.val_url = function(myEle, errStr) {
	var valid = myEle.value.match("http://") != null && myEle.value.indexOf('.') != -1
	return this.process(valid, myEle, errStr)
}
