/**
 * AUDI JavaScript library: filters dom elements by categories or 
 * 
 * @projectDescription	Creates <select onchange="audi_ngw.dom.select.change"><option value="HREF"> from <ul><li><a>  and sets onchange event to control iframe 
 * @namespace			dom
 *
 * @author 				$Author: hhoettecke $
 * @version				$Revision: 6416 $	
 * @copyright			NEUE DIGITALE GmbH, Berlin
 * 
 * @jslint: 2008-10-31
 * 
 * @file:				audi_ngw.dom.select.js
 * $URL: https://svn.pvtool.org/svn/day_audi_ngw/trunk/ngw_base/frontend/js/audi/audi.dom.filter.js $
 */

/* create namespace */
audi_ngw.namespace(audi_ngw,'dom.filter');

/**
 * Adds Events on rel="filter"
 * @param {String} Wrapper Id, narrowing search
 * @return {Void}
 */
audi_ngw.dom.filter._addEvents = function(sIdWrapper){
	sIdWrapper = sIdWrapper || '';
	jQuery(sIdWrapper+' *[rel="filter"]')
		.unbind('click.filter')
		.bind('click.filter',audi_ngw.dom.filter.run);
};

 
/**
 * filter elements by supplied classname / filterOtpions
 * @param {Event} event
 * @return {Bool}
 */
audi_ngw.dom.filter.run = function(event){
	// prevent event
	event.preventDefault();
	var $eventElement = jQuery(event.target) || jQuery(event);
	// in case of <select>, get filter options from <option.value> === current select value
	if ($eventElement.eq(0).get(0).tagName.toLowerCase() == 'select' || $eventElement.eq(0).get(0).tagName.toLowerCase() == 'option') {
		$eventElement = jQuery('option[value="'+$eventElement.val()+'"]');
	}
	// get filter options
	var _oOptions = audi_ngw.dom.filter._getOptions($eventElement);
	// call filter
	audi_ngw.dom.filter._doRun(_oOptions.sIdSource,_oOptions.sIdTarget,_oOptions.sFilter);
	// return false to prevent default action
	return false;
};

/**
 * Acutal filter function. Gets all elements below #sIdSource whose classnames 
 * matches sFilter and clones them into #sIdTarget
 * @param {String} sIdSource
 * @param {String} sIdTarget
 * @param {String} sFilter to match
 * @return {Bool}
 */
audi_ngw.dom.filter._doRun = function(sIdSource,sIdTarget,sFilter){
	// required just one source / target element and a supplied filter 
	if ( jQuery('#'+sIdSource).size() !== 1 || jQuery('#'+sIdTarget).size() !== 1 || !sFilter) { return; }
	// construct selector
	var _sSelector = '.';
	_sSelector += sFilter;
	var _$elFiltered = jQuery('#'+sIdSource)
		.find(_sSelector);
	// return false in case of noone matches my filters
	if (!_$elFiltered.size()) { return false; }
	// empty target
	var _$elTarget = jQuery('#'+sIdTarget).empty();
	// clone
	_$elFiltered
		.clone(true)
		.appendTo(_$elTarget);

	// DANG-1312: xhr-loading content for the (now newly created) first navigation item 
	_$elTarget
		.find('a')
		.eq(0)
		.trigger('click');
	
	// unset 
	_$elTarget = null;
	_$elFiltered = null;
	return true;
};

/**
 * Get fitler options from supplied element or using the default values.
 * @param {HTMLElement} jQuery extended element
 * @return {Object} Options
 */
audi_ngw.dom.filter._getOptions = function ($element) {
	// get options suing metadata()
	var _$oMeta = $element.metadata().filterOptions || {};
	// enhance options with default values
	var _oOptions = {
		sIdSource:  _$oMeta.sIdSource || audi_ngw.dom.filter._defaults.sIdSource,
		sIdTarget: _$oMeta.sIdTarget || audi_ngw.dom.filter._defaults.sIdTarget,
		sFilter: _$oMeta.sFilter || null
	};
	// return options 
	return _oOptions;
};



/**
 * Custom Event: wil be fired as soon as we injected the xhr-snippet 
 * @param {Object} event
 * @param {Object} XHR
 */
audi_ngw.dom.filter.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.dom.filter.onAjaxModalContentReady",arguments);
	// execute funtions on new content
 	audi_ngw.dom.filter._addEvents('#'+audi_ngw.url.getContentId());

	// 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.dom.filter.onAjaxSnippetReady = function(event,data){
 
	//audi_ngw.log("EVENT - ajaxSnippetPrepared: audi_ngw.dom.filter.onAjaxSnippetReady ",arguments);
	// execute funtions on new content
 
	audi_ngw.dom.filter._addEvents(data.sId);
	
	// trigger event 
	audi_ngw.event.trigger('ajaxSnippetPrepared');
 };
 
 
/**
 * Initialize 
 * @method initialize
 * @constructor
 * @param {Object} Options 
 * @return {Void}
 */
audi_ngw.dom.filter.initialize = function(){
	
	this.__className =  'audi_ngw.dom.filter';
	this.__classVersion= '1.5';
	
	this._options = {};
	this._defaults = {};
	this._defaults.sIdSource = 'filerBluePrint';
	this._defaults.sIdTarget = 'filterCopy';
	audi_ngw.dom.filter._addEvents();
};

/*
audi_ngw.dom.filter.TEST = function(){
	jQuery('*[rel="filter"]').bind('click.filter',audi_ngw.dom.filter.run)
};
*/ 

audi_ngw.dom.filter.prepare = function(){
	audi_ngw.dom.filter.initialize();
	
	// register ajaxModalContentReady event
	audi_ngw.event.bind('ajaxModalContentReady.domFilter',audi_ngw.dom.filter.onAjaxModalContentReady);
	audi_ngw.event.bind('ajaxSnippetReady',audi_ngw.dom.filter.onAjaxSnippetReady);

};
