/**
 * AUDI JavaScript library: handles form validation 
 * 
 * @projectDescription	handles form validation 
 * @namespace			form.
 * @deprecated 
 * @author 				$Author: hhoettecke $
 * @version				$Revision: 6416 $
 * @copyright			NEUE DIGITALE GmbH, Berlin
 * 
 * @jslint: 2008-10-31
 *
 * @TODO add hasError classes according to new layout
 * 
 * @file:				form.validation.js
 * $URL: https://svn.pvtool.org/svn/day_audi_ngw/trunk/ngw_base/frontend/js/audi/audi.form.validation.js $
 */

/* create namespace */
audi_ngw.namespace(audi_ngw,'form.validation');
 
/**
 * jQuery plugin that validates required fields by using the defined validator "validatorForRequiredFields"
 * @see audi_ngw.form.validation.validatorForRequiredFields
 */
$.fn.audi_validateRequired = function() {
	this.each(
		function() {
			 audi_ngw.form.validation.validatorForRequiredFields(jQuery(this));
	});
	return this;
};
/**
 * Adds necessary events
 * @return {Void}
 */
audi_ngw.form.validation._addEvents = function(){
	// cache scope
	var scope = audi_ngw.form.validation;

	/* ##sseifert: commented out to always show error messages - see discussion in DAU-805
	// add events on elements in div.row.error to show sibbling ul.error.li.hasError
	jQuery('form div.row.error').find('input, select, textarea')
		.unbind('blur.formError')
		.bind('blur.formError',audi_ngw.form.validation.blurError)
		.unbind('focus.formError')
		.bind('focus.formError',audi_ngw.form.validation.focusError);
  */
		
	// add hover effect 
	jQuery('form.'+scope._oOptions._sClassNameValidateRequired)
		.submit(audi_ngw.form.validation.validateRequired);
};

/**
 * Hides all error messages
 * @param {Event} event
 * @return {Void}
 */
audi_ngw.form.validation.blurError = function (event) {
	jQuery('li.hasError')
		.hide();
};

/**
 * Shows error messages on sibling li.hasError
 * @param {Event} event
 * @return {Void}
 */
audi_ngw.form.validation.focusError = function (event) {
	var $element = jQuery(event.target) || jQuery(event);
	$element.triggerHandler('blur.formError');
	$element
		.siblings('ul')
		.find('li.hasError')
		.show();
};

/**
 * Removes the hasError class on all children of the supplied element 
 * @param {jQuery-Element} 
 * @return {Void}
 */
audi_ngw.form.validation.resetErrors = function ($element) {
	var _sHasError= audi_ngw.form.validation._oOptions._sClassNameErrorElement;
	$element
		.find('.'+_sHasError)
		.removeClass(_sHasError);
};

/**
 * Valdiate required fields, bridge to _doValidationRequired
 * @param {Event} event
 * @return {Void}
 */
audi_ngw.form.validation.validateRequired = function (event) {
	var _$element = jQuery(event.target) || jQuery(event);
	audi_ngw.form.validation._doValidateRequired(_$element,event);
};

/**
 * Valdiate required fields by applying validator "audi_ngw.form.validation.validatorForRequiredFields"
 * @see audi_ngw.form.validation.validatorForRequiredFields
 * @param {Element} jQuery element
 * @return {Void}
 */
audi_ngw.form.validation._doValidateRequired = function ($element,event) {
	// cache
	var scope = audi_ngw.form.validation;
	// reset error count
	scope._iErrors = 0;

	$element
		// remove current error classes 
		.find('.'+scope._oOptions._sClassNameErrorRow)
		.removeClass(scope._oOptions._sClassNameErrorRow)
		.end()
		.find('.'+scope._oOptions._sClassNameErrorElement)
		.removeClass(scope._oOptions._sClassNameErrorElement)
		.end()
		// validate required elements
		.find('.'+scope._oOptions._sClassNameRequiredMarker)
		.audi_validateRequired();

	// prevent submission if necessary
	if (scope._iErrors > 0 && event) {
		event.preventDefault();
	}
};

/**
 * Validator: Defines rules for valdation of "required fields".
 * @param {Element} jQuery element
 */
audi_ngw.form.validation.validatorForRequiredFields = function($element) {
 
	var scope = audi_ngw.form.validation;

	switch ($element.get(0).tagName.toLowerCase()) {
	
		// <input>
		case 'input':
			// radio buttons
			if($element.is(':radio')) {
				// get all radios from this group (name), check if at least one is :checked
				var _hasError = !$element
					.parents('div.row')
					.find('[name="'+$element.attr('name')+'"]:checked')
					.size();
				// set error 
				if(_hasError) {scope._setError($element);}
				break;
			}
			// checkbox
			if($element.is(':checkbox') && !$element.is(':checked') ) {
				// set error 
				scope._setError($element);
				break;
			}
			// text, password
			if ($element.is(':text,:password') && !$element.val()) {
				// set error 
				scope._setError($element);
				break;
			}
		break;
		
		// <select>
		case 'select':
			if (!$element.val()) {
				// set error 
				scope._setError($element);
			}
		break;

		// <textarea>
		case 'textarea':
			if (!$element.val()) {
				// set error 
				scope._setError($element);
			}
		break;
 
	}
	return this;

};
/**
 * Sets error classes on element and row
 * @param {Element} jQuery extended element
 * @return {THIS}
 */
audi_ngw.form.validation._setError = function($element){
	var scope = audi_ngw.form.validation;
	$element
		// add error on element
		.addClass(scope._oOptions._sClassNameErrorElement)
		// add error on row
		.parents('div.row')
		.addClass(scope._oOptions._sClassNameErrorRow);
	// count errors
	scope._iErrors++;
	// keep jQuery chain
	return $element;
};
/**
 * Custom Event: wil be fired as soon as we filled the ajax-content into the modal layer, just before "xhrReallocate"
 * @param {Object} event
 * @param {Object} xhr
 */
audi_ngw.form.validation.onAjaxModalContentReady = function(event,xhr){
	// check if this xhr-response contains valid content
	if (!audi_ngw.url.hasXHRContent(xhr,event.timeStamp)) {return false;}
	//audi_ngw.log("-> "+audi_ngw.event.ajaxModalContentReadyCount+" EVENT - ajaxModalContentReady:audi_ngw.form.validation.onAjaxModalContentReady",arguments);
	// execute funtions on new content
 	audi_ngw.form.validation._addEvents();
	
	// trigger event 
	audi_ngw.event.trigger('ajaxModalContentPrepared');
};

 
/**
 * Custom Event: wil be fired as soon as we injected the xhr-snippet 
 * @param {Object} event
 * @param {Object} data {sId: new HTML parent Id}
 */
audi_ngw.form.validation.onAjaxSnippetReady = function(event,data){
 
	//audi_ngw.log("EVENT - ajaxSnippetPrepared: audi_ngw.form.validation..onAjaxSnippetReady",arguments);
	// execute funtions on new content
 	audi_ngw.form.validation._addEvents(data.sId);
	
	// trigger event 
	audi_ngw.event.trigger('ajaxSnippetPrepared');
};


/**
 * Constructor
 * @param {Object} oOptions
 * @return {Void}
 */
audi_ngw.form.validation.initialize = function (oOptions){
	// cache 
	var scope = audi_ngw.form.validation;

	scope.__className =  'audi_ngw.form.validation';
	scope.__classVersion= '1.1';
	
	// set environment
	scope._iErrors = 0;
	scope._oOptions = {};

	scope._oOptions._sClassNameRequiredMarker = 'required'; // sets element to be valdiated as "required"
	scope._oOptions._sClassNameValidateRequired = 'validate_required'; // marks form to be validated as "required"
	scope._oOptions._sClassNameErrorRow = 'error'; // error class on div.row
	scope._oOptions._sClassNameErrorElement = 'hasError'; // error class for invalid element 


	// register ajaxModalContentReady event
	audi_ngw.event.bind('ajaxModalContentReady.formValidation',audi_ngw.form.validation.onAjaxModalContentReady);
  	audi_ngw.event.bind('ajaxSnippetReady',audi_ngw.form.validation.onAjaxSnippetReady);
	// add events 
	scope._addEvents();
};


