/**
 * triplexNewsIndex
 * 
 * @author Robert Roemer, triplex neue medien GmBbH
 * @version 1.0.0
 * @date 24.03.2011
 */
(function(jQuery){
	jQuery.fn.triplexNewsIndex = function(options) {
	
		var settings = {
			'duration':			500,
			'filter_prefix':	'news_',
			'enable_hash':		true,
			'animation_stack':	{},
			'customEvents':		{
									'beforeInitFilterList': function(){},
									'afterInitFilterList': function(){},
									'onNavEntryMouseover': function(){},
									'onNavEntryMouseout': function(){},
									'beforeShowSlide': function(){},
									'afterShowSlide': function(){},
									'afterInit': function(){}
			}
		};
	
		return this.each(function() {
			if (options) { 
				jQuery.extend(true, settings, options);
			}
			
			initFilterList();
			var hash = window.location.hash.substring(1);
			if ( settings.filter_prefix.length > 0 && hash.substring(0, settings.filter_prefix.length) == settings.filter_prefix && getFilterNav().find('li.'+hash+' a').length > 0 ) {
				applyFilter(new Array(hash), true);
			}
			
			triggerCustomEvent('afterInit', getFilterNav());
			return true;
		});

		function triggerCustomEvent(name, params) {
			if ( settings.customEvents[name] !== undefined && typeof settings.customEvents[name] == 'function' ) {
				return settings.customEvents[name](params);
			}

			return null;
		}

		function getStage() {
			return jQuery('.filter_list');
		}

		/*
		 * return the node of the project list as jQuery object
		 */
		function getList() {
			return getStage().find('.entries');
		}

		/*
		 * return the node of the project list as jQuery object
		 */
		function getFilterNav() {
			var filter_nav = getStage().children('.filter');
			
			if ( filter_nav.length == 0 ) {
				getStage().prepend('<span class="filter_list_label">Filter: </span><ul class="filter"></ul>');
				filter_nav = getStage().children('.filter');

				var class_list = getFiltersFromEntry(getList().children('li'));
				for ( var i in class_list ) {
					var alias = class_list[i];
					var label = alias.substr( settings.filter_prefix.length );

					if ( filter_nav.children('.'+alias).length == 0 ) {
						filter_nav.append('<li class="'+alias+'"><a href="#'+alias+'"><span>'+label+'</span></a></li>');
	            	}
				}
			}
			
			return filter_nav;
		}


/*
 *
 * Filter related Methods
 *
 */
		/*
		 * apply event triggers and functions to the entries
		 */
		function initFilterList() {
			var filter		= getFilterNav();

			if ( triggerCustomEvent('beforeInitFilterList', filter) == false ) {
				return false;
			}
			
			initFilterFunction(filter);

			triggerCustomEvent('afterInitFilterList', filter);
			return true;
		}


		function initFilterFunction(filter) {
			filter.find('a').unbind('click').bind('click', function() {
				var thisObj = jQuery(this);

				if ( triggerCustomEvent('beforeFilterClick', thisObj) == false ) {
					return false;
				}
				
				if ( settings.enable_hash == true ) {
					if ( window.location.hash.substring(1, settings.filter_prefix.length) == settings.filter_prefix ) {
						window.location.hash = getFiltersFromEntry(thisObj.parents('li:eq(0)'));
					}
				}
				applyFilter( getFiltersFromEntry(thisObj.parents('li:eq(0)')) );

				return false;
			});
			return true;
		}

		/*
		 * return the node of the project list as jQuery object
		 */
		function getFiltersFromEntry(entry) {
			var classAttr = '';
			if ( entry.length > 1 ) {
				entry.each(function() {
					classAttr = classAttr + ' ' + jQuery(this).attr('class');
				});
			} else {
				classAttr = entry.attr('class');
			}

			var resultList = new Array();
			var tmp_resultList = new Array();
			
            if (classAttr != null && classAttr != undefined) {
	            var classList = classAttr.split(/\s+/);
	            var length = settings.filter_prefix.length;
	            for ( var ix = 0, len = classList.length; ix < len; ix++ ) {
	                if (settings.filter_prefix === classList[ix].substr(0, length) ) {
	                	tmp_resultList.push(classList[ix]);
	                }
	            }
	        }
            
            // array unique, remove double entries
            for (var i in tmp_resultList ) {
            	var class_found = false;
            	var cur_class	= tmp_resultList[i];
            	for (var j in resultList ) {
            		if ( resultList[j] == cur_class ) {
            			class_found = true;
            			continue;
            		}
            	}
            	if ( class_found == false ) {
            		resultList.push(cur_class);
            	}
            }
	        
			return resultList;
		}



		function applyFilter(filterList, fast) {
			var entries = getList().children('li');

			triggerCustomEvent('beforeApplyFilter', {'filters': filterList, 'entries': entries});

			getFilterNav().find('.active').removeClass('active');
			if ( filterList.length > 0 ) {
				var active		= entries.filter( '.'+filterList.join(':hidden, .')+':hidden' );
				var inactive	= entries.not( '.'+filterList.join(', .') ).filter(':visible');
				getFilterNav().find( '.'+filterList.join(', .') ).addClass('active');
			} else {
				var active		= entries.filter( '.'+filterList.join(':hidden, .')+':hidden' );
				var inactive	= jQuery('');
				getFilterNav().find( 'li:eq(0)' ).addClass('active');
			}

			if ( fast == true ) {
				inactive.slideUp(1);
				active.slideDown(1);
				inactive.children('.detail').hide();
				inactive.children('.teaser').show();
				inactive.removeClass('active');
				triggerCustomEvent('completeApplyFilter', getFilterNav());
			} else {
				if ( inactive.length > 0 ) {
					var inactive_counter	= inactive.length;
					var active_counter		= active.length;
					inactive.slideUp(settings.duration, function() {
						inactive_counter--;
						if ( inactive_counter <= 0 ) {
							if ( active_counter <= 0) {
								triggerCustomEvent('completeApplyFilter', getFilterNav());
							} else {
								active.slideDown(settings.duration, function() {
									active_counter--;
									inactive.children('.detail').hide();
									inactive.children('.teaser').show();
									inactive.removeClass('active');
									if ( active_counter <= 0 ) {
										triggerCustomEvent('completeApplyFilter', getFilterNav());
									}
								});
							}
						}
					});
				} else {
					var active_counter		= active.length;
					if ( active_counter <= 0 ) {
						triggerCustomEvent('completeApplyFilter', getFilterNav());
					} else {
						active.slideDown(settings.duration, function(){
							active_counter--;
							if ( active_counter <= 0 ) {
								triggerCustomEvent('completeApplyFilter', getFilterNav());
							}
						});
					}
				}
			}
			
			triggerCustomEvent('afterApplyFilter', {'filters': filterList, 'entries': entries});
			
			return active.length;
		}

		function debug(variable) {
			if (window.console !== undefined) {
				console.log(variable);
			}
		}
	};
})(jQuery);
