/*
 * Mini Advanced Search Form
 * 
 * @Version: 1.0
 * @Author: Rafał Salamon <rafal.salamon@stepstone.com>
 * @Required: jQuery 1.4
 */
(function($) {
	
	// plugin definition
	
	
	/*
	 * Main Function
	 * 
	 * @Argument: object options
	 * @Return: void
	 * @Versiion: 1.0
	 * @Access: Public
	 */
	$.fn.advSearch = function (options) {
		//debug(this);
		
		var options = $.extend({}, $.fn.advSearch.defaults, options);
		
		return this.each(function () {
			var iNumItem = $.fn.advSearch.defaults.formelements.length;
			var content = ''
			var submit = '<div class="'+ $.fn.advSearch.defaults.clasesses.SUBMITCONTAINER +'"><input type="submit" name="search" id="search" value="' + $.fn.advSearch.defaults.translations.submit + '" /></div>';
			
			
			for (var i = 0; i < iNumItem; i++) {
				content = createSelectBlock(i);
				
				if(options.appendto == '')
					$(this).append(content);
				else{ 
					$(options.appendto).append(content);
					debug(options.appendto);
				}
			}
			
			if (options.submitbutton == true) {
				if(options.appendto == '')
					$(this).append(submit);
				else
					$(options.appendto).append(submit);
			}
			
		});
	};
	
	/*
	 * Set Form Elements
	 * 
	 * @Argument: object options
	 * @Return: void
	 * @Versiion: 1.0
	 * @Access: Public
	 */
	$.fn.advSearch.setFormElement = function (options) {
		var options = $.extend({}, $.fn.advSearch.formelements, options);
		
		$.fn.advSearch.defaults.formelements.push (options);
	}
	
	/*
	 * Action to change main field value
	 * 
	 * @Argument: object elem, string name
	 * @Return: void
	 * @Versiion: 1.0
	 * @Access: Public
	 */
	$.fn.advSearch.setValue = function (elem, name) {
		var fields = $("div#box" + name + " input[type=checkbox]").serializeArray();
		var aSelected = new Array();
		var sSelected = '';
		var i = 0;
		var field = '';
		var count = 0;
		
		jQuery.each(fields, function(i, field){
			aSelected[i] = field.value;
        });
        
        count = aSelected.length;
        
        for (i == 0; i < count; i++) {
        	if (aSelected[i] != 'on') {
	        	if (i < (count - 1))
	        		sSelected += aSelected[i] + ',';
	        	else 
	       			sSelected += aSelected[i];
        	}
        }
		
		$('input#' + name).val(sSelected);
		//debug($('input#' + name).val());
	}
	
	// private function
	
	/*
	 * Debug information in console
	 * 
	 * @Argument: mixed arg
	 * @Return: void
	 * @Versiion: 1.0
	 * @Access: Public
	 */
	function debug (arg) {
		if (window.console && window.console.log)
			window.console.log(arg);
	}
	
	/*
	 * Create Search Element Block
	 * 
	 * @Argument: int item
	 * @Return: object
	 * @Versiion: 1.0
	 * @Access: Public
	 */
	function createSelectBlock (item) {
		var objItemContent = '';
		var aItem = $.fn.advSearch.defaults.formelements[item];
		var objElement = document.createElement('div');
		
		switch (aItem.TYPE)
		{
			case 'text':
					
					// SET MAIN CONTAINER
					$(objElement).addClass (aItem.CLASESSES.CONTAINER);
					$(objElement).attr ('id', 'advMC' + aItem.NAME);
					
					// SET TITLE CONTAINER 
					var objTitleContainer = document.createElement('div');
					var objTitleLabel = document.createElement('span');
					
					$(objTitleContainer).addClass (aItem.CLASESSES.TITLECONTAINER);
					$(objTitleLabel).addClass (aItem.CLASESSES.BOXTITLE);
					
					if (aItem.SHOWHIDE == true) {
						$(objTitleLabel).click (function () {
							$('div#box' + aItem.NAME).toggle('slow');
						});
					}
					
					$(objTitleLabel).append(aItem.LABELS.TITLE);
					$(objTitleContainer).append($(objTitleLabel));
			
					// SET BODY CONTAINER
					objItemContent = prepareTextBoxItem(item);
					
					// Append Main
					$(objElement).append($(objTitleContainer));
					$(objElement).append(objItemContent);
					
				break;
				
			case 'select': 
			default:
					
					// SET MAIN CONTAINER
					$(objElement).addClass (aItem.CLASESSES.CONTAINER);
					
					if (aItem.ID == '')
						$(objElement).attr ('id', 'advMC' + aItem.NAME);
					else
						$(objElement).attr ('id', aItem.ID);
					
					if (aItem.SIMPLE == false) {
						// SET TITLE CONTAINER 
						var objTitleContainer = document.createElement('div');
						var objTitleLabel = document.createElement('span');
						
						$(objTitleContainer).addClass (aItem.CLASESSES.TITLECONTAINER);
						$(objTitleLabel).addClass (aItem.CLASESSES.BOXTITLE);
	
						if (aItem.SHOWHIDE == true) {
							$(objTitleLabel).click (function () {
								$('div#box' + aItem.NAME).toggle('slow');
							});
						}
						
						$(objTitleLabel).append(aItem.LABELS.TITLE);
						$(objTitleContainer).append($(objTitleLabel));
					
						if (jQuery.isEmptyObject(aItem.PARENTS)) {
							// SET BODY CONTAINER
							objItemContent = prepareCheckBoxItemForSelect(item, aItem.MAINS);
						} else {
							// SET BODY CONTAINER
							objItemContent = prepareCheckBoxItemForSelect(item, aItem.MAINS);
						}
						
						// Append Main
						$(objElement).append($(objTitleContainer));
						$(objElement).append(objItemContent);
					} else {
						objItemContent = prepareCheckBoxItemForSelect(item, aItem.MAINS);
						$(objElement).append(objItemContent);
					}
				
					
				break;
		}
			
		return $(objElement);
	}
	
	/*
	 * Create Text Item
	 * 
	 * @Argument: int item
	 * @Return: object
	 * @Versiion: 1.0
	 * @Access: Private
	 */
	function prepareTextBoxItem (item) {
		var aItem = $.fn.advSearch.defaults.formelements[item];
		var objElement = document.createElement('div');
		var objItem = document.createElement('input');
		
		// MAIN CONTAINER
		$(objElement).addClass(aItem.CLASESSES.SELECTCONTAINER);
		$(objElement).attr('id', 'box' + aItem.NAME);
		
		// INPUT ELEMENT
		$(objItem).addClass(aItem.CLASESSES.INPUTTEXT);
		$(objItem).attr('type', 'text');
		$(objItem).attr('id', aItem.NAME);
		$(objItem).attr('name', aItem.NAME);
		$(objItem).attr('value', '');
		
		// Append
		$(objElement).append($(objItem));
		
		return $(objElement);
	}
	
	/*
	 * Create CheckBox Items
	 * 
	 * @Argument: int item
	 * @Return: object
	 * @Versiion: 1.0
	 * @Access: Private
	 */
	function prepareCheckBoxItemForSelect (item, items) {
		var objElement = document.createElement('div');
		var objHiddenElement = document.createElement('input');
		var objColumnUlLeft = document.createElement('ul');
		var objColumnUlRight = document.createElement('ul');
		var objTempLiElement = document.createElement('li');
		var objTempInputElement = document.createElement('input');
		var objTempLabel = document.createElement('label');
		var objDivSeparator = document.createElement('div');
		var objDivSelectAll = document.createElement('div');
		var objInputSelectAll = document.createElement('input');
		var objnputSelectAllLabel = document.createElement('label');
		
		var iNum = items.length;
		var aItem = $.fn.advSearch.defaults.formelements[item];
		var aDiv = Math.ceil(iNum/2);
		
		// MAIN CONTAINER
		$(objElement).addClass(aItem.CLASESSES.SELECTCONTAINER);
		$(objElement).attr('id', 'box' + aItem.NAME);
		
		// HIDDEN FIELDS
		$(objHiddenElement).attr('type', 'hidden');
		$(objHiddenElement).attr('value', '');
		$(objHiddenElement).attr('name', aItem.NAME);
		$(objHiddenElement).attr('id', aItem.NAME);
		
		// UL LEFT
		$(objColumnUlLeft).attr('class', aItem.CLASESSES.LISTCHECKBOX + ' ' + aItem.CLASESSES.LISTCHECKBOXLEFT);
		 
		// UL RIGHT
		$(objColumnUlRight).attr('class', aItem.CLASESSES.LISTCHECKBOX + ' ' + aItem.CLASESSES.LISTCHECKBOXRIGHT);
		
		// Div Select All
		$(objDivSelectAll).attr('class', aItem.CLASESSES.SELECTALLBOX);
		
		// Input Select ALL 
		$(objInputSelectAll).attr('class', aItem.CLASESSES.SELECTALLINPUT);
		$(objInputSelectAll).attr('id', 'selectall' + aItem.NAME);
		$(objInputSelectAll).attr('name', 'selectall' + aItem.NAME);
		$(objInputSelectAll).attr('type', 'checkbox');
		
		// Event Select ALL
		$(objInputSelectAll).click(function(){
			
			if (this.checked == true) {
				$('div#box' + aItem.NAME + ' ul input').each (function(){
					this.checked = true;
					
					$.fn.advSearch.setValue(this, aItem.NAME);
				});
			} else {
				$('div#box' + aItem.NAME + ' ul input').each (function(){
					this.checked = false;
					
					$.fn.advSearch.setValue(this, aItem.NAME);
				});
			}
			
		});
		
		// Label Select ALL
		$(objnputSelectAllLabel).attr('class', aItem.CLASESSES.SELECTALLLABEL);
		$(objnputSelectAllLabel).attr('for', 'selectall' + aItem.NAME);
		if (aItem.TRANSLATIONS[0] == undefined )
			$(objnputSelectAllLabel).append($.fn.advSearch.defaults.translations.all);
		else
			$(objnputSelectAllLabel).append(aItem.TRANSLATIONS[0]);
		
		// APPEND Input & Label Select ALL
		$(objDivSelectAll).append($(objInputSelectAll));
		$(objDivSelectAll).append(' ');
		$(objDivSelectAll).append($(objnputSelectAllLabel));
		 
		// INPUT FIELDS
		for (var i = 0; i < iNum; i++) {
			
			// CREATE LI
			objTempLiElement = document.createElement('li');
			
			// CREATE INPUT
			objTempInputElement = document.createElement('input');
			$(objTempInputElement).attr('type', 'checkbox');
			$(objTempInputElement).attr('id', 'item' + aItem.NAME + i);
			$(objTempInputElement).attr('name', 'item' + aItem.NAME + i);
			$(objTempInputElement).attr('value', items[i]);
			
			$(objTempInputElement).click(function () {
				$.fn.advSearch.setValue(this, aItem.NAME);
			});
			
			// CREATE LABEL
			objTempLabel = document.createElement('label');
			$(objTempLabel).attr('for', 'item' + aItem.NAME + i);
			$(objTempLabel).append (aItem.TRANSLATIONS[items[i]]);
			
			// APPEND LI 
			$(objTempLiElement).append($(objTempInputElement));
			$(objTempLiElement).append(' ');
			$(objTempLiElement).append($(objTempLabel));
			
			// APPEND UL
			if (i < aDiv ){
				$(objColumnUlLeft).append($(objTempLiElement));
			} else {
				$(objColumnUlRight).append($(objTempLiElement));
			}
				
		}
		
		$(objDivSeparator).attr('class', aItem.CLASESSES.CLEARFLOAT);
		
		// APPEND MAIN CONTAINER
		$(objElement).append($(objHiddenElement));
		$(objElement).append($(objDivSelectAll));
		$(objElement).append($(objColumnUlLeft));
		$(objElement).append($(objColumnUlRight));
		$(objElement).append($(objDivSeparator));
		
		
		return $(objElement);
	}
	
	// plugin defaults
	
	$.fn.advSearch.defaults = {
		formelements: [],
		clasesses: { SUBMITCONTAINER: 'advsSubmitContainer' },
		translations: { submit: '   Søk   ', all: 'Alle' },
		appendto: '',
		submitbutton: true
	};
	
	$.fn.advSearch.formelements = {
		TYPE: 'select',
		NAME: '',
		ID: '',
		VALUE: '',
		CLASESSES: { CONTAINER: 'advsContainer', TITLECONTAINER: 'advsTitleContainer', BOXTITLE: 'advsTitleBox', SELECTCONTAINER: 'advsSelectContainer', LISTCHECKBOX: 'advsListCheckbox', LISTCHECKBOXLEFT: 'advsListLeft', LISTCHECKBOXRIGHT: 'advsListRIGHT', CLEARFLOAT: 'advsClear', INPUTTEXT: 'advsInputText', SELECTALLBOX: 'advsSelectAllBox', SELECTALLINPUT: 'advsSelectAllInput', SELECTALLLABEL: 'advsSelectAllLabel' },
		LABELS: { 'TITLE': 'Select Widget' },
		MAINS: [],
		TRANSLATIONS: {},
		PARENTS: {},
		SIMPLE: false,
		SHOWHIDE: true
	};
	
})(jQuery);