/**
 * Variable globale
 */
var MP = {};

/**
 * Initialisation de timers
 */
var MenuTimer;
var SearchTimer;

/**
 * Initialise la collection d'items trouvés lors de la recherche
 */
var Collection;
var position = -1;

/**
 * Exécution lorsque le DOM est prêt
 */
Event.observe(document, "dom:loaded", function(e) {
	// Chargement du fichier XML pour le menu
	new Ajax.Request("xml/MenuEntete.xml", {
		method:'get',
		onSuccess:function(xhr) {
			// Le fichier a été trouvé
			MP = xhr.responseXML;
			
			// Associe les éléments du menu à un événement
			$$("table#MenuPrinc a").invoke("observe", "mouseover", function(e) {
				// Supprime le timer d'affichage
				if (typeof(MenuTimer) != "undefined") {
					window.clearTimeout(MenuTimer);
				}
				
				// Retrouve l'élément
				var menu_element = $(this);
				
				// Récupère l'information dans le fichier xml
				GetMenu(menu_element);
			});
			
			// Associe les éléments du menu à un événement
			$$("table#MenuPrinc a").invoke("observe", "mouseout", function(e) {
				// Déclenche un timer
				MenuTimer = window.setTimeout("CacheMenu()", 900);				
			});
		},
		onFailure:function(xhr) {
			alert("Impossible de charger le menu");
		}
	});

    // Initialise le combobox
    ComboBoxReset();
	
	/**
	 * Gestion du div où les résultats de recherche seront affichés
	 */
	
	// onMouseOut
	$('resultats').observe("mouseout", function(e){
		// Démarrre un timer
		SearchTimer = window.setTimeout(function() {
                    ComboBoxReset();
		}, 800);
	});
	
	// onMouseOver
	$('resultats').observe("mouseover", function(e){
		// Annule un timer
		window.clearTimeout(SearchTimer);
	});
	
	// onMouseEnter
	$('resultats').observe("mouseenter", function(e) {
		// Retire la classe fake-hover sur les éléments
		Collection.invoke("removeClassName", "fake-hover");
	});
	
	/**
	 * Gestion du champ de recherche dynamique
	 */
	
	// onClick
	$('ChoixProd').observe("click", function(e){
		// Vide le champ si la valeur par défaut est affichée
		/****************************************************
		if (this.value == this.defaultValue) {
			// Vide le champ
			this.value = "";
		}

        // Si la valeur du champ est nulle, amorce demande l'affichage
        if (this.value == "") {
            RechercheHandler(e);
        }
        *******************************************************/
		$('FilterText').clonePosition($('ChoixProd'), {
			setHeight:false,
			offsetTop:6,
			offsetLeft:5,
			setWidth:false
		});
		$('FilterText').show();
		$('FilterText').focus();
		RechercheHandler(e);
	});
	
	$('FilterText').observe("blur", function(e){
		$('FilterText').value = "";
		$('FilterText').hide();
	});
	
	$('FilterText').observe("keyup", function(e){
		RechercheHandler(e);
	});
	
	// onBlur
	$('ChoixProd').observe("fake:blur", function(e) {
		this.value = this.defaultValue;
	});
	
	/***************
	// onFocus
	$('RechercheGoogle').observe("focus", function(e) {
		// Vide le champ si la valeur par défaut est affichée
		if (this.value == this.defaultValue) {
			this.value = "";
		}
	});
	
	// onBlur
	$('RechercheGoogle').observe("blur", function(e) {
		if (this.value == "")
			this.value = this.defaultValue;
	});
	************************/
	
	// onKeyUp
	$('ChoixProd').observe("fake:keyup", RechercheHandler);
	
	/**
	 * Si on click dans le document, on cache les résultats
	 */
	Event.observe(document, "click", function(e) {
		ComboBoxReset();
	});
	
	// Vérifie si le dealer locator doit être arrangé
	if ($('zip') != null) {
		// Force les maj.
		$('zip').setStyle({
			textTransform:"uppercase"
		});
		
		// Gère le submit sur le formulaire parent
		$('zip').ancestors()[5].observe("submit", function(e){
			// Valide le code postal
			var code_reg = /^[A-Z][0-9][A-Z]\s?[0-9][A-Z][0-9]$/i;
			if (code_reg.test($F('zip'))) {
				// Ok, mais on doit s'assurer que le champ est bien formatté
				if ($F('zip').length == 6) {
					$('zip').value = $F('zip').substring(0,3) + " " + $F('zip').substring(3);
				}
			} else {
				if ($F('APP_LOCALE') != "fr-CA") {
					alert("Valid zip code required");
					e.stop();
				} else {
					alert("Code postal valide requis");
					e.stop();
				}
			}
		});
	}
});

/**
 * Fonction qui gère la recherche AJAX de produits
 * @param {Object} e
 */
function RechercheHandler(e) {
	// Annule le comportement par défaut
	e.stop();
	
	// La recherche dynamique démarre après 3 caractères
	if (e.keyCode != Event.KEY_DOWN && e.keyCode != Event.KEY_UP && e.keyCode != Event.KEY_RETURN) {
       // Récupère le conteneur des résultats (présents dans le DOM)
       OpenComboBox($F('FilterText'));
	} else {
		// Vérifie la direction du pointeur
		if (e.keyCode == Event.KEY_UP) {
			// Recule
            PositionUpdate(-1);
		} else if (e.keyCode == Event.KEY_DOWN) {
			// Avance
			PositionUpdate(1);
		} else if (e.keyCode == Event.KEY_RETURN) {
			// Suite à 'enter' on affiche la page
			ViewLink(Collection[position]);
		}
	}
}

/**
 * Fonction qui change la position du curseur interne dans la collection de produits listés
 * pour le choix du produit
 */
function PositionUpdate(delta) {
    // Annule un timer
    window.clearTimeout(SearchTimer);
    
    // Ajuste
    position += delta;

    // Valide, selonqu'on avance ou qu'on recule
    if (delta < 0 && position < 0) {position = (Collection.length - 1);}
    if (delta > 0 && position >= Collection.length) {position = 0;}

    // Récursion si nécessaire
    if (!Collection[position].visible()) {
        PositionUpdate(delta);
    }

    // Retire la classe sur tous les items
    Collection.invoke("removeClassName", "fake-hover");

    // Lance l'événement
    Collection[position].fire("cx:focus");
}

/**
 * Fonction qui ouvre la liste de sélection de produit en filtrant, au besoin, avec la valeur de filter
 * @param filter
 */
function OpenComboBox(filter) {
    // Conteneur de résultats
    var resDiv = $('resultats');

    // Positionnement
    resDiv.clonePosition($('ChoixProd'), {
        offsetTop:30,
        offsetLeft:-139,
        setHeight:false,
        setWidth:false
    });

    // Construit la collection d'items
    Collection = $$('a.cx-sl-elem');

    // Si un filtre est défini
    if (filter != "") {
        // Parcours la collection pour filtrer son contenu
        Collection.each(function(link) {
           // Vérifie si cet élément contient le texte cherché
           var texte = link.innerHTML.toLowerCase();
           var essai2;

           // Vérification
           if (texte.indexOf(filter.toLowerCase()) < 0) {
               // Le texte ne correspond pas tel quel, on vérifie en retirant les accents
               essai2 = noaccent(texte);

               // Compare le filtre avec le nom de produit sans accents
               if (essai2.indexOf(filter.toLowerCase()) < 0) {
                   link.hide();
               } else {
                   // On a trouvé une occurence
                   link.show();
               }
           } else {
               link.show();
           }
        });
    } else {
        Collection.invoke("show");
    }

    // Association d'un événement maison
    Collection.invoke("observe", "cx:focus", function(e) {
        this.addClassName("fake-hover");
    });

    // Affiche
	/*
    resDiv.setStyle({
        visibility:"visible",
		height:"1px"
    });
    */

    // Ajuste la hauteur du combo-box
    UpdateComboBoxHeight();
}

/**
 * Supprime les accents français d'une chaîne
 */
function noaccent(chaine) {
  temp = chaine.replace(/[àâä]/gi,"a")
  temp = temp.replace(/[éèêë]/gi,"e")
  temp = temp.replace(/[îï]/gi,"i")
  temp = temp.replace(/[ôö]/gi,"o")
  temp = temp.replace(/[ùûü]/gi,"u")
  return temp
}

/**
 * Fonction qui ajuste la hauteur de la liste de sélection selon la hauteur de page disponible
 */
function UpdateComboBoxHeight() {
    // Ajuste la hauteur de la liste à son contenu selon la hauteur de la page
    var resDiv = $('resultats');
    var Collection = $$('a.cx-sl-elem');
    var PageHeight = document.viewport.getHeight();
    var resLayout = resDiv.getLayout();
    var MaxResHeight = PageHeight - resLayout.get("top") - 50;

    // Détermine la taille nécessaire
    var nbItems = 0;
    Collection.each(function(link) {
        if (link.visible()) {
            if (link.hasClassName("cx-sl-elem")) {
				nbItems += 1;
			}
        }
    });
    
    var CalculatedHeight = Math.round((50 * nbItems) + (3 * 27));

    // On ajoute 50px par élément jusqu'à la taille max
    if (CalculatedHeight > MaxResHeight) {
        var Height = MaxResHeight;
    } else {
        var Height = CalculatedHeight;
    }
	
	// Animation
	resDiv.setStyle({visibility:"visible"});
	if (resDiv.getStyle("height") != "m1px") {
		new Effect.Morph('resultats', {
			style: {
				height: Height + "px"
			},
			duration: 0.3
		});
	}
}

/**
 * Fonction qui réinitialise le Combo-Box
 */
function ComboBoxReset() {
    // Cache le div
    $('resultats').setStyle({visibility:"hidden",height:"1px"});

    // Construit la collection d'items
    Collection = $$('a.cx-sl-elem');

    // Parcours la collection pour filtrer son contenu
    Collection.invoke("show");
}

/**
 * Fonction qui permet de voir la page produit associée à un lien du menu dynamique
 * @param {Object} anchor
 */
function ViewLink(anchor) {
	window.top.location = "index.php?prod=" + anchor.id.substring(5) + "&action=voir&locale=" + $('APP_LOCALE').value;
}

/**
 * Fonction qui lance la recherche google personnalisée
 */
function GoogleThis() {
	if ($F('RechercheGoogle') != "" && $F('RechercheGoogle') != $('RechercheGoogle').defaultValue) {
		window.top.location = "index.php?action=google&q=" + encodeURI($F('RechercheGoogle') + "&cx=000051434696783215091:ucezd0q2zkk&cof=FORID:11&sa.x=0&sa.y=0&sa=submit&siteurl=stelpro.com/#965");
	}
}

/**
 * Fonction qui affiche le sous-menu si possible
 * @param {HTMLAnchorElement} element
 */
function GetMenu(element) {
	// Récupère les menus
	var menus = $(MP).getElementsByTagName("menu");
	
	// Cycle les éléments pour trouver celui qu'on cherche
	for (var i = 0; i < menus.length; i++) {
		if (menus[i].getAttribute("id") == element.id) {
			AfficheSousMenu(menus[i],element);
			return true;
		}
	}
	
	// Si on arrive ici, il n'y a pas de sous-menu
	CacheMenu();
	
	// Obtient le lien
	var items = $(MP).getElementsByTagName("item");
	
	// Cycle les éléments pour trouver celui qu'on cherche
	for (var i = 0; i < items.length; i++) {
		if (items[i].getAttribute("id") == element.id) {
			// Assigne la cible du lien
			element.href = items[i].getAttribute("url");
			
			// Fin du cycle
			return true;
		}
	}
}

/**
 * Fonction qui affiche un sous-menu
 * @param {Object} node
 * @param {HTMLAnchorObject} element
 */
function AfficheSousMenu(node, element) {
	// Récupère le sous-menu
	var div = $('submenu');
	
	// Vide le div
	div.update("");
	
	// Assigne les membres
	for (var i = 0; i < node.childNodes.length; i++) {
		if (node.childNodes[i].nodeName == "item") {
			// Récupère la locale
			var locale = $('APP_LOCALE').value;
			
			// Trouve le texte
			var allText = node.childNodes[i].getElementsByTagName("text");
			
			// Cycle les textes pour trouver celui de la bonne langue
			for (var j = 0; j < allText.length; j++) {
				if (allText[j].getAttribute("lang") == locale) {
					var texte = allText[j].childNodes[0].nodeValue;
				}
			}
			
			// Insère le lien dans le sous-menu
			if (typeof(texte) != "undefined") {
				div.insert("<a href='"+node.childNodes[i].getAttribute('url')+"'>"+ texte +"</a>");
			}
		}
	}
	
	// Associe un événement
	$$("div#submenu a").invoke("observe", "mouseout", function(e) {
		// Déclenche un timer
		MenuTimer = window.setTimeout("CacheMenu()", 750);				
	});
	
	// Associe un événement
	$$("div#submenu a").invoke("observe", "mouseover", function(e) {
		// Déclenche un timer
		window.clearTimeout(MenuTimer);				
	});

        // Assigne la position du DIV
	div.clonePosition(element, {
		setWidth:false,
        setHeight:false,
        offsetTop:25,
		offsetLeft:0
	});
	
	// Affiche
	div.setStyle({
        visibility:"visible"
    });
}

/**
 * Fonction qui utilise Scriptaculous pour cacher le menu
 */
function CacheMenu() {
	if ($('submenu') != null) {
		// Effet de fade out
        /*
        Effect.Fade('submenu', {
			duration:.2
		});
        */

        // Change la visibilité
        $('submenu').setStyle({
            visibility:"hidden"
        });
	}
}

/**
 * Fonction qui utilise Scriptaculous pour montrer le menu
 */
function MontreMenu(element) {
	Effect.Appear('submenu', {
		duration:.2,
		afterFinish:function() {
			// Force l'opacité max
			$('submenu').setOpacity(1);
			
            // Assigne la position du DIV
            $('submenu').clonePosition(element, {
                setWidth:false,
                setHeight:false,
                offsetTop:25,
                offsetLeft:0
            });
		}
	});
}

/**
 * Fonction qui affiche le lecteur vidéo dans une fenêtre
 * @param {Number} id L'id du vidéo dans la bd
 */
function VoirVideo(id) {
	// Génère le lecteur
	var player = new cidrux.ui.VideoPlayer("ZoneVideo", id);
	
	// Active le mode drag
	new Draggable(player);
	
	// Affiche la fenêtre
	Effect.Appear(player,{
		afterFinish:function(el) {
			// Récupère les données du vidéo
			new Ajax.Request("index.php?action=ajaxvid", {
				method:"get",
				parameters:{
					vid:id
				},
				onSuccess:function(xhr) {
					// Récupère le contenu
					var contenu = xhr.responseText;
					
					// Insère le contenu
					$('vdo-div').replace(contenu);
				},
				onComplete:function() {
					// Active flowplayer
					if ($('lecteur') != null) {
						flowplayer('lecteur', 'assets/common/flowplayer/flowplayer-3.2.1.swf');
						flowplayer('lecteur', 'assets/common/flowplayer/flowplayer-3.2.1.swf');
					}
				}
			});
		}
	});
}

/**
 * Fonction qui affiche le questionnaire dans une cux-window
 */
function FormQuestion() {
	// Génère le lecteur
	var win = new cidrux.ui.Question("MenuZone");
	
	// Active le mode drag
	new Draggable(win);
	
	// Affiche la fenêtre
	Effect.Appear(win,{
		afterFinish:function(el) {
			// Récupère le contenu
			new Ajax.Request("index.php?action=ajaxquest&prod=" + $F('CODE_PRODUIT'), {
				method:"get",
				onSuccess:function(xhr) {
					// Récupère le contenu
					var contenu = xhr.responseText;
					
					// Insère le contenu
					$('quest').replace(contenu);
					
					// Attrape les input de téléphone pour la gestion dynamique
					$('cx-quest-phone1').observe("keyup", function(evt) {
						if ($F('cx-quest-phone1').length == 3) {
							$('cx-quest-phone2').focus();
						}
					});
					$('cx-quest-phone2').observe("keyup", function(evt) {
						if ($F('cx-quest-phone2').length == 3) {
							$('cx-quest-phone3').focus();
						}
					});
				}
			});
		}
	});
}

/**
 * Fonction qui affiche le formulaire d'envoi à un ami
 */
function PageSend() {
	// Génère le lecteur
	var win = new cidrux.ui.Sendpage("MenuZone");
	
	// Active le mode drag
	new Draggable(win);
	
	// Affiche la fenêtre
	Effect.Appear(win,{
		afterFinish:function(el) {
			// Récupère le contenu
			new Ajax.Request("index.php?action=ajaxpagesend&prod=" + $F('CODE_PRODUIT'), {
				method:"get",
				onSuccess:function(xhr) {
					// Récupère le contenu
					var contenu = xhr.responseText;
					
					// Insère le contenu
					$('quest').replace(contenu);
				}
			});
		}
	});
}

