/**
 * exemple :
 * 	
 * @name searchText
 * @class
 * @static
 * @version 1.0
 */
(function($){
	$.fn.extend({
		searchText: function(extendConfiguration) {
			//return true;
			
			var globalConfiguration = $.extend({
				maxHeightList: 200 /* Taille maximale de la liste des valeurs */
			}, extendConfiguration);
			
			return this.each(function(eachIndex){
				var objectLinked = $(this);
				if (objectLinked.attr('data-bov3-searchtext-div-associated')!=undefined) {
					/* déjà fait, on continue*/
					return true;
				}
				
				var configuration= $.extend(configuration, globalConfiguration, eval('('+objectLinked.attr('data-bov3-searchtext-options')+')'));
				
				/* On cache la cible */
				objectLinked.hide();
				
				/* on construit le template */
				var objectBase = new jQuery("<div></div>").addClass("widget-bov3-searchtext-div");
				var objectInputData = new jQuery("<input type='text'></input>").addClass("editable");
				var objectText = new jQuery("<div></div>").addClass("widget-bov3-searchtext-div-text").append( objectInputData );
				var objectChoice = new jQuery("<div></div>").addClass("widget-bov3-searchtext-div-choice");
				var objectOptions = new jQuery("<div></div>").addClass("widget-bov3-searchtext-div-options");
				
				objectChoice.append( objectOptions );
				objectBase.append( objectText ).append( objectChoice );
				
				objectLinked.attr('data-bov3-searchtext-div-associated','true');
				objectLinked.after( objectBase );

				/* Toute modification de notre champ de saisie doit être répercuté sur le champ caché */
				objectInputData.change(function() {
					if (objectBase.impactObjectLinked) objectLinked.val($(this).val());
				});
				/* L'event change ne fonctionne pas super bien en IE, alors pour pallier les petits problemes
				 * mettons à jour lorsque l'on quitte le champ */
				objectInputData.blur(function() {
					if (objectBase.impactObjectLinked) objectLinked.val($(this).val());
				});
				
				/* Calculons un nom pour les radios boutons */
				objectBase.radioname = 'searchtextrb_'+(objectLinked.attr('id')!=null?objectLinked.attr('id'):'plouf')+'_'+eachIndex;
				
				/*
				 * Un changement de l'option elle-même sera notifié
				 */
				var checkbox_change = function() {
					objectBase._setOption( $(this).val() );
					if (objectBase.impactObjectLinked) objectInputData.focus();
				};
				
				/*
				 * Gestion de la disparition de la liste des options
				 */
				objectBase.mouseout(function(e) {
					var hide=true;
					var parent = objectBase.get(0);
					$(e.relatedTarget).parents().andSelf().each(function() {
						if( this == parent ) {
							hide = false;
							return false;
						}
					});
					if( hide ) objectBase._hide();
					return true;
				});
				/*
				 * Gestion du resize de la liste des choix (avec actions)
				 * Pour ne pas dépasser une taille monstrueuse
				 */
				objectBase._resize = function() {
					if (!objectChoice.is(':visible')) return;
					objectOptions.css('height','');
					var options_height = objectOptions.height();
					if (options_height>configuration.maxHeightList) options_height=configuration.maxHeightList;
					objectOptions.height( options_height );
					options_height = objectOptions.outerHeight(true);
					objectChoice.height( options_height  );
					
					var new_width = objectBase.width();
					// il faut retirer nos border
					var border_width = objectChoice.outerWidth(false)-objectChoice.innerWidth();
					new_width = new_width - border_width;
					objectChoice.width(new_width);
				};
				/*
				 * On affiche la liste :
				 * => repositionne la liste correctement
				 */
				objectBase._show = function(params) {
					objectChoice.show();
					objectBase._resize();
				};
				/*
				 * On cache la liste
				 */
				objectBase._hide = function(params) {
					objectChoice.hide(params);
				}
				/*
				 * On change l'affichage ou non de la liste
				 */
				objectBase._toggle = function(params) {
					if (objectChoice.is(':visible')) objectBase._hide(params);
					else objectBase._show(params);
				}
				/*
				 * Gestion du click  pour afficher ou masquer la liste
				 */
				objectText.click(function() {
					objectBase._toggle();
					return false;
				});
				
				objectBase.impactObjectLinked=true;
				/*
				 * Sur n'importe quel changement des options
				 * - on modifie l'operation du champ caché
				 */
				objectBase._onchange = function() {
					if (!objectBase.impactObjectLinked) return;
					var $item = $(this).find("div.widget-bov3-searchtext-div-option input:checked");
					var op = $item.val();
					if (op==null || op=='') op = "contains";
					objectLinked.attr('op',op);
					if (op=='empty' || op=='notempty') {
						objectInputData.prop('readonly', true);
						objectInputData.val($item.parent().text()); /* On vide en apparence la zone de saisie */
						objectInputData.trigger('change');
						objectLinked.val("***"); /* On met du texte dans la zone cachée pour que le champ soit soumis */
					} else {
						objectInputData.prop('readonly', false);
					}
				};

				var objectlinked_change = function() {
					objectBase._initValuesFromLinked();
				};
				
				/*
				 * Ajouter une option.
				 * - val : identifiant de l'item
				 * - text : libellé associé de l'item .
				 */
				objectBase._addOption = function(val, text) {
					var label = new jQuery("<label style='display:block'></label>");
					label.append( new jQuery("<input type='radio'/>").val(val).bind('change', checkbox_change).attr('name',objectBase.radioname) );
					label.append( new jQuery("<span></span>").text(text));
					var option = new jQuery("<div class='widget-bov3-searchtext-div-option'></div>");
					option.attr('optionid', val);
					option.append(label);
					objectOptions.append( option );
				};
				objectBase._setOption = function(val) {
					objectOptions.find("input").prop('checked',false);
					objectOptions.find("div.widget-bov3-searchtext-div-option[optionid='"+val+"'] input").prop('checked',true);
					objectBase._onchange();
				};
				objectBase._initValuesFromLinked = function() {
					objectBase.impactObjectLinked = false; 
					objectBase._setOption( objectLinked.attr('op') );
					objectInputData.val( objectLinked.val() );
					objectBase.impactObjectLinked = true; 
				}
				
				objectLinked.bind('change', objectlinked_change);
				/* Premiere fois on cache la liste */
				objectBase._hide();
				
				objectBase.impactObjectLinked = false; 
				/* On lit les valeurs de la cible pour récupérer les éléments */
				objectBase._addOption( 'contains', boi18n.getMessage('/bov3/wcm','bov3_searchtext_op_contains') );
				objectBase._addOption( 'notcontains', boi18n.getMessage('/bov3/wcm','bov3_searchtext_op_notcontains') );
				objectBase._addOption( 'eq', boi18n.getMessage('/bov3/wcm','bov3_searchtext_op_eq'));
				objectBase._addOption( 'startswith', boi18n.getMessage('/bov3/wcm','bov3_searchtext_op_startswith') );
				objectBase._addOption( 'endswith', boi18n.getMessage('/bov3/wcm','bov3_searchtext_op_endswith') );
				objectBase._addOption( 'diff', boi18n.getMessage('/bov3/wcm','bov3_searchtext_op_diff') );
				objectBase._addOption( 'empty', boi18n.getMessage('/bov3/wcm','bov3_searchtext_op_empty') );
				objectBase._addOption( 'notempty', boi18n.getMessage('/bov3/wcm','bov3_searchtext_op_notempty') );
				objectBase.impactObjectLinked = true; 
				
				objectBase._initValuesFromLinked();
				objectBase._onchange();
				
				
			});
		}
	});
	
	$(function(){
		$('input[data-bov3-searchtext-options]').searchText();
	});
	
})(jQuery);


