function validateForm(params) {
	new Ajax.Request(params.validationController, { 
		method : 'post', 
		parameters : $(params.formId).serialize(true),
		requestHeaders : {
			Accept : 'application/json'
		},		
		onSuccess : function(transport) {
			params.onSuccessCallback(params);
		}, 
		onFailure : function(transport) { 
			params.onFailureCallback(params, transport);
		} 
	});
}

function onFormValidationFailure(transport, prefix) {
	var errors = transport.responseText.evalJSON();
	
	// reset div error class.
	var fieldDivs = $$('div[name="' + prefix + 'FieldDiv' + '"]');
	for(counter = 0; counter < fieldDivs.length; counter++) {
		var fieldDiv = $(fieldDivs[counter].id);
		fieldDiv.className = fieldDiv.className.replace('errorregister', '');
		
	}	
	
	// hide field associated errors.
	var fieldCodes = $$('code[name="' + prefix + 'FieldCode' + '"]');
	for(counter = 0; counter < fieldCodes.length; counter++) {
		var fieldCode = $(fieldCodes[counter].id);
		displayElement(fieldCode.id, 'none');
		fieldCode.innerHTML = '';
	}
	
	for(fieldName in errors) {
		var fieldDiv = $(fieldName + prefix.capitalize() + 'FieldDiv');		
		var fieldCode = $(fieldName + prefix.capitalize() + 'FieldCode');
		
		if (fieldDiv) {
			fieldDiv.className += ' errorregister'; 
		} else {
			// hack to compound dtos
			var parentObjectName = fieldName.substring(0, fieldName.lastIndexOf('\.') + 1);
			var fieldDiv = $(parentObjectName + prefix.capitalize() + 'FieldDiv');
			if (fieldDiv) {
				fieldDiv.className += ' errorregister'; 
			}
		}

		// display field associated errors.
		displayElement(fieldCode.id, 'block');
		for(counter = 0; counter < errors[fieldName].length; counter++) {
			var errorSpan = document.createElement("span");
			errorSpan.innerHTML = errors[fieldName][counter];
			fieldCode.appendChild(errorSpan);
		}
	}	
}

function displayElement(elementId, displayValue) {
	document.getElementById(elementId).style.display = displayValue;
}

function removeSelectedOptionFromSelectInput(select) {
	var selectInput = $(select);

	for ( var i = selectInput.length - 1; i >= 0; i--) {
		if (selectInput.options[i].selected) {
			selectInput.remove(i);
		}
	}
}

function appendOptionToSelectInput(select, optionText, optionValue, selected) {
	var selectInput = $(select);
	var option = document.createElement('option');

	option.text = optionText;
	option.value = optionValue;

	try {
		selectInput.add(option, null); // standards compliant; doesn't work in
		// IE
	} catch (ex) {
		selectInput.add(option); // IE only
	}

	if (selected) {
		selectInput.selectedIndex = selectInput.options.length - 1;
	}
}

function selectAllFromInput(select) {
	var selectInput = $(select);

	for ( var i = selectInput.length - 1; i >= 0; i--) {
		selectInput.options[i].selected = true;
	}
}

function escapeRegExp(input) {
	//return input.replace(/[.*+?^${}()|[\]\/\\]/g, '\\$0');
	var specials = new RegExp("[.*+?|()\\[\\]{}\\\\]", "g");
	return input.replace(specials, "\\$&");	
}

//-----------------------------------------
// validateCheckbox
// Validate that the correct number of check boxes has been checked.
// Returns true if valid; false otherwise.
//
// vfld: checkboxes to be validated
// nr: number of checkboxes to be checked.
// cond: -1 = less than or equal to nr; 0 = equal to nr (default); 1 = greater
// than or equal to nr
// -----------------------------------------
function validateCheckbox(vfld, nr, cond) {
	if (!cond) {
		cond = 0;
	}

	// count how many boxes have been checked by the reader
	var count = 0;
	for ( var j = 0; j < vfld.length; j++) {
		if (vfld[j].checked) {
			count++;
		}
	}

	if (count == nr)
		return true;
	if (count < nr && cond == -1)
		return true;
	if (count > nr && cond == 1)
		return true;

	return false;
}

function getElementsByRegExpId(p_regexp, p_element, p_tagName) {
	p_element = p_element === undefined ? document : p_element;
	p_tagName = p_tagName === undefined ? '*' : p_tagName;
	var v_return = [];
	var v_inc = 0;
	for(var v_i = 0, v_il = p_element.getElementsByTagName(p_tagName).length; v_i < v_il; v_i++) {
		if(p_element.getElementsByTagName(p_tagName).item(v_i).id && p_element.getElementsByTagName(p_tagName).item(v_i).id.match(p_regexp)) {
			v_return[v_inc] = p_element.getElementsByTagName(p_tagName).item(v_i);
			v_inc++;
		}
	}
	return v_return;
}

function checkAll(checkboxParent,childrensName) {
	checkboxes = document.getElementsByName(childrensName);
	for (i = 0; i < checkboxes.length; i++) {
		var checkbox = checkboxes[i];
		
		checkbox.checked=checkboxParent.checked;
		if (checkbox.onclick) {
			checkbox.onclick();
		}
		if (checkbox.onchange) {
			checkbox.onchange();
		}		
	}
}
