(function($) {
		  
	PopControl = function() {
		this._nextId = 0;
		this._inst = [];
		this._curInst = null;
		this._lastInst = null;
		this._popupShowing = false;
		this._uiBlocker = null;
		this._defaults = {
			buttonText: '',
			buttonImage: '',
			className: '',
			closeboxImage: '',
			directInput: true,
			setContent: null
		};
		this._popControlDiv =  $('<div id="popcontrol-div"></div>');
		
		if ($.browser.msie) {
			this._uiBlocker = $('<iframe src=""></iframe>').hide();
			$(document.body).append(this._uiBlocker);
		}
		$(document.body).append(this._popControlDiv);
		$(document.body).mousedown(this._checkExternalClick);
	};
	
	$.extend(PopControl.prototype, {
		_checkExternalClick: function(event) { // Ferme le popup si le clic est en dehors
			if (!popControl._curInst) {
				return;
			}
			var target = $(event.target);
			if (!target.is('#popcontrol-div') && (target.parents('#popcontrol-div').length == 0) && popControl._popUpShowing) {
				popControl._hide(popControl._curInst, target);
			}
		},
	
		_connect: function(target, inst) { // Attache le PopControl a un champ de saisie
			var input = $(target);
			var buttonText = inst._get('buttonText');
			var buttonImage = inst._get('buttonImage');
			var trigger = $('<img class="popcontrol-trigger" src="' + buttonImage + '" alt="' + buttonText + '" title="' + buttonText + '"/>');
			
			if ($.browser.mozilla) {
				trigger.css({position:'absolute', top:'2px', right:'-2px'});
			} else if ($.browser.opera) {
				trigger.css({position:'absolute', top:'2px', right:'2px', 'z-index':2});
			} else if ($.browser.msie) {
				if ( $.browser.version.substr(0, 1) >= '7' ) {
					trigger.css({position:'absolute', top:'3px', right:'-4px'});
				} else {
					trigger.css({position:'absolute', top:'3px', right:'2px'});
				}
			} else if ($.browser.safari) {
				trigger.css({position:'absolute', top:'4px', right:'-4px', 'z-index':2});
			} else { // Others ??
				trigger.css({position:'absolute', top:'4px', right:'-4px', 'z-index':2});
			}
			input.wrap('<span class="popcontrol-wrap"></span>').after(trigger);
			trigger.click(this._show);
			
			var self = this;
			
			if ( !inst._get('directInput') ) {
				input.click(self._show);
				input.keydown(function(event) { // Interdit la saisie directe dans le champ
					event.stopPropagation();
					event.preventDefault();
					return false;
				});
			}
			input[0]._pcId = inst._id;
		},
		
		_getInst: function(id) {
			return this._inst[id] || id;
		},
		
		_hide : function(inst, target) {
			if (target && target.is('.popcontrol-trigger')) {
				popControl._lastInst = inst;
			}
			if (popControl._uiBlocker) {
				popControl._uiBlocker.hide();
			}
			inst._popControlDiv.hide();
			
			popControl._popUpShowing = false;
			popControl._curInst = null;
			$('.popcontrol-trigger').attr('src', inst._get('buttonImage'));
		},
		
		_register: function(inst) { // Enregistre une nouvelle instance de PopControl
			var id = this._nextId++;
			this._inst[id] = inst;
			return id;
		},
		
		_show : function(target) { // Affiche le popup
			var input = (target.nodeName && target.nodeName.toLowerCase() == 'input' ? target : this);
			if (input.nodeName.toLowerCase() != 'input') {
				input = $('input', input.parentNode)[0];
			}
			input.blur();
			var inst = popControl._getInst(input._pcId);
			if (popControl._lastInst == inst) { // Eviter la reouverture immediate du meme PopControl
				popControl._lastInst = null;
				return;
			}
			$(input).parent('.popcontrol-wrap').children('.popcontrol-trigger').attr('src', inst._get('closeboxImage'));
			
			offset = $(input).offset();
			popControl._pos = [];
			popControl._pos[0] = offset.left;
			
			popControl._pos[1] = offset.top + $(input).outerHeight() - 1;
			if ($.browser.msie) {
				//popControl._pos[0] -= 10;
				//popControl._pos[1] -= 1;
			}
			inst._popControlDiv.css({position:'absolute', left:popControl._pos[0] + 'px', top:popControl._pos[1] + 'px', 'z-index':2});
			inst._popControlDiv.empty();
			var setContent = inst._get('setContent');
			if (setContent) {
				setContent(input, inst._popControlDiv, popControl);
			}
			
			inst._popControlDiv.show();
			
			if (popControl._uiBlocker) {
				popControl._uiBlocker.css({
					position:'absolute',
					width: inst._popControlDiv.width() + 'px',
					height: inst._popControlDiv.height() + 'px',
					left: popControl._pos[0] + 'px',
					top: popControl._pos[1] + 'px',
					'z-index':1,
					'zoom':1});
				popControl._uiBlocker.show();
			}
			popControl._popUpShowing = true;
			popControl._curInst = inst;
			popControl._lastInst = null;
		},
		
		close: function(target) {
			popControl._hide(popControl._curInst, target);
		}
	});
	
	PopControlInstance = function(settings) {
		this._id = popControl._register(this);
		this._popControlDiv = popControl._popControlDiv;
		this._settings = $.extend({}, settings || {});
		var className = this._get('className')
		if (className) {
			this._popControlDiv.addClass(className);
		}
	};
	
	$.extend(PopControlInstance.prototype, {
		_get: function(name) {
			return (this._settings[name] != null ? this._settings[name] : popControl._defaults[name]);
		}
	});
		
	$.fn.popControl = function(settings) {
		return this.each(function() {
			var nodeName = this.nodeName.toLowerCase();
			if (nodeName == 'input') {
				var inst = new PopControlInstance(settings);
				popControl._connect(this, inst);
			}
		});
	};
	
	$(document).ready(function() {
		popControl = new PopControl(); // Singleton
	});
})(jQuery);
