/* ============================== Variables globales ============================== */
var initialse = false; // True si la méthode init() à déjà été exécutée
var context = []; // webContext actuel de la page
/* Details sur le Webcontext : contient toutes les variables globales de la page courante
 * @context.domain - Domaine url : exemple : iphone.cityvox.fr
 * @context.browser - Type de navigateur, value : (iphone, firefox, ie)
 * @context.areTransformsSupported - Est-ce que les transitions webkit complexes sont supportées
 * @context.cookie - Array contenant le cookie complet dans son état actuel
 * @context.cookieDomain - Domaine du cookie. exemple : cityvox.fr
 * @context.charte - Charte du service : ici IHP
 * @context.ville - Libellé de la ville
 * @context.uid - Identifiant unique de l'utilisateur
 * @context.club - Si l'utilisateur est logué club
 * @context.fond - Style css : nom de la classe à appliquer à la page ('PLM' => Choix Ville, 'RBB' => Choix Theme, 'MUL' => Multicritere, 'DEF' => Profil Lieu, 'NON' => pas d'image de fond par default)
 * @context.pagePath - Nom de la page php qui à été utilisée pour générer le contenu de la page active
 * @context.reste - Reste de la page php qui à été utilisée pour générer le contenu de la page active
 * @context.keywords - Mots clés si utilisation du moteur de recherche
 * @context.pn - Pagination
 * @context.nav - Type de navigation : FIL (Films), SAL (Salles) 
 * || TPL (Traffic +) || INC (Incontournables) || GUI (Guides audio)
 * @context.lie - Lieu de référence pour la géoloc (peut être une station de transport)
 * @context.wgslat - Latitude de référence pour la géolocalisation
 * @context.wgslon - Longitude de référence pour la géolocalisation
 * @context.activeTab - Numéro de l'Onglet Actif
 * @context.oldTab - Ancien onglet
 * @context.posterVisible - Est-ce que le poster est caché ?
 * @context.tab - Nom de l'onglet actif
*/
var xhr_object = []; // Objets XmlHttpRequest
var timerAntiblocage = []; // Timers des requêtes XmlHttpRequest
var ajax_in_progress = [false, false, false, false]; // Y a t'il un chargement Ajax en cours ? 0= main pipe, 1 & 2 & 3 are for ads
var ajax_loaded = [false, false, false, false]; // True si la requête ajax à été chargée correctement
var action_in_progress = false; // Y a t'il une action en cours ?
var transitions_in_progress = false; // Y a t'il une transition en cours ?
var spin_in_progress = false; // Le preloader est-il entrain de tourner

// Fixe temporaire : Correction d'un bug sur le mailto. Au retour sur la webap les transitions ne fonctionnent plus
// Si true : Toutes les prochaines transition s'effectuerons sans effet
var no_more_transitions = false;

var screen_width = 320; // Largeur de la page
var screen_height = 460; // Hauteur de la page

var check_delay = 10000; // Délai d'attente max d'une requête Ajax en Millisecondes
var transitionDuration = 750; // Durée d'une transition classique
var flipDuration = 1200; //Durée d'une transition de type flip

var activePageId; // Id de la page Active 
var idlePageId; // Id de la page Prochaine
var oldPageId; // Id de l'ancienne page

var cookieName = 'cinefilIphone';

// Paramètres à ignorer lors d'un getUrl
var ignore = [	'fond', 'jump1', 'listPreload', 'url', 'target', 'statique', 'charte', 'type', 'going_forward', 
				'club', 'wgslat', 'wgslon', 'add', 'pn', 'nav', 'ville', 'pagePath', 'reste', 'lie', 'nocinap', 'domain',
				'tab', 'cookieDomain', 'cookie', 'browser', 'activeTab', 'areTransformsSupported', 'uid', 'images', 'oldTab', 'posterVisible'];
// Paramètre pour le preload des images par onglet :
var images1 = [];
var images2 = [];
var images3 = [];
var imagesStored = []; // Images stockées, pour être affichées quand présent dans les résultats du moteur de recherche
var nbaffiche;

var filmsList = [];
var idList = [];


/* ============================== Initialisation ============================== */

function init() {
	if (!initialse) {
		initGlobals();
		hide_address_bar();
		
		if (!context.browser) { context.browser = getBrowser(!context.browser); }
		// Gestion du domaine (Permet de gérer si on est en local, demo, test, preprod ou prod)
		
		updateContex(context,analyseURL());

		context.charte = 'IPC';
		context.areTransformsSupported = (window.WebKitCSSMatrix ? true : false);
		context.activeTab = 1; // Par defaut
		context.oldTab = false; // Par defaut
		context.posterVisible = false;
		if (context.pagePath == 'ProfilFilm') { // Pour afficher le poster du film
			context.activeTab = 0;
			context.oldTab = 1;
			context.posterVisible = true;
		}
		if (context.pagePath == 'ChoixFilm') {
			if (context.tab == 'affiche') {
				context.activeTab = 1;
			} else if (context.tab == 'nouveau') {
				context.activeTab = 2;
			} else {
				context.activeTab = 3;
			}
		}
		var cookie = getCookie(cookieName); // Récupération du cookie
		var urlConnue = false;
		if (context.pagePath != 'Accueil') { urlConnue = true; }
		
		if (!cookie) {
			var cookie = []; 
			cookie.uid = createRandomId(10); // Création d'un nouvel UID
		}
		createCookie(cookieName, cookie, context.cookieDomain); // Création ou réécriture du cookie
		updateContextFromCookie(context, cookie); // Mise à jour du webContext
		if (context.pagePath == 'Accueil') { // Exception de la page d'accueil
			addToPage(activePageId, dispHomePage(), false, true, false);
			setTimeout("executeJump('hide')",3000);
		}
		return;
	}
}

/* ============================== Gestion des actions ==============================
 * Analyse le type d'action demandé
 * Fait appel à la bonne méthode pour récupérer le contenu
 * Affiche le contenu avec la bonne transition
 * Index des paramètres que l'on peux transmettre : en plus de tous les paramètres qui sont identiques au context !!!
 * @params.listPreload - si != '' : affiche preloader sur liste et non sur page
 * @params.url - URL de redirection
 * @params.nocinap - Supprime le préfixe 'Cinap' lors d'une demande de page PHP
 * @params.target - Dans le cadre d'une redirection : si target =  blank : ouvre dans une nouvelle fenêtre ou onglet
 * @params.statique - si true : Appel à une méthode statique du framework JS (pas de PHP)
 * @params.jump1 - Scroll de page avant la transition ('hide' => retour en haut de page || 'jump' = > sauter le menu 136px (Par default) || Valeur en pixel)
 * @params.add - si true : on ajoute le contenu de la requête ajax au bas de la page existante
 * @params... Tous les autres paramètres passés sont ajoutés lors de la construction d'url (ex : '.php?autreParam1=valeur1&autreParam2=valeur2),
 *  mais ces paramètres ne sont pas conservés en mémoire par le framework
 * @params.noqs - si true : même si le framework à des paramètres en mémoires, ceux-ci ne serront pas rajoutés à la fin de l'url.
*/ 

function getAction(action, going_forward, type) {
	// Récupération des arguments supplémentaire de la méthode getAction
	var params = [];
	var size=arguments.length;
	if (size >= 4) {
		for (var i= 3; i<size; i=i+2) {
			params [arguments[i]] = arguments[i+1];
		}
	}
	
	// Gestion des cas spécifiques
	var redirect = accueil = false;
	if (action === 'redirect') { redirect = true; } // Si on effectue une redirection
	else if (action === 'Accueil') { accueil = true; } // Si on souhaite afficher la page d'accueil
	
	// Est-ce qu'on doit afficher le preloader ?
	var preload = true;
	if (accueil || redirect || params.listPreload) { preload = false; }
	
	// On demande l'utilisation du pipe Ajax principal
	if (!useMainAjaxPipe(!params.add, redirect, preload)) {
		return; // Si on ne parviens pas à libérer le pipe Ajax principal on ne peut pas continuer l'action
	}
	
	// Dans la cas ou l'on demande une redirecrion
	if (redirect && params.url) { // Dans le cas d'une redirection il n'y a pas d'actions en cours
		// Correction d'un bug sur le mailto. Au retour sur la webap les transitions ne fonctionnent plus
		if (params.nextPageWithoutTransition) { no_more_transitions = true; }
		if (params.target==='blank') { // Ouverture du lien dans un nouvel onglet
			window.open(params.url, '_blank');
		} else { // Ouverture du lien dans l'onglet courant
			window.location=params.url;
		}
		return; // Plus d'action à effectuer
	}
	
	// S'il faut rajouter le preload sur la liste
	if (params.listPreload) { $(params.listPreload).className += ' preload'; }
	
	// TODO : Peut on arreter le chargement des images ici ? (Sauf dans le cas d'un params.add)
	
	// Pour afficher le poster du film
	if (action == 'ProfilFilm' && params.poster) { 
		params.activeTab = 0;
		context.posterVisible = true;
	}
	
	// Type de transition : valeur par default
	if(!type || type === '') { type = 'Cube'; }
	// Correction d'un bug sur le mailto. Au retour sur la webap les transitions ne fonctionnent plus
	if (no_more_transitions) { type = false; }
	params.type = type;
	params.going_forward = going_forward;
	
	if (accueil) { // Page Statique : transition immédiate, on n'a pas besoin d'attendre les données
		var html = dispHomePage();
		transition(type, going_forward, html, 'ACC', false);
		overrideGlobals(params);
	} else { // Page dynamique : Appel à la méthode ajax
		params.pagePath = action;
		var url = getUrl(params);
		getPage(url, params);
	}
}

/* ============================== Méthodes D'accès aux Pages ============================== */

function getPageSuccess(result, params) {
	if(!params.listPreload) { stopSpinning(); }  // Arret du preloader
	if(params.add) { // Ajout de données à la page courante
		if(params.pagePath === 'ChoixFilm' ) {
			var temp = [];
			temp = result.split('@@@@@');
			removeDiv ('footerLinks'+params.tab, 'AutourFilm'+params.tab); // Suppression de l'ancien footerLinks
			addToDiv('AutourFilm'+params.tab, temp[0], true);
			setToDiv('delayedScript'+params.tab, temp[1]);
			setTimeout(function () { executeDivJavascript('delayedScript'+params.tab, context.browser == 'firefox', true); }, 200); //execution du javascript
		} else if (params.pagePath === 'ProfilFilm') {
			if (params.tab === 'avis') {
				removeDiv ('footerLinks', 'AutourAvis'); // Suppression de l'ancien footerLinks
				addToDiv('AutourAvis', result, true);
			} else if (params.tab === 'seances') {
				setToDiv('AutourSeances', result);
				removeClassName($('AutourSeances'), 'hidden');
				executeJump('hide');
			}
		}
		// On  adapte la taille du container à la taille de la nouvelle div
		resizeContainerHeight(1100);
		action_in_progress = false;
	} else { // Création d'une nouvelle page, et transition vers cette nouvelle page
		executeJump('hide'); //Repositionne le scroll et donc la vue en haut de page
		transition(params.type, params.going_forward, result, params.fond, false); // On effectue la trantision
	}
	overrideGlobals(params); // On insère les nouvelles variables globales
}

/* ============================== Gestion des actions ==============================
 * analyseURL()
 * Fonction qui analyse l'url pour en définir le Context
 * Permet de gérer le cas ou l'utilisateur à été redirigé depuis la version web de cinefil
 * @params : url - l'url de la page courante
*/ 

function analyseURL() {
	var url = location.href;
	var params = [];
	var temp  = [];
	var temp1  = [];
	var temp2  = [];
	var temp3 = [];
	
	var temp = url.split('?'); // Supression des paramètres après l'url
	temp1 = temp[0].split('/');
	var size = temp1.length;
	var domain = temp1[2];
	params.fulldomain = domain;
	temp2 = domain.split('.');
	if(temp2[0] == 'www') domain = domain.substr(4); 
	else if(temp2[0] == 'club') domain = domain.substr(5);
	params.domain = domain;
	if (isLocal(params.domain)) {
		params.cookieDomain = params.domain;
	} else {
		params.cookieDomain = domain.substr(2);
	}
	if (temp1[3] == '' || temp1[3] == 'iphonecinefil.html') { // iphonecinefil.html permet de travailler en local
		params.pagePath = 'Accueil';
	} else {
		params.pagePath = temp1[3];
	}
	
	if (size > 4 && temp1[4]) {
		var tmpPagePath = temp1[4];
		// Suppression de 'Cinap' si présent en début du pagePath
		if(tmpPagePath.substr(0,5).toLowerCase() == 'cinap') {
			tmpPagePath = tmpPagePath.substr(5);
		}
		params.pagePath = tmpPagePath;
		
		var city = ['ChoixSalle', 'ProfilSalle', 'SalleProximite'];
		var result = [];
		var tmp = [];
		if (city.indexOf(params.pagePath)!=-1) { // urls avec villes
			if (size > 5 && temp1[5]) { 
				params.ville =  temp1[5];
			}
			if (size > 6 && temp1[6]) {
				params.reste = temp1[6];
			}
			if (size > 7 && temp1[7]) {
				params.tab = temp1[7];
			}
		} else { // urls sans villes
			if (size > 5 && temp1[5]) {
				params.reste = temp1[5];
			}
			if (size > 6 && temp1[6]) {
				params.tab = temp1[6];
			}
		}
	}
	
	var nav = getStringFromRequest('nav');
	if (nav) { params.nav = nav; }
	return params;
}


/* ============================== Création des Urls  ============================== */

// Création des urls cityvox en fonction des paramètres transmis
function getUrl(params) {
	if (!isSet(params) || !params) { //Pas de paramètre, je renvoi l'url générée à partir des paramètres courants
		var params = context;
	}
	var ville = '';
	var reste = '';
	var qs = '';
	var tab = '';
	var nav = '';
	
	var pagePath = context.pagePath;
	var sub = 'www.';
	var http = 'http://';
	
	// --- CLUB ---
	if ((params.club || context.club) && params.club !== 'end') {
		if (params.club) {
			var tmp = {'club' : params.club};
			updateCookie(cookieName, tmp, context);
			context.club = params.club;
		} 
		qs += 'club='+context.club+'&';
	} else if (params.club === 'end' && context.club) { // Déconnexion club
		delKey('club');
		var tmp = {'club' : 'NULL'};
		updateCookie(cookieName, tmp, context);
	}
	// --- PAGE_PATH ---
	if (params.pagePath) { pagePath = params.pagePath; }
	// --- TYPE DE NAVIGATION ---
	if (params.nav) {
		nav = params.nav;
		qs += 'nav='+nav+'&';
	} else if (context.nav){
		nav = context.nav;
		qs += 'nav='+nav+'&';
	}
	// --- VILLE ---
	if (params.ville) { ville = params.ville; }
	else if (nav =='SAL' && context.ville) { ville = context.ville; }
	// --- RESTE ---
	if (params.reste) { reste = params.reste+'/'; }
	// --- Onglet ---
	if (params.tab) { tab = params.tab+'/'; }
	// --- LIEU DE REFERENCE POUR GEOLOC ---
	if (params.lie) {
		qs += 'lie='+params.lie+'&';
	} else if (context.lie){
		qs += 'lie='+context.lie+'&';
	}
	// --- PAGINATION ---
	if (params.pn) { qs += 'pn='+params.pn+'&'; }
	// --- AJOUT A LA PAGE COURANTE ---
	if (params.add) { qs += 'add=true&'; }
	// --- COORDONNEES GPS ---
	if (params.wgslat && params.wgslon) {
		qs += 'wgslat='+params.wgslat+'&wgslon='+params.wgslon+'&';
	} else if (context.wgslat && context.wgslon) {
		qs += 'wgslat='+context.wgslat+'&wgslon='+context.wgslon+'&';
	}
	if (context.uid) {
		params.uid = context.uid;
	}
	// --- AJOUT DES AUTRES PARAMETRES TEMPORAIRES ---
	for (var key in params) {
		if (validkey(key) && ignore.indexOf(key)==-1) {
			qs += key+'='+params[key]+'&';
		}
	}
	
	if (pagePath == 'ProfilFilm') {
		var salles = getSallesPreferes();
		if (salles) { qs += 'salles='+salles+'&'; }
	}
	
	if (qs) {
		qs = '?'+qs; // Rajout du ?
		qs = qs.slice(0,-1); // Suppression du dernier &
	}
	
	if (params.noqs) { qs = ''; }
	
	var test = context.domain.split('.');
	if(Number(test[0]) == test[0]) sub='';
	
	if (params.nocinap) { var prefixe = '';} 
	else { var prefixe = 'Cinap'; }
	var city = ['ChoixSalle', 'ProfilSalle', 'SalleProximite'];
	if (ville && city.indexOf(params.pagePath)!=-1) { ville+= '/'; }
	else { ville = ''; }
	var url = http+sub+context.domain+'/'+prefixe+pagePath+'/'+ville+reste+tab+qs;
	if ((context.domain === 'm.cinefil.localhost' || isLocal(context.domain)) && context.browser!='ie' && window.console && window.console.firebug) {
		console.log('url : '+url); //Pour Firebug
	}
	//alert(url);
	return url;
}

function overrideGlobals(params) {
	// Reset de paramètres
	delKeys(['reste', 'pn', 'tab']);
	images1 = [];
	images2 = [];
	images3 = [];
	imagesStored = [];
	filmsList = [];
	idList = [];
	
	if(params) {
		if (params.activeTab || params.activeTab === 0) { context.activeTab = params.activeTab; } 
		else if (!params.add && !params.avis) { context.activeTab = 1; }
		// --- PAGE_PATH ---
		if (params.pagePath) { context.pagePath = params.pagePath; }
		// --- CHARTE ---
		if (params.charte) { context.charte = params.charte; }
		// --- VILLE ---
		if (params.ville) {
			if (params.ville != context.ville) {
				var tmp = {'ville' : params.ville};
				updateCookie(cookieName, tmp, context);
				context.ville = params.ville;
			}
		}
		// --- RESTE ---
		if (params.reste) { context.reste = params.reste; }

		// --- PAGINATION ---
		if (params.pn) { context.pn = params.pn; }
		// COORDONNEES GPS
		if (params.wgslat && params.wgslon) {
			context.wgslat = params.wgslat;
			context.wgslon = params.wgslon;
		}
		// LIEU DE REFERENCE POUR GEOLOC
		if (params.lie) { context.lie = params.lie }
		// --- TYPE DE NAVIGATION ---
		if (params.nav) { context.nav = params.nav;}
	} else { // Pas de paramètres = Page d'accueil : reset des valeurs
		delKeys(['ville', 'pagePath', 'reste', 'nav']);
	}
}

/* ============================== Méthodes d'affichage statiques ============================== */

// Affichage de la page d'accueil
function dispHomePage() {
	var salles = '';
	delKey('ville');
	context.pagePath = 'Accueil';
	var s = getSallesPreferes();
	if(s) {
		var quelSalle = 'ListeSalles';
		salles = ',\'salles\',\''+s+'\'';
	} else {
		var quelSalle = 'ChoixVille'; 
	}
	today = new Date();
	dateToChange = new Date(2009,7,04);
	var bandeau;
	if(today<dateToChange){
		bandeau = '<IMG class="homeImg" SRC="http://photos.cityvox.com/photos_original/125/233/387453.jpg">';
	}else{
		bandeau = '<script type="text/javascript">'+
					'var qsp = {'+
						'\'ville\' : \'france\','+
						'\'pagePath\' : \'PubliciteOrange\','+
						'\'reste\' : \'_\'+context.uid,'+
						'\'noqs\' : true'+
					'};'+
					'var urlPub = getUrl(qsp)+\'?acc=true\';'+
					'getPub(urlPub, \'AutourPubOrange\', 1);'+
				'</script>';
	}
	
	var html = 	'<div class="main">'+
					'<div id="FILM" onclick="getAction(\'ChoixFilm\', true, \'Cube\', \'nav\', \'FIL\')"><h1>Quel film ?</h1></div>'+
					'<div id="SALLE" onclick="getAction(\''+quelSalle+'\', true, \'Cube\', \'nav\', \'SAL\''+salles+')"><h1>Dans quelle salle ?</h1></div>'+
				'</div>'+ 
				'<div id="AutourPubOrange" class="AutourPubOrange"></div>'+
				bandeau+
				'<!-- eStat -->'+
				'<SCRIPT LANGUAGE="JavaScript">'+
				'<!--'+
				'var _PJS=0;'+
				'//-->'+
				'</script>'+
				'<SCRIPT LANGUAGE="JavaScript" SRC="http://prof.estat.com/js/ml.js"></script>'+
				'<SCRIPT LANGUAGE="JavaScript">'+
				'<!--'+
				'if(_PJS) _estatl("280080157428","230030157427","IPCFRA","---","ACC","---");'+
				'//-->'+
				'</script>'+
				'<noscript>'+
				'<IMG SRC="http://prof.estat.com/m/web/280080157428?g=230030157427&c=IPCFRA&p=---&l3=ACC&l4=---" BORDER="0" WIDTH="1" HEIGHT="1" />'
				'</noscript>'+
				'<!-- /eStat -->';
	return html;
}

/* ============================== Chargement de la page ============================== */

//Creation du addEventListener metode pour IE
if (!document.addEventListener && document.attachEvent){
	context.browser = 'ie';
    Object.prototype.addEventListener = function(eventName, func, capture){
        if (this.attachEvent)
            this.attachEvent('on' + eventName, func);
    }

    var i, l = document.all.length;

    for (i = 0; i < l; i++)
        document.all[i].addEventListener = Object.prototype.addEventListener;

    window.addEventListener = Object.prototype.addEventListener;
    document.addEventListener = Object.prototype.addEventListener;
}

//Creation du Array.indexOf metode pour IE
if(!Array.indexOf){
    Array.prototype.indexOf = function(obj){
        for(var i=0; i<this.length; i++){
            if(this[i]==obj){
                return i;
            }
        }
        return -1;
    }
}

// Appel de la méthode init quand la page est chargée
if (window.addEventListener) {
	window.addEventListener("load", function () { setTimeout(init, 100); }, false);
} else {
	alert('Votre browser n\'est pas supporté sur cette platforme Mobile');
}
