/**
   FRAMELOADER :: CORE
   Requetes automatiques en Ajax 

   (c) 2009 - _expressiv
**/

var FlFormHeader = 'application/x-www-form-urlencoded;ISO-8859-1';

var frameLoader = new Class({

    /** Gestion des options **/
    options: {
		Container        : 'Inner',         /*L'élément qui est mis à jour*/
		Overlay          : false,           /*Utilise-t-on un Overlay ?   */
		OverlayContainer : 'Container',     /*L'élément qui est l'Overlay */
		loading          : '',              /*Path: Img Chargement        */
		Icon             : false,           /*Nom de l'icone si il y a    */
		MultiBox         : true,            /*Interface vers le multibox ?*/
		History          : true,            /*Affichage de l'URL histoy ? */
		FlashMenuId      : false,           /*Menu en flash si il y a     */
		DefaultPage      : '/Accueil.htm',  /*Page par défaut             */
		FlashEntete      : false,           /*Y-a-t-il une entete flash   */
		Actions          : [],              /*Action à lancer après req   */
		Title            : false,           /*Titre de la page            */
		OnlySubmitButton : false,
		killerActions    : [],
		scrollToTarget	 : ''
    },

    /** Attributs */
    overlay  : null,
    milkbox : null,
    busy     : false,
    index    : 0,
    moduleKey: 0,
    stack    : [],

    /** Librairie des actions de base **/ 

    actions: {

	// Identifier x FilePath -> Overlay
        overlayMake : function(container,loading){
	    /*Création d'un overlay*/
	    return new Overlay({container: container,
				loading  : loading,
				width    : '100%',
				opacity  : .40});
	},

	// ( () -> () ) -> ( Event -> () )
	stopEvThen : function(fct){
	    return function(e){if (e) e.stop();
			       fct();};
	},

	// Element -> Boolean
	bAjaxLink : function(el){
	    return !(!el.href || 
		     ['lightbox','mb','nonFrame'].contains(el.rel) ||
		     el.hasClass("nonFrame") ||
		     ['mb','internLink','bb_a_url','makePopup'].contains(el.className) ||
		     el.href.search(/mailto/)!=-1 ) &&
		( el._allerA==undefined && el.href.search(/\#/)== -1 );
	},

	// Element -> () :: EDB
	splitAnchor : function(el){
	    var anc = el._allerA.split('#');
	    el._allerA = anc[0];
	    el.href    = '#' + anc[1];
	},

	// Element -> () :: EDB
	elSplitRel : function(el){
	    var temp = el.rel.split(':');
	    if (temp[0]!='background') return ;
	    el.bg = temp[1];
	    el.rel = '';
	} ,

	// Url x Identifier [x String x Element] -> Request.HTML 
	getAjaxObject : function(urlR,targetR,methodR,dataR,killer){
	    if (!methodR) methodR='post';
	    if (killer)
		result = function(){
		    if (this.options.Overlay)
			this.options.Overlay.stop();
		    if (this.options.Icon)
			this.actions.iconHide(this.options.Icon);
		    this.busy = false;
		    //		    document.body.setStyle('cursor','inherit');
		    this.launchKillerActions();
		}.bind(this);
	    else result = function() {
		if (this.options.Overlay)
		    this.options.Overlay.stop();
		if (this.options.Icon)
		    this.actions.iconHide(this.options.Icon);
		this.busy=false;
		//		document.body.setStyle('cursor','inherit');
         	this.launchActions();
			this.scanLink();
	        window.fireEvent('onFrameLoad');
		var destY = 0;
		if(this.options.scrollToTarget != '') {
			var myTarget = $(this.options.scrollToTarget);
			if(myTarget != null) destY = myTarget.getCoordinates().top;
		}
		document.body.scrollTo(0, destY);
		window.removeEvents('onFrameLoad');
		window.fireEvent('onFrameLoadAlways');
	    }.bind(this);
	    var dict = {url:urlR,
			method: methodR,
			update : $(targetR),
			data:dataR,
			onSuccess : result};
	    if (killer){r= new Request(dict);}
	    else{
		r = new Request.HTML(dict);
	    }
	    if (dataR) r.setHeader('Content-Type',FlFormHeader);
	    return r;
	},

	/**
	 * Changement du menu du Flash
	 * @param	string	Lien
	 * @return	void
	 */
	flashChangeMenu : function (lien){
	    if (typeof($(this.options.FlashMenuId).changeMenu) == "function")
		$(this.options.FlashMenuId).changeMenu(lien);
	},

	// Identifier -> () :: EDB
	iconShow : function (icon){$(icon).setStyle('display','block');},
	iconHide : function (icon){$(icon).setStyle('display','none');},

	// Identifier -> () :: EDB
	overlayShow : function (overlay){overlay.show();},
	overlayHide : function (overlay){overlay.hide();},

	/**
	 * Prise en charge Admin ?
	 * @return	void
	 */
	getModAndKELink : function(){
	    var link = this.History.getCurrentLocation().substring(1).split('.')[0];
	    return [link.split('/')[0],link];
	},

	/**
	 * Prise en charge des liens popup
	 * @param	string	Element
	 * @return	void
	 */
	makeNewpageLink : function(el){
	    el.addEvent('click',this.actions.stopEvThen(function(e){
			window.open(arguments[0],"");
	    }.pass(el.href)));
	    el.rel = "noMoreAjax";
	},

	/**
	 * Prise en charge des liens
	 * @param	string	Element
	 * @param	string	Target
	 * @return	void
	 */
	makeXHRLink : function(el,target){
	    if (!target) target = this.options.Container;
	    el.rel = "noMoreAjax";
	    el._allerA = el.href;
	    if (el._allerA.indexOf('#') != -1) this.actions.splitAnchor(el);
	    else  el.removeProperty("href");
	    if (el.rel!=undefined) this.actions.elSplitRel(el);
	    el.addEvent('click',this.actions.stopEvThen(function(el,author,target){
			if(el.get('target')) this.options.scrollToTarget = el.get('target');
			else this.options.scrollToTarget = '';
			if (el.bg) $('EnteteContainer').setStyle('background','url('+el.bg+')');
			var T = this.urlToArray(el._allerA);
			if (!(el.rel!='' && el.bg=='') && author!='flash'){
				if (this.options.FlashEntete)
				$(this.options.FlashEntete).changeMenu(T['RawPath']);
				if (!this.busy) this.fireEvent('onChanged',T["Complete"]);
				this.changePage(T["Complete"],undefined,undefined,target);
			}
	    }.bind(this,[el,undefined,target])));
	},

	/**
	 * Prise en charge d'un formulaire
	 * @param	object	Element formulaire
	 * @param	string	Cible
	 * @param	string	URL actuelle ?
	 * @param	boolean	Killer ?
	 * @return	void
	 */
	makeXHRForm : function(el,target,currentLocation,killer){
	    if (el.hasClass('nonFrame')) return ;
            if (!currentLocation) currentLocation = this.History.getCurrentLocation();
	    if (!target) target = this.options.Container;
	    if (el.action == "") el.action = currentLocation;
	    el.action = this.urlToArray(el.action,".xml")["Complete"];
	    el.addEvent('submit',this.actions.stopEvThen(function(el,target,killer){
		var T = this.urlToArray(el.action,".htm");
		if (!killer) this.fireEvent('onChanged',T["Complete"]);

		this.changePage(T["Complete"],undefined,undefined,target,el.method,el,killer);
	    }.bind(this,[el,target,killer])));
	},

	/**
	 * Prise en charge des boutons de formulaire
	 * @param	object	Element bouton
	 * @return	void
	 */
	makeXHRButton : function(el){
	    var myForm = el.getParents('form');
	    if (myForm.hasClass('nonFrame')) return;
	    var Inputs = myForm.getElements('input[type=submit]')[0];
	    for (var i = 0;i < Inputs.length ; i++)
	    {
		if (Inputs[i].get('name') == el.get('name') &&
		    Inputs[i].get('value') == el.get('value'))
		{
		    el.set('type','hidden');
		}else{
		    Inputs[i].set('name','NOSUBMIT');
		}
	    }
	    myForm.fireEvent('submit');
	},

	/**
	 * Prise en charge d'un lien particulier
	 * @param	object	Element lien
	 * @return	void
	 */
	makeSubXHRLink : function(el){
	    el._allerA = el.rel;
	    el.rel     = "noMoreAjax";
	    el.addEvent('click',this.actions.stopEvThen(function(){
		options = el._allerA.split('::');
		var T = this.urlToArray(options[0]);
		var U = this.urlToArray(options[1]);
		if (!this.busy)
		{
		    this.fireEvent('onChanged',U["Complete"]);
		    this.options.Actions[this.options.Actions.length] = function(L)
		    {
			t = new Request.HTML({update:$('Ariane'),
					      url:"/Systeme/Interfaces/FilAriane/Ariane.htm",
					      onSuccess:function(){this.scanLink($('Ariane'));}.bind(this)
					     });
			t.get({"Module":L[0],"Chemin":L[1]});
			t.send();
			this.options.Actions.pop();
		    }.bind(this);
		}
		this.changePage(T["Complete"],undefined,undefined,options[2]);
	    }.bind(this)));
	}
    },

 	/**
	 * Initialisation générale du FrameLoader
	 * @param	object	options
	 * @return	void
	 */
	initialize : function(options){
		this.setOptions(options);
		document.Fl = this;
		if (this.options.Title) document.title = this.options.Title;
	
		// Initialisation Historique
		window.addEvent('domready', function() {
			document._FLNC.History = new HistoryManager();
			document._FLNC.History.addEvent('onHistoryChange', function(hash) {
				if(!hash) hash=document._FLNC.options.DefaultPage;
				document._FLNC.changePage(hash);
			}.bind(document._FLNC));
			document._FLNC.addEvent('onChanged', function(lien) {
				document._FLNC.History.addState(lien);
			}.bind(document._FLNC));
		});
	
		// Aller directement à la page indiquée si lien AJAX
		window.addEvent('domready',function() {
			var url = window.location.href;
			var t = url.split('#');
			if ($defined(t[1]) && !Browser.Engine.trident) {
				if (t[1].search(/htm/) == -1) return;
				Fl.changePage(t[1],true);
			}
		});
	},

	/**
	 * Transforme les liens en liens ajax
	 * @return	void
	 */
    scanLink: function(containerId, target, currentLocation, killer){
		var S = (containerId) ? $(containerId) : document.body;
		// Liens pour une nouvelle fenetre
		S.getElements('a[rel=link]').each(this.actions.makeNewpageLink.bind(this));
		S.getElements('a.lienExterne').each(this.actions.makeNewpageLink.bind(this));
		// Liens multiBox
		var initMultiBox = new multiBox({
			mbClass: '.mb',
			container: S,
			descClassName: 'multiBoxDesc',
			useOverlay: true,
			maxSize: {w:800, h:600},
			addRollover: true
		});
		// Autres liens
		S.getElements('a[rel!=noMoreAjax]').each(function(el){
			if(!this.actions.bAjaxLink(el)) return;
			this.actions.makeXHRLink.bind(this)(el,target);
		}.bind(this));
		// Validation de formulaire
		S.getElements('input[type=submit]').each(function(el){
			el.addEvent('click',function(el){
				this.actions.makeXHRButton.bind(this,el)()}.bind(this,el));
		}.bind(this));
		// Liens internes
       	S.getElements("a[class=internLink]").each(function(el){
			if (el.rel == "noMoreAjax") return;
			this.actions.makeSubXHRLink.bind(this)(el);
		}.bind(this));
		// Formulaires
		S.getElements("form").each(function(el){
			this.actions.makeXHRForm.bind(this)(el,target,currentLocation,killer);
		}.bind(this));
    },

    /**
	 * Changement de page
	 * @param	string		Lien de destination
	 * @param	boolean		Menu Flash ?
	 * @param	???			???
	 * @param	string		Target
	 * @param	object		Argument 2
	 * @param	object		Argument 3
	 * @param	boolean ?	Killer
	 * @return	void
	 */
    changePage : function(lien,flash,init,target,arg2,arg3,killer){
		if (!lien) lien = this.History.getCurrentLocation();
		if (!lien) lien = this.urlToArray(document.location.href)["Complete"];
		if (this.busy && !killer) return ;
		if (!target) target=this.options.Container;
		if (this.options.FlashMenuId && !flash && $chk($(this.options.FlashMenuId))) this.actions.flashChangeMenu.bind(this)(lien,flash);

		if (flash) this.fireEvent('onChanged',lien);
		if (this.options.Icon) this.actions.iconShow(this.options.Icon);
		if (this.options.Overlay) this.options.Overlay.start();
		this.busy = true;
		var Ajx = this.actions.getAjaxObject.bind(this,[lien,target,arg2,arg3,killer])();
		Ajx.send();
    },

    /**
     * Décomposition du lien demandé
     * @param	string	URL
     * @param	string	Suffixe
     * @return	array	URL décomposée en tableau
     */
    urlToArray : function(url, suffix){
		var result = new Array();
		var rawPath = '';
		if (!suffix) suffix = '.htm';
		result["Raw"] = url;
		if (url.search(/http/) != -1)
			url = '/' + url.split('/').slice(3).join('/');
		result["Relative"] = url;
		if (url.search(/\#/) != -1)
		{
			var anchor = url.split('#');
			url = anchor[0];
			result["Anchor"] = anchor[1];
		}
		if (url.search(/\?/) != -1)
		{
			var temp = url.split('?');
			url = temp[0];
			result["GetVars"] = temp[1];
		}
		rawPath = url;
		if (!['','/'].contains(url))
			url = url.split('.')[0] + suffix;
		else if (url != undefined)
			url += suffix;
		else
			rawPath = '';
		result["RawPath"] = rawPath;
		result["Absolute"] = url;
		if (result["GetVars"]!=undefined) url+="?"+result["GetVars"];
		result["Complete"] =url;
		return result;
    },
    
    /**
     * Lancement des actions
     * @return	void
     */
    launchActions : function(){
		for (var i = 0; i < this.options.Actions.length; i++) this.options.Actions[i](this.actions.getModAndKELink.bind(this)());
    },

    /**
     * Lancement des actions "tueuses"
     * @return	void
     */
    launchKillerActions : function(){
		for (var i = 0; i < this.options.killerActions.length; i++) this.options.killerActions[i](this.actions.getModAndKELink.bind(this)());
    },

    /**
     * Ajouter une fonction au load
     * @param	Function	Fonction à executer
     * @param	boolean		Popup ?
     * @return	void
     */
    addToLoad : function(fct,popup){
		if (popup) 	window.addEvent('onPopupLoad',fct);
		else window.addEvent('onFrameLoad',fct);
    },

	/**
	 * Changement rapide
	 * @param	Object	Params
	 * @return	void
	 */
    quickChange : function(params){
		lien = this.History.getCurrentLocation();
		if (!lien) lien = this.urlToArray(document.location.href)["Complete"];
		lien = lien + "?" + params;
		this.changePage(lien);
    },

	/**
	 * Upload de fichier
	 * --> utilisé dans le front ??
	 * @param	string	Container
	 * @param	???		list
	 * @param	???		ke
	 * @param	???		mod
	 * @param	???		obj
	 * @param	boolean	popup
	 * @return	void
	 */
    makeUpload : function(containerId,listId,ke,mod,obj,popup){
		var laterFct = function(containerId,listId,ke,mod,obj){
			var up = new FancyUpload2($(containerId).getElement(".Content"),$(listId),{
			path : '/Skins/' + Skin + '/Js/Swiff.Uploader.swf',
			multiple : false,
			verbose : false,
			target: $(containerId).getElement(".Browse"),
			method : 'get',
			typeFilter : {'Document (*.pdf)' : '*.pdf'},
			url : '/Systeme/User/Upload.htm?KE_SESSID='+ke,
			onLoad: function(containerId,target) {
				target.addEvents({
				click: function() {
					return false;
				},
				mouseenter: function() {
					this.addClass('hover');
				},
				mouseleave: function() {
					this.removeClass('hover');
					this.blur();
				},
				mousedown: function() {
					this.focus();
				}
				});
			}.pass([containerId,$(containerId).getElement(".Browse")]),
			onSelectSuccess : function(cId){
				up.start();
			}.bind(containerId),
			onFileSuccess: function(container, response) {
				var json = new Hash(JSON.decode(response, true) || {});
				var c = this.getElement('.Content');
				c.getElement(".UploadProgress").setStyle('display','none');
				c.getElement("a.Browse").setStyle('display','none');
				c.getElement('form').setStyle('display','block');
				c.getElement('form input[type=hidden]').set('value',json.url);
				c.getElement('form span.fileName').set('html',json.name);
			}.bind($(containerId))
			});	
		}.bind(this,[containerId,listId,ke,mod,obj]);
		this.addToLoad(laterFct,popup);
    }
});


//Initialisation du FrameLoader
frameLoader.implement(new Events);
frameLoader.implement(new Options);

window.addEvent('domready',function() {
	window.fireEvent('onFrameLoad');
	window.removeEvents('onFrameLoad');
});
