/**
 * AUDI JavaScript library: handles simple ajax posting 
 * 
 * @projectDescription	simple ajax forms
 * @namespace			form.
 *
 * @author 				$Author: mkrause $
 * @version				$Revision: 2599 $
 * @copyright			NEUE DIGITALE GmbH, Berlin
 * 
 * @file:				form.simpleAjax.js
 * $URL: https://svn.pvtool.org/svn/day_audi_ngw/trunk/ngw_base/frontend/js/audi/audi.form.simpleSjax.js $
 * 
 * Tried to force height on $element.parent, but this results in jumping elements / ff 3
 * 
 */

/* create namespace */
audi_ngw.namespace(audi_ngw,'form.simpleAjax');
 


/* CREATE JQUERY PLUGINS */
/**
 * @see audi_ngw.dom.rounded_corners.create 
 */
$.fn.audi_simpleAjax = function() {
  audi_ngw.dom.simpleAjax._doSubmit(this);
  return this;
};
 
/**
 * Adds necessary events
 * @return {Void}
 */
audi_ngw.form.simpleAjax._addEvents = function(sId){
	// cache scope
	var scope = audi_ngw.form.simpleAjax;
	var _sSelector = sId || '';
	_sSelector += ' form.';
	_sSelector += scope._oOptions._sClassNameMarker;
	
	forms = jQuery(_sSelector);
	// add events on forms
	forms
		.unbind('submit')
		.bind('submit.simpleAjax',audi_ngw.form.simpleAjax.submit)
		// set event on hide resetting elements in case a non-modal layer get closed during runnding request
		.parents('.audi_generated_corners_background')
		.find('.close')
		.unbind('click.simpleAjax')
		.bind('click.simpleAjax',audi_ngw.form.simpleAjax.hide);
};

  
/**
 * OnSubmit event
 * @param {Event} event
 * @return {Void}
 */
audi_ngw.form.simpleAjax.submit = function (event) {
	// prevent default 
	event.preventDefault();
	// cache scope
	var scope = audi_ngw.form.simpleAjax;
	// construct selector for running request markers
	var _sSelector = 'form.';
	_sSelector += scope._oOptions._sClassNameMarker;
	_sSelector += ".";
	_sSelector += scope._oOptions._sClassNameActiveMarker;
	
	// just one request
	if(jQuery(_sSelector).size()) {
		return;
	}
	
	// get element from event 
	var _$element = jQuery(event.target) || jQuery(event);
	// do submit 
	audi_ngw.form.simpleAjax._doSumbit(_$element,event);
	// cancel default event 
	return false;
};

/**
 * Ajax sumbit
 * @see audi_ngw.form.validation.validatorForRequiredFields
 * @param {Element} jQuery element
 * @return {Void}
 */
audi_ngw.form.simpleAjax._doSumbit = function ($element) {
	// cache scope
	var scope = audi_ngw.form.simpleAjax;
	// get callback (called after content update)
	$callback = function() {};
	if ($element.hasClass('audiCallbackLoginResponse')) {
		$callback = audi_ngw.myaudi.handleLoginResponse;
	}
	// prepare environment
	$element
		.parent()
//		.height($element.parent().height())
		.end()
		.addClass(scope._oOptions._sClassNameActiveMarker)
		.audi_setLoading();
	// get query param
	var _oFields = $element
		.find(":input")
		.serializeArray();
	// get url
	var _sUrl = audi_ngw.url.getContext($element.attr('action'));
	// post 
	$.post(_sUrl,_oFields, function(data) {
		audi_ngw.form.simpleAjax.onSuccess(data, $callback);
	});
	
};

/**
 * inSuccess callback, injects HTML
 * @param {String} responseText
 * @return {Void}
 */
audi_ngw.form.simpleAjax.onSuccess = function(data, $callback) {

 	// cache scope
	var scope = audi_ngw.form.simpleAjax;
	var _sId = null;

	// construct selector for request owing form
	var _sSelector = 'form.';
	_sSelector += scope._oOptions._sClassNameMarker;
	_sSelector += ".";
	_sSelector += scope._oOptions._sClassNameActiveMarker;
	
	// is modal layer
	if (jQuery('#audi_modal_super_wrapper').css('display') !== 'none') {
		audi_ngw.layer.modal._$elLayer
		.find('#audi_modal_body')
		.html(	
		// Create a dummy div to hold the results
		jQuery("<div/>")	
			// inject the contents of the document in, removing the scripts
			// to avoid any 'Permission Denied' errors in IE 
			.append(data.replace(/<script(.|\s)*?\/script>/g, ''))	
			// Locate the specified elements
			.find(" #" + "audi_modal_body > *")
		);
		// evaluate scripts
		audi_ngw.navigation.loadScript(data);
		_sId = '#audi_modal_body';
		$callback(_sId);
		audi_ngw.iframe.contentRedirects(jQuery(_sId));
	}
	
	// simple form 
	else {
		// inject html 
		jQuery(_sSelector)	// remove height 
		//		.parent()
		//		.height('')
		//		.end()
		.replaceWith(
			jQuery("<div/>")	
				// inject the contents of the document in, removing the scripts
				// to avoid any 'Permission Denied' errors in IE 
				.append(data.replace(/<script(.|\s)*?\/script>/g, ''))
				// Locate the specified elements
				.find(" #" + "audi_content_wrapper > *")
			);
		_sId = '#audi_container_page';
	}
	// trigger event
	audi_ngw.event.trigger('ajaxSnippetReady',[{'sId': _sId}]);
}; 

/**
 * Resets form in case of hiding non-modal layer during running request.
 * @param {Event} event
 * @return {Void}
 */
audi_ngw.form.simpleAjax.hide = function(event) {
	// get element
	var $element = jQuery(event.target) || jQuery(event);
	// bridge
	audi_ngw.form.simpleAjax._doHide($element);
};

/**
 * Resets form in case of hiding non-modal layer during running request.
 * @param {HTMLElement} $element, jQuery extended Element (.close)
 * @return {Void}
 */
audi_ngw.form.simpleAjax._doHide = function($element) {
 	// cache scope
	var scope = audi_ngw.form.simpleAjax;
	$element
		.parents('.audi_generated_corners_background')
		// get request owner (form)
		.find('form.'+scope._oOptions._sClassNameActiveMarker)
		// remove marker class
		.removeClass(scope._oOptions._sClassNameActiveMarker)
		// remove loader 
		.audi_unsetLoading();
		// reset height 
//		.parent()
//		.height('');
};

 
/**
 * 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.simpleAjax.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.simpleAjax.onAjaxModalContentReady",arguments);
	// execute funtions on new content
 	audi_ngw.form.simpleAjax._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.simpleAjax.onAjaxSnippetReady = function(event,data){

	//audi_ngw.log("EVENT - ajaxSnippetPrepared: audi_ngw.form.simpleAjax.onAjaxSnippetReady",arguments);
	// execute funtions on new content
 	audi_ngw.form.simpleAjax._addEvents(data.sId);
	
	// trigger event 
	audi_ngw.event.trigger('ajaxSnippetPrepared',[event,data]);
};

/**
 * Constructor
 * @param {Object} oOptions
 * @return {Void}
 */
audi_ngw.form.simpleAjax.initialize = function (oOptions){
	// cache 
	var scope = audi_ngw.form.simpleAjax;

	scope.__className =  'audi_ngw.form.simpleAjax';
	scope.__classVersion= '1.2';
	
	scope._oOptions = {};
	scope._oOptions._sClassNameMarker = 'simpleAjax'; // enables simple ajax on form
	scope._oOptions._sClassNameActiveMarker = 'runningRequest'; // marks form that requested the current XHR request


	// register ajaxModalContentReady event
	audi_ngw.event.bind('ajaxModalContentReady.formSimpleAjax',audi_ngw.form.simpleAjax.onAjaxModalContentReady);
 	audi_ngw.event.bind('ajaxSnippetReady',audi_ngw.form.simpleAjax.onAjaxSnippetReady);
		
	// add events 
	scope._addEvents();
};
