/*
 * Gestion du moteur de comparaison
 * # remplacement des champs de formulaire pour customisation
 * /!\ nécessite sof_datas.js pour fonctionner
 */

// init namespace (à utiliser pour éviter toute collision)
if(!SOF) {var SOF = {};}

// données pour les scripts de cette page
SOF.datasCompare = {};
if(!$$DC) {var $$DC = SOF.datasCompare;}

// remplacements formulaires
SOF.compare = {
	init: function() {
		$$DC.compare = Box.nodes.get('#compare');
		if(!$$DC.compare.length) {return;}
		$$DC.region = Box.nodes.get('#region')[0];
		if(!$$DC.region) {return;}
		SOF.compare.menu();
		SOF.compare.launch();
	},
	
	launch: function() {
		var f = Box.nodes.get('form', $$DC.compare)[0];
		if(!f) {return;}
		Box.nodes.addClass($$DC.compare[0], 'js');
		var cs = Box.nodes.get('input[type=checkbox]', [f]);
		if(!cs.length) {return;}
		for(var j = 0, c; c = cs[j]; j++) {SOF.compare.replace(c);}
		Box.events.add(f, 'submit', function(e) {SOF.compare.onSubmit(e, this)});
		f = null; cs = null; c = null; // nettoyage
	},
	
	onSubmit: function(e, f) {
		var v = Box.nodes.get('input[type=checkbox]', [f]), i = 0, c = 0;
		while(v[i]) {
			if(v[i].checked) {c++;}
			i++;
		}
		if(c < 2) {
			SOF.compare.onError(f);
			e.preventDefault();
		} else {
			i = 0;
			while(v[i]) {
				v[i].disabled = false;
				i++;
			}
		}
	},
	
	onError: function(f) {
		if(Box.nodes.get('#error')[0]) {return;}
		var insert = '<div id="error"><p>' + SOF[$$L].errorMsg.compare + '</p></div>';
		Box.nodes.insert(insert, f, 'before');
	},
	
	menu: function() {
		var menu = Box.nodes.get('ul', $$DC.compare)[0];
		Box.events.add(menu, 'click', SOF.compare.manageMenu);
		$$DC.activeTab = Box.nodes.get('li.actif', [menu])[0];
		$$DC.runIn = Box.nodes.prev($$DC.activeTab);
	},
	
	manageMenu: function(e) {
		var t = e.target || e.srcElement;
		while(t.nodeName.toLowerCase() != 'a' && t.nodeName.toLowerCase() != 'li') {t = t.parentNode;}
		if(t.nodeName.toLowerCase() != 'a') {return;}
		e.preventDefault();
		if($$DC.activeTab) {Box.nodes.removeClass($$DC.activeTab, 'actif');}
		if($$DC.runIn) {Box.nodes.removeClass($$DC.runIn, 'run-in');}
		$$DC.activeTab = t.parentNode;
		$$DC.runIn = Box.nodes.prev($$DC.activeTab);
		if($$DC.runIn) {Box.nodes.addClass($$DC.runIn, 'run-in');}
		Box.nodes.addClass($$DC.activeTab, 'actif');
		var url = Box.nodes.attribute(t, 'href');
		Box.ajax({
			'url': url,
			'type': 'GET',
			'onSuccess': SOF.compare.displayForm
		});
	},
	
	displayForm: function(d) {
		d = d.substring(d.indexOf('<div id="region">') + 17);
		d = d.substring(0, d.indexOf('</form>') + 7);
		$$DC.region.innerHTML = '';
		Box.nodes.insert(d, $$DC.region, 'last');
		SOF.compare.launch();
	},
	
	replace: function(o) {
		var id = o.id, l, insert = '', checked;
		l = Box.nodes.next(o);
		if(l) {Box.events.add(l, 'click', function(e) {SOF.compare.restoreLabel(e, this);});}
		checked = o.checked ? 'checked' : 'notchecked';
		insert += '<div id="' + id + '-rpl" class="js-checkbox"><a href="#" class="' + checked + '"></a></div>';
		Box.nodes.insert(insert, o, 'after', {
			'tag': 'a',
			'click': function(e) {SOF.compare.checkbox(e, false);},
			'keydown': function(e) {SOF.compare.checkbox(e, true);}
		});
		Box.nodes.addClass(o, 'hidden');
		o.disabled = true;
		l = null; // nettoyage
	},
	
	restoreLabel: function(e, l) {
		var t = e.target || e.srcElement;
		if(t.nodeName.toLowerCase() == 'a' || l.nodeName.toLowerCase() != 'label') {return;}
		e.preventDefault();
		var a = Box.nodes.get('a', [Box.nodes.prev(l)])[0], c = Box.nodes.prev(a.parentNode);
		if(Box.nodes.hasClass(a, 'checked')) {
			Box.nodes.swapClass(a, 'checked', 'notchecked');
			c.checked = false;
		} else {
			Box.nodes.swapClass(a, 'notchecked', 'checked');
			c.checked = true;
		}
		a.focus();
		t = null; a = null; c = null; // nettoyage
	},
	
	checkbox: function(e, keyboard) {
		var t = e.target || e.srcElement;
		while(t.nodeName.toLowerCase() != 'a' && t  != $$DC.region) {t = t.parentNode;}
		if(t.nodeName.toLowerCase() == 'a' && (Box.nodes.hasClass(t, 'checked') || Box.nodes.hasClass(t, 'notchecked'))) {
			var c = Box.nodes.prev(t.parentNode);
			var k = e.which || e.keyCode;
			if(!keyboard || k == 32) {
				if(Box.nodes.hasClass(t, 'checked')) {
					Box.nodes.swapClass(t, 'checked', 'notchecked');
					c.checked = false;
				} else {
					Box.nodes.swapClass(t, 'notchecked', 'checked');
					c.checked = true;
				}
				e.preventDefault();
			}
		}
		t = null; // nettoyage
	}
};

// chargement des fonctions
Box.events.load(SOF.compare.init);

// déchargement (nettoyage variables)
Box.events.add(window, 'unload', function() {
	$$DC = null;
	SOF.datasCompare = null;
});