(function(window, $, undef) {
	if($ === undef) {
		throw new Error('Dépendence non satisfaite : jQuery');
	}

	// Création du sélecteur :externalLink qui permet de sélectionner les lien externes
	$.extend($.expr[':'], {
		 externalLink	: function(a,i,m) {
							var lien = (a.nodeName == 'A' && a.attributes.href) ? a : $(a).parents('a[href]:first')[0];
							return (lien !== undef && /^(ftp|https?):\/\//.test(lien.attributes.href.nodeValue) && !/^[^:]+:\/\/[^\/]*(rfo|france([2345o]|tv(od)?|televisions))\.fr(\/|$)/.test(lien.href));
						}
	});

	// Plug-in qui permet de savoir si un element est un lien externe, ou si un groupe d'élément contient un lien externe.
	$.fn.isExternalLink = function(all) {
		return this.filter(':externalLink').length >= (all ? this.length : 1);
	};
})(this, this.jQuery);
(function(window, $, undef) {
	if($ === undef) {
		throw new Error('Dépendence non satisfaite : jQuery');
	}

	var globalEvents = window.globalEvents = {},
	bodyEventHandler = function(e) {
		var retour = true,
		args = arguments,
		target = $(e.target);
		for(var selector in globalEvents[e.type]) {
			if(target.is(selector)) {
				retour = retour & !!globalEvents[e.type][selector].apply(e.target, args);
			}
			else {
				target
					.parents(selector)
					.each(function() {
						var ret = !!globalEvents[e.type][selector].apply(this, args);
						retour = retour & ret;
						return ret;
					});
			}
		}
		return !!retour;
	};

	$.fn.bindGlobal = function(event, action) {
		if(globalEvents[event] === undefined) {
			globalEvents[event] = {};
			$(document.body).bind(event, bodyEventHandler);
		}
		globalEvents[event][this.selector] = action;
	};
})(this, this.jQuery);
(function(window, $, undef) {
	(function(dep) {
		for(var i in dep) {
			if(!dep[i]) {
				throw new Error('Dépendence non satisfaite : '+i);
			}
		}
	})({
		jQuery					: !!$,
		'jQuery.bindGlobal'		: !!($ && $.fn && $.fn.bindGlobal),
		'jQuery.isExternalLink'	: !!($ && $.fn && $.fn.isExternalLink)
	});

	var pattern = /(height|width|target)((=|:)([^ ]+))?/i

	,parseClass = function(cls) {
		if(typeof cls != 'string')
			return {};
		var key, matches
		,options = {}
		,params = cls.split(' ');
		for(key = 0; key < params.length; key++) {
			matches = params[key].match(pattern);
			if(!matches)
				continue;
			options[matches[1]] = matches[4];
		}
		return options;
	}

	,handlePopupLink = function() {
		var key
		,options = parseClass(this.className)
		,optionsArray = []
		,target;
		for(key in options) {
			if(key === 'target')
				target = options[key];
			else
				optionsArray.push(key + '=' + options[key]);
		}
		window.open(this.href, (target+'') || ('popup'+(+new Date)), optionsArray.join(',') || '');
		return false;
	};

	$('a.popUp, a.targBlank, a:externalLink').bindGlobal('click', handlePopupLink);
})(this, this.jQuery);