/**
 * @fileOverview KfW Finder, Programm-Finder
 * @version 0.1
 * @author Michael Schieben <michael@twoantennas.com>
 */

/*
 * jslint nomen: true, debug: true, evil: false, onevar: false, browser: true,
 * plusplus: false, undef: true
 */
/* global window: true, KfW: true, jQuery: true */

( function($) {

	function Search() {

		var search = $('#search');
		var suggestions = search.find('#search-suggestions');
		var input = search.find('input[type=text]');
		var form = search.parents('form');
		var url = form.attr('action');

		if (KfW.DEBUG) {
			url += '-search' + '.html';
		}
		suggestions.hide();

		function suggest(term) {
			var data = form.serialize();
			$.ajax( {
				url : url,
				type : 'post',
				data : data,
				dataType : 'html',
				success : function(data) {
					suggestions.html(data);
					suggestions.fadeIn();
					if (suggestions.children().size() === 0) {
						suggestions.fadeOut();
					}
				}
			});
		}

		function suggestInput() {
			if (input.val().length > 3) {
				suggest(input.val());
			} else {
				suggestions.fadeOut();
			}
		}

		input.focus( function() {
			search.addClass('focus');
			window.setTimeout(suggestInput, 100);
		});

		input.blur( function() {
			search.removeClass('focus');
			suggestions.hide();
		});

		input.keyup(suggestInput);

		search.find('input[name=reset]').click( function(e) {
			e.preventDefault();
			input.val('').focus();
		});
	}

	function Filter() {

		var filter = $('.eui-filter');
		var content = filter.find('.eui-filter-content');
		var form = content.parents('form');

		function initialize() {
			log("initialize in");
			filter.find('.filter-step').find('select, input').each(function() {
				log('---' + $(this).attr('name'));
			});
			filter.find('.filter-step').find('select, input').change(
				function(e) {
					var field = $(this).attr('name');
					//var container = $(this).parents('div.filter-step');
					/*
					 * var step =
					 * parseInt(container.attr('id').replace('filter-step-',
					 * ''), 10);
					 * 
					 * var previous = filter.find('#filter-step-' + (step -
					 * 1)); var next = filter.find('#filter-step-' + (step +
					 * 1));
					 * 
					 * if (previous.size() > 0 &&
					 * !previous.find('select').attr('disabled')) {
					 * previous.addClass('eui-select-locked
					 * eui-checkbox-locked'); previous.find('select,
					 * input').attr('disabled', 'disabled'); }
					 * 
					 * if (next.size() > 0) {
					 * next.addClass('eui-select-loading'); send(step); }
					 */
					//var step = '&ef_partial=true';
					send('&ef_partial=true&ef_field='+field);
			});

			filter.find('input[name=reset]').click( function(e) {
				e.preventDefault();
				send('&ef_immediate=true');
			});
			log("initialize out");
		}

		function result(data) {

			content.html(data);
			// D.R.Y.
			content.find('.eui-select select').not('.eui-wide').selectmenu( {
				'style' : 'dropdown'
			});
			content.find('.eui-select select.eui-wide').selectmenu( {
				'style' : 'dropdown',
				'menuWidth' : 'auto'
			});
			content.find('.eui-checkbox input[type=checkbox]').customInput();
			initialize();
			$('body').removeClass('busy');
			scrollBy(0,1);
			scrollBy(0,-1);
		}

		function send(step) {
			log("send for " + step);
			$('body').addClass('busy');
			//var url = form.attr('action');
			//var fform = filter.find('input[name=fform]');
			//var url = _global_fform_url;
			var url = /*VIPURL*/"/deg/Vorlagen/Programmfinder/flotseform.jsp";
			//alert(url);
			var data = form.serialize();
			data += step;
			$.ajax( {
				url : url,
				type : 'post',
				data : data,
				dataType : 'html',
				success : result
			});
		}
		initialize();
	}

	/**
	 * Enhancement for sorting
	 *
	 * transforms form elements to specify sort fields and direction
	 * into a list of clickable sort options that auto-submit a form with
	 * the original elements.
	 *
	 * The function expects the following dom
	 *
	 * div.eui-sort
	 * - div.eui-sort-form
	 * -- input.eui-sort-direction
	 *    The value must be either "desc" or "asc"
	 * -- div.eui-sort-fields
	 * --- input type="radio", label
	 *     Take care of the right for="id" relationship between the
	 *     label and the form field. One of the radio elements must
	 *     have a checked="checked" Attribute
	 * -- div.eui-sort-toggle-direction
	 * --- input type="checkbox"
	 *
	 * It creates an <ul> list an adds event handlers to the items.
	 * The selected radio button turns into a list item with the class names
	 * 'selected' and the value of the input.eui-sort-direction field,
	 * which is exspected to be either 'desc' or 'asc'.
	 * When this item is click the div.eui-sort-toggle-direction checkbox
	 * will be checked, the related radio will be checked and the form
	 * will be submitted.
	 */
	$.fn.euiSort = function(options) {
		var defaultSettings = {
			key : ''
		};
		options = $.extend(defaultSettings, options);

		return this
				.each( function() {
					var sort = $(this);
					var fields = sort.find('.eui-sort-fields label');
					var direction = sort.find('.eui-sort-direction').val();
					var toggleDirection = sort
							.find('.eui-sort-toggle-direction input');
					var list = $('<ul></ul>');

					fields.each( function(i) {

						var label = $(this);
						var input = sort.find('#' + label.attr('for'));
						var title = label.text();
						var dir = '';
						// data
							var classNames = input.attr('class');
							var selected = false;

							if (input.filter(':checked').size() > 0) {
								selected = true;
								classNames += ' selected';
								classNames += ' ' + direction;
								dir = KfW.Template
										.render('eui-sort-direction' + '-' + direction);
							}

							// output
							var item = '';
							if (selected) {
								item = KfW.Template.element(
										'eui-sort-selected-item', {
											'class' : classNames,
											'title' : title,
											'dir' : dir
										});
								item.click( function(e) {
									e.preventDefault();
									input.attr('checked', 'checked');
									toggleDirection.attr('checked', 'checked');
									input.parents('form').submit();
								});
							} else {
								item = KfW.Template.element('eui-sort-item', {
									'class' : classNames,
									'title' : title
								});
								item.click( function(e) {
									e.preventDefault();
									input.attr('checked', 'checked');
									input.parents('form').submit();
								});
							}
							list.append(item);

						});
					sort.find('.eui-sort-form').hide();
					sort.append(list);
				});
	};

	function initializeResult() {

		var result = $('#result');
		result.find('#sort form fieldset').append(
				KfW.Template.render('finder-toggle-result'));

		/**
		 * Toggle between minified and maxified view.
		 */
		result.find('p.result-maxify a').click( function(e) {
			e.preventDefault();
			result.removeClass('result-minify').addClass('result-maxify');
		});

		result.find('p.result-minify a').click( function(e) {
			e.preventDefault();
			result.removeClass('result-maxify').addClass('result-minify');
		});
	}

	function Finder() {
		Sort();
		Filter();
		Search();
	}

	function Sort() {
		initializeResult();
		$('.eui-sort').euiSort();
	}

	KfW.addInitializer(Finder, true);
	//KfW.addInitializer(Search, true);
	//KfW.addInitializer(Sort, true);

}(jQuery));

/* JS-Logging to Firefox console (only FF) */
function log(text) {
	if (window.console)
		console.log(text);
}
