Diacritics = {
	// http://lehelk.com/2011/05/06/script-to-remove-diacritics/

	removalMap: [
    {'base':'A', 'letters':/[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g},
    {'base':'AA','letters':/[\uA732]/g},
    {'base':'AE','letters':/[\u00C6\u01FC\u01E2]/g},
    {'base':'AO','letters':/[\uA734]/g},
    {'base':'AU','letters':/[\uA736]/g},
    {'base':'AV','letters':/[\uA738\uA73A]/g},
    {'base':'AY','letters':/[\uA73C]/g},
    {'base':'B', 'letters':/[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g},
    {'base':'C', 'letters':/[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g},
    {'base':'D', 'letters':/[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g},
    {'base':'DZ','letters':/[\u01F1\u01C4]/g},
    {'base':'Dz','letters':/[\u01F2\u01C5]/g},
    {'base':'E', 'letters':/[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g},
    {'base':'F', 'letters':/[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g},
    {'base':'G', 'letters':/[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g},
    {'base':'H', 'letters':/[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g},
    {'base':'I', 'letters':/[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g},
    {'base':'J', 'letters':/[\u004A\u24BF\uFF2A\u0134\u0248]/g},
    {'base':'K', 'letters':/[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g},
    {'base':'L', 'letters':/[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g},
    {'base':'LJ','letters':/[\u01C7]/g},
    {'base':'Lj','letters':/[\u01C8]/g},
    {'base':'M', 'letters':/[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g},
    {'base':'N', 'letters':/[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g},
    {'base':'NJ','letters':/[\u01CA]/g},
    {'base':'Nj','letters':/[\u01CB]/g},
    {'base':'O', 'letters':/[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g},
    {'base':'OI','letters':/[\u01A2]/g},
    {'base':'OO','letters':/[\uA74E]/g},
    {'base':'OU','letters':/[\u0222]/g},
    {'base':'P', 'letters':/[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g},
    {'base':'Q', 'letters':/[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g},
    {'base':'R', 'letters':/[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g},
    {'base':'S', 'letters':/[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g},
    {'base':'T', 'letters':/[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g},
    {'base':'TZ','letters':/[\uA728]/g},
    {'base':'U', 'letters':/[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g},
    {'base':'V', 'letters':/[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g},
    {'base':'VY','letters':/[\uA760]/g},
    {'base':'W', 'letters':/[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g},
    {'base':'X', 'letters':/[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g},
    {'base':'Y', 'letters':/[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g},
    {'base':'Z', 'letters':/[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g},
    {'base':'a', 'letters':/[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g},
    {'base':'aa','letters':/[\uA733]/g},
    {'base':'ae','letters':/[\u00E6\u01FD\u01E3]/g},
    {'base':'ao','letters':/[\uA735]/g},
    {'base':'au','letters':/[\uA737]/g},
    {'base':'av','letters':/[\uA739\uA73B]/g},
    {'base':'ay','letters':/[\uA73D]/g},
    {'base':'b', 'letters':/[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g},
    {'base':'c', 'letters':/[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g},
    {'base':'d', 'letters':/[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g},
    {'base':'dz','letters':/[\u01F3\u01C6]/g},
    {'base':'e', 'letters':/[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g},
    {'base':'f', 'letters':/[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g},
    {'base':'g', 'letters':/[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g},
    {'base':'h', 'letters':/[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g},
    {'base':'hv','letters':/[\u0195]/g},
    {'base':'i', 'letters':/[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g},
    {'base':'j', 'letters':/[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g},
    {'base':'k', 'letters':/[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g},
    {'base':'l', 'letters':/[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g},
    {'base':'lj','letters':/[\u01C9]/g},
    {'base':'m', 'letters':/[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g},
    {'base':'n', 'letters':/[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g},
    {'base':'nj','letters':/[\u01CC]/g},
    {'base':'o', 'letters':/[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g},
    {'base':'oi','letters':/[\u01A3]/g},
    {'base':'ou','letters':/[\u0223]/g},
    {'base':'oo','letters':/[\uA74F]/g},
    {'base':'p','letters':/[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g},
    {'base':'q','letters':/[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g},
    {'base':'r','letters':/[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g},
    {'base':'s','letters':/[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g},
    {'base':'t','letters':/[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g},
    {'base':'tz','letters':/[\uA729]/g},
    {'base':'u','letters':/[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g},
    {'base':'v','letters':/[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g},
    {'base':'vy','letters':/[\uA761]/g},
    {'base':'w','letters':/[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g},
    {'base':'x','letters':/[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g},
    {'base':'y','letters':/[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g},
    {'base':'z','letters':/[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g}
	],

	remove: function(str, options) {
		options = Options.filter(options, {
			toLowerCase: false,
		});
		
		str = str || '';
		
		if(typeof(str) === 'string') {
			for(var i = 0; i < Diacritics.removalMap.length; i++) {
				str = str.replace(Diacritics.removalMap[i].letters, Diacritics.removalMap[i].base);
			}
			
			if(options.toLowerCase) str = str.toLowerCase();
		}

    return str;
	},
};

var lng = function(sf, se) {
	return (Site.lngId == 'f') ? sf : se;
}

var log = function(s) {
	if(!Site.dev) return null;
	if(!$dev) $dev = new Dev();
	$dev.log(s);
}

var logError = function(s) {
	log('<strong class="error">' + s + '</strong>');
}

var objInspect = function(o) {
	o = o || {};
	return '{ ' + Object.keys(o).map(function(k) { return k + ':' + o[k] }).join(', ') + ' }';
}

var Dev = Class.create({
	initialize: function() {
		this.elements = {
			dev: $E('div', 'dev'),
			log: $E('ul', 'log'),
		};

		this.init = false;
	},
	
	initInterface: function() {
		document.body.insert({ top: this.elements.dev });
		this.elements.dev.insert(this.elements.log);
		document.body.addClassName('dev');
		this.init = true;
	},
	
	log: function(s) {
		if(!this.init) this.initInterface();
	
		this.elements.log.insert({
			top: $E('li').update(this.elements.log.childElements().size() + ': ' + s)
		});
	},
});

var $E = function(tag, idName, attr) {
	attr = attr || {};
	if(idName) attr['id'] = idName;
	return new Element(tag, attr);
}

var $e = function(tag, attr) {
	return new Element(tag, attr);
}

var $LINK = function(href, idName, attr) {
	attr = attr || {};
	attr.href = href || '#';
	if(idName) attr['id'] = idName;
	return new Element('a', attr);
}

var $link = function(href, attr) {
	attr = attr || {};
	attr.href = href || '#';
	return new Element('a', attr);
}

var clearDiv = function() {
	return $e('div', { 'class': 'clear' });
}

var Options = {
	filter: function(options, defaults) {
		options = options || {};
		defaults = defaults || {};
		
		for(k in defaults) {
			options[k] = options[k] || defaults[k];
		}
		
		return options;
	},
};

var makeSelectFunc = function(container) {
	return container ? $(container).select.bind($(container)) : $$;
}

var zero2 = function(n) {
	var s = n.toString();
	if(s.length == 0) return '00'
	else if(s.length == 1) return '0' + s
	else return s;
}

var fixAjaxUrl = function(url) {
	return url + ((url.match(/\?/)) ? '&' : '?') + 'ajax=1';
}

var initNavPtr = function(li) {
	if(!li.down('div.nav-ptr')) {
		li.insert($e('div', { 'class': 'nav-ptr' }));
	}
}

var Store = Class.create({
	initialize: function() {
		this.jar = new CookieJar({
			expires: 3600, // seconds
			path: '/',
		});
	},
	
	put: function(name, value) {
		this.jar.put(name, value);
	},
	
	get: function(name) {
		return this.jar.get(name);
	},
});

var PairImpair = Class.create({
	initialize: function(container, options) {
		this.container = container;
		this.containerSelector = this.container.tagName + '.' + this.container.className;

		this.options = Options.filter(options, {
			childSelector: '>li',
			startIndex: 0,
		});
		
		this.index = this.options.startIndex || 0;

		this.build();
	},
	
	build: function() {
		if(this.container.hasClassName('pair-impair')) {
			return this;
		}
		
		this.items = this.container.select(this.options.childSelector).findAll(function(item) {
			return item.visible();
		});
		
		this.items.each(function(item) {
			if(((this.index+1) % 2) > 0) {
				item.addClassName('impair')
				item.removeClassName('pair')
			} else {
				item.addClassName('pair');
				item.removeClassName('impair');
			}
			
			this.index++;
			
			item.select(this.containerSelector).each(function(container) {
				this.index = new PairImpair(container, {
					childSelector: this.childSelector,
					startIndex: this.index,
				}).index;
			}.bind(this));
		}.bind(this));
		
		this.container.addClassName('pair-impair');
		return this;
	},
});

var getTdSortValue = function(td) {
	if(td.select('input[name="sort"]').size() > 0) {
		return td.select('input[name="sort"]')[0].value;
	} else {
		return td.innerHTML.stripTags();
	}
}

var setupTableTri = function(trHead) {
	trHead.select('th').each(function(th, index) {
		th.update('<a href="#">' + th.innerHTML + '</a>');
		triLien = th.down('a');

		triLien.observe('click', function(event) {
			if(!th.hasClassName('sel')) {
				th.siblings().invoke('removeClassName', 'sel');
				th.addClassName('sel');
				
				var table = th.up('table');
				var colIndex = -1;

				trHead.select('th').each(function(thCalc) {
					var colSpan = 1;
					if(thCalc.colSpan != undefined) colSpan = thCalc.colSpan * 1;
					colIndex += colSpan;
					if(thCalc == th) throw $break;
				});
				
				var rowList = table.select('tr').findAll(function(tr) {
					return (tr.select('td').size() > 0);
				});
				
				rowList.each(function(tr) {
					var val = getTdSortValue(tr.select('td')[colIndex]);
					if(val != '') tr.show()
					else tr.hide();
				});
				
				var sortedRowList = rowList.clone();
				rowList.invoke('remove');
				
				sortedRowList.sort(function(tr1, tr2) {
					var c1 = Diacritics.remove(getTdSortValue(tr1.select('td')[colIndex]), { toLowerCase: true });
					var c2 = Diacritics.remove(getTdSortValue(tr2.select('td')[colIndex]), { toLowerCase: true });
					if (c1 == c2) return 0;
					if (c1 < c2) return -1;
					return 1;
				});
				
				sortedRowList.each(function(tr) {
					table.down('tbody').insert(tr);
				});
			}
			
			event.stop();
		});
	});
}

var Triable = Class.create({
	initialize: function(container, options) {
		this.container = $(container);
		
		this.options = Options.filter(options, {
			childSelector: '>li',
		});
		
		this.items = this.container.select(this.options.childSelector).map(function(item) {
			return { element: item };
		});
		
		this.indices = [
			{ id: 'titre', desc: lng('Titre', 'Title') },
			{ id: 'annee', desc: lng('Année', 'Year') },
			{ id: 'instr', desc: lng('Instrumentation', 'Instrumentation') },
			{ id: 'duree', desc: lng('Durée', 'Duration') },
			{ id: 'catno', desc: lng('Numéro de catalogue', 'Catalogue No.') },
		].map(function(index) {
			index.actif = false;
			return index;
		});

		this.indicesById = (function() {
			var indicesById = {};
		
			this.indices.each(function(index) {
				indicesById[index.id] = index;
			}.bind(this));
			
			return indicesById;
		}.bind(this))();

		this.index = (function() {
			var id = this.retrieveIndex();
			return this.indicesById[id] ? this.indicesById[id] : this.indices[0];
		}.bind(this))();
		
		this.build();
	},
	
	build: function() {
		this.parseItemValues();

		var nav = $e('div', { 'class': 'nav-tri' });
		nav.insert($e('div', { 'class': 'desc' }).update(lng('Trier par:', 'Sort by:')));
		var ul = $e('ul');
		nav.insert(ul);
		nav.insert(clearDiv());
		
		this.indices.each(function(index) {
			if(index.id && !this.container.down('input.tri[name=' + index.id + ']')) {
				return false;
			}
			
			index.actif = true;
			var link = $link('#tri:' + index.id).update(index.desc);
			
			link.observe('click', function(event) {
				this.setIndex(index);
				link.blur();
			}.bind(this));
			
			index.nav = $e('li').update(link);
			ul.insert(index.nav);
		}.bind(this));
		
		this.container.insert({ before: nav });
		this.setIndex(this.index);
		return this;
	},

	storeIndex: function() {
		$store.put('tri', this.index.id);
		return this;
	},

	retrieveIndex: function() {
		if(location.href.match(/#tri:/)) {
			return location.href.match(/#tri:(.*)/)[1];
		}

		return $store.get('tri');
	},

	setIndex: function(newIndex) {
		if(newIndex != this.index) {
			this.index.nav.removeClassName('sel');
			this.index = newIndex;
		}
		
		this.index.nav.addClassName('sel');
		this.storeIndex();
		this.perform();
		return this;
	},
	
	parseItemValues: function() {
		this.items.each(function(item) {
			item.values = {};
		
			item.element.select('input.tri').each(function(input) {
				var value = Triable.filterValue(input.value);
				item.values[input.name] = value;
				if(input.hasClassName('fallback')) item.fallback = value;
			}.bind(this));
		}.bind(this));

		return this;
	},

	perform: function() {
		this.items.each(function(item) {
			item.element.remove();
		});
		
		this.items.sort(function(item1, item2) {
			var c1 = Diacritics.remove(item1.values[this.index.id], { toLowerCase: true });
			var c2 = Diacritics.remove(item2.values[this.index.id], { toLowerCase: true });

			if(c1 == c2) {
				c1 = item1.fallback;
				c2 = item2.fallback;
			}
			
			if(c1 == c2) return 0;
			if(c1 < c2) return -1;
			return 1;
		}.bind(this));
		
		this.items.each(function(item) {
			this.container.insert(item.element);
		}.bind(this));
		
		return this;
	}
});

Triable.filterValue = function(value) {
	var TRIVIDE = 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz';
	var TRIVIDE_INTEGER = 99999999999;

	var getNum = function(value) {
		if(value.match(/^#/)) {
			var m = value.match(/(\d+)/);
			if(m) value = parseInt(m[1]);
			else value = TRIVIDE_INTEGER;
		}
		
		return value;
	};

	if(value == '') return TRIVIDE;
	return getNum(value);
};

var Filtrable = Class.create({
	initialize: function(container, options) {
		this.container = $(container);
		
		this.options = Options.filter(options, {
			childSelector: '>li',
		});
		
		this.items = this.container.select(this.options.childSelector);
		
		this.filtres = [
			{ id: null, desc: lng('Tout', 'All') },
			{ id: 'dispo', desc: lng('Disponibles', 'Available') },
			{ id: 'texte', desc: lng('Notices', 'Notes') },
			{ id: 'partition', desc: lng('Partitions', 'Scores') },
			{ id: 'video', desc: lng('Vidéo', 'Video') },
			{ id: 'cat', desc: lng('Publications', 'Publications') },
		].map(function(filtre) {
			filtre.actif = false;
			return filtre;
		});

		this.filtresById = (function() {
			var filtresById = {};
		
			this.filtres.each(function(filtre) {
				filtresById[filtre.id] = filtre;
			}.bind(this));
			
			return filtresById;
		}.bind(this))();

		this.filtre = (function() {
			var id = location.href.match(/#filtre:/) && location.href.match(/#filtre:(.*)/)[1];
			return this.filtresById[id] ? this.filtresById[id] : null;
		}.bind(this))();
		
		this.build();
	},
	
	build: function() {
		var nav = $e('div', { 'class': 'nav-filtre' });
		nav.insert($e('div', { 'class': 'desc' }).update(lng('Filtrer:', 'Filter:')));
		var ul = $e('ul');
		nav.insert(ul);
		nav.insert(clearDiv());
		
		this.filtres.each(function(filtre) {
			if(filtre.id && !this.container.down('input.filtre[name=' + filtre.id + ']')) {
				return false;
			}
			
			filtre.actif = true;
			
			var link = $link('#filtre:' + filtre.id).update(filtre.desc);
			
			link.observe('click', function(event) {
				if(filtre.id && (filtre == this.filtre)) {
					this.setFiltre(this.filtresById[null]);
				} else {
					this.setFiltre(filtre);
				}
				
				link.blur();
			}.bind(this));
			
			filtre.nav = $e('li').update(link);
			ul.insert(filtre.nav);
		}.bind(this));
		
		this.container.insert({ before: nav });
		this.setFiltre(this.filtre);
		return this;
	},
	
	setFiltre: function(newFiltre) {
		if(newFiltre != this.filtre) {
			this.filtre.nav.removeClassName('sel');
			this.filtre = newFiltre;
		}
		
		this.filtre.nav.addClassName('sel');
		this.perform();
		return this;
	},
	
	perform: function() {
		this.items.each(function(item) {
			if(!this.filtre.id || item.down('input.filtre[name=' + this.filtre.id + ']')) {
				item.show();
			} else {
				item.hide();
			}
		}.bind(this));

		return this;
	}
});

var Vitrine = Class.create({
	initialize: function(container, options) {
		this.container = container;
		
		this.options = Options.filter(options, {
			childSelector: '>li',
			hoverOffset: 10,
			bottomOffset: 10,
			gradualBottomOffset: 5,
			zIndex: 500,
		});

		this.items = this.container.select(this.options.childSelector).map(function(item) {
			return {
				element: item,
				offsetFrom: 'left',
			};
		});

		this.lastItem = this.items.last();
		this.lastItem.offsetFrom = 'right';
		this.lastItem.last = true;

		this.itemCount = this.items.size();
		this.containerWidth = this.container.measure('width');
		this.timer = null;
		
		this.build();
	},
	
	build: function() {
		this.container.setStyle({ 'visibility': 'hidden' });
		this.lastItem.element.addClassName('last');
		this.load();
	},
	
	imagesLoaded: function() {
		var imgNotLoadedCount = this.container.select('img').findAll(function(img) {
			return !img.complete;
		}).size();
		
		return (imgNotLoadedCount == 0);
	},

	load: function() {
		if(this.timer) clearTimeout(this.timer);

		if(!this.imagesLoaded()) {
			this.timer = setTimeout(this.load.bind(this), 100);
			return false;
		}

		this.widthTotal = this.items.inject(0, function(total, item) {
			item.width = item.element.measure('width');
			return total + item.width;
		});
		
		this.ratio = (this.containerWidth - this.lastItem.width) / (this.widthTotal - this.lastItem.width);
		var offset = 0;

		this.items.each(function(item, index) {
			if(!item.last) {
				item.offset = offset;
				offset += item.width * this.ratio;
			} else {
				item.offset = 0;
			}
			
			item.bottom = this.options.bottomOffset + (index*this.options.gradualBottomOffset);
			item.zIndex = this.options.zIndex - index;
			
			var newStyle = {
				'bottom': item.bottom + 'px',
				zIndex: item.zIndex,
			};

			newStyle[item.offsetFrom] = item.offset + 'px';
			item.element.setStyle(newStyle);
	
			item.element.observe('mouseover', function(event) {
				item.element.addClassName('sel');
				
				var newStyle = {};
				newStyle[item.offsetFrom] = (item.offset - this.options.hoverOffset) + 'px';
				item.element.setStyle(newStyle);
			}.bind(this));
	
			item.element.observe('mouseout', function(event) {
				item.element.removeClassName('sel');

				var newStyle = {};
				newStyle[item.offsetFrom] = item.offset + 'px';
				item.element.setStyle(newStyle);
			}.bind(this));
		}.bind(this));

		this.container.setStyle({ 'visibility': 'visible' });
	},
});

var DeviseSelect = Class.create({
	initialize: function(devises) {
		this.devises = devises;
		this.deviseId = $store.get('devise') || 'cad';
		this.elements = {};

		this.initMenu();
		document.body.observe('click', this.bodyClick.bind(this));
		$$('div.achat div.prix').each(this.setupChoix.bind(this));
		this.updateDocument();
	},
	
	store: function(newDeviseId) {
		this.deviseId = newDeviseId || this.deviseId;
		$store.put('devise', this.deviseId);
		return this;
	},

	bodyClick: function(event) {
		var e = event.element().up('#devise-menu') || event.element().up('a.btn-devise');
	
		if(!e && this.elements.deviseMenu) {
			this.elements.deviseMenu.hide();
			$$('a.btn-devise.actif').invoke('removeClassName', 'actif');
			document.body.stopObserving('click', this.bodyClick.bind(this));
		}
	},

	updateDocument: function() {
		if(this.deviseId) {
			$$('span.prix-devise').each(function(span) {
				if(this.deviseId == 'cad') {
					span.innerHTML = '';
					span.hide();
	
				} else {
					var desc = this.devises.get(this.deviseId).get('desc');
					var mult = this.devises.get(this.deviseId).get('mult');
					var prix = parseFloat(span.up('div.prix').down('span.prix').innerHTML.match(/(\d+[,.]\d+)/)[0].replace(',', '.'));
					var prixDevise = prix * mult;
					span.innerHTML = '~ ' + prixDevise.toFixed(2) + ' ' + desc;
					span.show();
				}
			}.bind(this));
		}
		
		return this;
	},
	
	initMenu: function() {
		if(!this.elements.deviseMenu) {
			this.elements.deviseMenu = $E('ul', 'devise-menu').hide();
		
			this.devises.each(function(pair) {
				var li = $e('li');
				var link = $link('#devise:' + pair.key);
				link.innerHTML = pair.value.get('desc');
				
				link.observe('click', function(event) {
					this.elements.deviseMenu.hide();
					$$('a.btn-devise.actif').invoke('removeClassName', 'actif');
					this.store(link.href.match(/#devise\:(.+)$/)[1]);
					this.updateDocument();
					event.stop();
				}.bind(this));
				
				li.insert(link);
				this.elements.deviseMenu.insert(li);
			}.bind(this));
		
			document.body.insert(this.elements.deviseMenu);
		}
		
		return this;
	},
	
	showMenu: function(left, top) {
		this.elements.deviseMenu.setStyle({
			'left': left + 'px',
			'top': top + 'px',
		});
		
		this.elements.deviseMenu.show();
		return this;
	},

	setupChoix: function(parent) {
		var devisePrix = $e('span', { 'class': 'prix-devise' });
		parent.insert(devisePrix);

		var deviseLien = $link('#devise-menu', {
			'class': 'btn-devise', 
			'title': lng('Sélectionner une autre devise', 'Select another currency')
		});
		
		deviseLien.innerHTML = '<img src="' + Site.baseUrl + '/res/element/btn-plus.png" />';
	
		deviseLien.observe('click', function(event) {
			deviseLien.blur();
			deviseLien.addClassName('actif');
			var devisePos = deviseLien.cumulativeOffset();
			this.showMenu(devisePos.left, devisePos.top + deviseLien.measure('height'));
			event.stop();
		}.bind(this));
		
		parent.insert(deviseLien);
		return this;
	},
});

var Popup = Class.create({
	initialize: function() {
		this.popup = $E('div', 'popup');
		document.body.insert(this.popup);
		this.popup.hide();
		
		this.elements = {
			header: $E('div', 'popup-header'),
			btn: $E('div', 'popup-btn'),
			titre: $E('div', 'popup-titre'),
			navTab: $E('div', 'popup-nav-tab'),
			contenu: $E('div', 'popup-contenu'),
		};
		
		this.elements.header.insert(this.elements.btn);
		
		this.elements.btn.update(
			'<a href="#" title="' + lng('Fermer', 'Close') + '">' +
			'<img src="' + Site.baseUrl + '/res/element/btn-fermer.png" />' +
			'</a>'
		);
		
		this.elements.header.insert(this.elements.titre);
		this.elements.header.insert(clearDiv());
		this.popup.insert(this.elements.header);
		this.popup.insert(this.elements.navTab);
		this.popup.insert(this.elements.contenu);

		this.sombre = $E('div', 'sombre');
		document.body.insert(this.sombre);
		
		this.width = null;
	},
	
	fetchLayouts: function() {
		this.viewportDim = document.viewport.getDimensions();
		this.layout = this.popup.getLayout();
		this.contenuLayout = this.elements.contenu.getLayout();
		return this;
	},
	
	center: function() {
		this.fetchLayouts();
	
		this.popup.setStyle({
			'left': ((this.viewportDim.width - this.layout.get('margin-box-width')) / 2) + 'px',
			'top': ((this.viewportDim.height - this.layout.get('margin-box-height')) / 2) + 'px',
		});
		
		return this;
	},

	redim: function() {
		if(this.popup.hasClassName('redim')) return this;

		if(this.popup.down('.popup-guide')) {
			this.redimFromGuide(this.popup.down('.popup-guide'));
			return this;
		}
		
		if(this.width) {
			this.elements.contenu.setStyle({ 'width': this.width + 'px' });
		} else {
			this.elements.contenu.setStyle({ 'width': '' });
		}

		this.fetchLayouts();
		this.elements.contenu.setStyle({ 'height': '' });
		var totalHeight = this.layout.get('margin-box-height');

		if(totalHeight > this.viewportDim.height) {
			var extraHeight = totalHeight - this.contenuLayout.get('height');
			this.elements.contenu.setStyle({ 'height': (this.viewportDim.height - extraHeight - 50) + 'px' });
		}
		
		if(this.contenuLayout.get('height') > 500) {
			this.elements.contenu.setStyle({ 'height': '500px' });
		}
		
		this.popup.addClassName('redim');
		this.center();
		return this;
	},

	redimFromGuide: function(guide) {
		var loadTimer;
		
		var waitForLoad = function() {
			log('waitForLoad');
		
			if(this.guide.complete) {
				log('complete!');
				this.guide.setOpacity(1);
			
				this.fetchLayouts();
				this.elements.contenu.setStyle({ 'height': '' });
				var totalHeight = this.layout.get('margin-box-height');
				
				if(totalHeight > this.viewportDim.height) {
					var extraHeight = totalHeight - this.guide.height;
					var newGuideHeight = this.viewportDim.height - extraHeight;
					var newGuideWidth = this.guide.width / this.guide.height * newGuideHeight;
					this.guide.setStyle({ 'height': newGuideHeight + 'px' });
					this.elements.contenu.setStyle({ 'width': newGuideWidth + 'px' });
					
				} else {
					this.elements.contenu.setStyle({ 'width': this.guide.width + 'px' });
				}
				
				var totalWidth = this.layout.get('margin-box-width');
				
				if(totalWidth > this.viewportDim.width) {
					var extraWidth = totalWidth - this.guide.width;
					var newGuideWidth = this.viewportDim.width - extraWidth;
					var newGuideHeight = this.guide.height / this.guide.width * newGuideWidth;
					this.guide.setStyle({ 'width': newGuideWidth + 'px' });
					this.guide.setStyle({ 'height': newGuideHeight + 'px' });
					this.elements.contenu.setStyle({ 'width': newGuideWidth + 'px' });
				}
		
				this.popup.addClassName('redim');
				this.center();
	
			} else {
				loadTimer = setTimeout(waitForLoad, 100);
			}
		}.bind(this);
	
		this.guide = guide;

		if(this.guide) {
			this.guide.setOpacity(0);
			waitForLoad();
		}

		return this;
	},

	update: function(contenu, titre, navTab) {
		this.elements.navTab.update(navTab);
		this.elements.navTab.select('li').each(initNavPtr);
		this.elements.titre.update(titre);
		this.popup.removeClassName('redim');
		this.elements.contenu.update(contenu);
		setupDocument(this.popup);
		return this;
	},
	
	wait: function() {
		this.update('<div class="un-instant">' + lng('Un instant…', 'One moment…') + '</div>', lng('Un instant…', 'One moment…'), (this.fromNavTab ? this.elements.navTab.innerHTML : ''));
		return this;
	},

	bodyClick: function(event) {
		var e = event.element();
	
		if((!e.match('#popup') && !e.up('#popup')) || (e.match('#popup-btn') || e.up('#popup-btn'))) {
			this.popup.hide();
			document.body.removeClassName('sombre');
			document.body.stopObserving('click', this.bodyClick.bind(this));
			
			if(e.match('#popup-btn') || e.up('#popup-btn')) {
				event.stop();
			}
		}
	},
	
	show: function() {
		this.popup.setOpacity(0);
		this.popup.show();
		this.redim();
		this.popup.setOpacity(1);
	},

	open: function() {
		if(this.inverse) {
			this.popup.addClassName('inverse');
			document.body.addClassName('sombre');
		} else {
			this.popup.removeClassName('inverse');
		}

		this.show();
		document.body.stopObserving('click', this.bodyClick.bind(this));
		document.body.observe('click', this.bodyClick.bind(this));
	},

	getAjaxResponse: function(url, options, formParameters) {
		this.width = options.width || 0;
		this.inverse = !!options.inverse;
		this.fromNavTab = !!options.fromNavTab;
		var fixUrl = (options.fixUrl !== false);
		var defaultBody = options.defaultBody || '#corps';
		if(fixUrl) url = fixAjaxUrl(url);
		
		new Ajax.Request(url, {
			method: 'post',
			parameters: formParameters,
			
			onCreate: function(transport) {
				this.wait();
				this.open();
			}.bind(this),
		
			onSuccess: function(transport) {
				var response = transport.responseText || '<div id="corps">Erreur</div>';
				response = response.replace(/\n/g, ' ');
				response = response.replace(/\[base\]/g, Site.baseUrl);
				var html = $e('div').update(response);
				var responseCorps = '';
	
				if(html.down(defaultBody)) {
					responseCorps = html.down(defaultBody).innerHTML;
				} else {
					responseCorps = html.innerHTML;
				}
				
				var responseTitre = html.down('h1') ? html.down('h1').innerHTML : '';
				var responseNavTab = (html.down('#nav-tab') && !this.inverse) ? html.down('#nav-tab').innerHTML : '';
	
				delete html;
				this.update(responseCorps, responseTitre, responseNavTab);
				this.open();
				if(options.successFunc) options.successFunc();
			}.bind(this)
		});
	},
});

Popup.setupLink = function(link) {
	if(link.hasClassName('popup')) return false;
	
	link.addClassName('popup');
	var inverse = !!(link.hasClassName('video') || link.hasClassName('photo'));

	var width = (function() {
		var wMatch = link.href.match(/&w=(\d+)/);
		return wMatch ? wMatch[1] : 0;
	})();

	link.observe('popup:click', function(event) {
		if(link.hasClassName('out')) {
			document.location.href = link.href;
			return;
		}
		
		var fromNavTab = !!link.up('#popup-nav-tab');

		if(fromNavTab) {
			var newSel = link.up('li');
			newSel.addClassName('here');
			newSel.adjacent('li.here').invoke('removeClassName', 'here');
		}
		
		$popup.getAjaxResponse(link.href, {
			width: width, 
			inverse: inverse, 
			fromNavTab: fromNavTab,
		});

		event.stop();
	});
	
	if(link.match('a')) {
		link.observe('click', function(event) {
			if(link.hasClassName('out')) return;
			link.fire('popup:click');
			event.stop();
		});
	}
}

Popup.disableLink = function(link) {
	link.removeClassName('popup');
	link.stopObserving('click');
}

var setupSuggestions = function() {
	var form = $('footer-suggestions').down('form');
	if(form.hasClassName('popup')) return false;
	
	form.addClassName('popup');

	form.observe('submit', function(event) {
		event.stop();
		var formParameters = form.serialize(true);
		log(objInspect(formParameters));

		var successFunc = function() {
			if(!$('suggestions-resultat').hasClassName('erreur')) {
				form.down('textarea').clear();
			}
		}

		$popup.getAjaxResponse(form.action, {
			successFunc: successFunc,
		}, formParameters);
	});
}

var setupListe = function() {
	var form = $('footer-liste').down('form');
	if(form.hasClassName('popup')) return false;
	
	form.addClassName('popup');

	form.observe('submit', function(event) {
		event.stop();
		var formParameters = form.serialize(true);
		
		$popup.getAjaxResponse(form.action, {
			width: 620, 
			defaultBody: 'body', 
			fixUrl: false,
		}, formParameters);
	});
}

var Superlink = {
	setup: function(container, asPopup) {
		if(container.hasClassName('super')) return false;
		
		var masterLink = container.down('.titre a') || container.down('a');
		if(!masterLink) return false;
	
		if(masterLink.hasClassName('out')) {
			asPopup = false;
		}
	
		firedEvent = !!asPopup ? 'popup:click' : 'plain:click';
	
		if(asPopup) {
			Popup.setupLink(masterLink);
	
		} else {
			masterLink.observe(firedEvent, function(event) {
				event.stop();
				document.location.href = masterLink.href;
			});
		}
	
		container.observe('click', function(event) {
			var link = event.findElement('a');
			
			if(link) {
				if(link == masterLink) masterLink.fire(firedEvent);
	
			} else {
				masterLink.focus();
				masterLink.fire(firedEvent);
			}
		});
	
		container.addClassName('super');
	},
	
	setupAsPlain: function(container) {
		Superlink.setup(container, false);
	},
	
	setupAsPopup: function(container) {
		Superlink.setup(container, true);
	},
};

var Magic = Class.create({
	initialize: function() {
		this.corps = $('corps');
		this.init = !!this.corps;
	},
	
	update: function(contenu) {
		if(!this.init) return false;

		this.corps.update(contenu);
		setupDocument(this.corps);
		return this;
	},

	wait: function() {
		if(!this.init) return false;

		this.update('<div class="un-instant">' + lng('Un instant…', 'One moment…') + '</div>');
		return this;
	},
	
	getAjaxResponse: function(url) {
		if(!this.init) return false;

		url = fixAjaxUrl(url);
		
		new Ajax.Request(url, {
			method: 'post',
	
			onCreate: function(transport) {
				this.wait();
			}.bind(this),
			
			onSuccess: function(transport) {
				var response = transport.responseText || '<div id="corps">Erreur</div>';
				response = response.replace(/\n/g, ' ');
				response = response.replace(/\[base\]/g, Site.baseUrl);
				var html = $e('div').update(response);
				var responseCorps = html.down('#corps').innerHTML;
				this.update(responseCorps);
			}.bind(this)
		});
		
		return this;
	},
});

Magic.setupLink = function(link) {
	if(link.hasClassName('magic')) return false;

	link.addClassName('magic');

	link.observe('click', function(event) {
		event.stop();
		link.blur();
		$magic.getAjaxResponse(link.href);
		
		var newSel = link.up('li');
		newSel.addClassName('here');
		newSel.adjacent('li.here').invoke('removeClassName', 'here');
	});
}

Magic.disableLink = function(link) {
	link.removeClassName('magic');
	link.stopObserving('click');
}

var Minitab = Class.create({
	initialize: function(container, options) {
		this.container = container;
		
		this.options = Options.filter(options, {
			childSelector: '>li',
			titleSelector: 'h3',
		});
		
		this.items = this.container.select(this.options.childSelector).map(function(item, index) {
			return {
				id: item.id || String(index),
				index: index,
				element: item,
			};
		});
		
		if(this.items.size() < 2) {
			this.simplify();
			return;
		}
		
		this.itemsById = (function() {
			var itemsById = {};
		
			this.items.each(function(item) {
				itemsById[item.id] = item;
			}.bind(this));
			
			return itemsById;
		}.bind(this))();
		
		this.index = (function() {
			var id = location.href.match(/#item:/) && location.href.match(/#item:(.*)/)[1];
			return (id && this.itemsById[id]) ? this.itemsById[id].index : 0;
		}.bind(this))();
		
		this.maxIndex = this.items.size() - 1;

		this.build();
	},
	
	build: function() {
		this.container.addClassName('itemtab');
		var nav = $e('div', { 'class': 'nav-minitab' });
		var ul = $e('ul');

		this.items.each(function(item, index) {
			item.element.hide();
			item.nav = $e('li');
			var title = item.element.down(this.options.titleSelector).remove();
			var link = $link('#item:' + item.id).update(title.innerHTML);
			
			link.observe('click', function(event) {
				this.setIndex(index);
				link.blur();
			}.bind(this));
			
			ul.insert(item.nav.update(link));
			initNavPtr(item.nav);
		}.bind(this));
		
		nav.insert(ul).insert(clearDiv());
		this.container.insert({ before: nav });
		this.setIndex(this.index);
		return this;
	},
	
	setIndex: function(newIndex) {
		this.timeout = setTimeout(function() {
			clearTimeout(this.timeout);
			
			if(this.index !== null) {
				this.items[this.index].nav.removeClassName('sel');
				this.items[this.index].element.hide();
			}
			
			this.index = newIndex;
			this.items[this.index].nav.addClassName('sel');
			this.items[this.index].element.show();
		}.bind(this), 200);

		return this;
	},

	simplify: function() {
		this.items.each(function(item) {
			item.element.down(this.options.titleSelector).remove();
		}.bind(this));
	},
});

var Recherche = Class.create({
	initialize: function() {
		this.element = $('header-recherche') || $('splash-recherche');
		if(!this.element) return false;
		this.input = this.element.down('input');
		this.prompt = lng('Recherche', 'Search');
		
		this.input.observe('focus', function(event) {
			if(this.input.hasClassName('q')) {
				this.input.removeClassName('q');
				this.input.value = '';
			}
			
			event.stop();
		}.bind(this));
	
		this.input.observe('blur', function(event) {
			if(this.input.value == '') {
				this.input.value = this.prompt;
				this.input.addClassName('q');
			}
	
			event.stop();
		}.bind(this));
	},
});

var Dossier = Class.create({
	// attention: pour v5, à refaire pour v6

	initialize: function() {
		this.dossier = $('dossier');
		if(!this.dossier) return false;
		
		this.element = {
			btn: $link('#dossier:impression').update(lng('Pour impression', 'For printing')),
		}
		
		this.dossier.insert({ before: $e('div').insert(this.element.btn) });
	
		this.element.btn.observe('click', function(event) {
			this.element.zone = $E('div', 'dossier-zone');
			document.body.insert(this.element.zone);
			this.element.zone.insert(this.dossier);
			document.body.select('#conteneur, #footer').each(Element.hide);
			document.body.setStyle({ backgroundColor: '#fff' });
		}.bind(this));
	},
});

var Panier = Class.create({
	initialize: function() {
		if($('btn-maj')) $('btn-maj').hide();
	
		$$('#panier-achats input[type="text"]').each(function(e) {
			new Form.Element.Observer(e, 0.2, function(input) {
				$('btn-maj').show();
			});
		});
	
		if($('paypal-form') && !Site.interne) $('paypal-form').submit();
	},
});

/*
var Ioda = Class.create({
	initialize: function() {
		this.element = $$('.achat-ioda').first();
		if(!this.element) return;
		this.elements = {};
		this.setup();
		this.init = true;
	},
	
	setup: function() {
		var e = this.element.down('input[name="ioda_id_interne"]');
		this.iodaId = e.value;
		this.getAjaxResponse();
	},
	
	update: function(response) {
		var ul = $e('ul');
		ul.update(response);
		this.element.update(ul);
		this.element.insert(clearDiv());
	},

	getAjaxResponse: function() {
		var url = 'http://www.iodalliance.com/album/' + this.iodaId;
		
		new Ajax.Request(url, {
			method: 'post',
	
			onSuccess: function(transport) {
				log(objInspect(transport));
				var response = transport.responseText || '<div id="corps">Erreur</div>';
				response = response.replace(/\n/g, ' ');
				//response = response.replace(/\[base\]/g, Site.baseUrl);
				var html = $e('div').update(response);
				log(html.innerHTML);
				var responseCorps = html.down('ul.landing-buylinks').innerHTML;
				this.update(responseCorps);
			}.bind(this)
		});
		
		return this;
	},
});
*/

var Mobile = Class.create({
	initialize: function() {
		if(!Site.mobile) return false;
	
		this.modes = {
			menu: {
				desc: lng('Menu', 'Menu'),
			},
			
			contenu: {
				desc: lng('Contenu', 'Content'),
			},
			
			recherche: {
				desc: lng('Recherche', 'Search'),
			},
		};
		
		this.elements = {};
		this.mode = null;
		this.updateMode('contenu');
		this.build();
	},
	
	allModes: function() {
		return Object.keys(this.modes);
	},
	
	allModesExcept: function(except) {
		return Object.keys(this.modes).without(except);
	},
	
	updateMode: function(newMode) {
		if(newMode == this.mode) return this;
	
		this.allModesExcept(newMode).each(function(otherMode) {
			var c = 'mobile-' + otherMode;
			if(document.body.hasClassName(c)) document.body.removeClassName(c);
		});
		
		document.body.addClassName('mobile-' + newMode);
		this.mode = newMode;
		return this;
	},
	
	build: function() {
		document.body.addClassName('mobile-nav-built');
		this.elements.nav = $E('div', 'mobile-nav');
		$('header-logo').insert({ after: this.elements.nav });
		var ul = $e('ul');
		
		this.allModes().each(function(mode) {
			this.modes[mode].element = $E('li', 'mobile-nav-' + mode);
			var link = $link('#mobile:' + mode);
			link.update(this.modes[mode].desc);

			link.observe('click', function(event) {
				link.blur();
			
				this.allModesExcept(mode).each(function(otherMode) {
					this.modes[otherMode].element.removeClassName('sel');
				}.bind(this));
				
				this.modes[mode].element.addClassName('sel');
				this.updateMode(mode);
				event.stop();
			}.bind(this));
			
			this.modes[mode].element.insert(link);
			ul.insert(this.modes[mode].element);
		}.bind(this));
		
		this.modes[this.mode].element.addClassName('sel');
		this.elements.nav.insert(ul);
		this.elements.nav.insert(clearDiv());
		return this;
	},
});

var setupDocumentLinks = function(container) {
	var select = makeSelectFunc(container);
	select('ul.cat-list-mini li.cat').each(Superlink.setupAsPlain);
	
	if(!Site.mobile && !Site.tablet) {
		select('li.blogue-mini:not(.menu) div.item-contenu').each(Superlink.setupAsPopup);
		//select('li.blogue-mini.theque div.item-contenu').each(Superlink.setupAsPlain);
		select('a.photo, a.video, #cat-prog a.piste, #cat-prog a.notice, div.citations a.press, li.oeuvre div.titre a.w').each(Popup.setupLink);
		select('#popup-nav-tab a').each(Popup.setupLink);
	
		if(!container || (container == document.body)) {
			if($('footer-suggestions')) setupSuggestions();
			if($('footer-liste')) setupListe();
		}
	}
	
	if(!Site.mobile && Site.tablet) {
		select('li.blogue-mini:not(.menu) div.item-contenu').each(Superlink.setupAsPlain);
	}
}

var setupDocument = function(container) {
	setupDocumentLinks(container);
	var select = makeSelectFunc(container);

	select('#nav-tab li').each(initNavPtr);
	
	select('div.press-blocs').each(function(div) {
		new Minitab(div, {
			childSelector: 'div.bloc-texte, div.bloc-image',
		});
	});
	
	select('#vitrine ul.vitrine-cat-list').each(function(ul) {
		new Vitrine(ul);
	});

	select('ul.piste-list-prog').each(function(ul) {
		new PairImpair(ul);
	});

	select('tr.table-tri').each(setupTableTri);

	select('.filtrable').each(function(filtrable) {
		new Filtrable(filtrable);
	});
	
	select('.triable').each(function(triable) {
		new Triable(triable);
	});
	
	// google +1
	if((typeof(gapi) !== 'undefined') && gapi.plusone) gapi.plusone.go(container);
}

var setupInterne = function() {
	if(!Site.interne) return false;
	document.body.addClassName('site-interne');
}

var initSiteDomLoaded = function(event) {
	$store = new Store();
	setupInterne();
	new Mobile();

	if(!!Prototype.Browser.MobileSafari) {
		Site.noFixed = true;
		document.body.addClassName('no-fixed');
	} else {
		Site.noFixed = false;
	}
	
	if(!!Prototype.Browser.WebKit) {
		document.body.addClassName('webkit');
	}

	$popup = new Popup();
	$magic = new Magic();
	new Recherche();
	new DeviseSelect(devises);
	new Panier();
	//new Ioda();
	new Dossier();
	setupDocument();
	if(Site.dev && !$dev) $dev = new Dev();
}

var initSiteAllLoaded = function(event) {
	Site.allLoaded = true;
}

Event.observe(document, 'dom:loaded', initSiteDomLoaded, false);
Event.observe(window, 'load', initSiteAllLoaded, false);

Site.allLoaded = false;
Site.interne = location.href.match(/^http:\/\/interne\.electrocd\.com/);
Site.dev = !!Site.interne;
var $store;
var $dev;
var $popup;
var $magic;

