( function($) {
	jQuery.fn.b2f_pdm_request_observer = function(action, key, callback) {
		var self = this;
		
		switch (action) {
			case 'bind' :
				result = bind(self, key, callback);
				break;
			case 'triggerSuccess' :
				result = triggerSuccess(self, key);
				break;
			case 'triggerReset' :
				result = triggerReset(self);
				break;
			case 'successed' :
				result = successed(self, key);
				break;
		}
		
		return result;
	}
	

	function bind(self, key, callback) {		
		//console.debug('bind : ', self, key, callback);
		
		var pself = self;
		var pkey = key;
		var pcallback = callback;
		
		
		$(self).bind(key+'Success', function() {
			return _triggerSuccessHandler(pself, pkey, pcallback);
		});
		$(self).bind(key+'Reset', function() {
			return _triggerResetHandler(pself, pkey, pcallback);
		});
		
	}

	function triggerSuccess(self, key) {
		//console.log('triggerSuccess', key);
		$(self).data('states_'+key, true);
		var liste = $(self).data('liste_states');
		if (!$.isArray(liste)) {
			liste = new Array();
		}
		liste.push(key);
		
		$(self).data('liste_states', liste);
		//console.debug('setListe : ', $(self).data('liste_states'), 'states_'+key, $(self).data('states_'+key));
		$(self).triggerHandler(key+'Success');
	}
	
	function _triggerSuccessHandler(self, key, callback) {
		//console.debug('_triggerSuccessHandler : ', self, key, callback);
		callback(key, 'success');
	}

	function triggerReset(self, key) {
		//console.log('triggerReset', self, key);
		
		var liste = $(self).data('liste_states');
		
		if (undefined != liste) {
			$.each(liste, function(index, element) {
				//console.debug(index, element);
				$(self).data('states_'+element, false);
			});
		}
		
		$(self).triggerHandler(key+'Reset');
	}
	
	function _triggerResetHandler(self, key, callback) {
		//console.log('_triggerResetHandler');
		
		callback(key, 'reset');
	}
	
	function successed(self, key) {				
		var retour =  (undefined == $(self).data('states_'+key) || true == $(self).data('states_'+key));
		//console.debug(retour, $(self).data('states_'+key), 'states_'+key);
		return retour;
	}
		
	
})(jQuery);;