/**
* jQuery Plugin LiveSearch implements a text based live search.
* @author NOSE
*/
jQuery.fn.liveSearch = function(op) {
	// defaults
	var defaults = {
		selectorLiveSearchInput:"input.text",
		selectorLiveSearchSubmit:"input.submit",
		selectorLiveSearchCount:".lsCount",
		selectorLiveSearchEntry:".lsEntry",
		selectorLiveSearchKeyword:".lsKeyword",
		classNoMatch:"lsNoMatch",
		classNoMatches:"lsNoMatches",
		classClear:"lsClear",
		txtLiveSearch:"Suchfilter"
	 };
	 jQuery.extend(defaults, op);
	
	// live search selector
	var lsSelector = jQuery(this).attr("id");
	jQuery.log("LiveSearch: selector = " + lsSelector);
	
	// browser
	var browserIE = jQuery.browser.msie;
	if (browserIE) {
		jQuery("."+lsSelector).addClass("ie");
	}

	
	// references
	var elLiveSearchForm = jQuery("form",this);
	var elLiveSearchTerm = jQuery(defaults.selectorLiveSearchInput,this);
	var elLiveSearchSubmit = jQuery(defaults.selectorLiveSearchSubmit,this);
	var elLiveSearchCount = jQuery(defaults.selectorLiveSearchCount,this);
	
	// entries
	var lsGroups = jQuery("."+lsSelector);
	var lsEntries = new Array();
	var lsKeywords = new Array();
	
	// events
	jQuery(elLiveSearchForm).bind("submit",function() {return false;});
	jQuery(elLiveSearchSubmit).bind("click",clearLiveSearch);
	jQuery(elLiveSearchTerm).bind("click",prepareLiveSearch);
	jQuery(elLiveSearchTerm).bind("blur",leaveLiveSearch);
	jQuery(elLiveSearchTerm).bind("keyup",updateLiveSearch);
	
	
	// init
	var lsMatchingCount = 0;
	var lsFilterKeyword = "";
	initLiveSearch();
	
	
	/**
	* Initializes the live search.
	*/
	function initLiveSearch() {
		jQuery.log("LiveSearch: initLiveSearch");
		
		// form
		jQuery(elLiveSearchForm).attr("autocomplete","off");
		jQuery(elLiveSearchTerm).attr("value",defaults.txtLiveSearch);
		
		// entries & keywords
		lsMatchingCount = 0;
		for (var i = 0; i < lsGroups.length; i++) {
			var lsGroup = lsGroups[i];
			var lsGroupEntries = jQuery(defaults.selectorLiveSearchEntry,lsGroup);
			lsEntries[i] = new Array();
			lsKeywords[i] = new Array();
			
			for (var j = 0; j < lsGroupEntries.length; j++) {
				var lse = lsGroupEntries[j];
				
				// entry
				lsEntries[i][j] = lse;
				
				// keywords
				var elsKeywords = jQuery(defaults.selectorLiveSearchKeyword,lse);
				var lseKeywords = "";
				for (var k = 0; k < elsKeywords.length; k++) {
					lseKeyword = jQuery(elsKeywords[k]).html();
					lseKeywords += lseKeyword + " ";
				}
				lsKeywords[i][j] = lseKeywords.toUpperCase();
				jQuery.log("keyword: " + lsKeywords[i][j]);
				
				// count
				lsMatchingCount++;
			}
		}
		
		// count
		jQuery(elLiveSearchCount).html(lsMatchingCount);
	}
	
	
	
	
	/**
	* Prepares the live search.
	*/
	function prepareLiveSearch() {
		jQuery.log("LiveSearch: prepareLiveSearch");
		var val = jQuery(elLiveSearchTerm).attr("value");
		if (val == defaults.txtLiveSearch) {
			jQuery(elLiveSearchTerm).attr("value","");
		}
	}
	
	/**
	* Leaves the live search.
	*/
	function leaveLiveSearch() {
		jQuery.log("LiveSearch: leaveLiveSearch");
		// input
		var val = jQuery(elLiveSearchTerm).attr("value");
		if (val == "") {
			// input
			jQuery(elLiveSearchTerm).attr("value",defaults.txtLiveSearch);
			// submit
			jQuery(elLiveSearchSubmit).removeClass(defaults.classClear);
		}
	}
	
	/**
	* Cleares the live search.
	*/
	function clearLiveSearch() {
		jQuery.log("LiveSearch: clearLiveSearch");
		// reset
		jQuery(elLiveSearchTerm).attr("value","");
		jQuery(elLiveSearchTerm).focus();
		// update
		updateLiveSearch();
	}
	
	
	
	/**
	* Filters the entries.
	*/
	function updateLiveSearch() {
		jQuery.log("LiveSearch: updateLiveSearch");
		
		// keyword
		lsFilterKeyword = jQuery(elLiveSearchTerm).attr("value").toUpperCase();
		
		// keyword
		jQuery.log("LiveSearch: filter keyword = " + lsFilterKeyword);	
		
		// entries
		lsMatchingCount = 0;
		for (var i = 0; i < lsKeywords.length; i++) {
			// check keywords
			var lsKeywordGroup = lsKeywords[i];
			var groupMatch = false;
			for (var j = 0; j < lsKeywordGroup.length; j++) {
				var keywords = lsKeywords[i][j];
				if (keywords.indexOf(lsFilterKeyword) >= 0) {
					groupMatch = true;
					jQuery(lsEntries[i][j]).removeClass(defaults.classNoMatch);
					lsMatchingCount++;
					jQuery.log("LiveSearch: matching =" + lsEntries[i][j] + " = " + keywords);
				}
				else {
					jQuery(lsEntries[i][j]).addClass(defaults.classNoMatch);
				}
			}
			// group
			if (groupMatch) {
				jQuery(lsGroups[i]).removeClass(defaults.classNoMatches);
			}
			else {
				jQuery(lsGroups[i]).addClass(defaults.classNoMatches);
			}
		}
		if (jQuery.browser.safari || jQuery.browser.webkit) {
			recalculateLineHeight();
		}
		
		
		// count
		jQuery(elLiveSearchCount).html(""+lsMatchingCount);	
		
		// submit
		if (lsFilterKeyword.length > 0) {
			jQuery(elLiveSearchSubmit).addClass(defaults.classClear);
		}
		else {
			jQuery(elLiveSearchSubmit).removeClass(defaults.classClear);
		}
		
	}
	
	/**
	 * hack for safari to force recalculation of the height for td
	 */
	function recalculateLineHeight() {
		for (var i = 0; i < lsKeywords.length; i++) {
			var lsKeywordGroup = lsKeywords[i];
			for (var j = 0; j < lsKeywordGroup.length; j++) {
				jQuery('td img', lsEntries[i][j]).eq(0).hide();
			}
		}
		for (var i = 0; i < lsKeywords.length; i++) {
			var lsKeywordGroup = lsKeywords[i];
			for (var j = 0; j < lsKeywordGroup.length; j++) {
				jQuery('td img', lsEntries[i][j]).eq(0).show();
			}
		}
	}
	
	
	
	// chain
	return true;
}
