/* Fonctions pour les URLS */

function baseUrl(append) {
	return BASE_URL + append;
}

function siteUrl(append) {
	return SITE_URL + append;
}

function ajaxUrl(url) {
	var append = "";
	var info = extractAjaxInfo(url);
	if(info) {
		for(var i = 0; i < info.length;i++) {
			append = append + "/" + info[i];
		}
	}
	return SITE_URL + "Ajax/pageContent" + append;
}

function extractAjaxInfo(url) {

	if(url.search(SITE_URL) == 0) {
		url = url.substr(SITE_URL.length);
	}
	//alert(url);
	var splitUrl = url.split('/');
	if(splitUrl.length >= 1 && splitUrl[0].length > 1) {
		if(splitUrl[0].charAt(0) == '#') {
			splitUrl[0] = splitUrl[0].substr(1);
		}
		if(splitUrl.length == 1) {
			splitUrl.push('index');
		}
		return splitUrl;
	}
	return ['Home', 'index'];
}

function ajaxDashlet(append) {
	return SITE_URL + "Ajax/dashletContent/" + append;
}

function jsUrl(append) {
	return JS_URL + append + '.js';
}

function cssUrl(append) {
	return CSS_URL + append + '.css';
}

function imageUrl(append) {
	return IMAGE_URL + append + '.png';
}

/***************************/

function addCssFile(file, useCssUrl) {
	if (useCssUrl) {
		file = cssUrl(file);
	}
	var css = Asset.css(file);
	return css;
}

function addErrorMessage(inputName, message) {
	var errorElement = new Element('div', {
		'class': 'error-message',
		'html': message
	});
	
	if (inputName != 'recaptcha_response_field') {
		$$('input[name="' + inputName + '"]').each(function(input) {
			errorElement.inject(input, 'after');
		});
		
		$$('textarea[name="' + inputName + '"]').each(function(input) {
			errorElement.inject(input, 'after');
		});
	} else {
		// Pour un recaptcha il faut placer le message ailleurs.
		var widget = $('recaptcha_widget_div');
		if (widget) {
			errorElement.inject(widget, 'after');
		}
	}
}

function setInputValue(inputName, value) {
	$$('input[name="' + inputName + '"]').each(function(input) {
		input.set('value', value);
	});
	
	$$('textarea[name="' + inputName + '"]').each(function(input) {
		input.set('value', value);
	});
}


function AssertException(message) { this.message = message; }
AssertException.prototype.toString = function () {
	return 'AssertException: ' + this.message;
};

function assert(exp, message) {
	if (!exp) {
		throw new AssertException(message);
	}
}

/*
Correction dans index.php

var acceptedURI = new URI(BASE_URL);
var currentURI = new URI(location.href);

if (typeof(page_title) == "undefined" ||
    typeof(BASE_URL) == "undefined"   ||
    page_title != "Warlegend-Project" ||
    (acceptedURI.get('host') != currentURI.get('host') && "www."+acceptedURI.get('host') != currentURI.get('host'))) {
	location.href = "http://warlegend-project.com/Home/pishing";
}
*/

if (typeof(page_title) == "undefined" || typeof(BASE_URL) == "undefined" || page_title != "Warlegend-Project" || location.href.indexOf(BASE_URL) != 0) {
	location.href = "http://warlegend-project.com/Home/pishing";
}

function getXmlDoc(str) {
	if (window.DOMParser) {
		parser = new DOMParser();
		xmlDoc = parser.parseFromString(str,"text/xml");
	} else {
		xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async = "false";
		xmlDoc.loadXML(str); 
	}
	return xmlDoc;
}

var DashletItem = new Class({
	// Si le dashlet est affiché ou pas
	'display': true,
	
	// si superieur a 0 se met a jour tous les x sec
	'updateDelay': 0,
	
	// dernière update 
	'lastUpdateTime': 0,

	// Nom du dashlet
	'name': null,
	
	// Mettre a true si il faut recharger le dashlet quans il s'affiche
	'onDispalyUpdate': false,

	'initialize': function(dashlet) {
		this.name = dashlet.getProperty('name');
		var conf = DASHLET_CONF.get(this.name);
		if(conf) {
			try {
				this.updateDelay = conf.updateDelay;
				this.onDispalyUpdate = conf.onDispalyUpdate;
			} catch (e) {
				this.updateDelay = 0;
				this.onDispalyUpdate = 0;
			}
		}
		if(dashlet.getStyle('display') == "none") {
			this.display = false;
		}
		this.lastUpdateTime = new Date().getTime();
	}
});

var DashletMgr = {
	'dashlets': new Hash(),
	'init': function() {
		$$('.dashlet').each( function(dashlet) {
			DashletMgr.append(dashlet);
		});
		setInterval("DashletMgr.onTick();", 1000);
	},
	
	// met a jour le dash let dont le nom est passé en parametre
	'updateOne': function(name) {
		new Request({
			'url': ajaxDashlet(name),
			'method': 'post',
			'data': 'controller=' + AjaxMgr.lastPage.ajax.controller + '&method=' + AjaxMgr.lastPage.ajax.method + '&args=' + AjaxMgr.lastPage.ajax.args,
			'onSuccess': function(txt) {
				var xml = getXmlDoc(txt);
				DashletMgr.onSuccess(xml);
			}
		}).send();
	},
	
	'onSuccess': function(xml) {
		var dashlets = xml.getElementsByTagName("dashlet");
		if (!dashlets || dashlets.length == 0)
			return;
		
		var x = dashlets[0].childNodes;
		if (x) {
			for(var i = 0;i < x.length;i++) {
				var dashletName = x[i].nodeName;
				var y = x[i].childNodes;
				for(var j = 0; j < y.length; j++) {
					if(y[j].nodeName == "html") {
						var html = y[j].childNodes[0].nodeValue;
						DashletMgr.foreach(dashletName, function(dashlet) {
							dashlet.set('html', html);
						});
					}
					if(y[j].nodeName == "display") {
						var display = (y[j].childNodes[0].nodeValue == 1) ? true : false;
						DashletMgr.foreach(dashletName, function(dashlet) {
							if (display != dashlet.info.display) {
								var valueToSet = display ? 'block' : 'none';
								dashlet.info.display = display;
								dashlet.setStyle('display', valueToSet);
							}
						});
					}
				}
			}
		}
	},

	'onTick': function() {
		var timeStamp = new Date().getTime();
		DashletMgr.dashlets.each( function(dashletSet) {
			dashletSet.each(function(dashlet) {
				if (dashlet.info.updateDelay != 0) {
					if (dashlet.info.lastUpdateTime + (dashlet.info.updateDelay * 1000) < timeStamp) {
						DashletMgr.updateOne(dashlet.info.name);
						dashlet.info.lastUpdateTime = timeStamp;
					}
				}
			});
		});
	},
	
	'append': function(dashlet) {
		dashlet.info = new DashletItem(dashlet);
		if (DashletMgr.dashlets.has(dashlet.info.name)) {
			DashletMgr.dashlets.get(dashlet.info.name).push(dashlet);
		} else {
			DashletMgr.dashlets.set(dashlet.info.name, new Array(dashlet));
		}
	},
	
	'foreach': function(dashletName, fn) {
		var set = DashletMgr.dashlets.get(dashletName);
		if (set) {
			set.each(fn);
		}
	},
	
	'showOne': function(name) {
		DashletMgr.foreach(name, function(fashlet) {
			if (!dashlet.info.display) {
				dashlet.info.display = true;
				dashlet.setStyle('display', 'block');
			}
		});
	},
	'hideOne': function(name) {
		DashletMgr.foreach(name, function(fashlet) {
			if (!dashlet.info.display) {
				dashlet.info.display = false;
				dashlet.setStyle('display', 'none');
			}
		});
	}
};


/**
 * Gestionnaire des status.
 * @author ayane
 */
var StatusMgr = {
	
	'received': false,
	'processCounter': 0,
	'fx': null,
	
	'onLoad': function() {
		if (++StatusMgr.processCounter > 1 && StatusMgr.received) {
			StatusMgr.resetFx();
		}
		
		window.setTimeout(function() {
			if (--StatusMgr.processCounter == 0) {
				var status = $('status');
				if (status != null) {
					if (StatusMgr.fx == null) {
						StatusMgr.fx = new Fx.Tween(status, {
							'link': 'chain',
							'duration': 'long'
						});
					}
					StatusMgr.received = false;
					StatusMgr.fx.start('opacity', 0);
					StatusMgr.fx.start('display', 'none');
				}
			}
		}, 10000);
	},
	
	'onReceive': function(xml) {
		// Cherche les données sur les status
		var xmlShowStatusList = xml.getElementsByTagName('showStatus');
		if (xmlShowStatusList == null || xmlShowStatusList.length == 0)
			return;
		
		// Retrouve l'élément status
		var statusElement = $('status');
		
		// Le créé s'il n'existe pas
		if (statusElement == null) {
			statusElement = new Element('div', {
				'id': 'status'
			});
			statusElement.inject(document.body);
		} else {
			// Supprime les anciens status
			StatusMgr.clear();
		}
		
		// Boucle sur tous les éléments trouvés
		for (var i = 0; i < xmlShowStatusList.length; ++i) {
			var xmlShowStatus = xmlShowStatusList[i];
			for (var j = 0; j < xmlShowStatus.childNodes.length; ++j) {
				var xmlStatus = xmlShowStatus.childNodes[j];
				
				// Ajoute le status
				var statusItemElement = new Element('div', {
					'class': xmlStatus.attributes['type'].nodeValue,
					'text': xmlStatus.textContent
				});
				
				statusItemElement.inject(statusElement);
			}
		}
		
		StatusMgr.received = true;
		StatusMgr.resetFx();
	},
	
	'resetFx': function() {
		if (StatusMgr.fx != null) {
			StatusMgr.fx.cancel();
			StatusMgr.fx.set('opacity', 1);
			StatusMgr.fx.set('display', 'block');
		}
	},
	
	'clear': function() {
		var status = $('status');
		if (status != null) {
			var children = status.getElementsByTagName('*');
			Array.each(children, function(item) {
				item.dispose();
			});
		}
	}

};


var AjaxLink = new Class({
	
	// Tous sur le JS
	'jsFilesUrl': [],
	'jsScripts': [],
	'js': [],


	// Tous sur le CSS
	'cssFilesUrl': [],
	'css': [],

	// link de la requete Ajax
	'requestUrl': null,

	// lien direct de la page
	'directUrl' : null,

	// Le xml retournl par Ajax
	'xml': null, 
	
	'controller': 'Home',
	'method': 'index',
	'args': '',

	// Initialise quelques variables.
	'initialize': function(link) {
		if(link) {
			this.directUrl = link.href;
			//var link = link.href.substr(SITE_URL.length);
			//alert(link);
			var infos = extractAjaxInfo(link.href);
			
			this.controller = infos[0];
			this.method = infos[1];
			if(infos.length > 2) {
				for(var i = 2; i < infos.length;i++) {
					if(i != 2) {
						this.args = this.args + "/";
					}
					this.args = this.args + infos[i];
				}
			}
			
			this.requestUrl = ajaxUrl(this.directUrl);
		}
	}
});

var AjaxMgr = {

	// Contien la dernière page mise a jour
	'lastPage': null,
	
	// Contien la div du centre
	'pageWrapperMiddle': null,
	
	// Contien la balise head de la page
	'head': null,
	
	'isAllScriptsLoaded': true,
	'scriptsCount': 0,
	
	'update': function() {
		$$('a:not(.fullRefresh)').each( function(link) {
			if(link.hasClass('ajaxLink')) {
				return;
			}
			// Si c'est un link interne au site initialise les links.
			if(link.href.search(SITE_URL) == 0) {
				link.ajax = new AjaxLink(link);
			} else {
				return true;
			}
			link.addClass('ajaxLink');
			// Ajoute l'evenement du click sur chaques link
			link.addEvent('click', function() {
				return AjaxMgr.onLinkClicked(this);
			});
		});
	},	
	
	// Initialise les link pour qu'il execute une requete ajax.
	'init': function() {
		AjaxMgr.update();
		
		// Initialise les variables qui seront uriliser a plusieur reprises
		this.pageWrapperMiddle = $('page-wrapper-middle');
		this.head = $(document.head);
		
		
		// Initialise le lastpage pour contenire les link css de la page actuelle.
		this.lastPage = {};
		this.lastPage.ajax = new AjaxLink(false);
		this.lastPage.ajax.css = $$('.ControlerCss');
		
		if(window.location.hash != "") {
			var url = ajaxUrl(window.location.hash);
			//alert(url);
			var infos = extractAjaxInfo(window.location.hash);
			this.lastPage.ajax.controller = infos[0];
			this.lastPage.ajax.method = infos[1];
			if(infos.length > 2) {
				for(var i = 2; i < infos.length;i++) {
					if(i != 2) {
						this.lastPage.ajax.args = this.lastPage.ajax.args + "/";
					}
					this.lastPage.ajax.args = this.lastPage.ajax.args + infos[i];
				}
			}
		
			this.lastPage.ajax.requestUrl = url;
			
			AjaxMgr.onLinkClicked(this.lastPage);
		}
	},
	
	
	// Quand un link est cliqué on execute la fonction suivente
	'onLinkClicked': function(link) {
		var req = new Request({
			'url': link.ajax.requestUrl,
			'onFailure': function() {
				window.location = "/Error/404";
//				alert('Erreur pendant la requete');
			},
			'onSuccess': function() {
				var reponseTxt = this.response.text;
				this.ajaxLink.ajax.xml = getXmlDoc(reponseTxt);
				AjaxMgr.onSuccess(this.ajaxLink);
			}
		});

		
		// permet le transfer du link plus loins
		req.ajaxLink = link;
		req.send();
		return false;
	},
	
	
	// Quand on recoin la réponce ajax d'un link on execute la fonction suivente
	'onSuccess': function (link) {
		var xml = link.ajax.xml;
		var pageMiddle = xml.getElementsByTagName("pageWrapperMiddle");
		if (!pageMiddle || pageMiddle.length == 0)
			return;
		
		DashletMgr.onSuccess(xml);
		StatusMgr.onReceive(xml);
		
		var x = pageMiddle[0].childNodes;
		if(x) {
			for (i=0;i<x.length;i++) {
				if(x[i].nodeName == "html") {
					this.pageWrapperMiddle.empty();
					this.pageWrapperMiddle.set('html', x[i].childNodes[0].nodeValue.stripScripts() );
				}
				
				// Mise a jour des fichier Css Inclus
				if(x[i].nodeName == "addCss") {
					y = x[i].childNodes;
					link.ajax.cssFilesUrl = [];
					for (j=0;j<y.length;j++) {
						if(y[j].nodeName == "file") {
							var urlCss = baseUrl(y[j].childNodes[0].nodeValue);
							link.ajax.cssFilesUrl.push(urlCss);
						}
					}
				}
				
				// Mise a jout des fichier JS
				if(x[i].nodeName == "addJs") {
					y = x[i].childNodes;
					link.ajax.jsFilesUrl = [];
					link.ajax.jsScripts = [];
					for (j=0;j<y.length;j++) {
						if(y[j].nodeName == "file") {
							var urlJS =y[j].childNodes[0].nodeValue;
							link.ajax.jsFilesUrl.push(urlJS);
						}
						if(y[j].nodeName == "script") {
							link.ajax.jsScripts.push(y[j].childNodes[0].nodeValue);
						}
					}
				}
				
				if(x[i].nodeName == "title") {
					document.title = x[i].childNodes[0].nodeValue;
				}
			}
		}
		
		this.updateCss(link);
		this.updateJs(link);
		
		window.location.hash = link.ajax.controller + "/" + link.ajax.method + "/" + link.ajax.args;
		
		this.lastPage = link;
		AjaxMgr.update();
		onPageLoaded();
	},
	
	'updateCss': function(link) {
		this.lastPage.ajax.css = [];
		
		// Ajout des nouveau fichier CSS
		for (var i = 0;i < link.ajax.cssFilesUrl.length;i++) {
			if (this.head.getElement('link[href="' + link.ajax.cssFilesUrl[i] + '"]') == null) {
				css = addCssFile(link.ajax.cssFilesUrl[i], false);
				link.ajax.css.push(css);
			}
		}
	},
	
	'updateJs': function(link) {
		// Supression des anciens fichier JS
		for (var i = 0;i < this.lastPage.ajax.js.length;i++) {
			this.head.removeChild(this.lastPage.ajax.js[i]);
		}
		this.lastPage.ajax.js = [];
		
		// Ajout des nouveaux fichier JS
		if(link.ajax.jsFilesUrl.length > 0) {
			this.isAllScriptsLoaded = false;
		} else {
			this.isAllScriptsLoaded = true;
		}

		this.scriptsCount = link.ajax.jsFilesUrl.length;
		for (var i = 0;i < link.ajax.jsFilesUrl.length;i++) {
			var file = link.ajax.jsFilesUrl[i];
			var script = Asset.javascript(file, {
				'onload': function(){
					AjaxMgr.scriptLoaded();
				}
			});
			
			link.ajax.js.push(script);
		}
		
		// Ajout des codes JS
		
		for (var i = 0;i < link.ajax.jsScripts.length;i++) {
			
			var script = document.createElement('script');
			script.setAttribute('type', 'text/javascript');
			script.text = link.ajax.jsScripts[i];
			document.head.appendChild(script);
			
			link.ajax.js.push(script);
		}
	},
	
	'scriptLoaded': function() {
		this.scriptsCount--;
		if(this.scriptsCount == 0) {
			this.isAllScriptsLoaded = true;
		} else {
			this.isAllScriptsLoaded = false;
		}
	}
};


var ChromeInputRestorer = {
		
	'init': function() {
		if (navigator.userAgent.toLowerCase().indexOf("chrome") >= 0) {
			$$('input["input:-webkit-autofill"]').each(function(input) {
				var id = input.id;
				var newInput = input.clone();
				newInput.inject(input, 'after');
				input.destroy();
				newInput.id = id;
			});
		}
	}
};

var SqueezeBoxScanner = {
    'init' : function() {
        
        if ($('slimbox') && !$('slimbox').hasClass('executed'))
        {
            var reqDialog = new MooDialog.Request($('slimbox').get('href'), null, {
                'class': 'MooDialog myDialog',
                autoOpen: false
            });
            
            function tmp(ev) {
                $$('.MooDialog .btn').addEvent('click', function (ev) {
                    var req = new Request({
                        'url': this.get('rel'),
                        'onSuccess': reqDialog.close()
                    }).send();
                    
                });
            }
            // You want the request dialog instance to set the onRequest message, so you have to do it in two steps.
            reqDialog.setRequestOptions({
                'onSuccess': function(link) {
                    $$('.MooDialog .content').addEvent('domready', function() { tmp.delay(500); });
                },
                onRequest: function(){
                    reqDialog.setContent('loading...');
                    $('slimbox').addClass('executed');
                }
            }).open();

        }
    }
};

function onPageLoaded() {
	/**
	 * Retrait des champs jaunes de Google.
	 * @author ayane
	 */
	ChromeInputRestorer.init();
	
	/**
	 * Cache les messages de status au bout d'un moment.
	 * @author ayane
	 */
	StatusMgr.onLoad();
    
    /**
     * Affiche une popup si nécessaire
     * @author atikae
     */
    SqueezeBoxScanner.init();
	
	/**
	 * Gestion captcha.
	 * @author ayane
	 */
	if (RECAPTCHA_ENABLED)
	{
		var recaptchaDiv = $('recaptcha_div');
		if (recaptchaDiv != null) {
			Recaptcha.create(RECAPTCHA_KEY_PUBLIC, recaptchaDiv, {'theme': 'red'});
		}
	}
}


// Initialisation
window.addEvent('domready', function() {
	if (USE_AJAX) {
		AjaxMgr.init();
		DashletMgr.init();
	}
	
	/**
	 * Tips.
	 * @author ayane
	 */
	var tips = new Tips($$('.tip'));
	
	/**
	 * Gestion de l'ouverture des liens dans un nouvel onglet.
	 * @author ayane
	 */
	$$('a.newtab').each(function(item) {
		item.set('target', '_blank');
	});
	
	window.addEvent('load', onPageLoaded);
	
});





