function gettext(str) {
	if (typeof(i18n) != 'undefined' && i18n[str]) return i18n[str];
	return str;
}
function ngettext(s, p, n) {
	if (n > 1) return gettext(p);
	return gettext(s);
}
function _(str) {
	return gettext(str)
}
function sprintf(str) {
	var bits = str.split('%');
	var out = bits[0];
	var re = /^([ds])(.*)$/;
	for (var i=1; i<bits.length; i++) {
		p = re.exec(bits[i]);
		if (!p || arguments[i]==null) continue;
		if (p[1] == 'd') out += parseInt(arguments[i], 10);
		else if (p[1] == 's') out += arguments[i];
		out += p[2];
	}
	return out;
}

$extend(Date, {
	$months: [_('Janvier'), _('Février'), _('Mars'), _('Avril'), _('Mai'), _('Juin'), _('Juillet'), _('Août'), _('Septembre'), _('Octobre'), _('Novembre'), _('Décembre')],
	$days: [_('Dimanche'), _('Lundi'), _('Mardi'), _('Mercredi'), _('Jeudi'), _('Vendredi'), _('Samedi')],
	$formats: {
		db: '%Y-%m-%d %H:%M:%S',
		compact: '%Y%m%dT%H%M%S',
		iso8601: '%Y-%m-%dT%H:%M:%S%T',
		rfc822: '%a, %d %b %Y %H:%M:%S %Z',
		'short': _('%d/%b/%y à %H:%M'),
		'long': _('%A %d %B %Y à %H:%M')
	},
	distanceOfTimeInWords: function(fromTime, toTime, includeTime) {
		var delta = parseInt((toTime.getTime() - fromTime.getTime()) / 1000);
		if(delta < 60) {
			return _('il y a moins d\'une minute');
		} else if(delta < 120) {
			return _('il y a une minute');
		} else if(delta < (45*60)) {
			return sprintf(_('il y a %d minutes'), (parseInt(delta / 60)).toString());
		} else if(delta < (90*60)) {
			return _('il y a une heure');
		} else if(delta < (24*60*60)) {
			return sprintf(_('il y a %d heures'), (parseInt(delta / 3600)).toString());
		} else if(delta < (48*60*60)) {
			return _('il y a un jour');
		} else {
			var days = (parseInt(delta / 86400)).toString();
			if(days > 30) {
				var fmt  = _('le %d %B');
				if(toTime.getYear() != fromTime.getYear()) { fmt += _(' %Y'); }
				if(includeTime) fmt += _(' à %H:%M');
				return fromTime.strftime(fmt);
			} else {
				return sprintf(_('il y a %d jours'), days);
			}
		}
	}
});

(function(){
	var events;
	var check = function(e){
		var target = $(e.target);
		var parents = target.getParents();
		events.each(function(item){
			var element = item.element;
			if (element != target && !parents.contains(element)) item.fn.call(element, e);
		});
	}
	Element.Events.outerClick = {
		onAdd: function(fn){
			if(!events) {
				document.addEvent('click', check);
				events = [];
			}
			events.push({element: this, fn: fn});
		},
		onRemove: function(fn){
			events = events.filter(function(item){
				return item.element != this || item.fn != fn;
			}, this);
			if (!events.length) {
				document.removeEvent('click', check);
				events = null;
			}
		}
	}
});