
// Script de préférences d'affichage, d'impression...et de ce que l'on veut...
// stockage des préférence dans un cookie, creation par js des formulaires de choix par type de préférences
// le type de préférence est associée à un fichier css (ou partie de css), les choix sont attribués aux classes de la balise body
// par mécanisme descendant, le reste de la page subit ces choix css : méthode des selecteurs descendants

//************************************************
// function d'initialisation des switchers
function pref() { switcher = new switchManager();
//************************************************



/*****************************************************************************
 Definit les controles des switchers : c'est ici qu'il faut modifier!!
*****************************************************************************/


//creé un formulaire de switch par type de préférence (ici affichage écran) ('id-container html', 'label du formulaire')
var ecranSwitcher = new bodySwitcher('choixecran', "Choix des couleurs d'étiquette :");
//ajoute des nouvelles classes disponible dans option du select pour ce type de préférence ('nomdeclasse css', 'label css')
ecranSwitcher.classPerso('default', 'Par défaut');
ecranSwitcher.classPerso('hautcontraste', 'Noir et blanc');
ecranSwitcher.classPerso('hautevisibilite', 'Couleurs très visibles');

//creé le formulaire de switch par type de préférence (ici préférences d'impression)('id-container html', 'label du formulaire')
var impressionSwitcher = new bodySwitcher('choiximpression', "Choix du format et police :");
//ajoute des nouvelles classes disponible dans option du select pour ce type de préférence ('nomdeclasse css', 'label css')
impressionSwitcher.classPerso('default', 'Par défaut');
impressionSwitcher.classPerso('normal-sans', 'Largeur : 10,5 cm / Police : Arial');
impressionSwitcher.classPerso('normal-serif', 'Largeur : 10,5 cm / Police : Times');
impressionSwitcher.classPerso('petit-sans', 'Largeur : 7,5 cm / Police : Arial');
impressionSwitcher.classPerso('petit-serif', 'Largeur : 7,5 cm / Police : Times');
impressionSwitcher.classPerso('perso', 'Largeur et Police Personalisées', 'selected');

//creé le formulaire de switch par type de préférence (ici préférences d'impression)('id-container html', 'label du formulaire')
var pictoSwitcher = new bodySwitcher('choixpictos', "Choix de disposition des pitogrammes :");
//ajoute des nouvelles classes disponible dans option du select pour ce type de préférence ('nomdeclasse css', 'label css')
pictoSwitcher.classPerso('default', 'Horizontaux centrés');
pictoSwitcher.classPerso('pictos-gauche', 'Verticaux à gauche');
pictoSwitcher.classPerso('pictos-droite', 'Verticaux à droite');



//creé le formulaire de switch par type de préférence (ici préférences nombre de copies)('id-container html', 'label du formulaire')
var copieSwitcher = new bodySwitcher('choixcopies', "Nombre de copies à imprimer/ Planche d\'Impression :");
//ajoute des nouvelles classes disponible dans option du select pour ce type de préférence ('nomdeclasse css', 'label')

copieSwitcher.classPerso('nbc1', '1');
copieSwitcher.classPerso('nbc2', '2');
copieSwitcher.classPerso('nbc3', '3');
copieSwitcher.classPerso('nbc4', '4');
copieSwitcher.classPerso('nbc5', '5');
copieSwitcher.classPerso('nbc6', '6');
copieSwitcher.classPerso('planche', 'Planche d\'impression','selected' );


//creé le formulaire de switch (ici préférences pour projection: touche F11 sur Opera)('id-container html', 'label du formulaire')
var projectionSwitcher = new bodySwitcher('choixprojection', "Préférences pour vidéoprojecteur (F11 pour Opera) :");
//ajoute des nouvelles classes disponible dans option du select pour ce type de préférence ('nomdeclasse css', 'label css')
projectionSwitcher.classPerso('default', 'Par défaut');
projectionSwitcher.classPerso('fluid', 'Mise en page fluide');
projectionSwitcher.classPerso('superpose', 'Largeur maximum');

//creé le formulaire de switch (ici préférences pour produit ou melange)('id-container html', 'label du formulaire')
//var produitmelangeSwitcher = new bodySwitcher('choixproduit-melange', "Étiqueter un Produit ou un Mélange de produits :");
//ajoute des nouvelles classes disponible dans option du select pour ce type de préférence ('nomdeclasse css', 'label css')
//produitmelangeSwitcher.classPerso('default', 'Produit');
//produitmelangeSwitcher.classPerso('Melange', 'Mélange');


/*****************************************************************************
*****************************************************************************/

//fin  function initialisation
};




// preferences globales ; reference au manager; stockage des infos
var switcher;


// initialisation de la function, par gestion d'évenements non interférant avec d'autres bibliothèque/scripts qui utilse onload:
//.. gecko, safari, chrome, konqueror et generiques
if(typeof window.addEventListener != 'undefined')
{
	window.addEventListener('load', pref, false);
}
//.. opera 
else if(typeof document.addEventListener != 'undefined')
{
	document.addEventListener('load', pref, false);
}
//.. win/ie
else if(typeof window.attachEvent != 'undefined')
{
	window.attachEvent('onload', pref);
}


// fonction de switch des preferences  
function switchManager()
{
	//chaîne pour stocker classname car
	//stockage direct dans la balise boby impossible à cause de mozilla 1.7+ qui ne prend pas  le caractère espace dont on a besoin
	
	this.string  = '';
	
	//stokage de référence dans body 
	this.body = document.getElementsByTagName('body')[0];

	//stokage de classname initiale
	this.initial = this.body.className;
	
	//si la className par défaut est vide  on fixe à "preferences" car il faut au moins une classe 
	if(this.initial == '')
	{
	//un espace est nécessaire entre chaque classeName, 
	//on ne peut pas fixer directement la class de body à " quelquechose" (avec un espace devant)à cause d'Opera 	
		this.initial = 'preferences';
	}
	
	//y-a-t-il un cookie? on le lit avec la methode définit plus loin
	this.cookie = this.read();

	//s'il existe
	if(this.cookie != null)
	{
		//stockage du cookie dans la chaîne
		this.string = this.cookie;
		
		//attribution du nouveau nom de classe à body
		this.body.className = this.initial + this.string;
	}
	
};

//definition de la méthode set pour le cookie
switchManager.prototype.set = function(jours)
{
	//format de la date d'expiration
	this.date = new Date();
	this.date.setTime(this.date.getTime() + ( jours *24*60*60*1000));
	
	//stocker dans la chaîne, en remplaçant les espaces par '#' pour que soient préservés les espaces de gauche
	this.info = this.string.replace(/ /g,'#');
	
	//Si la valeur est vide, on définit son expiration dans le passé pour supprimer le cookie
	if(this.info == '') { this.date.setTime(0); }
	
	//creation du cookie bodySwitcher
	document.cookie = 'bodySwitcher=' + this.info
		+ '; expires=' + this.date.toGMTString() 
		+ '; path=/';
		
};


//definition de la méthode  read pour le cookie
switchManager.prototype.read = function()
{
	//attribution de la valeur null au cookie pour toujours avoir quelquechose à retourner
	this.cookie = null;
	
	//Si un cookie existe
	if(document.cookie)
	{
		//si c'est notre cookie
		if(document.cookie.indexOf('bodySwitcher')!=-1)
		{
			//extraire et stocker les informations (en changeant les # en espaces)
			this.cookie = document.cookie.split('bodySwitcher=');
			this.cookie = this.cookie[1].split(';');
			this.cookie = this.cookie[0].replace(/#/g,' ');
		}
	}
	
	return this.cookie;
};


//constructeur de formulaire de choix
function bodySwitcher(divid, label)
{

	//créer un tableau associatif de noms de classes pour cette option
	//pour pouvoir plus tard, parcourir et les supprimer de la chaîne classname
	this.classes = [];

	//démarrage du compte des options, car on aura besoin de l'index de chaque option quand elles seront crées
	//ainsi une option peut être selectionnée par défaut si nécessaire :index [0]
	this.options = 0;
	
	//attributs du formulaire; création du noeud DOM form
	this.attrs = { 'action' : '' };
	this.form = this.createElement('form', this.attrs);
	document.getElementById(divid).appendChild(this.form);

	//crée le fieldset dans le formulaire
	this.attrs = {'class' : 'fieldset2' };
	this.fieldset = this.createElement('fieldset', this.attrs);
	this.form.appendChild(this.fieldset);

	//crée le label dans le fieldset
	this.attrs = { 'for' : 'select-' + divid };
	this.label = this.createElement('label', this.attrs);
	this.fieldset.appendChild(this.label);

	//crée la span dans le label contenant le texte du label
	this.attrs = { 'text' : label };
	this.span = this.createElement('span', this.attrs);
	this.label.appendChild(this.span);

	//crée le select dans le label
	this.attrs = { 'id' : 'select-' + divid };
	this.select = this.createElement('select', this.attrs);
	this.label.appendChild(this.select);
	

	//crée une variable globale pour la référence à 'this' pour cette partie du script
	var self = this;
	
	
	
	//gestionnaire onchange
	this.select.onchange = function()
	{

		//boucle dans le tableau des classnames 
		this.classLen = self.classes.length;
		for(var i=0; i < this.classLen; i++)
		{
			//remplace la classname personalisée de la chaîne
			switcher.string = switcher.string.replace(' ' + self.classes[i] + ' ','');
		}

		//récupère la nouvelle valeur de l'option du select
		this.choisi = this.options[this.options.selectedIndex].value;

		//si ce n'est pas le choix par defaut, ajoute à la chaîne
		//il faut un espace avant et après le nom de classe personalisée,pour éviter les confusions entre noms de classes proches 
		if(this.choisi != 'default' && this.choisi != 'nbc1' && this.choisi != 'nbc2' && this.choisi != 'nbc3'&& this.choisi != 'nbc4' && this.choisi != 'nbc5' && this.choisi != 'nbc6' && this.choisi != 'planche' && this.choisi != 'pictos-gauche' && this.choisi != 'pictos-gauche'  )
		{
			switcher.string += ' ' + this.choisi + ' ';	
		}
		
		//attribution du nouveau nom de classe à body
		switcher.body.className = switcher.initial + switcher.string;

		//stockage des preferences dans le cookie expiration fixée à 4 jours
		switcher.set(4)
		
		

	};

};

//définit une nouvelle methode pour les classes et leurs  options
bodySwitcher.prototype.classPerso = function(clef, val, sel)
{
	//crée les option dans les select avec les attributs
	this.attrs = { 'value' : clef, 'text' : val, 'selected' : sel }; 
	this.option = this.createElement('option', this.attrs);
	this.select.appendChild(this.option);
	

	//vérifier la valeur du cookie 
	if(switcher.cookie != null )
	{
		//Si la valeur du cookie contient  une key
		if(switcher.cookie.indexOf(' ' + clef + ' ')!=-1 )
		{
			//selectionne l'option
			this.select.selectedIndex = this.options;
		}
	}
	
	//stocke le nom de classe
	
	this.classes[this.options] = clef;
			
	//incremente le compte des options
	this.options ++;

};

//défini la méthode pour creer les élement et attributs
bodySwitcher.prototype.createElement = function(tag, attrs)
{
	//detecter le support pour la création d'espace nom, dans le cas où nous sommes dans le DOM /XML
	this.ele = (typeof document.createElementNS != 'undefined') ? document.createElementNS('http://www.w3.org/1999/xhtml',tag) : document.createElement(tag);

	//parcourir les arguments des attributs
	if(typeof attrs != 'undefined')
	{
		for(var i in attrs)
		{
			switch(i)
			{
				//créé un noeud text
				case 'text' :
					this.ele.appendChild(document.createTextNode(attrs[i]));
					break;
				
				//crée un nom de classe
				case 'class' : 
					this.ele.className = attrs[i];
					break;
				
				//crée un attribut 'for' géré par js pour les label :htmlFor
				case 'for' : 
					this.ele.setAttribute('htmlFor',attrs[i]);
					break;
					
				case 'selected' :
					if (typeof attrs[i] != 'undefined'){
					this.ele.setAttribute('selected',attrs[i]);
					}else{this.ele.removeAttribute}
					break;
				
				//crée un  attribut generique pour les autres cas
				default : 
					this.ele.setAttribute(i,'');
					this.ele[i] = attrs[i];
					break;
			}
		}
	}
	return this.ele;
};

function css_browser_selector(u){var ua=u.toLowerCase(),is=function(t){return ua.indexOf(t)>-1},g='gecko',w='webkit',s='safari',o='opera',m='mobile',h=document.documentElement,b=[(!(/opera|webtv/i.test(ua))&&/msie\s(\d)/.test(ua))?('ie ie'+RegExp.$1):is('firefox/2')?g+' ff2':is('firefox/3.5')?g+' ff3 ff3_5':is('firefox/3.6')?g+' ff3 ff3_6':is('firefox/3')?g+' ff3':is('gecko/')?g:is('opera')?o+(/version\/(\d+)/.test(ua)?' '+o+RegExp.$1:(/opera(\s|\/)(\d+)/.test(ua)?' '+o+RegExp.$2:'')):is('konqueror')?'konqueror':is('blackberry')?m+' blackberry':is('android')?m+' android':is('chrome')?w+' chrome':is('iron')?w+' iron':is('applewebkit/')?w+' '+s+(/version\/(\d+)/.test(ua)?' '+s+RegExp.$1:''):is('mozilla/')?g:'',is('j2me')?m+' j2me':is('iphone')?m+' iphone':is('ipod')?m+' ipod':is('ipad')?m+' ipad':is('mac')?'mac':is('darwin')?'mac':is('webtv')?'webtv':is('win')?'win'+(is('windows nt 6.0')?' vista':''):is('freebsd')?'freebsd':(is('x11')||is('linux'))?'linux':'','js']; c = b.join(' '); h.className += ' '+c; return c;}; css_browser_selector(navigator.userAgent);

