/*
 * Historique 
 * Animation inter-pages lorsque :
 * => Mise à jour via history.back()/history.next()
 * => Chargement de la page
 * => Chargement du contenu en Ajax
 */
var _handlePageAnimation = function(hashHistory, initEvent)
{
    //_trace('handlePageAnimation');
    // disabled history (20/05/2011 - oparadis)
    //return true;
  
	if (typeof oTryptique == "undefined" || typeof jpgAjaxContent == "undefined")
	{
		setTimeout(function(){_handlePageAnimation(hashHistory,initEvent);}, 10);
		return false;
	}	
	var 
		_this = hashHistory || "",
		_navigatorEvent = (typeof initEvent == "undefined") ? _this.navigatorEvent : initEvent
	;
	
	// Ne rien faire s'il ne s'agit pas 
	// d'un événement "Back" ou "Prev"
	if (!_navigatorEvent)
	{
		return false;
	}
	
	var
		_hash = _this.getHash(),
		_history = jpgAjaxContent.history[_hash] || [],
		_slideRef = _hash.split(_this.suffixe) || null
	;
	if (!_hash.length || !_slideRef || !_history || _history.length < 2)
	{
		return false;
	}
	_handleGotoContent(_slideRef[0], {
		"data-target": _history[0] || null,
		"data-slider": "jpgContent",
		"data-id": _slideRef[1], 
		"href": _history[1] || null,
		"type": "history"
	});
};

//
// Navigation Alternative
// Provoquée par un événement extérieur
// de type : historique ou flash
//
var _handleGotoContent = function(slideId, data)
{
	var
		_slide = oTryptique.getSlides()[oTryptique.indice] || oTryptique.getSlides()[oTryptique.startIndice] || {},
		_currentSlideId = _slide.id || "",
		_slideId = slideId || null
	;
	
	// Slide Updater
	if (_slideId && _currentSlideId != _slideId)
	{
		oTryptique.gotoSlide({
			"target": document.getElementById(_slideId),
			"type": "history"
		});
	}

	// Content Updater
	jpgAjaxContent.gotoContent({"target": 
	{
		"data-target": data["data-target"],
		"data-slider": "jpgContent",
		"data-id": data["data-id"], 
		"href": data["href"],
		"type": data["type"]
	}});
};

// Mise à jour de l'historique
var _updateHistoryContent = function(ajaxData)
{
  // disabled history (20/05/2011 - oparadis)
  //return true;

	if (typeof oHistory == "undefined")
	{
		setTimeout(function(){_updateHistoryContent(ajaxData);}, 10);
		return false;
	}
	if (typeof oHistory == "undefined")
	{
		return false;
	}
	var 
		_separator = oHistory.suffixe || "/",
		_hashContent = ajaxData["id"],
		_hashPage = ajaxData["target"].split(_separator)[0]
	;
	oHistory.setHash(_hashPage + _separator + (_hashContent || ""));
};

// Historique de la page
var oHistory = new fakeHistory(
{
	"init": function()
	{
		var _slide = (oTryptique.getSlides() || [])[oTryptique.startIndice];
		if (_slide)
		{
			_updateHistoryContent({"target": _slide.id, "id": ""});
		}
		
		// Annuler le click sur chaque lien du site contenant un "hash"
		var _trypriqueContainer = oTryptique.elements["container"];
		driver.addEvent(_trypriqueContainer, "click", function(e)
		{
			var 
				_hash = e.target.hash || "",
				_isHash = (e.target.href || "").search("#")
			;
			
			if (_hash.length || _isHash > -1)
			{
				e.preventDefault();
			}
		});
	},
	"onHashChange" : function()
	{
		_handlePageAnimation(this);
	}
});

/*
 *  Liens Ajax 
 * --
 * les éléments avec les attributs "data-target" et "data-id" chargent le contenu ciblé en Ajax
 * Mise à jour du Hash en fonction
 */
var jpgAjaxContent = new ajaxBox(
{
	"init": function()
	{
		// Register default content
		var
			_indice = (oTryptique.indice == null) ? oTryptique.startIndice : oTryptique.indice,
			_slide = oTryptique.getSlides()[_indice],
			_hash = oHistory.getHash(),
			_url = window.location.href.replace("#" + _hash, "")
		;
		if (_slide)
		{
			this.save.call(this, _hash, [_slide.id, _url]);
		}
		
		// Update de l'url du site
		if (oHistory)
		{
			oHistory.init();
		}
		
		// FIXIE : Survol des éléments 
		_handleElementsHover(_slide);
	},
	"success" : function()
	{
		_handleTracking(this.currentData);
	},
	"onchange" : function(data)
	{
		// Mise à jour de l'historique
		_updateHistoryContent(data);
		
		if (typeof _newsletterForm != "undefined")
		{
			_newsletterForm.destroy();
		}

		// Chargement des nouveaux Scripts
		// FIXME le setTimeout est nécessaire pour 
		// qu'il s'exécutent après que prototype les ai injecté dans le document
		setTimeout(function()
		{
			_handleScriptAfterOnload();
			
			// FIXIE : Survol des éléments 
			_handleElementsHover(document.getElementById(data.target));
		}, 10);
	}
});

var _handleTracking = function(data)
{
    //Enable page tracking for Google Analytics
    if(typeof window._gaq == "undefined")
    {
    	return false;
    }
    try
    {                   
        var currentUri = data["url"];
        if(currentUri.indexOf('index.php'))
        {
            currentUri = currentUri.split('index.php');
            currentUri.shift();
            currentUri = currentUri.join('/');
        }
        else if(currentUri.indexOf(document.domain))
        {
            currentUri = currentUri.split(document.domain);
            currentUri.shift();
            currentUri = currentUri.join('/');
        }
        _gaq.push(["_trackEvent", "ajaxLoading", data["target"], currentUri]);
    }
    catch(e)
    {
        //who care?
    }
};

/*
 *  Slider
 *  --
 *  Navigation dans le site sous forme de Tryptique
 *  !!! jpgAjaxContent & oHistory sont initialisés ici
 */
var _resetScrollValue = function(elm)
{
	if (typeof elm == "undefined" || !elm)
	{
		return false;
	}
	var _founded = false;
	while(elm && !_founded)
	{		
		elm.scrollTop = 0;
		_founded = elm.tagName.toLowerCase() == "html";
		elm = elm.parentNode;
	}	
	return true;
};

var oTryptique = new Slider(
{	
	"animation": {"delay": 1000},
	"init": function()
	{
	    if (this.initialized == true )
	    {
	      //_trace('**ERROR** oTryptique should ne bot instantiated twice');
	      return false;
	    }
	    
	    //Aller à la slide par fafaut
		//this.startIndice = this.getIndice(this.getStartSlide());
		this.gotoSlide({
			target: this.getStartSlide(),
			type: "start"
		});
	    
		driver.addClass(this.elements["container"], "fixed-content");

		// Chargement du contenu en AJax
		jpgAjaxContent.init(this.elements["container"]);

        this.initialized = true;
	},
	
	"onchange": function()
	{		
		// Remonter en haut de la page
		_resetScrollValue(this.getSlides()[this.indice]);
		
		// FLASH : Arréter les animations
        _handleStopFlash(this.getSlides()[this.oldIndice]);
        
        // SLIDER : arréter les animations
		var keys;
        if (typeof sliderElements != "undefined")
        {
	        for (keys in sliderElements)
	        {
	        	if (sliderElements[keys] !== this)
	        	{
		        	sliderElements[keys].destroy();
	        	}
	        }
        }
        // ACCORDION : arréter les animations en cours
        if (typeof accordionElements != "undefined")
        {
            for (keys in accordionElements)
            {
                accordionElements[keys].destroy();
            }
        }
		
		// Update website width&height
		driver.removeClass(this.elements["container"], "fixed-content");
	},	
	"onsuccess": function()
	{
		// Update website width&height
		driver.addClass(this.elements["container"], "fixed-content");
	}
});

//Exécuter tous les script après le chargement du document
//Ou après chaque chargement en Ajax dans la page
var _destroyScriptBeforeOnload = function()
{
	if (typeof _destroyBeforeOnload == "undefined")
	{
		return false;
	}
	for (var i=0; i in _destroyBeforeOnload;)
	{
		delete _destroyBeforeOnload[i];
		_destroyBeforeOnload.shift();
	}
	//_trace("_destroyScriptBeforeOnload : ", _destroyBeforeOnload)
};

var _handleScriptAfterOnload = function()
{
	//_trace("_handleScriptAfterOnload : ", _executeAfterOnload)
	
	// Suppression des scripts courant
	_destroyScriptBeforeOnload();

	// Scripts du nouveau contenu
    setTimeout(function()
	{
    	if (typeof _destroyBeforeOnload == "undefined")
    	{
    		window._destroyBeforeOnload = [];
    	}
		for (var i=0; i in _executeAfterOnload;)
		{
			var _script = _executeAfterOnload[i] || function(){};
			if (typeof _script == "function" && _script)
			{
                try
                {
                    _script();
                    _destroyBeforeOnload.push(_script);
                }
                catch(ex)
                {
                    //_trace(ex);
                }
			}
			_executeAfterOnload.shift();
		} 
       if(typeof(_onHandleScriptAfterOnloadDone) != 'undefined')
       _onHandleScriptAfterOnloadDone();
	}, 10);
};
driver.addEvent(document, "dom:loaded", _handleScriptAfterOnload);

/*
 * _handleEvents
 * fire flash events
 */
var flashSuccess = false,
	flashSuccessTime = null;
var _handleEvent = function(event, data)
{
	 var 
	 	_event = (event || "").toLowerCase(),
	 	_data = data || null
	 ;
	
	//alert("_handleEvent : " + event + ", data="  + data);
    switch(_event)
    {
	    case '_gotocontent':
	    	if (_data)
	    	{
	    		var 
	    			_target = _data["target"] || "",
	    			_slideId = (_target.split("/") || [null])[0]
	    		;

	    		_handleGotoContent(_slideId, {
	    			"data-target": _data["target"],
		   			"data-slider": "jpgContent",
		   			"data-id": _data["id"], 
		   			"href": _data["url"],
		   			"type": "flashEvent"
	    		});
	    	}
	   		break;
	   		
        case '_flashsuccess':
			
			if(document.getElementsByClassName("homeBrand").length != 0) break;
        	
			if (flashSuccessTime) clearTimeout(flashSuccessTime);
			
			flashSuccessTime = setTimeout(function()
        	{
			
            	var _pageContainer = document.getElementById("page-brand");				
                if(typeof window.menuBrand != "undefined" && !window.menuBrand.isActive)
                {
	            	// Disparition du menu
	                menuBrand.animate();
                }
	                
        		// Disparition des crossTryptiques
                var _menuLinks = driver.find(_pageContainer, ".hover") || [];
                for(var i=0, len=_menuLinks.length; i<len; i++)
                {
                	driver.removeClass(_menuLinks[i], "hover");
                }
				
            }, 4000);
        	break;
        
        // Chnagement de Logo
        case '_flashswitchlogo':
        	_handleSwitchLogo(_data);        	
        	break;    	
    }
};

var _handleSwitchLogo = function(data)
{
	if (typeof data != "string")
	{
		return false;
	}
	
	var 
		_pageElement = document.getElementById("page-brand"),
		_contentElement = driver.getElement(_pageElement, ".page-content"),
    	_templateName = 
	 	{
		 	"monsieur-content": "mix-content",
		 	"monsieurPart2-content": "mix-content",
		 	"classique-content": "black-content",
		 	"classiqueX-content": "white-content",
		 	"leMale-content": "black-content",
		 	"leMaleTerrible-content": "white-content"
	 	}
	;
	
    _contentElement.id = data;
    
    var _className = _templateName[data] || null;
    if (_className)
    {
    	_handleTemplate(document.getElementById("page-brand"),_className);
    }
};

//
// Changer le template d'affichage
// Il existe un template pour un fond sombre, et pour un fond clair (par défaut)
//
var _handleTemplate = function(elm, className)
{
	if (typeof elm == "undefined" || !elm)
	{
		return false;
	}
	var _classNames = ["gray-content", "white-content", "black-content", "mix-content"];
	for (var i=0, len=_classNames.length; i<len; i++)
	{
		if (_classNames[i] == className)
		{
			driver.addClass(elm, _classNames[i]); 
			continue;
		}
		driver.removeClass(elm, _classNames[i]); 
	}
};

/*
 * _handleStopFlash
 * stop le(s) flash(s) en cours sur le site
 */
var _handleStopFlash = function(slide)
{
    var flashs = driver.find(slide, 'object');
    for(var i=0, len=flashs.length; i<len; i++)
    {
    	var _flash = flashs[i];
        try
        {
        	_flash.eventHandler('_handleStop');
        	_flash.parentNode.removeChild(_flash);
        }
        catch(ex)
        {
            _trace("_handleStopFlash error : ", ex);
        }
        
    }
};

// Lightbox qui se charge en ajax
// délégation d'événement
window.fakeWindowLinks = new AjaxFakeWindow({
	"success" : function(data)
	{
		if (typeof _handleTracking == "function")
		{
			_handleTracking(data);
		}
	}
});

//Only iOs \w no position fixed support
function touchScroll(node)
{
	node.ref = null;
	node.addEventListener("touchmove", function(e)
	{
		if(e.touches.length != 1)
		{
			return;
		}
		// Prevent bubbling
		e.preventDefault();
		var	
			touch = e.touches[0],
			pagey = touch.pageY,
			current = node.scrollTop,
			delta = 0
		;
		
		// Delta
		if(node.ref != null)
		{
			delta = node.ref-pagey;
			node.scrollTop = current+delta;
		}

		// Store next reference
		node.ref = pagey;
		return;
		
	}, false);
	
	node.addEventListener("touchend",function(e)
	{
		node.ref = null;
		return;
		
	}, false);
}

//
// Inscription à la newsletter
//
var _newsletterSuccessBox = new ajaxBox(
{
	"success": function()
	{
		_setAjaxBoxParameters(this, false);
	}
});

// Activer/Désactiver le composant AjaxBox
var _setAjaxBoxParameters = function(_ajaxBox, active)
{
	var 
		_setBox = active || false,
		_boxInstance = _ajaxBox,
		_boxElement = _boxInstance.elm || null,
		_successElement = driver.getElement(_boxElement, ".message")
	;
	
	if (!_boxElement || !_successElement)
	{
		return false;
	}
	
	var _defaultAction = _boxElement.getAttribute("data-success");
	_boxElement.setAttribute("data-success", _boxElement.action);
	_boxElement.setAttribute("action", _defaultAction);

	if (_setBox)
	{
		_boxElement.setAttribute("data-target", _successElement.id);
		_boxElement.setAttribute("data-id", "is-registered-to-the-newsletter");
		return true;
	}
	
	_ajaxBox.destroy();
	return false;
	
};
var _newsletterForm = new AjaxForm(
{
	"onBeforeSubmit": function(response)
	{
		var elm = driver.getElement(this.elm, "input[type=text]");
	  	return !(!elm.value || elm.value == elm.defaultValue);
	},
	"success": function(response)
	{
	    var 
	    	_data = response.responseJSON || null, 
	    	_messageContainer = driver.getElement(this.elm, ".message")
	    ;
	    if (!_data || !_messageContainer)
	    {
		    return false;
	    }
	
	    var _errors = _data.errors || null;
		if (!_errors.length)
		{
			// Attributs nécessaires pour faire fctionner AjaxBox
		    driver.removeClass(_messageContainer, "error");
			_setAjaxBoxParameters(this, true);
			_newsletterSuccessBox.init(this.elm);
			_newsletterSuccessBox.gotoContent({"target": _messageContainer});
			return true;
		}
		for(var i=0, len=_errors.length; i<len; i++)
		{
		    // Créer le message d'erreur
		    var _messageText = _errors[i].message;
		    driver.putHTML(_messageContainer, _messageText);
		    driver.removeClass(_messageContainer, "success");
		    driver.addClass(_messageContainer, "error");
		}
	}
});
