var Cacaoweb = {
	version: 2.0,
	timerTasksInterval: 1.0,
	lasttimeclientrunning: 0,
	isclientrunningHysteresisInterval: 30000,
	timeoutClientAlive: 2000,
	timeStart: (new Date()).getTime(),
	status: 'Unknown',
	myFunc: null,
	
	
	/**
	 * Lance le téléchargement de cacaoweb en fonction de la plateforme de l'utilisateur
	 */
	download: function() {
		var platform = "Windows";
		
		if ( navigator.platform != null ) {
			if ( navigator.platform.indexOf( "Win32" ) != -1 ) {
				platform = "Windows";
			} else if ( navigator.platform.indexOf( "Win64" ) != -1 ) {
				platform = "Windows";
			} else if ( navigator.platform.indexOf( "Win" ) != -1 ) {
				platform = "Windows";
			} else if ( navigator.platform.indexOf( "Linux" ) != -1 ) {
				platform = "Linux";
			} else if ( navigator.platform.indexOf( "SunOS i86pc" ) != -1 ) {
				platform = "Solaris x86";
			} else if ( navigator.platform.indexOf( "SunOS sun4u" ) != -1 ) {
				platform = "Solaris SPARC";
			} else if ( navigator.platform.indexOf( "SunOS" ) != -1 ) {
				platform = "Solaris SPARC";
			} else if ( navigator.platform.indexOf( "Mac" ) != -1 && navigator.platform.indexOf( "Intel" ) != -1 ) {
				platform = "Mac OSX Intel";
			} else if ( navigator.platform.indexOf( "Mac" ) != -1 && navigator.platform.indexOf( "PPC" ) != -1 ) {
				platform = "Mac OSX PPC";
			} else if ( navigator.platform.indexOf( "Mac" ) != -1 ) {
				platform = "Mac OSX" ;
			} else
				platform = navigator.platform;
		}
		
		var uri;
		
		if (platform == "Windows"){
			uri = "http://www.sourceforge.net/projects/cacaoweb/files/cacaoweb.exe/download";
		} else if (platform == "Mac OSX" || platform == "Mac OSX Intel") {
			uri = "http://www.sourceforge.net/projects/cacaoweb/files/cacaoweb.dmg/download";
		} else if (platform == "Linux") {
			uri = "http://www.sourceforge.net/projects/cacaoweb/files/cacaoweb.linux/download";
		}
			
		setTimeout(function(){window.location.href = uri;},  500 );
	},
	
	/**
	 * Inclut le script 'filename' en utilisant l'id 'scriptname'
	 * (seul moyen de contourner la same origin policy pour échanger des données avec, par exemple, cacaoweb sur localhost)
	 * Supprime les précédents scripts insérés avec la même id 'scriptname'
	 * 
	 * @param	filename		Nom du fichier JS à inclure
	 * @param	scriptname		Id du script inclus
	 */
	includeScript: function(filename, scriptname){
		var htmlDoc = document.getElementsByTagName('body').item(0);
		var scriptblock = document.getElementById(scriptname); 
		if (scriptblock) {
			htmlDoc.removeChild(scriptblock);
		}
		var script = document.createElement("script");
		
		script.id = scriptname;
		script.src = filename;
		script.language = 'javascript';
		script.type = 'text/javascript';
		htmlDoc.appendChild(script);
	},
	
	/**
	 * Permet de spécifier une fonction qui sera appelée périodiquement en envoyant le status de cacaoweb
	 * La fonction doit prendre un argument (qui sera le status de cacaoweb)
	 */
	periodicalExecuter: function(myFunc){
		this.myFunc = myFunc;
	},
	
	/**
	 * Met à jour le statut de cacaoweb.
	 * On		si cacaoweb tourne sur la machine
	 * Off		si cacaoweb ne tourne pas sur la machine
	 * Unknown	si le statut n'a pas encore été initialisé ou s'il n'a plus été mis à jour depuis un certain délai
	 */
	updateStatusVariable: function() {
		if ((new Date()).getTime() - this.lasttimeclientrunning < this.timeoutClientAlive + this.isclientrunningHysteresisInterval) {
			this.status = 'On';
		} else if ((new Date()).getTime() - this.timeStart < 2000) {
			this.status = 'Unknown';
		} else {
			this.status = 'Off';
		}
	},
	
	/**
	 * Met à jour le statut des boutons cacaoweb de la page 
	 */
	updateBtn: function() {
		var buttons = document.getElementsByTagName('button');
				
		//Pour chaque bouton portant la classe "btn-status-cacaoweb"
		for(i = 0; i < buttons.length; i++)	{
			if(buttons.item(i).className && buttons.item(i).className.match(/\bbtn-status-cacaoweb\b/g)) {
				var button = buttons.item(i);
				
				if(this.status == 'On'){
					button.className = 'btn-status-cacaoweb btn-status-cacaoweb-on';
					button.onclick = null;
				}else if (this.status == 'Off') {
					button.className = 'btn-status-cacaoweb btn-status-cacaoweb-off';
					button.onclick = Cacaoweb.download;
				}else {
					button.className = 'btn-status-cacaoweb btn-status-cacaoweb-unknown';
					button.onclick = Cacaoweb.download;
				}				
			}
		}
	},
	
	/**
	 * Toutes les actions à effectuer à chaque fois qu'il peut y avoir un changement dans le statut
	 */
	updateActions: function() {
		this.updateStatusVariable();
		
		if(this.myFunc != null)
			this.myFunc(this.status);
		
		this.updateBtn();
	},
	
	/**
	 * Vérifie et met à jour à jour le statut de cacaoweb
	 */
	checkInstalled: function() {
		var i = Math.floor(Math.random() * 1000000);
		if (this.lasttimeclientrunning == 0 || (new Date()).getTime() - this.lasttimeclientrunning > this.isclientrunningHysteresisInterval) {
			this.includeScript('http://127.0.0.1:4001/isrunning?unique=' + i, 'isrunningscript');
		}
		this.updateActions();
	},

	/**
	 * Fonction appelée en callback de checkInstalled () (par le client cacaoweb s'il est démarré)
	 */
	callbackIsRunning: function() {
		Cacaoweb.lasttimeclientrunning = (new Date()).getTime();
		this.updateActions();
	}


}

setInterval(function() {
				Cacaoweb.checkInstalled();
			}, Cacaoweb.timerTasksInterval * 1000);
