if (!service) var service="skini";
if (!fms_service) var fms_service='skini';
if (!url_basename) var url_basename="http://localhost/skini/web/serveur/serveur.php";
if (!flash_dir )var flash_dir="../flash";

if (!fms_host_rtmp) var fms_host_rtmp='flash.sk-prod.com';
if (!fms_host_rtmpt) var fms_host_rtmpt='flash.sk-prod.com';

// ##############################
// FIXES pour browser spécifiques
// ##############################
// IE 5 ne connaît pas la méthode push
// Attention il considère donc que "push" est une clé du tableau dans une boucle "for"

if (!Array.prototype.push)
Array.prototype.push = function ( element )
{
  this[this.length] = element;
}


// ##############################
// Fonctions génériques : CSS
// ##############################

/**
 * Teste la présence d'une classe dans un objet
 * Renvoie true si l'objet "object" possède la classe "className"
 */
function hasClass(object, className) {
    // si pas de className transmis, renvoie true
    if (!className) return true;
    
    // si l'objet n'a pas de classe renvoie false
	if (!object.className) return false;
	
	// sinon recherche la classe dans la liste des classes
	return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1);
}

/**
 * Rajoute une classe à un objet
 * retourne "true" si modification
 */
function addClass(element, value) {
    // si l'objet n'a pas de classe, initialise
    if (!element.className) {
        element.className = value;
    } else {
        // si l'objet a déjà la classe ne fait rien
        if (hasClass(element, value)) return false;
        
        // sinon rajoute la classe à l'objet
        var newClassName = element.className+" "+value;
        element.className = newClassName;
    }
    return true;
}

/**
 * Supprime une classe d'un objet
 * renvoie "true" en cas de réussite
 */
function removeClass(obj,cName) {
    // si la classe n'est pas présente, ne fait rien
    if (!hasClass(obj, cName)) return false;
    
    // cherche la chaîne dans la liste des classes
    var rep=obj.className.match(' '+cName)?' '+cName:cName;
    
    // supprime la chaîne
    obj.className=obj.className.replace(rep,'');
    return true;
}

/**
 * Retourne la liste des balises de type "elementName" possédant la classe "className"
 * retourne une liste d'objets
 */
function GetElementsWithClassName(elementName, className) {

    // retourne toutes les balises tags
	var allElements = document.getElementsByTagName(elementName);
	
	// si pas de classe demandée, renvoie ces balises
    if (!className) return allElements;
    
    // sinon parcours les éléments
	var elemColl = new Array();
	for (var i = 0; i< allElements.length; i++) {
	   // et renvoie ceux possédant cette classe
		if (hasClass(allElements[i], className)) {
			elemColl[elemColl.length] = allElements[i];
		}
	}
	return elemColl;
}

/**
 * Renvoie un identifiant unique
 */
function uniqid() {
    //getTime renvoie un résultat en millisecondes...
    return Math.ceil(Math.random()*9999)+''+(+new Date().getTime());
}


// ##############################
// Fonctions génériques : Cookies
// ##############################

/**
 * Définit un nouveau cookie juste pour la session (pas d'expire, domaine, etc.)
 */

function setCookie (name, value) {
	var argv=setCookie.arguments;
	var argc=setCookie.arguments.length;
	var expires=(argc > 2) ? argv[2] : null;
	var path=(argc > 3) ? argv[3] : null;
	var domain=(argc > 4) ? argv[4] : null;
	var secure=(argc > 5) ? argv[5] : false;
	document.cookie=name+"="+escape(value);

/*	document.cookie=name+"="+escape(value)+
		((expires==null) ? "" : ("; expires="+expires.toGMTString()))+
		((path==null) ? "" : ("; path="+path))+
		((domain==null) ? "" : ("; domain="+domain))+
		((secure==true) ? "; secure" : "");
		*/
}

/**
 * Renvoie le contenu d'une sous-chaîne cookie à partir d'un offset déterminé
 */
function getCookieVal(offset) {
	var endstr=document.cookie.indexOf (";", offset);
	if (endstr==-1)
      		endstr=document.cookie.length;
	return unescape(document.cookie.substring(offset, endstr));
}

/**
 * Renvoie la valeur d'un cookie
 */
function getCookie (name) {
	var arg=name+"=";
	var alen=arg.length;
	var clen=document.cookie.length;
	var i=0;
	while (i<clen) {
		var j=i+alen;

		if (document.cookie.substring(i, j)==arg)
            return getCookieVal (j);
        i=document.cookie.indexOf(" ",i)+1;

        if (i==0) break;
    }
	return null;
}


// ##############################
// Fonctions génériques : Paramètres de ligne de commande
// ##############################

/**
 * Découpe la chaîne de paramètres
 */

/* Client-side access to querystring name=value pairs
	Version 1.2.3
	22 Jun 2005
	Adam Vandenberg
*/
function Querystring(qs) { // optionally pass a querystring to parse
	this.params = new Object()
	this.get=Querystring_get
	
	if (qs == null)
		qs=location.search.substring(1,location.search.length)

	if (qs.length == 0) return

// Turn <plus> back to <space>
// See: http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4.1
	qs = qs.replace(/\+/g, ' ')
	var args = qs.split('&') // parse out name/value pairs separated via &
	
// split out each name=value pair
	for (var i=0;i<args.length;i++) {
		var value;
		var pair = args[i].split('=')
		var name = unescape(pair[0])

		if (pair.length == 2)
			value = unescape(pair[1])
		else
			value = name

		this.params[name] = value
	}
}

/**
 * récupère un des paramètres de l'adresse
 */
function Querystring_get(key, default_) {
	// This silly looking line changes UNDEFINED to NULL
	if (default_ == null) default_ = null;
	
	var value=this.params[key]
	if (value==null) value=default_;
	
	return value
}

// ##############################
// Fonctions génériques : RPC / Ajax
// ##############################
/**
 * Charge une page en GET, ou en POST s'il y a un tableau data
 */

function load(filename, data) {
	var xmlhttpreq=null;
	if (window.XMLHttpRequest) {
		xmlhttpreq = new XMLHttpRequest();
		// évite un Bug du navigateur Safari :
		if (xmlhttpreq.overrideMimeType)
			xmlhttpreq.overrideMimeType("text/xml");
	} else if (window.ActiveXObject) {
		try {
			xmlhttpreq = new ActiveXObject("Msxml2.XMLHTTP");
		} catch (e) {
			try {
				xmlhttpreq = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (e){}
		}
	}
	// chargement go!
	if (xmlhttpreq) {
	    var method;
	    if (data) {
	       method='POST';
	       mode=false;
	    } else {
	       method='GET';
	       mode=false;
	    }
		xmlhttpreq.open (method, filename, mode);
		//var header='Content-Type:application/x-www-form-urlencoded; charset=UTF-8';
		//if (method=='POST') xmlhttpreq.setRequestHeader(header.split(':')[0],header.split(':')[1]); 
		if (method=='POST') xmlhttpreq.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8'); 
		xmlhttpreq.send (data);
		return xmlhttpreq.responseText;
	}
	return false;
}


/**
 * récupère ou envoie des données via AJAX
 */
function getAJAX() {
	/**
	 * calcul du chemin d'accès au serveur
	 */
	var url=url_basename+"?";
	for (var i=0;i<arguments.length;i++) {
		url+=escape(arguments[i])+"+";
	}

	/**
	 * ajout d'un id unique pour éviter les pbms de cache
	 */
	var d=new Date();
	url+=d.getTime();
//	alert(load(url));
	return eval('('+load(url)+')');
}

/**
 * Envoie des données via AJAX
 */
function postData(data) {
	/**
	 * calcul du chemin d'accès au serveur
	 */
	var url=url_basename+"?postData+";
	/**
	 * ajout d'un id unique pour éviter les pbms de cache
	 */
	var d=new Date();
	url+=d.getTime();

	return eval('('+load(url, data)+')');

}
// ##############################
// captureFlash
// ##############################
// numéro du player en cours
var cntPlayer=0;
// contient la liste des vidéos et zero si elles ont été faites
var tabVideos=new Array();

// paramètres du lecteur Flash par défaut
var flash_params=new Array();
flash_params['upstreamUrl']='rtmp%3A%2F%2F'+fms_host_rtmp+'%2F'+fms_service+'%2Fdefault';
flash_params['upstreamUrl2']='rtmpt%3A%2F%2F'+fms_host_rtmpt+'%2F'+fms_service+'%2Fdefault';
flash_params['videoBasename']='test';
flash_params['connectionLatency']='1500';

/**
 * affichage d'un composant de capture flash déterminé
 */
function newPlayer(etiquette, nb, video, duration, maxTime) {
	var uid = new Date().getTime()+cntPlayer;
	cntPlayer++;
	var params='';
	flash_params['videoBasename']=video;
	flash_params['previousDuration']=duration;
	flash_params['maxTimeLength']=maxTime;
	flash_params['etiquette']=nb;
	flash_params['jsEventHandler']='flashGet';
	tabVideos['video_'+nb]=(duration)?0:1;
	for (var k in flash_params) params+=k+'='+flash_params[k]+'&amp;';
	
	var tag = new FlashTag(flash_dir+'/capture/capture.swf?'+params, 397, 265); // last two arguments are height and width
	tag.setFlashvars('lcId='+uid);
    document.getElementById(etiquette).innerHTML=tag;
	var flashProxy = new FlashProxy(uid, flash_dir+'/JavaScriptFlashGateway.swf');

}

/**
 * affichage d'un lecteur flash (confirmation vidéo finale)
 */
function newLecteur(obj) {
	var uid = new Date().getTime()+cntPlayer;
	cntPlayer++;
	var url=flash_dir+'/player/player.swf?playlistUrl='+escape(url_basename)+'%3FgetPlaylist%2B'+id_contribution+'%2B'+uid+'&amp;lang=fr';
	var tag = new FlashTag(url, 340, 275); // last two arguments are height and width
	tag.setFlashvars('lcId='+uid);
    obj.innerHTML=tag;
	var flashProxy = new FlashProxy(uid, flash_dir+'/JavaScriptFlashGateway.swf');
}

/**
 * fonction d'interception des évènements du composant de capture
 */
function flashGet() {
	switch(arguments[0]) {
		case "captureFinished":
			setCaptureFinished(arguments[1], arguments[2]);
		break;	
	}	
}

/**
 * enregistre la durée d'une capture vidéo
 */
function setCaptureFinished(video, duree) {
    getAJAX('setCaptureTime', id_contribution, service, video, duree);
	tabVideos['video_'+video]=0;
}


// ##############################
// Fonctions spécifiques
// ##############################

//var metadonnees = new Array();

// champs de métadonnées
var champs=new Array();
var champs_obligatoires=new Array();

// champs obligatoires


/**
 * initTag: initialise un tag
 * restaure la dernière donnée saisie
 * place l'observateur d'évènements sur un tag
 */

function initTag(tagName, className) {
	var tChamps=GetElementsWithClassName(tagName, className);

	for (var i=0;i<tChamps.length;i++) {
	   // ajoute à la liste des champs
	    champs.push(tChamps[i]);

	    // remplace les espaces dans le nom par un underscore
	    var name=tChamps[i].name.replace(/\ /g, '_');
	    
	    // si la métadonnées a déjà été saisie, la réaffecte
	    // et met en place les observateurs d'évènement
	    if (donnees['metadonnees'][name]) {
	       switch(tChamps[i].type) {
	           case "checkbox":
	               tChamps[i].checked=donnees['metadonnees'][name] ? true : false;
	               tChamps[i].onclick=saveChamp;
	               tChamps[i].onchange=saveChamp;
               break;
	           case "radio":
	               if (tChamps[i].value==donnees['metadonnees'][name]) {
	                   tChamps[i].checked=true;
	               }
            	   tChamps[i].onchange=saveChamp;
	           break;
	           default:       
        	       tChamps[i].value=donnees['metadonnees'][name];
            	   tChamps[i].onchange=saveChamp;
    	       break;
	       }
	    }
	    // si le champ est obligatoire, l'ajoute à la liste
		if (hasClass(tChamps[i], 'skini_obligatoire')) {
			champs_obligatoires.push(tChamps[i]);
		}
	}
}

/**
 * getIdContribution : récupère l'identifiant de Contribution; ou le crée!
 */
var id_contribution=null;

/**
 * renvoie l'id de l'utilisateur courant
 */
function getIdContribution() {
    // récupère l'id depuis l'URL
    var qs = new Querystring()
    var id=qs.get("id");
    
    if (!id) { // sinon parse l'URL
        id=getCookie(service + '_id');
        if (!id) id=uniqid();
    }
    // affecte un cookie
    setCookie(service+'_id', id);
    return id;
}

/**
 * initCaptureFlash: met en place les enregistreurs flash
 */
function initCaptureFlash() {
    // cherche les "div" de classe "captureFlash"
	var tChamps=GetElementsWithClassName('div', 'captureFlash');

    // pour chacun d'entre eux initialise le lecteur
	for (var i=0;i<tChamps.length;i++) {
        // les informations sont contenues dans le nom "id"
        var video=tChamps[i].id;
        var duree=0;
        var tab=video.split(/_/);

        // récupère la durée si la vidéo a déjà été faite
        if (donnees&&donnees['videos']&&donnees['videos'][tab[1]])
            duree=donnees['videos'][tab[1]]['duree'];
            
        // affiche le player
        newPlayer(video, tab[1], id_contribution + '_' + tab[1], duree, tab[2]*1000);
    }
}

/**
 * initialise le lecteur flash de confirmation
 */
function initLecteurFlash() {
    var champ=document.getElementById('lecteurFlash');
    if (champ) newLecteur(champ);
}

/**
 * initFormulaire: place l'observateur d'évènements
 */
var donnees;
function initFormulaire() {
    /*
      récupération de l'id de contribution
     */    
    id_contribution=getIdContribution();
    donnees=getAJAX('getData', id_contribution);

    champs=new Array();
    initTag('input');
    initTag('select');
    initTag('textarea');
    initCaptureFlash();
    initLecteurFlash();
}

// indique que les données ont été modifiées sur la page actuelle
var modifie=false;

/**
 * saveChamp: enregistre le champ modifié dans le tableau de métadonnées
 */
function saveChamp() {
    modifie=true;
    
    // vérifie si le champ est obligatoire
    verifChamp(this);
    //metadonnees[this.name]=this.value;
}

/**
 * provoque des actions au chargement de la page
 */

window.onload=initFormulaire;

/**
 * savePage: sauvegarde les éléments de la page courante
 */

function savePage(force) {
    modifie=0;
    var res='';
    
    // parcourt les différents champs
	for (var i=0;i<champs.length;i++) {
	    // sauf les champs à ne pas enregistrer
		if (!hasClass(champs[i], 'skini_transparent')) {
	       res+=champs[i].name+'='+champs[i].value+'&';
	    }
	}
    
    // en l'absence de champ à enregistrer renvoie true
    if (!res) return true;
 
	res+='skini_id='+id_contribution;
	res+='&skini_service='+service;
    
    // sinon si tous les champs obligatoires ont été remplis
    // ou que l'on souhaite forcer la sortie, renvoie true
    if (force||verifChampsObligatoires()) {
        return postData(res);
    }
    return false;
    // interromp le changement de page.
    //document.location=self.document.location;
}

/**
 * vérifie si le champ est bien rempli
 * renvoie true si le champ n'est pas obligatoire ou si le champ est rempli 
 */

function verifChamp(champ, nocolor) {
    var cond=false;

    // si le champ est obligatoire vérifie qu'il est rempli
    if (hasClass(champ, 'skini_obligatoire')) {
        switch (champ.type) {
            case "checkbox":
                cond=champ.checked;
            break;
            default:
                cond=champ.value?true:false;
            break;
        }
    } else cond=true; // sinon true

    // si on souhaite la couleur
    if (!nocolor) {
        if (!cond) { // si erreur, changement couleur
            addClass(champ, 'skini_obligatoire_erreur');
        } else { 
            // sinon pas de couleur
            removeClass(champ, 'skini_obligatoire_erreur');
        }
    }
    
    return cond;
}

/**
 * Vérifie l'ensemble des champs obligatoires du formulaire
 * nocolor=true si on ne souhaite pas de mise en valeur des couleurs
 */
function verifChampsObligatoires(nocolor) {
    var ret=true;
    // parcourt chacun des champs obligatoires
	for (var i=0;i<champs_obligatoires.length;i++) {
	   ret=verifChamp(champs_obligatoires[i], nocolor)&&ret;
    }
    
    // vérifie que toutes les vidéos ont été enregistrées
    for (var k in tabVideos) {
        // fix for ie5
        if (k!='push')
        ret=(tabVideos[k]?false:true)&&ret;
    }
    return ret;
}

/**
 * Indique qu'une contribution est terminée 
 */
function ValideDonnees() {
    var ret=getAJAX('valide', id_contribution);
    // regénère un nouvel id pour l'utilisateur
    setCookie(service+'_id', uniqid());
    return true;
}

function testEnvoi() {
    savePage();
    return false;
}

/**
 * provoque des actions lorsque l'on quitte la page
 */

function sortiePage() {
    if (modifie==1) {
        // GetText
        if (confirm('Voulez-vous enregistrer les modifications?')) {
            savePage();
        }
    }
}

//window.onunload=sortiePage;