var DOM = new Object();
var CM = new Object();

DOM = {
	support : {
		'id' : typeof document.getElementById,
		'tag' : typeof document.getElementsByTagName,
		'el' : typeof document.createElement
	},
	
	getByClassName : function (node, classname) {
		var a = [];
		var re = new RegExp('\\b' + classname + '\\b');
		var els = document.getElementsByTagName(node);
		for(var i=0,j=els.length; i<j; i++) {
			if(re.test(els[i].className)) {a[a.length] = els[i];}
		}
		return a;
	}
};

CM.menus = {
	// variables
	baseID : 'menus',
	targetNAME : 'h2',
	fieldsName : 'input',
	fieldsType : {'checkbox':'checkbox', 'text':'text'},
	lastMenu : '',
	lastForm : '',
	actif : 'actif',
	defaultTXT : {'f_lieuDepart':'Lieu de départ','f_lieuArrivee':'Lieu d\'arrivée','f_destination':'destination'},
	lesRendezVous : {'id':'lesRendezVous','value':20,'active':false},
	lesIncontournables : {'IDmain':'lesIncontournables','IDflash':'lesIncontournablesFLA','IDmap':'map'},
	chargementID : 'chargement',
	chargementMSG : '<img src=\"css/img/chargement.gif\" width=\"300\" height=\"80\">',

	// fonction à appeler au démarrage
	init : function() {
		if(DOM.support.id == 'undefined' || DOM.support.tag == 'undefined') {return;}
		CM.menus.base = document.getElementById(CM.menus.baseID);
		CM.menus.map = document.getElementById(CM.menus.lesIncontournables.IDmap);
		CM.menus.fla = document.getElementById(CM.menus.lesIncontournables.IDflash);
		if(!CM.menus.base || !CM.menus.map || !CM.menus.fla) {return;}
		CM.menus.obj = CM.menus.base.getElementsByTagName(CM.menus.targetNAME);
		CM.menus.fields = CM.menus.base.getElementsByTagName(CM.menus.fieldsName);
		// appel du masquer/montrer
		CM.menus.showHide();
		// appel du changement d'apparence des labels cochés (+cocher/decocher)
		CM.menus.doChoice();
		// appel de l'effacement du contenu des champs texte en focus
		CM.menus.clearTextFields();
	},

	// masquer/montrer
	showHide : function() {
		for(var i = 0; i < CM.menus.obj.length; i++) {
			CM.menus.obj[i].lk = CM.menus.obj[i].firstChild;
			CM.menus.obj[i].pr = CM.menus.obj[i].parentNode;
			// onclick sur un titre de menu
			CM.menus.obj[i].onclick = function() {
				// affichage du flash pour les incontournables
				if(this.pr.id == CM.menus.lesIncontournables.IDmain) {
					CM.menus.map.className = '';
					CM.menus.fla.className = CM.menus.actif;
				} else {
					CM.menus.map.className = CM.menus.actif;
					CM.menus.fla.className = '';
				}
				// si le menu cliqué est différent du dernier menu actif (lastMenu), on masque lastMenu
				if(CM.menus.lastMenu != this.pr && CM.menus.lastMenu != '') {CM.menus.lastMenu.className = '';}
				// lastMenu = menu actif, pour savoir quel menu masquer au prochain clic (ligne 38)
				CM.menus.lastMenu = this.pr;
				// masquer/montrer sur le menu cliqué
				this.pr.className = this.pr.className == CM.menus.actif ? '' : CM.menus.actif;
				// si ouverture des rendez-vous (pas de checkbox)
				if(this.parentNode.getAttribute('id') == CM.menus.lesRendezVous.id && !CM.menus.lesRendezVous.active) {
					// envoi possible d'une requête AJAX en utilisant CM.lesRendezVous.value (ligne 31)
					point(CM.menus.lesRendezVous.value);
					//alert(CM.menus.lesRendezVous.id+'='+CM.menus.lesRendezVous.value);
					CM.menus.lesRendezVous.active = true;
				// si fermeture des rendez-vous
				} else {
					CM.menus.lesRendezVous.active = false;
				}
				/************************************************************************************
			    on peut ajouter ici un appel vers une fonction AJAX
				  on peut récupérer : 
				   # l'href du lien par "this.firstChild.href" (il faut une URL absolue pour IE)
				************************************************************************************/
				
				//efface();
				CM.menus.enableCheckbox();
				// arrêt de l'action par défaut
				return false;
			};
		}
	},

	// changement d'apparence des labels
	doChoice : function() {
		for(var i = 0; i < CM.menus.fields.length; i++) {
			if(CM.menus.fields[i].type == CM.menus.fieldsType.checkbox) {
				CM.menus.fields[i].pr = CM.menus.fields[i].parentNode;
				// onclick sur les checkbox
				CM.menus.fields[i].onclick = function() {
					// si la checkbox cliquée appartient à un formulaire différent de celui de la dernière checkbox cochée (lastForm)
					// on décoche toutes les checkbox appartenant à lastForm
					//if(CM.menus.lastForm != '' && CM.menus.lastForm != this.form) {CM.menus.deChecked(CM.menus.lastForm);}
					// lastForm = dernier formulaire utilisé
					CM.menus.lastForm = this.form;
					// changement d'apparence sur les labels
					this.pr.className = this.checked ? CM.menus.actif : '';
					// exemple d'utilisation des fonctions de désactivation/activation des checkbox
					//CM.menus.disableCheckbox();
					//setTimeout(function() {CM.menus.enableCheckbox();},2000);
					/************************************************************************************
					   on peut ajouter ici un appel vers une fonction AJAX
						 on peut récupérer : 
						  # l'action du formulaire par "this.form.action" (il faut une URL absolue pour IE)
						  # la valeur du checkbox par "this.value"
					************************************************************************************/
					if(this.checked) {
						//CM.menus.disableCheckbox(); 
       			point(this.value);
       			//CM.menus.enableCheckbox();
       		} else { 
       			
						CM.menus.disableCheckbox();
       			effaceMarker(this.value);
       			CM.menus.enableCheckbox();
       		}
				};
			}
		}
	},

	// décocher les checkbox appartenant à un autre menu
	deChecked : function(o) {
		//var elmts = o.getElementsByTagName(CM.menus.fieldsName);
		//for(var i = 0; i < elmts.length; i++) {
		//	elmts[i].checked = false;
		//	elmts[i].parentNode.className = '';
		//}
	},
	
	// désactiver les checkbox
	disableCheckbox : function() {
		for(var i = 0; i < CM.menus.fields.length; i++) {
			CM.menus.fields[i].setAttribute('disabled','disabled');
		}
		// afficher le message de chargement
		CM.menus.load = document.createElement('div');
		CM.menus.load.setAttribute('id', CM.menus.chargementID);
		CM.menus.load.innerHTML = CM.menus.chargementMSG;
		CM.menus.map.insertBefore(CM.menus.load,CM.menus.map.firstChild);
	},
	
	// activer les checkbox
	enableCheckbox : function() {
		for(var i = 0; i < CM.menus.fields.length; i++) {
			CM.menus.fields[i].removeAttribute('disabled');
		}
		// supprimer le message de chargement
		if(CM.menus.load) {CM.menus.load.parentNode.removeChild(CM.menus.load);}
	},

	// suppression ou ajout du texte par défaut sur les champs textes
	clearTextFields : function() {
		for(var i = 0; i < CM.menus.fields.length; i++) {
			if(CM.menus.fields[i].type == CM.menus.fieldsType.text) {
				// onfocus : on supprime le texte si c'est celui par défaut
				CM.menus.fields[i].onfocus = function() {
					if(this.value == CM.menus.defaultTXT[this.id]) {
						this.value = '';
					}
				};
				// onblur : on remet le texte si le champ est vide ou contient des espaces
				CM.menus.fields[i].onblur = function() {
					if(/^\s*$/.test(this.value)) {
						this.value = CM.menus.defaultTXT[this.id];
					}
				};
			}
		}
	}
};