var common_message = {
"tmaccessdenied_qdefault" : "Vous ne pouvez pas \"Retrouver une note\" pour le moment.\n\nSi le problème persiste veuillez vous déconnecter puis reconnectez-vous." ,
"tmaccessdeniededit" : "Vous ne pouvez pas \"Retrouver une note\" pour le moment.\n\nVous devez d'abord annuler ou valider les modifications de la note accuellement éditée." ,
"tmoneselected" : "Ramener la note sélectionnée" ,
"tmseveralselected" : "Ramener les notes sélectionnées" ,
"tminit" : "Pour retrouver une note supprimée, cliquez sur la flèche de gauche." ,
"tminstructions" : "Quand vous avez retrouvé la note, cliquez sur la note puis sur <b>Ramener</b>." ,
"authaskid" : "SVP veuillez d'abord fournir un identifiant Quomodo." ,
"authaskpassw" : "SVP veuillez d'abord fournir un mot de passe." ,
"serverbusy" : "Opération en cours, veuillez réessayer dans quelques instants." ,
"unexperror" : "Unexpected error: a new session id could not be found." ,
"badrequest" : "Vos modifications n'ont pas été enregistrées, et cette page est maintenant déconnectée du serveur. \n\nFermez cette fenêtre puis reconnectez-vous, ou bien changez maintenant d'espace puis revenez sur celui-ci uniquement au moyen des onglets de vos espaces : ceci reconnectera cette page." ,
"safaribugarrow" : "En raison d'un bug de Safari, vous ne pouvez pas utiliser les flèches Précédent - Suivant de votre navigateur : utilisez plutôt les liens et les onglets présents sur votre page." ,
"sigbug" :  "Si vous n'utilisez pas Safari, n'hésitez pas à signaler ce bug à l'équipe Quomodo." ,
"alertdoyoureally" : "Vos modifications seront définitivement perdues." ,
"today" : "aujourd'hui" ,
"yesterday" : "hier" ,
"tomorrow" : "demain" ,
"availablesoon" : "Bientôt disponible..." ,
"currlanguage" : "fr" ,
"msgfoldleftcol" : "Cliquez pour passer en mode plein écran",
"msgunfoldleftcol" : "Cliquez pour quitter le mode plein écran",
"emptyrecentcol" : "Au fur et à mesure que vous constituerez votre site, cette zone affichera des liens vers chacune de vos pages." ,
"promptpages" : "Pages récentes" ,
"allservices" : "Ajouter une page" ,
"promptservices" : "Services récents" ,
"on" : "sur" ,
"newspacetabname" : "nouvel espace..." ,
"declineinvite" : "Votre invitation sera conservée pendant 1 semaine, vous pourrez y donner suite ultérieurement si vous le souhaitez. Vous allez maintenant être redirigé(e) vers la page d'accueil de Quomodo" ,
"membersonly" : "Cette fonction est réservée aux membres Quomodo. \n\nVeuillez vous inscrire d'abord. L'inscription sur Quomodo est gratuite et rapide, aucune information personnelle ne vous sera demandée." ,
"not enough rights" : "Vous n'avez pas les droits nécessaires pour faire un nouveau %s." ,
"newpageprompt" : "Nouvelle page %s :" ,
"newnameprompt" : "Indiquez un nom pour la nouvelle page %s :" ,
"taken" : "Le nom \"%s\" est déjà pris, vous pouvez en choisir un autre :" ,
"decsep" : "," ,
"bytesondisk" : " octets" ,
"kbondisk" : " ko" ,
"mbondisk" : " Mo" ,
"gbondisk" : " Go" ,
"maxsizereached" : "Téléchargement impossible : votre site dépasse l'espace disque alloué (%maxmb). Pour régulariser la situation et ré-autoriser les téléchargements, supprimez les fichiers inutiles dans la Gestion des fichiers, ou souscrivez à une Option Giga dans la Gestion du site." ,
"overspace" : "Téléchargement de ce fichier impossible. Le fichier dépasse de %overspace l'espace disque alloué (%maxmb). Pour autoriser son téléchargement, supprimez les fichiers inutiles dans la Gestion des fichiers, ou souscrivez à une Option Giga dans la Gestion du site." ,
"firstmaxsizereached" : "Attention, vous venez de dépasser l'espace disque alloué (%maxmb). Pour augmenter l'espace disque alloué, souscrivez à une Option Giga dans la Gestion du site." ,
"pagesmenuname" : "les pages de l'espace" ,
"pagescreatenew" : "Ajouter une page" ,
"undefineduser" : "membre inconnu" ,
"ajaxerror": "Toutes nos excuses, une erreur est survenue." ,
"ajaxerror:": "Toutes nos excuses, une erreur est survenue : " ,
"tryagain": "Toutes nos excuses, une erreur est survenue. Veuillez ré-essayer ultérieurement." ,
"createfailed": "La nouvelle note n'a peut-être pas été enregistrée: veuillez recommencer l'opération." ,
"changefailed": "Les modifications n'ont peut-être pas été enregistrés: veuillez recommencer l'opération." ,
"suppressfailed": "La suppression n'a peut-être pas été enregistrée: veuillez recommencer l'opération." ,
"filelocked" : "fichier en cours d'utilisation" ,
"filenotfound" : "fichier introuvable" ,
"flashPuzzleMsg" : "&legende_vert=laisser<br>des<br>messages&legende_orange=partager<br>photos,<br>vidéos...&legende_rouge=planifier<br>les activités<br>des<br>enfants&legende_bleu=organiser<br>ensemble<br>anniversaires,<br>vacances..." ,
"smartnotename" : "Smartnote %" ,
"svcaccessdenied" : "Vous n'avez pas accès à cette page." ,
"forcehomepage" : "Vous n'avez plus accès à cette page." , 
"alerterror" : "Toutes nos excuses, une erreur est survenue. \n Si ce problème venait à persister, merci de nous en faire part en nous transmettant les informations suivantes : \n\n " , 
"alertenderror" : " \n\nD'avance, merci pour votre contribution." ,
"quittingeditmode" : "Une note de la page est en cours de modification. Si vous cliquez OK, vous allez maintenant quitter cette page et les modifications risquent d'être perdues. Pour d'abord terminer les modifications de la note, cliquez maintenant sur Annuler." ,
"rubric" : "Rubrique" ,
"clicktoaccesstopage" : "Cliquez pour accéder à la page" ,
"noemptyemail" : "Le champ e-mail est obligatoire." ,
"invalidemail" : "Adresse e-mail invalide." ,
"onlyoneemail" : "Vérifiez que vous n'avez indiqué qu'une seule adresse e-mail." ,
"leadingspace" : "Vérifiez que vous n'avez pas laissé un espace au début de l'adresse e-mail." ,
"trailingspace" : "Vérifiez que vous n'avez pas laissé un espace à la fin de l'adresse e-mail." ,
"nospaceinemail" : "Vérifiez que vous n'avez pas laissé un espace dans l'adresse e-mail." ,
"noaccentinemail" : "L'adresse e-mail que vous avez indiquée comporte une lette accentuée (%). Veuillez la remplacer par la lettre non accentuée correspondante." ,
"nocedillainemail" : "L'adresse e-mail que vous avez indiquée comporte une cédille (Ç ou ç). Ce caractère est invalide." ,
"invalidcharinemail" : "L'adresse e-mail que vous avez indiquée comporte un caractère invalide (%)." ,
"loginmsg" :  "" ,
"close" : "Fermer" ,
"entry_missing" : "Les champs marqués d'une astérisque sont obligatoires." ,
"entry_invalidemail" :  "L'adresse e-mail est invalide." ,
"defaultwait" :  "Veuillez patienter..."
} ;

var q_lang = common_message[ "currlanguage" ] ;
var mname = {
"0" : "janvier", 
"1" : "février", 
"2" : "mars", 
"3" : "avril", 
"4" : "mai", 
"5" : "juin", 
"6" : "juillet", 
"7" : "août", 
"8" : "septembre", 
"9" : "octobre", 
"10" : "novembre", 
"11" : "décembre"
} ;

var mshortname = {
"0" : "jan", 
"1" : "fév", 
"2" : "mars", 
"3" : "avr", 
"4" : "mai", 
"5" : "juin", 
"6" : "juil", 
"7" : "août", 
"8" : "sept", 
"9" : "oct", 
"10" : "nov", 
"11" : "déc"
} ;

var dname = {
"0" : "dimanche", 
"1" : "lundi", 
"2" : "mardi", 
"3" : "mercredi", 
"4" : "jeudi", 
"5" : "vendredi", 
"6" : "samedi"
} ;

var dshortname = {
"0" : "dim", 
"1" : "lun", 
"2" : "mar", 
"3" : "mer", 
"4" : "jeu", 
"5" : "ven", 
"6" : "sam"
} ;

var dlettername = {
"0" : "Di", 
"1" : "Lun", 
"2" : "Ma", 
"3" : "Me", 
"4" : "Je", 
"5" : "Ve", 
"6" : "Sa"
} ;



function checkauthparams() {
	if ( ( getelement ( "edituserid" ) ) && ( getelement ( "edituserid" ).value == "" ) ) {
		alert( common_message[ "authaskid" ] ) ;
		focusandselect ( "edituserid" ) ;
		return false ;
	}
	if ( ( getelement ( "editpassword" ) ) && ( getelement ( "editpassword" ).value == "" ) ) {
		alert( common_message[ "authaskpassw" ] ) ;
		focusandselect ( "editpassword" ) ;
		return false ;
	}
	return true ;
}

function validateauth( callBackFunction ) {
	if ( ! q_readytosubmit() ) return false ;
	if ( ( ! callBackFunction ) || ( callBackFunction == null ) ) callBackFunction = handleauthresult ;
	if ( ! checkauthparams() ) return false ;
	if ( getelement ( "edituserid" ) ) document.mainform.canuserid.value = getelement ( "edituserid" ).value ;
	if ( getelement ( "editpassword" ) ) document.mainform.canpassword.value = getelement ( "editpassword" ).value ;
	var i = hiddenoptional.length ;
	hiddenoptional[ i ] = "canuserid" ;
	hiddenoptional[ ( i+1 ) ] = "canpassword" ;
	var savedmission = document.mainform.mission.value ;
	document.mainform.mission.value = "login" ;
	q_ajaxsubmit( "" , callBackFunction ) ;
	hiddenoptional.splice( i , 2 ) ;
	document.mainform.mission.value = savedmission ;
	return false ;
}

function jsvalidateauth( callBackFunction ) {
	if ( ! q_readytosubmit() ) return false ;
	if ( ( ! callBackFunction ) || ( callBackFunction == null ) ) callBackFunction = handleauthresult ;
	if ( ! checkauthparams() ) return false ;
	remote_validateauth_callback = callBackFunction ;
	var savedmission = document.mainform.mission.value ;
	document.mainform.mission.value = "login" ;
	q_cloneinputsfrommainform( "js_authenticate" ) ;
	q_xrssubmit( "js_authenticate" ) ;
	document.mainform.mission.value = savedmission ;
	return false ;
}

var remote_validateauth_callback ;

function q_remote_validateauth_callback( x ) {
	if ( remote_validateauth_callback ) remote_validateauth_callback( x ) ;
}

function handleauthresult( x ) {
	if ( x.authresult == "ok" ) {
		if ( document.mainform.canuserid ) document.mainform.canuserid.parentNode.removeChild( document.mainform.canuserid ) ;
		q_submit() ;
		setcookie ( "status" , "member" , 365000 ) ;
		return false ;
	}
	return handleauthfailed( x ) ;
}

function q_submit_auth(theurl, theuserlevel) {
	if ( q_alreadysubmitted() ) return false ;
	var url ;
	if ( iswaiting ) {
		url= "wait" ;
	}else if ( window.q_cgiurls && q_cgiurls.length ){
	 	url = q_cgiurls [ Math.floor ( Math.random() * q_cgiurls.length ) ] ;
	}else if ( theuserlevel && theuserlevel=='admin'){
		url = "admin" ;
	}else{
		url = "membre" ;
	}
	document.mainform[ "q_method" ].value = "cgi" ;
	document.mainform.action = ""+theurl + url ;
	document.mainform.submit() ;
	return true ;
}

function handleauthresultopenhomepage( x ) {
	if ( x.authresult == "ok" ) {
		if ( document.mainform.canuserid ) document.mainform.canuserid.parentNode.removeChild( document.mainform.canuserid ) ;
		document.mainform.mission.value = "openhomepage" ;
		document.mainform[ "q_space" ].value = "" ;
		q_submit_auth(x.theurl, x.theuserlevel) ;
		setcookie ( "status" , "member" , 365000 ) ;
		return false ;
	}
	return handleauthfailed( x ) ;
}

function handleauthresultopenhomepageorservice( x ) {
	if ( x.defaultspace != document.mainform.q_space.value ) return handleauthresultopenhomepage( x ) ;
	if ( x.authresult != "ok" ) return handleauthfailed( x ) ;
	if ( ( ! window.currsvcid ) || ( ! /artemapage/.test( currsvcid ) ) ) {
		if ( document.mainform.canuserid ) document.mainform.canuserid.parentNode.removeChild( document.mainform.canuserid ) ;
		document.mainform.mission.value = "openhomepage" ;
		document.mainform[ "q_space" ].value = "" ;
		q_submit_auth(x.theurl, x.theuserlevel) ;
		setcookie ( "status" , "member" , 365000 ) ;
		return false ;
	}
	var filename = servicefilename( currsvcid ) ;
	document.mainform.mission.value = "openservicepage" ;
	document.mainform.service.value = currsvcid.replace( /@intl/ , "@" + q_lang ) ;
	document.mainform.filename.value = filename ;
	q_submit_auth(x.theurl, x.theuserlevel) ;
	return false ;
}

function handleauthfailed( x ) {
	if ( x.authresult == "rejected" ) {
		var lang = ( window.q_lang ) ? q_lang : "en" ;
		window.location.href = q_getrelativebaseurl( ) + '/services/common@' + lang + '/autherrorpage' ;
	}
	msg( x.authmsg ) ;
	getelement( "editpassword" ).value = "" ;
	focusandselect( getelement( x.focusid ) ) ;
	return false ;
}

function launchforgotpw( h ) {
	if ( h ) qdyn_qorgload( "forgotpw_reveal" ,[ ], "forgotpw" , { dynloadhandler : h} );
	else qdyn_qorgload( "forgotpw_reveal" ,[ ], "forgotpw" );
}

function launchforgottenpw( ) {
	q_elems[ "forgotpw" ] = { 
		id : "forgottenpw_block" , 
		urls : [ 
			"/services/qorg/scripts/forgottenpw.js",  
			"/services/qorg/scripts/forgotpw_msgs_" + q_lang + ".js", 
			"/services/qorg/forgottenpw_" + q_lang + ".html" ] , 
		target : "q_fullscreenmask" 
	} ;
	q_fsm_reveal( { src : q_elems[ "forgotpw" ] , title : "Mot de passe oublié" , reveal_callback : "forgottenpw_reveal"  } ) ;
}

var q_authenticate_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "q_authenticate_js_loaded" ) ;


var currfocus ;
var rights_record = {} ;
var q_blue = "#4A88AB" ;
var q_idalias = {} ;
var q_elems = {} ;
var qdyn_load_trace = false;

/*
function -
function BROWSERS
*/

// Trouvé sur quirksmode.org
var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent) || this.searchVersion(navigator.appVersion) || "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) { if (dataString.indexOf(data[i].subString) != -1) return data[i].identity; }
			else if (dataProp) return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ string: navigator.userAgent, subString: "Chrome", identity: "Chrome" },
		{ string: navigator.userAgent, subString: "OmniWeb", versionSearch: "OmniWeb/", identity: "OmniWeb" },
		{ string: navigator.vendor, subString: "Apple", identity: "Safari", versionSearch: "Version" },
		{ prop: window.opera, identity: "Opera" },
		{ string: navigator.vendor, subString: "iCab", identity: "iCab" },
		{ string: navigator.vendor, subString: "KDE", identity: "Konqueror" },
		{ string: navigator.userAgent, subString: "Firefox", identity: "Firefox" },
		{ string: navigator.vendor, subString: "Camino", identity: "Camino" },
		{ string: navigator.userAgent, subString: "Netscape", identity: "Netscape" }, // for newer Netscapes (6+)
		{ string: navigator.userAgent, subString: "MSIE", identity: "Explorer", versionSearch: "MSIE" },
		{ string: navigator.userAgent, subString: "Gecko", identity: "Mozilla", versionSearch: "rv" },
		{ string: navigator.userAgent, subString: "Mozilla", identity: "Netscape", versionSearch: "Mozilla" } // for older Netscapes (4-)
	],
	dataOS : [
		{ string: navigator.platform, subString: "Win", identity: "Windows" },
		{ string: navigator.platform, subString: "Mac",	identity: "Mac" },
		{ string: navigator.userAgent, subString: "iPhone", identity: "iPhone" },
		{ string: navigator.userAgent, subString: "iPod", identity: "iPod" },
		{ string: navigator.userAgent, subString: "iPad", identity: "iPad" },
		{ string: navigator.userAgent, subString: "Android", identity: "Android" },
		{ string: navigator.platform, subString: "Linux", identity: "Linux" }
	]

};
BrowserDetect.init();

var isWin = ( BrowserDetect.OS == "Windows"  );
var isMac = ( BrowserDetect.OS == "Mac" ) ;

var isInternetExplorer = isIE  = ( BrowserDetect.browser == "Explorer"  );
var isIE_6 = ( isIE && parseInt( BrowserDetect.version ) <= 6 );
var isIE_7 = ( isIE && parseInt( BrowserDetect.version ) == 7 );
var isIE_8 = ( isIE && parseInt( BrowserDetect.version ) == 8 );
var isMsieMac = ( isIE && BrowserDetect.OS == "Mac" );
var isOpera = ( BrowserDetect.browser == "Opera"  );
var isFirefox = ( BrowserDetect.browser == "Firefox"  );
var isSafari = ( BrowserDetect.browser == "Safari"  );
var isSafari_3 = ( isSafari &&  BrowserDetect.version  == "3"  );
var isSafari_4 = ( isSafari &&  BrowserDetect.version  == "4"  );
var isSafari_5 = ( isSafari &&  BrowserDetect.version  == "5"  );
var isiPhone = ( BrowserDetect.OS == "iPhone" );
var isiPod = ( BrowserDetect.OS == "iPod" );
var isiPad = ( BrowserDetect.OS == "iPad" );
var isAppleMobile = ( isiPhone || isiPod || isiPad );
var isAndroid = ( BrowserDetect.OS == "Android" ); 
var isMobile = isAppleMobile || isAndroid;

function isie55() { return ( navigator ) && ( navigator.userAgent ) && ( /MSIE 5\.5/.test( navigator.userAgent ) ) ; }
function isie6() { return ( navigator ) && ( navigator.userAgent ) && ( /MSIE (5\.5|6\.)/.test( navigator.userAgent ) ) ; }
function isie7() { return ( navigator ) && ( navigator.userAgent ) && ( /MSIE 7/.test( navigator.userAgent ) ) ; }
function isie8() { return ( navigator ) && ( navigator.userAgent ) && ( /MSIE 8/.test( navigator.userAgent ) ) ; }
function isie78() { return ( isie7() || isie8() ) ; }
function isfirefox() { return ( navigator ) && ( navigator.userAgent ) && ( /FireFox/i.test( navigator.userAgent ) ) ; }
function issafari() { return ( navigator ) && ( navigator.appVersion ) && ( /AppleWebKit/.test( navigator.appVersion ) ) ; }

function q_navigatorlanguage() {
	var lang = ( navigator.language ) ? navigator.language : ( ( navigator.userLanguage ) ? navigator.userLanguage : "fr" ) ;
	lang = lang.split("-")[ 0 ] ;
	if ( lang != "fr" ) lang = "en" ;
	return lang ;
}

/*
function -
function GET
*/

function ge( x, y ) {
	return getelement ( x , y ) ;
}

function gebcn( x, y ) {
	return getElementByClassName ( x , y ) ;
}

function gebtn( x, y ) {
	x = ge( x ) ;
	if ( ! x ) return null ;
	var e = x.getElementsByTagName( y ) ;
	if ( e.length > 0 ) return e.item( 0 ) ;
	else return null ;
}

function getelement( x , basehtml ) {
	if ( ! x ) return null ;
	if ( x.splice || ( ( ! x.tagName ) && x[0] && x[0].tagName) ) {
		var res = [ ] ;
		for ( var i = 0 ; i < x.length ; i++ ) res.push( getelement ( x[ i ] , basehtml ) ) ;
		return res ;
	}
	if ( x.tagName ) return x ;
	if ( basehtml != undefined ) return gebcn( getelement( basehtml ) , x ) ;
	var y = null ;
	y = document.getElementById( x ) ;
	if ( y ) return y ;
	if ( q_idalias [ x ] ) y = document.getElementById( q_idalias [ x ] ) ;
	if ( y ) return y ;
	y = document.getElementsByName( x ) ;
	if ( y.length ) return y[ 0 ] ;
	return null ;
}

function getElementFromEvent( ee ){
	var e = ee ||  window.event ;
	return e.target || e.srcElement ;
}

function getRelatedElementFromEvent( ee ){
	var e = ee ||  window.event ;
	if(e.relatedTarget) return e.relatedTarget ;
	if(e.type=="mouseover" && e.fromElement) return e.fromElement ;
	if(e.type=="mouseout" && e.toElement) return e.toElement ;
	return null ;
}

function getElementByClassName( elem , classname ) {
	var x = getElementsByClassName( elem , classname , true ) ;
	if ( x.length ) return x[ 0 ] ;
	return null ;
}

function getElementsByClassName( elem , classname , stopWhenFound ) {
	elem = ge( elem ) ;
	if ( ! elem || elem.nodeType != 1 ) {
		if ( getElementsByClassName.caller ) debug_msg( "getElementsByClassName called by " + q_fname( getElementsByClassName.caller ) ) ;
		return [] ;
	}
	if ( ! stopWhenFound ) stopWhenFound = false ;
	var listres = new Array();
	var nfound = 0 ;
	var re = new RegExp ( "\\b" + classname + "\\b" ) ;
	function find( x ) {
		if ( x.nodeType == 1 ) {
			if ( x.className && re.test ( x.className ) ) {
				listres [ nfound++ ] = x ;
				if ( stopWhenFound ) return ;
			}
			for ( var i = 0 ; i < x.childNodes.length ; i++ ) find ( x.childNodes[ i ] );
		}
	}
	for ( var i = 0 ; i < elem.childNodes.length ; i++ ) find ( elem.childNodes[ i ] ) ;
	return listres ;
}

function getContainer ( x, cc ) {
	if ( ! x ) return null ;
	x = ge( x ) ;
	if ( isremoved( x ) || x.nodeType != 1 ) return null ;
	var c = cc || "container" ;
	var re = new RegExp( "\\b" + c + "\\b" )  ; 
	while ( x.nodeType == 1 && ! ( x.className &&  re.test( x.className) ) ) x = x.parentNode ;
	if ( ! x || x.nodeType != 1 ) return null ;
	return x ;
}

function getContainerOrSelf ( x, cc ) {
	if ( ! x ) return null ;
	var re = new RegExp( "\\b" + ( cc || "container" ) + "\\b" )  ; 
	return x.className && re.test( x.className) && x || getContainer ( x, cc ) ;
}

function q_coreRelevantTargetCatcher( target , relevantTargetCatcher ) {
	return getContainerOrSelf( target , relevantTargetCatcher ) ;
}

function q_nodelevel( elem ) {// compte le nombre de parentNode jusqu'au body
	try {
		if( ! elem ) return 0 ;
		var nb = 0 ;
		while ( elem.nodeType == 1  && elem.parentNode && elem.tagName.toLowerCase() != "body" ) {
			nb ++ ; 
			elem = elem.parentNode ;
		}
		return nb ; 
	} catch( err ) {
		return 0 ;
	}
}

function q_ascendingnodelevel( elem1 , elem2 ) {
	return q_nodelevel( elem1 ) - q_nodelevel( elem2 ) ;
}

/*
function -
function CREATE ELEMS
*/

function create_elem( t , arg , text ) {
	var e = document.createElement( t ) ;
	if ( arg ) create_attributes( e , arg ) ;
	if ( text ) e.appendChild( document.createTextNode( text ) ) ;
	return e ;
}

function create_table( e, arg ) {
	var t = create_elem( "TABLE", { cellSpacing : "0", cellPadding : "0", border: "0" } ) ;
	if ( arg ) create_attributes( t , arg ) ;
	return e.appendChild( t ) ;
}

function create_tr( table, x, y ){
	var rownb = ( x && typeof x == "number" ) ? x : -1;
	var arg = ( x && typeof x == "object" ) ? x : ( ( y && typeof y == "object" ) ? y : null ) ;
	
	var tr = table.insertRow( rownb );
	if ( arg ) create_attributes( tr , arg ) ;
	return tr ;
}

function create_td( tr , arg ) {
	var td = tr.insertCell( -1 ) ;
	if ( arg ) create_attributes( td , arg ) ;
	return td ;
}

function create_attributes( e , arg ) {
	var z ;
	for ( var x in arg ) {
		z = arg[ x ] ;
		if ( ( x == "innerHTML" ) && ( ! (/</).test( z ) ) ) q_innerHTML( e , z ) ;
		else {
			if ( typeof z == "string" ) {
				try {//vh : pb sur IE7 et IE8 pour la propriété align d'un td ; try plus souple je pense.
					e[ x ] = z ;
				} catch (err) {
					e.setAttribute( x , z ) ;
				}
//				if ( isie6() || isie7() ) e.setAttribute( x , z ) ; // attention pas ie8 sinon ça buggue sur className il faut mettre class
//				else e[ x ] = z ;
			} else for ( var y in z ) {
				if ( isIE && y == "cursor" && z[ y ] == "pointer" ) z[ y ] = "hand" ;
				try { e[ x ][ y ] = z[ y ] ; } catch (err) {
					var s = "error in create_attributes" ;
					try { s += " " + x + " for " + y + " value : " + z[ y ] ; } catch(err2) { } ;
					try { s += "\r" + ( err.message || err.description || "(no message)" ) ; } catch(err2) { } ;
					try { s += "\rElement's innerHTML is: \r\r" + e.innerHTML ; } catch(err2) { } ;
					debugmail( s ) ;
				} ;
			}
		}
	}
}

/*
var desc = {
	options :  (type array)
		(type string) "toto"
		(type array) [ value (type string), [ display (type string) ] , [ disabled (type boolean) ] ]	
		(type objet) { label : "titi", options : [ 
			(type string) "toto"
			(type array) [ value (type string), [ display (type string) ] , [ disabled (type boolean) ] ]		
			(type object) { value : (type string), [ display : (type string) ] , [ disabled : (type boolean) ] }	
		] }, 
	]  	
	[ id : (type string ou HTMLElement) // id du select si il existe ]
	[ selected : (type string ou array) // éléments sélectionnés ]
	[ multiple : (type boolean) , // plusieurs choix autorisés ]
	[ size : (type number), // nb de lignes affichées ]
}
*/

function createradio( s , xx ) {
	var x ;
	x = ( xx ) ? xx : { className : "radio on" } ;
	if ( ! x.className ) x.className = "radio on" ;
	var a = create_elem( "A" , x ) ;
	var img = a.appendChild( create_elem( "IMG", { src : "/images/blank.gif" } ) ) ;
	a.appendChild( document.createTextNode( s ) ) ;
	return a ;
}

function create_select( desc, args ){
	if ( desc.id ) {
		var select = ge( desc.id );
		if ( ! select || ! select.tagName || select.tagName.toLowerCase() != "select" ) return ;
	} else var select = create_elem( "SELECT" ) ;

	create_attributes( select, args );
	if ( desc.multiple ) {
		select.multiple = "multiple";
		select.size = ( desc.size || 3 ) ;
	}
	select.onclick = function( event ) { q_stopPropagation( event );};
	if ( desc.onChange ) select.onchange = desc.onChange;
	
	if ( desc.selected && ( typeof desc.selected ) == "string" ) desc.selected = [ desc.selected ] ;
	if ( desc.options ) {
		for ( var i in desc.options ){
			var opt = desc.options[ i ];
			if ( ( typeof opt ) == "string" ) opt = [ opt ] ;
			if ( ! opt.splice && opt.label ){ // c'est un optgroup
				var optargs = ( opt.args ) ? opt.args : {};
				optargs.label = opt.label;
				var group = create_elem( "OPTGROUP", optargs) ;
				for ( var j in opt.options ) group.appendChild( create_option( opt.options[ j ] , desc.selected ) );
				select.appendChild( group );
			} else {
				select.options[ select.options.length ] = create_option( opt , desc.selected ) ;
			}
		}
	}
	return select;
};

function create_option( option , x, y ){
	var disabled = false ;
	var selected = false;
	var value , name ;
	if ( ( typeof option ) == "string" ) option = [ option ];
	if ( option.splice ) { 
		// array : [ value , [ name (type string) ] , [ disabled (type boolean) ] ]
		value = option[ 0 ] ;
		name = ( option.length > 0 && ( typeof option[ 1 ] ) == "string" ) ? option[ 1 ] : option[ 0 ] ;
		if ( option.length > 0 && ( typeof option[ 1 ] ) == "boolean" ) disabled = option[ 1 ] ;
		else if ( option.length > 1 ) disabled = option[ 2 ] ;
	} else {
		value = ( option.value != undefined ) ? option.value : option ;
		name = ( option.name != undefined ) ? option.name : value;
		if ( option.disabled ) disabled = option.disabled ;
		if ( option.selected ) selected = option.selected;
	}
	var opt = new Option( name, value );
	if ( x && x.splice && indexOfItem( value , x ) != -1 ) selected = true;
	
	if ( disabled ) opt.disabled = "disabled" ;
	if ( selected ) opt.selected = "selected" ;
	
	var args = ( x && ! x.splice ) ? x : ( ( y ) ? y : null );
	if ( args ) create_attributes( opt, args );
	
	return opt;
};

function simplefillselect( s, pps ) { // s: name of the select, pps: [ "English" , "Français" ] 
// Keep first item in menu
	var x = ge( s );
	x.options.length = 1 ;
	for ( var i = 0 ; i < pps.length ; i++ ) {
		var pp = pps [ i ] ;
		x.options[ i + 1 ] = create_option( pp );
	}
}

function fillselect( s, pps ) { // s: name of the select, pps: [ [ "en" , "English" ] , [ "fr" , "Français" , "whatever" ] ]
	var x = ge( s ) ;
	x.options.length = 0 ;
	for ( var i = 0 ; i < pps.length ; i++ ) {
		var pp = pps [ i ] ;
		if ( pp.length == 1 )  x.options[ i ] = new Option ( pp[ 0 ] , pp[ 0 ] ) ;
		else  x.options[ i ] = new Option ( pp[ 1 ] , pp[ 0 ] ) ; 
		if ( pp.length == 3 ) x.options[ i ].selected = 'selected' ;
	}
}

/*
function -
function TRAVAIL SUR LES OBJETS
*/

function q_deleteRow( tr ) {
	var table = tr.parentNode ; 
	if ( table.tagName != "TABLE" ) table = table.parentNode ; 
	var rows = table.rows ; 
	for ( var i = 0 ; i < rows.length ; i++ ) if ( rows[ i ] == tr ) { 
		table.deleteRow( i ) ; 
		return ;
	}
}

function q_deleteCell( td ) {
	var tr = td.parentNode ; 
	var cells = tr.cells ; 
	for ( var i = 0 ; i < cells.length ; i++ ) if ( cells[ i ] == td ) { 
		tr.deleteCell( i ) ; 
		return ;
	}
}

function q_deleteCells( tr ) {
	var cells = tr.cells ;
	var n = cells.length ;
	for ( var i = 0 ; i < n ; i++ ) tr.deleteCell( 0 ) ; 
}

function q_removeChildren( x ) {
	if ( ! x ) return false ;
	if ( typeof x == 'string' ) x = getelement( x ) ;
	if ( ! x ) return false ;
	if ( x.tagName == "TR" ) return q_deleteCells( x ) ;
	while ( x.childNodes.length > 0 ) x.removeChild( x.firstChild ) ;
}
function q_removeChilds( x ) { return q_removeChildren( x ) ; }

function rm( x ) {
	if ( ! x ) return false ;
	if ( typeof x == 'string' ) x = getelement( x ) ;
	if ( ! x ) return false ;
	var debugnoteid ;
	try { debugnoteid = x.id ; } catch( err ) { }
	try { x.removed = true ; } catch( err ) { } ;
	try { x.setAttribute( "removed" , true ) ; } catch( err ) { } ;
	if ( x.parentNode ) {
		switch( x.tagName ) {
			case "TR" : q_deleteRow( x ) ; break ;
			case "TD" : q_deleteCell( x ) ; break ;
			default : x.parentNode.removeChild( x ) ;
		}
	} else if ( x.splice || ( x[ 0 ] && x[ 0 ].parentNode ) ) {
		for ( var i in x ) rm( x [ i ] ) ;
	} else if ( debugnoteid ) debugmail( "rm was called for orphan child, id " + debugnoteid ) ;
	return false ;
}

function isremoved( elem ) {
	return ( ! elem || ! elem.parentNode || elem.removed || ( elem.getAttribute && elem.getAttribute( "removed" ) ) || false ) ;
}

function q_cloneObject( o , oldobj ){
	return xq_cloneObject( o , true , oldobj ) ;
}

function xq_cloneObject( o , appendArray , oldobj ){
	var no ;
	if ( oldobj !== undefined ) no = oldobj ;
	else  {
		if ( o && o.splice ) no = new Array() ;
		else no = {} ;
	}
	if ( o && o.splice ) { // i = 0
		for ( var i = 0 ; i < o.length ; i++ ) {
			if ( o[ i ] != null ) {
				if ( typeof o[ i ] == "object" && ! o[ i ].nodeType ) no[ no.length ] = xq_cloneObject( o[ i ] , appendArray ) ;
				else no[ ( appendArray ) ? no.length : i ] = o[ i ] ;
			}
		}
		return no ;
	}
	for ( var x in o ) {
		if ( o[ x ] != null ) {
			if ( typeof o[ x ] == "object" && ! o[ x ].nodeType ) no[ x ] = xq_cloneObject( o[ x ] , appendArray , ( ( oldobj ) && ( oldobj[ x ] != undefined ) ) ? oldobj[ x ] : undefined ) ;
			else no[ x ] = o[ x ] ;
		}
	}
	return no ;
}

function indexOfItem( theitem , thelist ) {
	var thesep, s, i ;
	thesep = "\n" ;
	s = thesep + thelist.join( thesep ) + thesep ;
	i = s.indexOf( thesep + theitem + thesep ) ;
	if ( i == -1 ) return i ;
	return ( s.substring( 0 , i ).split( thesep ).length ) - 1 ;
}

function q_sortjson( json ) {
	var sortedkeys = [] ;
	for ( var key in json ) sortedkeys.push( key ) ;
	sortedkeys.sort() ;
	return sortedkeys ;
}

function q_emptyjson( x ) {
	for ( var xx in x ) return false ;
	return true ;
}

function q_getkeys( obj ) {
	var t = [] ;
	if ( typeof obj == "object" ) for ( var k in obj ) t.push( k ) ;
	return t ;
}

function suppressitem( theitem , thelist ) {
	for ( var i = thelist.length - 1 ; i >= 0 ; i-- ) {
		if ( thelist[ i ] == theitem ) thelist[ i ] = null ;
	}
	return thelist ;
}

function testIsValidObject( objToTest ) {
 	if ( null == objToTest ) {
 		return false ;
 	}
 	if ( "undefined" == typeof( objToTest ) ) {
 		return false ;
 	}
 	return true ;
}

var cloneNumber = 0 ;

function changeProp( t , s ) {
	if ( t.id ) t.id = t.id.replace( /template$/ , "") + s ;
	if ( t.name ) t.name = t.name.replace( /template$/ , "") + s ;
	var children = t.childNodes ;
	for( var i = 0 ; i < children.length ; i++ ) changeProp( children[ i ] , s ) ;
}

function q_CloneFromNode( t ){
	var aclone = t.cloneNode( true ) ;
	changeProp( aclone , "_clone" + cloneNumber++ ) ;
	return aclone ;
}

function changeProp2( t , s ) {
	if ( t.id ) t.id = t.id.replace( /template$/ , "") + s ;
	var children = t.childNodes ;
	for( var i = 0 ; i < children.length ; i++ ) changeProp2( children[ i ] , s ) ;
}

function q_CloneFromNode2( t ){
	var aclone = t.cloneNode( true ) ;
	changeProp2( aclone , "_clone" + cloneNumber++ ) ;
	return aclone ;
}

function q_CloneFromID( s ){
	var t = getelement( s ) ;
	return q_CloneFromNode( t ) ;
}

/*
function -
function DISPLAY
*/

function showblock( x , base ) {
	x = getelement( x , base ) ;
	if ( ! x ) return false ;
	if ( x.tagName ) {
		if ( x.style[ 'visibility' ] ) x.style[ 'visibility' ] = 'visible' ;
		else {
			if ( x.tagName == "TR" ) x.style[ 'display' ] = ( ( navigator.appVersion ) && ( /MSIE/.test( navigator.appVersion ) ) ) ? 'block' : 'table-row' ;
			else if ( x.tagName == "TD" ) try {
				if( isie8() || isie7() ) x.style[ 'display' ] = "inline" ;
				else x.style[ 'display' ] = 'table-cell' ;
			} catch( err ) {
				x.style[ 'display' ] = 'inline' ;
			}
			else if ( x.tagName == "LI" ) x.style[ 'display' ] = 'list-item' ;
			else if ( x.tagName == "A" ) x.style[ 'display' ] = 'inline' ;
			else if ( x.tagName == "SPAN" ) x.style[ 'display' ] = 'inline' ;
			else if ( x.tagName == "TABLE" ) x.style[ 'display' ] = ( ( navigator.appVersion ) && ( /MSIE/.test( navigator.appVersion ) ) ) ? 'block' : 'table' ; // non vérifié sur IE
			else x.style[ 'display' ] = 'block' ;
		}
	} else {
		var y = [] ;
		for ( var i = 0 ; i < x.length ; i++ ) y.push( x[ i ] ) ;
		y.sort( q_ascendingnodelevel ) ;
		for ( var i = 0 ; i < y.length ; i++ ) showblock( y [ i ] , base ) ;
	}
	return false ;
}

function hideblock( x , base ) {
	x = getelement( x , base ) ;
	if ( ! x ) return false ;
	if ( x.tagName ) {
		if ( x.style[ 'visibility' ] ) x.style[ 'visibility' ] = 'hidden' ;
		else x.style[ 'display' ] = 'none' ;
	} else {
		var y = [] ;
		for ( var i = 0 ; i < x.length ; i++ ) y.push( x[ i ] ) ;
		y.sort( q_ascendingnodelevel ).reverse() ;
		for ( var i = 0 ; i < y.length ; i++ ) hideblock( y [ i ] , base ) ;
	}
	return false ;
}

function hideshowblock( x , y , base ) {
	hideblock( x , base ) ; 
	showblock( y , base ) ; 
	return false  ;
}

function toggledisplay( x , base ) {
	x = getelement( x , base ) ;
	if ( ! x ) return false ;
	var b ;
	if ( x.tagName ) {
		if ( x.style[ 'visibility' ] ) b = ( x.style[ 'visibility' ] == 'visible' ) ;
		else b = ( x.style[ 'display' ] != 'none' ) && ( gcs( x , "display" ) != 'none' ) ;
		visibleblock( x , ! b , base ) ;
	} else for ( var i = 0 ; i < x.length ; i++ ) toggledisplay( x [ i ] , base ) ;
	return false ;
}

function visibleblock( x , b , base ) {
	if ( b ) showblock( x , base ) ;
	else hideblock( x , base ) ;
}

/*
function -
function COLORS
*/

function q_makecolortable( elem, cellsize, callback ) {
	var table_colors = [[[50,0,0],[50,50,0],[0,50,0],[0,50,50],[0,0,50],[50,0,50],[50,50,50]],[[50,25,0],[25,50,0],[0,50,25],[0,25,50],[25,0,50],[50,0,25],[25,25,25]],[[100,0,0],[100,100,0],[0,100,0],[0,100,100],[0,0,100],[100,0,100],[100,100,100]],[[100,50,0],[50,100,0],[0,100,50],[0,50,100],[50,0,100],[100,0,50],[80,80,80]],[[100,40,40],[100,100,40],[40,100,40],[40,100,100],[40,40,100],[100,40,100],[40,40,40]],[[100,80,40],[80,100,40],[40,100,80],[40,80,100],[80,40,100],[100,40,80],[0,0,0]]] ;
	var table = document.createElement( "TABLE" ) ;
	for( var i = 0 ; i < 6 ; i++ ) {
		var tr = table.insertRow( -1 ) ;
		var tc = table_colors[ i ] ;
		for( var j = 0 ; j < 7 ; j++ ) {
			var td = tr.insertCell( -1 ) ;
			td.style.width = td.style.height = cellsize + "px" ;
			td.style.cursor = "pointer" ;
			td.style.backgroundColor = "rgb(" + tc[ j ][0] + "%," + tc[ j ][1] + "%," + tc[ j ][2] + "%)" ;
			td.onclick =  function( ) { callback( this ) ; } ;
		}
	}
	if ( ! elem.tagName ) elem = ge( elem ) ;
	elem.appendChild( table ) ;
}

function rgb2brightness( rgb ) {
	var c = rgbvalues( rgb, 255 ) ;
	return 100 * ( 0.2125*c[ 0 ] + 0.7154*c[ 1 ] + 0.0721*c[ 2 ] ) ;
}

function rgbcomplement( rgb ) {
	var c = rgbvalues( rgb, 1 ) ;
	return "rgb(" + ( 255 - c[ 0 ] ) + "," + ( 255 - c[ 1 ] ) + "," + ( 255 - c[ 2 ] ) + ")" ;
}

function rgb2hsv( rgb ) {
	var c = rgbvalues( rgb, 255 ) ;
	var r = c[ 0 ] ;
	var g = c[ 1 ] ;
	var b = c[ 2 ] ;
	var minval = Math.min( r, g, b ) ;
	var maxval = Math.max( r, g, b ) ;
	var delta = maxval - minval ;
	var v = maxval ;
	var h, s ;
	if ( delta == 0 ) h = s = 0 ;
	else {
		s = delta / maxval ;
		var del_r = ( ( ( maxval - r ) / 6 ) + ( delta / 2 ) ) / delta ;
		var del_g = ( ( ( maxval - g ) / 6 ) + ( delta / 2 ) ) / delta ;
		var del_b = ( ( ( maxval - b ) / 6 ) + ( delta / 2 ) ) / delta ;		
		if ( r == maxval ) h = del_b - del_g ;
		else if ( g == maxval ) h = ( 1/3 ) + del_r - del_b ;
		else if ( b == maxval ) h = ( 2/3) + del_g - del_r ;
		if ( h < 0 ) h = h + 1 ;
		if ( h > 1 ) h = h - 1 ;
	}
	h = Math.max( 0 , Math.min( 360 , Math.round( h * 360 ) ) ) ;
	s = Math.max( 0 , Math.min( 100 , Math.round( s * 100 ) ) ) ;
	v = Math.max( 0 , Math.min( 100 , Math.round( v * 100 ) ) ) ;
	return [ h, s, v ] ;
}

function hsv2rgb( hsv ) { // h [0-360], s [0-100], v [0-100]
	return Xhsv2rgb( hsv , 255 ) ;
}
function chsv2rgb( hsv ) { // h [0-360], s [0-100], v [0-100]
	return Xhsv2rgb( hsv , 100 ) ;
}
function Xhsv2rgb( hsv , base ) { // h [0-360], s [0-100], v [0-100]
	var h = hsv[ 0 ] ;
	var s = hsv[ 1 ] ;
	var v = hsv[ 2 ] ;
	if ( h == 360 ) h = 0 ;
	s /= 100 ;
	v /= 100 ;
	var r = null ;
	var g = null ;
	var b = null ;
	if ( s == 0 ) r = g = b = v ;
	else {
		var hTemp = h / 60 ;
		var i = Math.floor( hTemp ) ;
		var f = hTemp - i ;
		var p = v * ( 1 - s ) ;
		var q = v * ( 1 - ( s * f ) ) ;
		var t = v * ( 1 - ( s * ( 1 - f ) ) ) ;
		switch( i ) {
			case 0 : r = v ; g = t ; b = p ; break ;
			case 1 : r = q ; g = v ; b = p ; break ;
			case 2 : r = p ; g = v ; b = t ; break ;
			case 3 : r = p ; g = q ; b = v ; break ;
			case 4 : r = t ; g = p ; b = v ; break ;
			case 5 : r = v ; g = p ; b = q ; break ;
		}
	}
	r = Math.round( r * base ) ;
	g = Math.round( g * base ) ;
	b = Math.round( b * base ) ;
	return [ r, g, b ] ;
}

function rgb2hex(val){//préciser ce que peut être val
	if ( typeof( val ) == "string" && val.indexOf("rgb") >= 0) var rgb_val = val.slice(val.indexOf('(') + 1,val.indexOf(')')).split(",");
	else var rgb_val = val;
	val = "#";
	var hexChars = "0123456789ABCDEF";
	for ( var i = 0 ; i < 3 ; i++ ) {
		var v = Math.max( 0 , Math.min( 255 , rgb_val[i] ) ) ;
		val += hexChars.charAt(v/16) + hexChars.charAt(v%16);
	}
	return val;
}

function hex2rgb( val ) { 
	function cutHex(h) {return (h.charAt(0)=="#") ? h.substring(1,7):h;}
	var r = parseInt((cutHex(val)).substring(0,2),16) ;
	var g = parseInt((cutHex(val)).substring(2,4),16) ;
	var b = parseInt((cutHex(val)).substring(4,6),16) ;
	return [ r , g , b ] ; 
}


function rgbcontrastcolor( rgb, v ) {
	if ( ! v ) v = 20 ;
	var hsv = rgb2hsv( rgb ) ;
	var c = ( hsv[ 2 ] > 50 ) ? hsv[ 2 ] - v : hsv[ 2 ] + v ;
	if ( c < 20 ) c = 20 ;
	if ( c > 100 ) c = 100 ;
	rgb = hsv2rgb( [ hsv[ 0 ], hsv[ 1 ], c ] ) ;
	return ( "rgb(" + rgb[ 0 ] + ", " + rgb[ 1 ] + ", " + rgb[ 2 ] + ")" ) ;
}

/*function rgbcontrastcolor( rgb ) {
	var c = rgb.replace( /rgb\((.*)\)/, "$1" ).split( "," ) ;
	var delta = ( rgb2brightness( c ) > 50 ) ? -70 : 70 ;
	for ( var i=0; i<3; i++ ) {
		c[ i ] = parseInt( c[ i ], 10 ) + delta ;
		if ( c[ i ] < 0 ) c[ i ] = 0 ;
		if ( c[ i ] > 255 ) c[ i ] = 255 ;
	}
	return ( "rgb(" + c[ 0 ] + ", " + c[ 1 ] + ", " + c[ 2 ] + ")" ) ;
}*/

function rgbcontrastcolor150( rgb ) { // provisoire, faire fnct delta variable
	if ( /%/.test( rgb ) ) rgb = rgb255( rgb ) ;
	var c = rgb.replace( /rgb\((.*)\)/, "$1" ).split( "," ) ;
	var delta = ( rgb2brightness( c ) > 50 ) ? -150 : 150 ;
	for ( var i=0; i<3; i++ ) {
		c[ i ] = parseInt( c[ i ], 10 ) + delta ;
		if ( c[ i ] < 0 ) c[ i ] = 0 ;
		if ( c[ i ] > 255 ) c[ i ] = 255 ;
	}
	return ( "rgb(" + c[ 0 ] + ", " + c[ 1 ] + ", " + c[ 2 ] + ")" ) ;
}

function bwcontrastcolor( rgb, v ) { // couleur de contraste noir/blanc + teinte rgb fonction de v
	if ( ! v ) v = 0 ;
	var h = rgb2hsv( rgb )[ 0 ] ;
	rgb = ( rgb2brightness( rgb ) < 50 ) ? hsv2rgb( [ h, v, 100 ] ) : hsv2rgb( [ h, 100, v ] ) ;
	return ( "rgb(" + rgb[ 0 ] + ", " + rgb[ 1 ] + ", " + rgb[ 2 ] + ")" ) ;
}

function rgb2givenlevel( thelevel, thergb ){
	var a , b ;
	var desat = 0.4;
	thelevel = thelevel / 100 ;
	var thehsv = rgb2hsv( thergb );
	var h = thehsv[ 0 ];
	var s = thehsv[ 1 ];
	var v = thehsv[ 2 ];
	var hlevel = rgb2brightness( hsv2rgb( [ h , 100, 100 ] ) ) / 100;
	if ( thelevel <= hlevel) {
		a = thelevel / hlevel;
		b = 0;
	} else {
		a = (1 - thelevel) / (1 - hlevel);
		b = 1 - a;
	}
	a = a * (1 - desat);
	b = b * (1 - desat) + thelevel * desat;	
	return hsv2rgb( [ h , 100 * a / (a + b) , 100 * ( a + b ) ] );
}

function rgbvalues( rgb, base ) {  // tableau [ r, g, b ] ou string css "rbg( r255, g255, b255 )" ou "rbg( r%, g%, b% )"
	if ( typeof( rgb ) == "string" && (/rgb/).test( rgb ) ) {
		rgb = rgb.replace( /rgb\((.*)\)/, "$1" ).split( "," ) ;
		if ( /%/.test( rgb[ 0 ] ) ) var r = Math.round( ( parseInt ( rgb[ 0 ] , 10 )/100 ) * 255 ) ;
		else var r = parseInt ( rgb[ 0 ] , 10 ) ;
		if ( /%/.test( rgb[ 1 ] ) ) var g = Math.round( ( parseInt ( rgb[ 1 ] , 10 )/100 ) * 255 ) ;
		else var g = parseInt ( rgb[ 1 ] , 10 ) ;
		if ( /%/.test( rgb[ 2 ] ) ) var b = Math.round( ( parseInt ( rgb[ 2 ] , 10 )/100 ) * 255 ) ;
		else var b = parseInt ( rgb[ 2 ] , 10 ) ;
	} else if ( typeof( rgb ) == "string" && (/#/).test( rgb ) ) {
		rgb = rgb.replace( "#" , "" ) ;
		// if ( rgb.length == 3 ) rgb = rgb.split( "" ).join( "0" ) + "0" ;
		if ( rgb.length == 3 ) rgb = rgb.replace( /(.)(.)(.)/ , "$1$1$2$2$3$3" ) ;
		// var r = parseInt( rgb.slice( 0 , 2 ) , 16 ) ;
		// var g = parseInt( rgb.slice( 2 , 4 ) , 16 ) ;
		// var b = parseInt( rgb.slice( 4 , 6 ) , 16 ) ;
		var r = parseInt( rgb.substring( 0 , 2 ) , 16 ) ;
		var g = parseInt( rgb.substring( 2 , 4 ) , 16 ) ;
		var b = parseInt( rgb.substring( 4 , 6 ) , 16 ) ;
	} else {
		var r = rgb[ 0 ] ;
		var g = rgb[ 1 ] ;
		var b = rgb[ 2 ] ;
	}
	if ( base == 1 ) return [ Math.round( r ) , Math.round( g ) , Math.round( b ) ] ;
	return [ r/base , g/base , b/base ] ;
}

function rgb100(rgb255) {
	rgb255 = rgb255.replace( /(rgb\(|\)| )/g , "" ) ;
	var rgb = rgb255.split( "," ) ;
	for ( var i = 0 ; i < 3 ; i++ ) rgb[ i ] = Math.round( rgb[ i ] / 2.55 ) ;
	return "rgb(" + rgb.join( "%," ) + "%)" ;
}

function rgb255(rgb100) {
	rgb100 = rgb100.replace( /(rgb\(|\)| )/g , "" ) ;
	var rgb = rgb100.split( "," ) ;
	for ( var i = 0 ; i < 3 ; i++ ) rgb[ i ] = Math.round( 2.55 * parseInt( rgb[ i ] , 10 ) ) ;
	return "rgb(" + rgb.join( "," ) + ")" ;
}

function getrealcolor( colorvalue, withtransparent ){
	if ( colorvalue == undefined ) return;
	var c = parseInt( colorvalue, 10 );
	if ( c == -1 || colorvalue == "transparent") return ( withtransparent ) ? "transparent" : getpagebackgroundcolor() ;
	else if ( c < 10 ) return getsncontextualbackgroundcolors( 7 )[ c - 1 ] ;
	else if ( colorvalue == "black" ) return "rgb(0,0,0)";
	else if ( colorvalue == "white" ) return "rgb(255,255,255)";
	else if ( (/^(c1|c2|cm|cmo|cfs|cfp|cb|ctb|ctm)$/).test( colorvalue ) ) return club_siteelemscolor[ colorvalue ] ;
	return colorvalue;
}

function getleftcolbackgroundcolor( ) {
	if ( window.rights_record && rights_record.currspaceright ) {
		switch( rights_record.currspaceright.right ) {
			case "fede" :
				return "rgb(102,102,102)" ;
			case "qlub" :
			case "qorp" :
				return club_menucolorpalette[ 0 ] ;
			case "family" :
				return "rgb(255,255,255)" ;
			default :
				return "rgb(255,255,255)" ;
		}
	} else return "rgb(255,255,255)" ;
}

function getpagecolor( ) {
	return getsncontextualbackgroundcolors( 7 )[ ( rgb2brightness( getpagebackgroundcolor() ) < 50 ) ? 5 : 1 ] ;
}

function getpagebackgroundcolor( ) {
	if ( window.rights_record && rights_record.currspaceright ) {
		switch( rights_record.currspaceright.right ) {
			case "fede" :
				return "rgb(255,255,255)" ;
			case "qlub" :
			case "qorp" :
				return club_sitecolorpalette[ 7 ] ;
			case "family" :
				if ( /homepage/.test( currsvcid ) ) return "rgb(234,255,225)" ;
				else if ( /schooltt/.test( currsvcid ) ) return "rgb(250,230,237)" ;
				else if ( /pm/.test( currsvcid ) ) return "rgb(253, 244, 236)" ;
				else if ( /artemadisq/.test( currsvcid ) ) return "rgb(234,223,236)" ;
				// pb avec homepage projet et autres pages
				break;
			default :
				return "rgb(255,255,255)" ;
		}
	} else return "rgb(255,255,255)" ;
}

function q_contextualcolor( c , n ) {
	return ( /^[0-9]+$/.test( c ) ) ? getsncontextualbackgroundcolors( n )[ parseInt( c, 10 ) - 1 ] : c ;
}

function getsncontextualbackgroundcolors( n , wantclass ) {
	if ( ! n ) n = 4 ;
	var def4 = [ "rgb(191,227,249)" , "rgb(219, 236, 53)" , "rgb(255, 255, 255)" , "rgb(231, 51, 82)" ] ;
	var def7 = [ "rgb(191,227,249)" , "rgb(219, 236, 53)" , "rgb(255, 255, 255)" , "rgb(231, 51, 82)" ,  "rgb(0, 0, 0)", "rgb(190, 190, 190)" , "rgb(255, 255, 0)" ] ;
	if ( window.rights_record && rights_record.currspaceright ) {
		switch( rights_record.currspaceright.right ) {
			case "qlub" :
			case "qorp" :
				var c = club_sitecolorpalette ;
				if ( n == 4 ) {
					if ( wantclass ) return [ "1" , "7" , "4" , "comp1" ] ;
					return [ c[ 0 ] , c[ 6 ] , c[ 4 ] , rgbcomplement( c[ 0 ] ) ] ;
				} else if ( n == 7 ) {
					if ( wantclass ) return [ "1" , "2" , "3" , "4" , "5" , "6" , "comp1" ] ;
					return [ c[ 0 ] , c[ 1 ] , c[ 2 ] ,  c[ 3 ] , c[ 4 ] , c[ 5 ] , rgbcomplement( c[ 0 ] ) ] ;
				}
			case "fede" :
				var c = club_sitecolorpalette ;
				if ( n == 4 ) {
					if ( wantclass ) return [ "1" , "3" , "5" , "7" ] ;
					return [ c[ 0 ] , c[ 2 ] , c[ 4 ] , c[ 6 ] ] ;
				} else if ( n == 7 ) {
					if ( wantclass ) return [ "1" , "2" , "3" , "4" , "5" , "6" , "7" ] ;
					return [ c[ 0 ] , c[ 1 ] , c[ 2 ] ,  c[ 3 ] , c[ 4 ] , c[ 5 ] , c[ 6 ] ] ;
				}
			case "family" :
				return ( n == 4 ) ? def4 : def7 ;
			default :
				return ( n == 4 ) ? def4 : def7 ;
		}
	} else {
		return ( n == 4 ) ? def4 : def7 ;
	}
}

/*
function -
function URLS, PATHS, WINDOWS
*/

function q_getrelativebaseurl() {
	return "../../.." ;
}

function q_getabsolutebaseurl() {
	return ( window.location.href.replace( /(http(s?):\/\/[^\/]+\/).*/ , "$1" ) ) ;
}

function isrealserver() {
	var burl = q_getabsolutebaseurl() ;
	return ! ( burl == "http://beta2.quomodo.com/" || burl == "http://localhost/" || burl == "http://10.0.1.22/" || burl == "http://club2.quomodo.com/" || burl == "http://club1.quomodo.com/" || ( /\.local\/$/.test( burl ) )  || ( /^http:\/\/(10|192)\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/.test( burl ) ) ) ;
}

function showstaticfile( x ) {
	var url= q_getrelativebaseurl() + "/services/" + document.mainform.service.value + "/" + x ;
	window.open( url , 'help pane' , 'directories=no, location=no, menubar=no, status=no, width=600, height=450, scrollbars=yes' ) ;
	return false ;
}

function q_spacebaseurl( ownerid ) {
	if ( ownerid == "quomodo" ) return "/services/" + document.mainform.service.value.replace( /^#[0-9]+#/ , "" ).replace( /@intl/ , "@" + q_lang ) + "/" ;
	return "/symspaces/" + ( document.mainform && document.mainform.sessionid.value || q_spaceparam( "sessionid" ) ).replace( /^(.)(.)(.)/ , "$1/$2/$3/$1$2$3" ) + "/" ;
}

function q_spaceabsoluteurl( ownerid , relativeurl ) { return q_spacebaseurl( ownerid ) + encodeURI( relativeurl ) ; }

function q_selfbaseurl() {
	return "/symspaces/" + ( document.mainform && document.mainform.sessionid.value || q_spaceparam( "sessionid" ) ).replace( /^(.)(.)(.)/ , "$1/$2/$3/$1$2$3" ) + "_self/" ;
}

function q_geturlparams( url ) {
	var params = {} ;
	var x = ( url ) ? url.replace( /^[^?]*\??/ , "" ) : window.location.search.replace( /^\?/ , "" ) ;
	var t = x.split( "&" ) ;
	var tt ;
	for ( var i = 0 ; i<t.length ; i++ ) {
		tt = t[ i ].split( "=" ) ;
		params[ tt[ 0 ] ] = decodeURIComponent( tt[ 1 ] ) ;
	}
	return params ;
}

function openhelpwindow ( url , w_width , w_height ) {
	if ( ! w_width ) w_width = 700 ;
	if ( ! w_height ) w_height = 500 ;
	window.open ( url ,"helpwindow","location=1, status=1, scrollbars=1, toolbar=0, resizable=1, menubar=0, width=" + w_width + ", height=" + w_height ) ;
	return false ;
}

function q_openfile( elem ) {
	var file ;
	if ( elem.tagName == "A" ) {
		if ( isie6() ) file = elem.outerHTML.replace( /^.*href="([^"]+)".*$/ , "$1" ) ;
		else file = elem.href ;
	}
	else {
		file = elem.getAttribute( "fileref" ) ;
	}
	file = file.replace( /.*\/(uploads\/.*)/g , '$1' ) ;
	window.open( q_spacebaseurl( memberid ) + file ) ; // q_spacebaseurl recouvert dans web.js donc pas de pb, fourni la base url courante
	return false ;// force à ne pas suivre le lien en href dans le cas d'un <a>
}

function q_locationhrefwithsearch( url , x ) { //x json { key1 : value1 , key2 : value2 , etc }
	var params = q_geturlparams() ;
	if ( x ) params = q_cloneObject( x , params ) ;
	var s = [] ;
	for ( var k in params ) if ( k ) s.push( encodeURIComponent( k ) + "=" + encodeURIComponent( params[ k ] ) ) ;
	window.location.href = url + ( ( s.length ) ? ( "?" + s.join( "&" ) ) : "" );
}

/*
function -
function IMAGES
*/

function q_renderimgie6() {
	if ( ! q_imgtofix ) return ;
	for ( var i = q_imgtofix.length -1 ; i >= 0 ; i -- ) {
		var img = q_imgtofix[ i ][ 0 ] ;
		if ( ! img || ! img.parentNode ) {// si jamais l'image a disparu
			q_imgtofix.splice( i , 1 ) ;
			continue ;
		}
		if ( ! img.complete ) continue ;
		var s = img.src.replace ( /%23/g , "%2523" ) ;
		if ( img.offsetWidth ) img.style.width = img.offsetWidth + "px" ;
		if ( img.offsetHeight ) img.style.height = img.offsetHeight + "px" ;
		img.src = "/images/blank.gif" ;
		img.style.visibility = "visible" ;
		img.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+s+'",sizingMethod="scale")';
		if ( q_imgtofix[ i ][ 1 ] ) q_imgtofix[ i ][ 1 ].apply( this , ( q_imgtofix[ i ][ 2 ] ) ? q_imgtofix[ i ][ 2 ] : [] ) ;
		q_imgtofix.splice( i , 1 ) ;
	}
	if ( q_imgtofix.length ) q_imgtimer = setTimeout( q_renderimgie6 , 100 ) ;
	else q_imgtimer = null ;
}

function q_himgcheckloaded() {
	for ( var i = q_imgtoload.length -1 ; i >= 0 ; i -- ) {
		if ( ! q_imgtoload[ i ][ 0 ].complete ) continue ;
		var h = ( q_imgtoload[ i ][ 1 ] ) ;
		if ( h ) h.apply( this , q_imgtoload[ i ][ 2 ] ) ;
		q_imgtoload.splice( i , 1 ) ;
	}
	if ( q_imgtoload.length ) q_imgtoloadtimer = setTimeout( q_himgcheckloaded , 100 ) ;
	else q_imgtoloadtimer = null ;
}

function q_imgcheckloaded() {
	q_himgcheckloaded() ;
}

function q_waitimgloaded( src , h , p ) {
	var test = new Image( ) ;
	test.src = src ;
// #1509
/*
	if ( test.complete ) {
		if ( h ) h.apply( this , p ) ;
		return true ;
	}
*/
	q_imgtoload.push( [ test , h , p ] ) ;
	if ( ! q_imgtoloadtimer ) q_imgtoloadtimer = setTimeout( q_himgcheckloaded , 100 ) ;
	return false ;
}

var q_imgtimer = null ;
var q_imgtofix = [] ;

var q_imgtoloadtimer = null ;
var q_imgtoload = [] ;

function q_hsetimgsrc( imgobj , h , p ) { // imgobj = [ img , src , sizes ] 
//	if ( ! issafari() ) return q_hdosetimgsrc( imgobj , h , p ) ;
	imgobj[ 0 ].src = imgobj[ 1 ] ;
	return q_waitimgloaded( imgobj[ 1 ] , q_hdosetimgsrc , [ imgobj , h , p ] ) ;

	var test = new Image( ) ;
	test.src = imgobj[ 1 ] ;
	if ( test.complete ) return q_hdosetimgsrc( imgobj , h , p ) ;
	q_imgtoload.push( [ test , imgobj , h , p ] ) ;
	if ( ! q_imgtoloadtimer ) q_imgtoloadtimer = setTimeout( q_imgcheckloaded , 100 ) ;	
}

function q_setimgsrc( img , src , sizes ) {
	q_hsetimgsrc( [ img , src , sizes ] ) ;
}

function q_hdosetimgsrc( imgobj , h , p ) { // imgobj = [ img , src , sizes ]
	var img = ge( imgobj[ 0 ] ) ;
	if ( ! img || ! img.parentNode ) return ; // si jamais l'image a disparu
	var re = new RegExp( "\\.png($|\\?)" , "i" ) ;
	var src = imgobj[ 1 ] ;
	img.src = src ;
	if ( ! re.test( img.src ) || ! isie6() ) {
		if ( re.test( img.src ) && ( ! (/\bpng/).test( img.className ) ) ) img.className += " png" ;
		if ( h ) h.apply( this , ( p ) ? p : [] ) ;
		return ;
	}
	img.className = img.className.replace( /\bpng[^ ]*\b/ , "" ) ;
	var sizes = imgobj[ 2 ] ; 
	if ( sizes ) {// on pourrait supprimer le test et du coup faire un reset de la taille lorsqu'elle n'est pas passée
		img.style.width = ( sizes ) ? sizes[ 0 ] : "" ;
		img.style.height = ( sizes ) ? sizes[ 1 ] : "" ;
	}
	img.style.visibility = "hidden" ;
	img.style.filter = "" ;
	q_imgtofix.push( [ img , h , p ] ) ;
	if ( ! q_imgtimer ) q_imgtimer = setTimeout( q_renderimgie6 , 100 ) ;
}

function q_dosetimgsrc( img , src , sizes ) {
	q_hdosetimgsrc( [ img , src , sizes ] ) ;
}

function q_pngbgimagename( x ) {
	if ( /(pngbtn|btnbtn)/.test( x.parentNode.className ) ) x = x.parentNode ;
	if ( /pngbtn/.test( x.className ) && isie6() ) {
		var ref = x.getElementsByTagName( "DIV" )[0].style.filter ;
	} else if ( /btnbtn/.test( x.className ) ) {
		var ref = ( isie6() ) ? gebcn( x , "divimg" ).style.filter : gebcn( x , "divimg" ).style.backgroundImage ;
	} else var ref = x.style.backgroundImage ;
//	var ref = ( isie6() && /pngbtn/.test( x.className ) ) ? x.getElementsByTagName( "DIV" )[0].style.filter : x.style.backgroundImage ;
	var re = new RegExp( ".*/([^/]*).png.*$" ) ;
	return ref.replace( re , "$1" ) ;
}

/*
function -
function CSS
*/

function q_getCSS( selector, key ) {
	var r = getCSSRule( selector ) ;
	if ( ! r ) return "" ;
	return ( eval( "r.style." + key ) ) ;
}

function q_setCSS( selector, key, value ) {
	var r = addCSSRule( selector ) ;
	eval( "r.style." + key + " = '" + value + "'" ) ;
}

function q_killCSS( selector ) {
	getCSSRule( selector, true ) ;
}

//http://www.hunlock.com/blogs/Totally_Pwn_CSS_with_Javascript

function getCSSRule( ruleName, toDelete ) {
	ruleName = ruleName.toLowerCase() ;
	if ( document.styleSheets ) {
		for ( var i=0; i<document.styleSheets.length; i++ ) {
			var styleSheet = document.styleSheets[ i ] ;
			var j = 0 ;
			var cssRule = false ;
			do {
				if ( styleSheet.cssRules ) cssRule = styleSheet.cssRules[ j ] ;
				else cssRule = styleSheet.rules[ j ] ;
				if ( cssRule ) {
					if ( cssRule.selectorText.toLowerCase() == ruleName ) {
						if ( toDelete ) {
							if ( styleSheet.cssRules ) styleSheet.deleteRule( j ) ;
							else styleSheet.removeRule( j ) ;
							return true ;
						} else return cssRule ;
					}
				}
				j++ ;
			} while ( cssRule ) ;
		}
	}
	return false ;
}

function addCSSRule( ruleName ) {
	if ( document.styleSheets ) {
		if ( ! getCSSRule( ruleName ) ) {
			if ( document.styleSheets[ 0 ].addRule ) document.styleSheets[ 0 ].addRule( ruleName, null, 0 ) ;
			else document.styleSheets[ 0 ].insertRule( ruleName + " { }", 0 ) ;
		}
	}
	return getCSSRule( ruleName ) ;
}

function gcs( e , jsKey ) { // jsKey = "top" , "backgroundColor" , etc
	e = ge( e ) ;
	if ( window.getComputedStyle ) return window.getComputedStyle( e , "" ).getPropertyValue( jsKey.replace(/([A-Z])/g, "-$1").toLowerCase() ) ;
	if ( e.currentStyle ) return e.currentStyle[ jsKey ] ;
	return e.style[ jsKey ] ;
}

/*
function -
function EVENTS
*/

function q_stdmouseover( ee ) {
	var e = ee ||  window.event ;
	var x = e.target || e.srcElement ;
	var button = getContainerOrSelf( x , "btnbtn" ) ;
	if ( button ) return q_mouseoverbutton( button ) ;
}

function q_stdmouseout( ee ) {
	var e = ee ||  window.event ;
	var x = e.target || e.srcElement ;
	var button = getContainerOrSelf( x , "btnbtn" ) ;
	if ( button ) return q_mouseoutbutton( button ) ;
}

function q_coremouseio ( ee , relevantTargetCatcher , mouseioFunction ) {
	var target = getElementFromEvent( ee ) ;
	var relevantTarget = getContainerOrSelf( target , relevantTargetCatcher ) ;
	if ( ! relevantTarget ) return null;
	var relatedTarget = getRelatedElementFromEvent( ee ) ;
//	if ( ! relatedTarget ) return null ;
	var relevantRelatedTarget = getContainerOrSelf( relatedTarget , relevantTargetCatcher ) ;
	if( relevantRelatedTarget == relevantTarget ) return null;
	return mouseioFunction( relevantTarget , ee ) ;
}

function q_coremouseonclick ( ee , relevantTargetCatcher , mouseonclickFunction ) {
	var target = getElementFromEvent( ee ) ;
	var relevantTarget = getContainerOrSelf( target , relevantTargetCatcher ) ;
	if(!relevantTarget) return null;
	return mouseonclickFunction( relevantTarget , ee ) ;
}

function q_coremouseclick ( ee , relevantTargetCatcher , mouseonclickFunction ) { return q_coremouseonclick ( ee , relevantTargetCatcher , mouseonclickFunction ) ; }

function q_containermover( x , v ) {
	var div = getElementsByClassName( x , "qbtn" ) ;
	for ( var i = 0 ; i<div.length ; i++ ) q_mouseoverbutton( div[ i ] , v ) ;
}

function q_mouseoverbutton( x , v ) {// recopié dans homepage@fr/scripts/fo_homepage.js
try{
	x = ge( x );
	if ( /(pngbtn|btnbtn)/.test( x.parentNode.className ) ) x = x.parentNode ;
	if ( /locked/.test( x.className ) ) return ;
	if ( /btncontainer/.test( x.className ) ) {
		var d = getElementsByClassName( x, "btnbtn" ) ;
		for ( var i=0; i<d.length; i++ ) q_mouseoverbutton( d[ i ] ) ;
		return ;
	}
	var b = /pngbtn/.test( x.className ) ;
	if ( b && isie6() ) {
		x = x.getElementsByTagName( "DIV" )[ 0 ] ;
		x.style.top = ( ( v ) && ( /top/.test ( v ) ) ) ? "0px" : "" ;
		x.style.bottom = ( ( v ) && ( /top/.test ( v ) ) ) ? "" : "0px" ;
	} else if ( /btnbtn/.test( x.className ) ) {
		x = gebcn( x , "divimg" ) ;
		x.style.top = ( ( v ) && ( /top/.test ( v ) ) ) ? "0px" : "" ;
		x.style.bottom = ( ( v ) && ( /top/.test ( v ) ) ) ? "" : "0px" ;
	} else{
		if ( isfirefox())  x.style.backgroundPosition = v ? v : "bottom" ;
		else  x.style.backgroundPositionY = v ? v : "bottom" ;
	}
}
catch(e){}
}

function q_containermout( x , v ) {
	var div = getElementsByClassName( x , "qbtn" ) ;
	for ( var i = 0 ; i<div.length ; i++ ) q_mouseoutbutton( div[ i ] , v ) ;
}

function q_mouseoutbutton ( x , v ) {// recopié dans homepage@fr/scripts/fo_homepage.js
try{
	x = ge( x );
	if ( /(pngbtn|btnbtn)/.test( x.parentNode.className ) ) x = x.parentNode ;
	if ( /locked/.test( x.className ) ) return ;
	if ( /btncontainer/.test( x.className ) ) {
		var d = getElementsByClassName( x, "btnbtn" ) ;
		for ( var i=0; i<d.length; i++ ) q_mouseoutbutton( d[ i ] ) ;
		return ;
	}
	var b = /pngbtn/.test( x.className ) ;
	if ( b && isie6() ) {
		x = x.getElementsByTagName( "DIV" )[ 0 ] ;
		x.style.bottom = ( ( v ) && ( /bottom/.test ( v ) ) ) ? "0px" : "" ;
		x.style.top = ( ( v ) && ( /bottom/.test ( v ) ) ) ? "" : "0px" ;
	} else if ( /btnbtn/.test( x.className ) ) {
		x = gebcn( x , "divimg" ) ;
		x.style.bottom = ( ( v ) && ( /bottom/.test ( v ) ) ) ? "0px" : "" ;
		x.style.top = ( ( v ) && ( /bottom/.test ( v ) ) ) ? "" : "0px" ;
	} else {
		if (isfirefox()) x.style.backgroundPosition = v ? v : "top" ;
		else x.style.backgroundPositionY = v ? v : "top" ;
	}
}
catch(e){}
}

function q_mob( x, v ) {
	if ( v ) {
		x.className = x.className.replace( /newbtnoff\b/, "newbtnon" ) ;
		q_mouseoverbutton( x ) ;
	} else {
		x.className = x.className.replace( /newbtnon\b/, "newbtnoff" ) ;
		q_mouseoutbutton( x ) ;
	}
}

function autowbtn_cmout( t , args ) {
	var td = t.getElementsByTagName( "TD" ) ;
	var x0 = td[ 0 ].getElementsByTagName( "DIV" )[ 0 ] ;
	var x1 = td[ 1 ].getElementsByTagName( "DIV" )[ 0 ] ;
	q_mouseoutbutton( x0 , "left top"  ) ;
	q_mouseoutbutton( x1 , "right top"  ) ;
	if ( /\b.*_mover\b/.test( t.className ) ) t.className = t.className.replace( /\b(.*)_mover\b/, "$1_mout" ) ;
}

function autowbtn_mout( t , args ) {
	var td = t.getElementsByTagName( "TD" ) ;
	var x0 = td[ 0 ].getElementsByTagName( "DIV" )[ 0 ] ;
	var x1 = td[ 1 ].getElementsByTagName( "DIV" )[ 0 ] ;
	q_mouseoutbutton( x0 , "left top"  ) ;
	q_mouseoutbutton( x1 , "right top"  ) ;
	var b = /pngbtn/.test( x0.className ) ;
	if ( b && isie6() ) x0 = x0.getElementsByTagName( "DIV" )[ 1 ] ;
	x0.style.lineHeight = '22px' ;
	if ( ! args ) return ;
	for ( var x in args ) {
		if ( ( x == "ie6" ) && ( b ) && ( isie6() ) ) {
			for ( var y in args[ x ] ) x0.style[ y ] = args[ x ][ y ] ;
		} else x0.style[ x ] = args[ x ] ;
	}
}

function autowbtn_cmover( t , args ) {
	var td = t.getElementsByTagName( "TD" ) ;
	var x0 = td[ 0 ].getElementsByTagName( "DIV" )[ 0 ] ;
	var x1 = td[ 1 ].getElementsByTagName( "DIV" )[ 0 ] ;
	q_mouseoverbutton( x0 , "left bottom" ) ;
	q_mouseoverbutton( x1 , "right bottom" ) ;
	if ( /\b.*_mout\b/.test( t.className ) ) t.className = t.className.replace( /\b(.*)_mout\b/, "$1_mover" ) ;
}

function autowbtn_mover( t , args ) {
	var td = t.getElementsByTagName( "TD" ) ;
	var x0 = td[ 0 ].getElementsByTagName( "DIV" )[ 0 ] ;
	var x1 = td[ 1 ].getElementsByTagName( "DIV" )[ 0 ] ;
	q_mouseoverbutton( x0 , "left bottom" ) ;
	q_mouseoverbutton( x1 , "right bottom" ) ;
	var b = /pngbtn/.test( x0.className ) ;
	if ( b && isie6() ) x0 = x0.getElementsByTagName( "DIV" )[ 1 ] ;
	x0.style.lineHeight = '26px' ;
	if ( ! args ) return ;
	for ( var x in args ) {
		if ( ( x == "ie6" ) && ( b ) && ( isie6() ) ) {
			for ( var y in args[ x ] ) x0.style[ y ] = args[ x ][ y ] ;
		} else x0.style[ x ] = args[ x ] ;
	}
}

function blurdefault( x , thegraytext , thegraycolor , theplaincolor ) {
	if ( theplaincolor === undefined ) theplaincolor = "#000000" ;
	if ( typeof x == 'string' ) x = getelement ( x ) ;
	if ( x == null ) return ;
	if ( ( x.value == "" ) || ( x.value == thegraytext ) ) {
		x.value = thegraytext ;
		x.style.color = thegraycolor ;
	} else x.style.color = theplaincolor ;
}

function focusdefault( x , thegraytext , theplaincolor ) {
	if ( typeof x == 'string' ) x = getelement ( x ) ;
	if ( x == null ) return ;
	if ( x.value == thegraytext ) x.value="" ;
	x.style.color = theplaincolor ;
}

function focusoptional( x , thegraytext ) {
	focusdefault ( x , thegraytext , "#000" ) ;
}

function bluroptional( x , thegraytext ) {
	blurdefault( x , thegraytext , "#AAA" , "#000" ) ;
}

function mouseover_tabtitle( x ) {
	if ( /_open/.test( x.className ) ) return ;
	x.className = x.className.replace( "_closed", "_mouseover" ) ;
}

function mouseout_tabtitle( x ) {
	if ( /_open/.test( x.className ) ) return ;
	x.className = x.className.replace( "_mouseover", "_closed" ) ;
}

var q_windowblurhandlers = [] ;
var q_windowfocushandlers = [] ;

function q_addwindowblurhandlers( h ) { //h = string
	window.onblur = window.onblur || q_windowblur ;
	if ( indexOfItem( h , q_windowblurhandlers ) == -1 ) q_windowblurhandlers.push( h ) ;
}
function q_addwindowfocushandlers( h ) { //h = string
	window.onfocus = window.onfocus || q_windowfocus ;
	if ( indexOfItem( h , q_windowfocushandlers ) == -1 ) q_windowfocushandlers.push( h ) ;
}
function q_windowblur(ee) {
	var target = getElementFromEvent( ee ) ;
	if ( target != window && target != window.document ) return ;
	for ( var i = 0 ; i < q_windowblurhandlers.length ; i++ ) {
		try { eval ( q_windowblurhandlers[ i ] ).apply ( this , [] ) ; } catch(err) {}
	}
}
function q_windowfocus(ee) {
	var target = getElementFromEvent( ee ) ;
	if ( target != window && target != window.document ) return ;
	for ( var i = 0 ; i < q_windowfocushandlers.length ; i++ ) {
		try { eval ( q_windowfocushandlers[ i ] ).apply ( this , [] ) ; } catch(err) {}
	}
}

function setcurrfocus( x ){
	currfocus = x ;
}

function setfocus( x ){
	var y = getelement( x ) ;
	if ( y != null ) {
		y.focus() ;
		return true ;
	}
	return false ;
}

function setselection( x ){
	var y = getelement( x ) ;
	if ( y != null ) {
		y.focus() ;
		y.select() ;
		return true ;
	}
	return false ;
}

function focusandselect ( x ) {
	if ( typeof x == 'string' ) x = getelement ( x ) ;
	if ( x == null ) return false ;
	try { x.focus() ; } catch ( err ) {  } ; // if (x.focus) ne suffit pas
	try { x.select() ; } catch ( err ) {  } ;
	return false ;
}

/*
function -
function FULL SCREEN MASK
*/

var q_fsmzindex = 0 ; 

function q_incrementfsmindex() {
	q_fsmzindex++ ;
	q_fsmzindex = Math.max( ( window.zindexmax || 0 ) + 1 , q_fsmzindex ) ;
	return q_fsmzindex ;
}

function fsm_displayoption( displayoption ) {
	if ( ! displayoption ) return null ;
	var s = displayoption.split( " " ) ;
	if ( s.length == 1 ) s = s.concat( s ) ;
	for ( var i = 0 ; i < 2 ; i++ ) {
		if ( /[0-9]+%/.test( s[ i ] ) ) s[ i ] = parseInt( s[ i ] , 10 ) / 100 ;
		else if ( /[0-9.]+/.test( s[ i ] ) ) s[ i ] = parseFloat( s[ i ] , 10 ) ;
		else if ( s[ i ] == "center" ) s[ i ] = 0.5 ;
		else if ( s[ i ] == "top" ) s[ i ] = 0 ;
		else if ( s[ i ] == "bottom" ) s[ i ] = 1 ;
		else if ( s[ i ] == "left" ) s[ i ] = 0 ;
		else if ( s[ i ] == "right" ) s[ i ] = 1 ;
		else if ( s[ i ] == "none" ) s[ i ] = null ;
	}
	return s ;
}

function q_fsm_wait_blockreveal( div , json , s ) {
	q_innerHTML( gebtn( gebcn( div , "q_fsm_wait" ) , "DIV" ) , s || common_message[ "defaultwait" ] ) ;
}

function q_fsm_wait( s ) {
	q_fsm_reveal( { src : '<div class="q_fsm_wait"><img src="/bundles/qlub/images/waitanim.gif" alt="" /><div></div></div>' , hideheader : true , reveal_callback : q_fsm_wait_blockreveal , reveal_args : [ s ] } ) ;
}

function q_alert( msg, options ){
	if ( typeof( msg ) == "object" ) {
		try{ msg = msg.innerHTML; } catch(e){}
	}
	if ( ! options ) options = {};
	var title = options.title || "Quomodo"; 
	var icon = options.icon || "q_alert_warning";
	var callback = options.callback ;
	var width  = options.width  || "300"; 
	var enter = options.enter || "true";
	
	var thesrc = create_elem( "TABLE", { cellSpacing : "0", cellPadding : "10", border : "0", className : "q_fsm_alert", style : { width : width + 'px' } } ) ;
	var tr, td;
	tr  = thesrc.insertRow( -1 );
	td = create_td( tr, { width : "1" } );
	td.appendChild( create_elem( "IMG", { className : "png " + icon , src : "/images/blank.gif", alt : "" } ) );
	td  = create_td( tr, { vAlign : "middle", align : "left", innerHTML : msg } );
	tr = thesrc.insertRow( -1 );
	td = create_td( tr, { colSpan : "2", align : "center" } );
	var btn = create_elem( "DIV", { className : "q_button", innerHTML : "ok" } );
	btn.onmouseover  = function(){ q_mouseoverbutton( this ); this.style.color='#FFF'; };
	btn.onmouseout = function(){ q_mouseoutbutton( this ); this.style.color='#333'; };
	btn.onclick = function(){ q_fsm_delete(); };
	if ( enter == "true" ) btn.onkeypress = function( e ){ if ( q_keycode( e ) == 13 ) q_fsm_delete(); };
	btn.onmousedown = function( e ){ q_stopPropagation( e ); };
	td.appendChild( btn );
	
	var json = {};
	json.src = thesrc;
	json.title = title;
	if ( callback ) json.deletecallback = callback;
	q_fsm_reveal( json ) ;
}

function q_fsm_reveal( json ) {
/*
src : string (HTML), oject HTML ou json (pour q_include)
title : string
delete_title : string ("vrai" attribut title)
draggable : boolean
position : comme fsm_displayoption
revealid : id target du bloc pour tester son existance
reveal_callback, reveal_args, delete_callback, delete_args
*/

	var revealid = json.revealid || ( ! json.src.tagName && json.src.id ) ;
	if ( revealid && ge( revealid ) ) q_fsm_finishreveal( getContainer( ge( revealid ) , "q_fsmblockcontainer" ) , json ) ;
	else {
		var div = create_elem( "DIV" , { className : "q_fsmblockcontainer" , style : { position : "absolute" , left : "0px" , top : "0px" } } ) ;
		div.innerHTML = '<div class="q_fsmblockcontainer_screenmask"></div><table class="q_fsmblockcontainer_block" cellspacing="0" cellpadding="0" border="0" style="border: solid 1px white;"><tbody><tr class="q_fsmblockcontainer_header clubbackgroundcolor2"><td width="1" height="27" align="left" style="border-right: solid 1px"><div class="q_fsmblockcontainer_delete" onclick="q_fsm_delete(); return false;" onmousedown="q_stopPropagation( event )"><div class="q_fsmblockcontainer_deletebtn"/></div></td><td align="left"><div class="q_fsmblockcontainer_title"></div></td></tr><tr><td class="q_fsmblockcontainer_content" style="background-color:white;" align="center" colspan="2"></td></tr></tbody></table>' ;
		div = ge( "q_fullscreenmask" ).appendChild( div ) ;
		if ( ( typeof json.src ) == "string" ) {
			gebcn( div , "q_fsmblockcontainer_content" ).innerHTML = json.src ;
			q_fsm_finishreveal( div , json ) ;
		} else {
			if ( json.src.tagName ) {
				gebcn( div , "q_fsmblockcontainer_content" ).appendChild( json.src );
				q_fsm_finishreveal( div , json ) ;
			} else {
				json.src.target = gebcn( div , "q_fsmblockcontainer_content" ) ;
				q_include( [ json.src ] , "q_fsm_finishreveal" , [ div , json ] ) ;
			}
		}
	}
}

function q_fsm_finishreveal( div , json ) {
	if ( ! json.position ) json.position = "50% 25%" ;
	div.revealid = json.revealid || ( ! json.src.tagName && json.src.id ) ;
	if ( json.draggable != false ) gebcn( div , "q_fsmblockcontainer_block" ).onmousedown = function( event ) { beginFreeDrag( this, event ) ; } ;
	gebcn( div , "q_fsmblockcontainer_delete" ).title = json.delete_title || common_message[ "close" ] ;
	if ( json.title ) q_innerHTML( gebcn( div , "q_fsmblockcontainer_title" ) , json.title ) ;
	if ( json.hideheader ) hideblock( gebcn( div , "q_fsmblockcontainer_header" ) ) ;
	q_fsm_showblock( gebcn( div , "q_fsmblockcontainer_block" ) , json ) ;
	q_apply( json.reveal_callback , [ div , json ].concat( json.reveal_args || [] ) ) ;
	div.delete_callback = json.delete_callback ;
	div.delete_args = json.delete_args ;
	q_fsm_revealed.push( div ) ;
}

var q_fsm_revealed = [] ;
function q_fsm_delete( x ) {
	if ( x ) var div = getContainer( x , "q_fsmblockcontainer" ) ;
	else var div = q_fsm_revealed.splice( q_fsm_revealed.length - 1 , 1 )[ 0 ] ;
	if ( div.delete_callback ) div.delete_callback.apply( this , div.delete_args || [] ) ;
	var b = div.fsmpresent || false ;
	if ( ! div.revealid ) rm( div ) ;
	else hideblock( div ) ;
	visibleblock( "q_fullscreenmask" , b ) ;
}

function fsm_showblock( elem , displayoption , base ) {
	q_fsm_showblock( elem , { position : displayoption } , base ) ;
}

function q_fsm_showblock( elem , json , base ) {
	elem = ge( elem , base ) ;
	if ( elem.splice ) {
		for ( var i in elem ) q_fsm_showblock( elem[ i ] , json , base ) ;
		return ;
	}
	var formateddisplay = fsm_displayoption( json.position ) ;
	var ww = q_windowInnerWidth() ;
	var wh = q_windowInnerHeight() ;
	if ( formateddisplay && formateddisplay[ 0 ] != null ) elem.style.left = 2*ww ;
	if ( formateddisplay && formateddisplay[ 1 ] != null ) elem.style.top = 2*wh ;
	q_fsm_showfullscreenmask( elem , json ) ;
	showblock( [ getContainer( elem , "q_fsmblockcontainer" ) , elem ] ) ;
	if ( formateddisplay && formateddisplay[ 0 ] != null ) elem.style.left = Math.round( ( ww - elem.offsetWidth ) * formateddisplay[ 0 ] ) + "px" ;
	if ( formateddisplay && formateddisplay[ 1 ] != null ) elem.style.top = Math.round( ( wh - elem.offsetHeight ) * formateddisplay[ 1 ] ) + "px" ;
}

function q_fsm_showfullscreenmask( elem , json ) {
	var div = getContainer( elem , "q_fsmblockcontainer" ) ;
	if ( div ) {
		div.fsmpresent = ( ge("q_fullscreenmask").style.display != "none" ) ;
		div.style.zIndex = q_incrementfsmindex() ;
		var maskopacity = ( div.fsmpresent ) ? 0.5 : 0.05 ;
		var mask = gebcn( div , "q_fsmblockcontainer_screenmask" ) ;
		mask.style.opacity = "" + maskopacity ;
		mask.style.filter = "alpha(opacity=" + ( 5 * Math.round( 20 * maskopacity ) ) + ")" ;
	}
	displayfullscreenmask( json.color , json.opacity ) ;
}

function displayfullscreenmask( color, opacity ) {
	var fsm = gebcn( ge( "q_fullscreenmask" ), "q_fullscreenmask" ) ;
	if ( ! color ) {
		fsm.style.backgroundColor = "#777" ;
		fsm.style.opacity = "0.25" ;
		fsm.style.filter = "alpha(opacity=25)" ;
	} else {
		fsm.style.backgroundColor = color ;
		if ( ! opacity ) {
			fsm.style.opacity = "0.25" ;
			fsm.style.filter = "alpha(opacity=25)" ;
		} else {
			fsm.style.opacity = opacity ;
			fsm.style.filter = "alpha(opacity=" + opacity*100 + ")" ;
		}
	}
	showblock( "q_fullscreenmask" ) ;
}

function q_fsmpresent() {
	return ge( "q_fullscreenmask" ) && ge( "q_fullscreenmask" ).style.display == 'block' ;
}

/*
function -
function MOVE & EFFECTS
*/

function movediv( x ) {
	xmovediv( x , 0.7 , "*" ) ;
}

function xmovediv( x , module , mode ) {
	var div = getelement( x ) ;
	var u,v ;
	var again = false ;
	var keys = [ "left" , "top" , "width" ] ;
	for ( var i = 0 ; i < 3 ; i++ ) {
		 v = div.style[keys[i]] ;
		var targetkey = "target" + keys[i] ;
		if ( v ) if ( div[ targetkey ] != null ) {
			if ( /%/.test ( v ) ) u = "%" ;
			else u = "px" ;
			if ( mode == "+" ) {
				if ( Math.abs( div[ targetkey ] - parseInt( v ) ) < module ) div.style[keys[i]] = div[ targetkey ] + u ;
				else div.style[keys[i]] = ( Math.round( parseInt( v ) + module * ( ( div[ targetkey ] - parseInt( v ) < 0 ) ? -1 : 1 ) ) ) + u ;
			} else div.style[keys[i]] = ( Math.round( parseInt( v ) + module * ( div[ targetkey ] - parseInt( v ) ) ) ) + u ;
			again = again || ( Math.abs( div[ targetkey ] - parseInt( div.style[keys[i]] ) ) > 1 ) ;
		}
	}
	if ( again ) setTimeout( function() { xmovediv( x , module ,mode ) ; } , 100 ) ;
}

function applymoveid( id , left , top , width ) {
	applymove( getelement( id ) , left , top , width ) ;
}

function dounrolldiv( x, h ) {
	var div = getelement( x ) ;
	var currh = parseInt( div.style.height ) ;
	if ( currh < h ) {
		div.style.height = currh + 25 + "px" ;
		setTimeout( "dounrolldiv( '" + x + "', '" + h + "' )" , 5 ) ;
	} else {
		div.style.height = "" ;
		div.id = "" ;
	}
}

function doblink( x, v ) {
	var d = getelement( x ) ;
	if ( ! d ) return ;
	if ( v > 0 ) {
//		d.style.visibility = ( d.style.visibility == "visible" ) ? "hidden" : "visible" ;
		d.style.visibility = ( ( d.style ) && ( d.style.visibility == "visible" ) ) ? "hidden" : "visible"  ;
		setTimeout( "doblink( '" + d.id + "', '" + ( v - 1 ) + "' )" , 250 ) ;
	}
}

function applyresize( div , width , module , mode ) {
	if ( ! div || ! div.parentNode ) return ;
	div.targetleft = div.targettop = null ;
	div.targetwidth = parseInt( width ) ;
	xmovediv( div , module || 0.7 , mode ) ;
}

function applymove( div , left , top , width ) {
	if ( ! div || ! div.parentNode ) return ;
	div.targetleft = parseInt( left ) ;
	div.targettop = ( top != null ) ? parseInt( top ) : null ;
	div.targetwidth = ( width != null) ? parseInt( width ) : null ;
	movediv( div ) ;
}

function q_dim( div , dimtarget , slow , callback ) { // slow = false, or true, or 20 (fast) ou 200 (real slow) etc
	if ( div.splice ) for ( var i = 0 ; i < div.length ; i++ ) q_dim( div[ i ] , dimtarget , slow , callback ) ;
	if ( typeof ( div ) == "string" ) div = ge ( div ) ;
	if ( ( div.style.display ) && ( div.style.display == "none" ) ) return ;
	div.dimtarget = dimtarget ;
	div.dimcallback = callback ? callback : null ;
	do_q_dim( div , slow ) ;
}

function do_q_dim( div , slow ) {
	if ( typeof ( div ) == "string" ) div = getelement ( div ) ;
	if ( ! div ) return ;
	if ( div.dimtarget == undefined ) return ;
	if ( ( slow == null ) || ( slow == undefined ) ) slow = true ;
	if ( slow == true ) slow = 50 ;
	if ( ! slow ) {
		var opa = div.dimtarget ;
		div.style.opacity = "" + opa ;
		if ( opa == 1 ) div.style.filter = "" ;
		else div.style.filter = "alpha(opacity=" + Math.round ( 100 * opa ) + ")" ;
		if ( div.dimcallback ) div.dimcallback() ;
		return ;
	}
	if ( ! div.style.opacity ) div.style.opacity = "1" ;
	var opa = parseFloat ( div.style.opacity ) ;
	if ( div.dimtarget > opa ) {
		opa = opa + 0.2 ;
		if ( opa > div.dimtarget ) opa = div.dimtarget ;
	} else {
		opa = opa - 0.2 ;
		if ( opa < div.dimtarget ) opa = div.dimtarget ;
	}
	div.style.opacity = "" + opa ;
	if ( opa == 1 ) div.style.filter = "" ;
	else div.style.filter = "alpha(opacity=" + Math.round ( 100 * opa ) + ")" ;
	if ( opa != div.dimtarget ) setTimeout ( function(){ do_q_dim ( div ) ; } , slow ) ;
	else if ( div.dimcallback ) div.dimcallback() ;
} // opacity: "0.5" ; filter: alpha(opacity=50)

function smartfade( x, recall ) {
 	var div = getelement( x ) ;
	if ( ! recall ) {
		showblock ( div ) ;
		div.style.opacity = 1 ;
		div.style.filter = "alpha(opacity=100)" ;
		if ( ! div.fadingout ) {
			div.fadingout = true ;
			setTimeout( "smartfade( '" + x + "' , true )" , 80 ) ;
		}
	} else {
		if ( ( div.style.opacity -= 0.05 ) <= 0 ) {
			hideblock ( div ) ;
			div.style.opacity = 1 ;
			div.style.filter = "alpha(opacity=100)" ;
			div.fadingout = false ;
		} else {
			div.style.filter = "alpha(opacity=" + Math.round ( 100 * parseFloat ( div.style.opacity ) ) + ")" ;
			setTimeout( "smartfade( '" + x + "' , true )" , 80 ) ;
		}
	}
}

/*
function -
function DIMENSIONS
*/

function q_trueXY( y ) {
	var y = ge( y ) ;
	var pos ;
	if ( isremoved( y ) ) return [ 0 , 0 ] ;
	if ( y.getBoundingClientRect ) {
		var box = y.getBoundingClientRect() ;
		var doc = document ;
		var scroll = getscroll() ;
		return [ Math.round( box.left + scroll[ 0 ] ) , Math.round( box.top + scroll[ 1 ] ) ] ;
	} else {
		pos = [y.offsetLeft, y.offsetTop];
		parentNode = y.offsetParent;
		if (parentNode != y) {
			while (parentNode) {
				pos[0] += parentNode.offsetLeft;
				pos[1] += parentNode.offsetTop;
				parentNode = parentNode.offsetParent;
			}
		}
		if (issafari() && gcs(y, "position") == "absolute" ) { // safari doubles in some cases
			pos[0] -= document.body.offsetLeft;
			pos[1] -= document.body.offsetTop;
		} 
	}

	if ( y.parentNode ) parentNode = y.parentNode;
	else parentNode = null;
	
	while (parentNode && parentNode.tagName.toUpperCase() != 'BODY' && parentNode.tagName.toUpperCase() != 'HTML') { // account for any scrolled ancestors
		if ( gcs(parentNode, 'display') != 'inline') { // work around opera inline scrollLeft/Top bug
			pos[0] -= parentNode.scrollLeft;
			pos[1] -= parentNode.scrollTop;
		}
		
		if (parentNode.parentNode) parentNode = parentNode.parentNode; 
		else parentNode = null;
	}
	return [ Math.round( pos[0] ) , Math.round( pos[1] ) ] ;
}

function q_parentwindowInnerWidth() {
	if ( parent.window.innerWidth ) return parseInt( parent.window.innerWidth , 10 ) ;
	else return parseInt( parent.document.documentElement.clientWidth , 10 ) ;
}

function q_windowInnerWidth() {
	if ( isiniframe() ) return q_parentwindowInnerWidth() ;
	if ( document.documentElement && document.documentElement.clientWidth ) return parseInt( document.documentElement.clientWidth , 10 ) ;
	else if ( window.innerWidth ) return parseInt( window.innerWidth , 10 ) ;
	else return parseInt( document.body.clientWidth , 10 ) ;
// vh : les 2 lignes suivantes focntionnent pour IE6, mais la 2e est celle qui donne le bon résultat.
//	else if ( document.body.clientWidth ) return parseInt( document.body.clientWidth , 10 ) ;
//	else return parseInt( document.documentElement.clientWidth , 10 ) ;
}

function q_parentwindowInnerHeight() {
	if ( parent.window.innerHeight ) return parseInt( parent.window.innerHeight , 10 ) ;
	else return parseInt( parent.document.documentElement.clientHeight , 10 ) ;
}

function q_windowInnerHeight() {
	if ( isiniframe() ) return q_parentwindowInnerHeight() ;
	if ( document.documentElement && document.documentElement.clientHeight ) return parseInt( document.documentElement.clientHeight , 10 ) ;
	else if ( window.innerHeight ) return parseInt( window.innerHeight , 10 ) ;
	else return parseInt( document.body.clientHeight , 10 ) ;
// vh : idem ci-dessus : les 2 lignes suivantes focntionnent pour IE6, mais la 2e est celle qui donne le bon résultat.
//	else if ( document.body.clientHeight ) return parseInt( document.body.clientHeight , 10 ) ;
//	else return parseInt( document.documentElement.clientHeight , 10 ) ;
}

function getscroll() {
	var x = 0, y = 0;
	if( typeof( window.pageYOffset ) == 'number' ) {
		y = window.pageYOffset;
		x = window.pageXOffset;
	} else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
		y = document.body.scrollTop;
		x = document.body.scrollLeft;
	} else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
		y = document.documentElement.scrollTop;
		x = document.documentElement.scrollLeft;
	}
	return [ x, y ];
}

function q_parentwindowscrollX(){
	if ( parent.window.scrollX ) return parent.window.scrollX ; // Safari , FF
	return parent.document.documentElement.scrollLeft ; // IE
}

function q_windowscrollX(){
	if ( isiniframe() ) return q_parentwindowscrollX() ;
	if ( window.scrollX ) return window.scrollX ; // Safari , FF
	return document.documentElement.scrollLeft ; // IE
}

function q_parentwindowscrollY(){
	if ( parent.window.scrollY ) return parent.window.scrollY ; // Safari , FF
	return parent.document.documentElement.scrollTop ; // IE
}

function q_windowscrollY(){
	if ( isiniframe() ) return q_parentwindowscrollY() ;
	if ( window.scrollY ) return window.scrollY ; // Safari , FF
	return document.documentElement.scrollTop ; // IE
}

function q_deltacontentwidth( elem ) {
	var div = ge( elem ) ;
	if ( ! div ) return 0 ;
	var csskey = [ "paddingLeft" , "paddingRight" , "borderLeftWidth" , "borderRightWidth" ] ;
	var x = 0 ;
	for ( var i in csskey ) {
		var y = parseInt( gcs( div , csskey[ i ] ) || "0" , 10 ) ;
		if ( y.toString() != "NaN" ) x += parseInt( gcs( div , csskey[ i ] ) || "0" , 10 ) ;
	}
	return x ;
}

function q_deltawidth( elem ) {
	var div = ge( elem ) ;
	if ( ! div ) return 0 ;
	if ( div.tagName == "TABLE" ) return 0 ;
	return q_deltacontentwidth( elem ) ;
}

function q_deltacontentheight( elem ) {
	var div = ge( elem ) ;
	if ( ! div ) return 0 ;
	var csskey = [ "paddingTop" , "paddingBottom" , "borderTopWidth" , "borderBottomWidth" ] ;
	var x = 0 ;
	for ( var i in csskey ) {
		var y = parseInt( gcs( div , csskey[ i ] ) || "0" , 10 ) ;
		if ( y.toString() != "NaN" ) x += parseInt( gcs( div , csskey[ i ] ) || "0" , 10 ) ;
	}
	return x ;
}

function q_deltaheight( elem ) {
	var div = ge( elem ) ;
	if ( ! div ) return 0 ;
	if ( div.tagName == "TABLE" ) return 0 ;
	return q_deltacontentheight( elem ) ;
}

function q_changedwidth( elem , targetoffsetwidth ) {
	var w = targetoffsetwidth || elem.offsetWidth ;
	var wstyle = w - q_deltawidth( elem ) ;
	elem.style.width = Math.max( 1 , Math.round( wstyle ) ) + "px" ; // mais parfois ça ne marche pas
	if ( elem.dragratio ) elem.style.height = Math.max( 1 , Math.round( wstyle * elem.dragratio ) ) + "px" ;
	if ( elem.resized ) elem.resized( elem , w ) ;
	if ( ! elem.toresize ) return ( elem.offsetWidth == w ) ;
	var x = elem.toresize() ;
	var contentwidth = w - q_deltacontentwidth( elem ) ;
	for ( var i = 0 ; i < x.length ; i++ ) {
		var targetelem = x[ i ] ;
		q_changedwidth( targetelem , ( targetelem.widthrule ) ? targetelem.widthrule( contentwidth ) : contentwidth ) ;
	}
	return ( elem.offsetWidth == w ) ;
}

/*
function -
function FORMULAIRES
*/

function getcheckedid(buttonfamilyname) {
	var x = document.getElementsByName( buttonfamilyname ) ;
	if ( ! x.length ) return null ; 
	for ( var i = 0 ; i < x.length ; i++ ) if ( ( ( x[i].tagName == 'INPUT' ) && ( x[i].checked ) ) || ( containsradioon ( x[i].className ) ) ) return x[i].id ;
	return x[0].id ;
}

function containsradioon( s ) {
	return ( /\bon\b/.test ( s ) ) ;
}

function radiobutton( s ) {
	return ( /\bradio\b/.test ( s ) ) ;
}

function radiohbutton( s ) {
	return ( /\bradioh\b/.test ( s ) ) ;
}

function toggleradio ( x ) {
	return switchradio ( x , ( /\boff\b/.test( x.className ) ) ) ;
}

function switchradio ( x , checked ) {
	var s = x.className ;
	x.className = ( checked ? s.replace ( /\boff\b/ , "on" ) : s.replace ( /\bon\b/ , "off" ) ) ;
	return x ;
	var id = x.id ;
	var onclick = x.onclick ;
	var y = x.cloneNode( true ) ;
	if ( id ) y.id = id + "tmp" ;
	y = x.parentNode.insertBefore( y , x ) ;
	if ( onclick ) y.onclick = onclick ;
	rm( x ) ;
	if ( id ) y.id = id ;
	return y ;
}

function q_handleradio( groupelem , x ) {
	if ( x.tagName ) x = x.target ;
	var radios = ge( groupelem ).getElementsByTagName( "A" ) ;
	for ( var i=0; i<radios.length; i++ ) radios[ i ].className = ( radios[ i ].target == x ) ? "radio on" : "radio off" ;
	return x ;
}

function q_targetradio( groupelem , value ) {
	var radios = ge( groupelem ).getElementsByTagName( "A" ) ;
	for ( var i=0; i<radios.length; i++ ) if ( radios[ i ].target == value ) return radios[ i ] ;
	return null ;
}

function getchecked( x , basehtml ) {
	x = getelement ( x , basehtml ) ;
	if ( x.tagName == 'INPUT' ) return x.checked ;
	return containsradioon ( x.className ) ;
}

function setchecked( x , checked , basehtml ) {
	x = getelement ( x , basehtml ) ;
	if ( ! x ) return ;
	if ( x.tagName == 'INPUT' ) { x.checked = checked ; return x ; }
	var s = x.className ;
	if ( radiobutton( s ) ) {
		var xs = ( x.name ) ? document.getElementsByName( x.name ) : [] ;
		if ( ( xs.length > 1 ) && ( ! checked ) ) return x ;
		var y = switchradio ( x , checked ) ;
		if ( ! checked ) return y ;
		var xs = ( y.name ) ? document.getElementsByName( y.name ) : [] ;
		for ( var i = 0 ; i < xs.length ; i++ ) {
			if ( ( xs[i].id != y.id ) && containsradioon ( xs[i].className ) ) {
				switchradio ( xs[i] , false ) ;
				xs = document.getElementsByName( y.name ) ;
			}
		}
		return y ;
	}
	if ( radiohbutton( s ) && ( ! checked ) ) return x ;
	var y = switchradio ( x , checked ) ;
	if ( ! radiohbutton( s ) ) return y ;
// 	if ( ! checked ) return y ;
	var radioname = y.name ;
	var yc = getContainer( y ) ;
	var xs = getElementsByClassName( yc , "radioh" ) ;
	var e ;
	for ( var i = 0 ; i < xs.length ; i++ ) {
		e = xs[ i ] ;
		if ( ( e.name ) && ( e.name == radioname ) &&  ( e != y ) && containsradioon ( e.className ) ) {
			switchradio ( e , false ) ;
			xs = getElementsByClassName( yc , "radioh" ) ;
		}
	}
	return y ;
}

/*
function -
function STRINGS & HTML
*/

function escapeattribute( xx ) {
	var x = "" + ( xx || "" ) ;
	if ( ! isIE ) return x.replace( /&/g , "&amp;" ).replace( /</g , "&lt;" ).replace( />/g , "&gt;" ).replace( /"/g , "&quot;" ).replace( /'/g , "&apos;" ) ;
	return x.replace( /&/g , "&amp;" ).replace( /</g , "&lt;" ).replace( />/g , "&gt;" ).replace( /"/g , "&quot;" ).replace( /'/g , "‘" ) ;
}

function escapeHTML( xx ) {
	var x = "" + ( xx || "" ) ;
	return x.replace( /&/g , "&amp;" ).replace( /</g , "&lt;" ).replace( />/g , "&gt;" ).replace( /(\r\n|\r|\n)/g , "<br/>" ) ;
}

function q_innerHTML( x , ss ) {
	var s = ss || "" ;
	x = ge( x ) ;
	if ( ! x ) return ;
	if ( /\bpngbtn/.test( x.className ) && isie6() ) x = x.getElementsByTagName( "DIV" )[ 1 ] ;
	if ( x.tagName == "TEXTAREA" ) x.value = s ;
	else x.innerHTML = escapeHTML( s ) ;
	// x.innerHTML = "" ;
	// x.appendChild( document.createTextNode( s ) ) ;
}

function wiqi_text2HTML( s ) {
	if ( ! s ) return "" ;
	s = s.replace( /&/g, "&amp;" ) ;
	s = s.replace( />/g, "&gt;" ) ;
	s = s.replace( /</g, "&lt;" ) ;	
// [ "'''''" , "<b><i>$1</i></b>" ] ,
	var patts =[
[ "&gt;&gt;&gt;&gt;" , "<div style='margin: 0 0 0 3.2em'>$1</div>" ] ,
[ "&gt;&gt;&gt;" , "<div style='margin: 0 0 0 1.6em'>$1</div>" ] ,
[ "&gt;&lt;" , "<div style='text-align: center'>$1</div>" ] ,
[ "'''" , "<span style='font-weight:bold'>$1</span>" ] ,
[ "''" , "<span style='font-style:italic'>$1</span>" ] ,
[ "\\+\\+\\+\\+" , "<span style='font-size: 177% ; line-height: 1.4em'>$1</span>" ] ,
[ "\\+\\+\\+" , "<span style='font-size: 133% ; line-height: 1.4em'>$1</span>" ] ,
[ "-" + "-" + "-" , "<span style='font-size: 88% ; line-height: 1.4em'>$1</span>" ] ,
[ "[|]-[|]" , "<div style='text-align: justify ; margin: 0'>$1</div>" ] ,
[ "==" , "<span style='text-decoration: line-through'>$1</span>" ]
] ;
	var x ;
	for ( var i = 0 ; i < patts.length ; i++ ) {
		x = patts [i] ;
		s = s.replace( new RegExp ( x [0] + "((.|\\r|\\n)*?)" + x [0] , "g" ) , x[1] ) ;
		s = s.replace( new RegExp ( x [0] + "((.|\\r|\\n)+$)" , "m" ) , x[1] ) ;
	}
	s = s.replace ( /\[\[at\]\]/gi , "@" ) ;
	s = s.replace ( /\[\[([^\]]+?)-&gt;(js|javascript):(.+?)\]\]/gi , "<a href='#' style='cursor: pointer' onmousedown='disabledrag()' onclick='$3 ; return false'>$1</a>" ) ;
	s = s.replace ( /\[\[([^\]]+?)-&gt;http(.+?)\]\]/gi , "[[$1-&gt;tqmzzxvr$2]]" ) ;
	s = s.replace ( /\[\[([^\]]+?)-&gt;mailto(:[^\r\n <>,;:\/"]+)@([^ <>,;:\/"]+\.[a-z]{2,4})\]\]/gi , "[[$1-&gt;euwuvhtc$2pqsdfiezahds$3]]" ) ;
	s = s.replace ( /(https?:\/\/[a-z0-9_@\/=%#?&;.-]+[a-z0-9_@\/=%#?&;-])/gi , "[[$1-&gt;$1]]" ) ;
	s = s.replace ( /(mailto:)?([^\n\r <>,;:\/"]+@[^ <>,;:\/"]+\.[a-z]{2,4})/gi , "[[$2-&gt;mailto:$2]]" ) ;
	s = s.replace ( /tqmzzxvr/g , "http" ).replace ( /euwuvhtc/g , "mailto" ).replace ( /pqsdfiezahds/g , "@" ) ;
	s = s.replace ( /\[\[([^\]]+?)-&gt;(mailto:.+?)\]\]/gi , "<a href='$2' style='cursor: pointer' onmousedown='disabledrag()'>$1</a>" ) ;
	s = s.replace ( /\[\[img-&gt;(http[^\]]+?)(__([^\]]*))?\]\]/gi , "<img src='$1' hspace='12px' vspace='6px' align='$3' style='margin: 7px'/>" ) ;
	s = s.replace ( /\[\[img-&gt;([^\]]+?)(__([^\]]*))?\]\]/gi , "<img src='/images/help/$1' hspace='12px' vspace='6px' align='$3' style='margin: 7px'/>" ) ;
	s = s.replace ( /\[\[([^\]]+?)-&gt;(.+?)\]\]/gi , "<a href='$2' style='cursor: pointer' onmousedown='disabledrag()' onclick='window.open(this.href) ; return false'>$1</a>" ) ;
	s = s.replace ( /^#(.*)$/gm , "<span class='scsquare'>$1</span>" ) ;
	s = s.replace ( /\r/g , "\n" ) ;
	s = s.replace ( /(^|\n)[ \t\n]*-[ \t\n]*(.*)(\n|$)/g , "$1<ul><li style='margin-left: -2em'>$2</li></ul>$3" ) ;
	s = s.replace ( /(^|\n)[ \t\n]*-[ \t\n]*(.*)(\n|$)/g , "$1<ul><li style='margin-left: -2em'>$2</li></ul>$3" ) ;
	s = s.replace ( /<\/ul>[ \t\n]<ul>/g , "" ) ;
	s = s.replace ( /<\/ul>[ \t\n]/g , "</ul>" ) ;
	s = s.replace ( /[ \t\n]<ul>/g , "<ul>" ) ;
	s = s.replace ( /(^|\n)[ \t\n]*\*[ \t\n]*(.*)(\n|$)/g , "$1<ol><li style='margin-left: -1em'>$2</li></ol>$3" ) ;
	s = s.replace ( /(^|\n)[ \t\n]*\*[ \t\n]*(.*)(\n|$)/g , "$1<ol><li style='margin-left: -1em'>$2</li></ol>$3" ) ;
	s = s.replace ( /<\/ol>[ \t\n]<ol>/g , "" ) ;
	s = s.replace ( /<\/ol>[ \t\n]/g , "</ol>" ) ;
	s = s.replace ( /[ \t\n]<ol>/g , "<ol>" ) ;
	s = s.replace( /<\/div>\n/g , "</div><div style=\"height: 0.5em ; margin: 0 ; padding: 0\"> </div>") ;
	s = s.replace( /\n\n/g , "<br/><div style=\"height: 0.5em ; margin: 0 ; padding: 0\"> </div>") ;
	s = s.replace( /\n/g , "<br/>") ;
	return s ;	
}

function qHTML2text( s ) {
	s = s.replace( /<br\/?>/gi , "\r") ;
	// s = s.replace ( /<(a|A) href=('|")(http:\/\/[^[:space:]]+)\2>\3<\/\1>/g , "$3" )
// [ "'''''" , "<b><i>$1</i></b>" ] ,
	var patts =[
[ "&gt;&gt;&gt;&gt;" , "<div style=\"margin-left: 2em\">$1</div>" ] ,
[ "&gt;&gt;&gt;" , "<div style=\"margin-left: 1em\">$1</div>" ] ,
[ "'''" , "<b>$1</b>" ] ,
[ "''" , "<i>$1</i>" ] ,
[ "++++" , "<span style=\"font-size: 17px ; line-height: 1.2em\">$1</span>" ] ,
[ "+++" , "<span style=\"font-size: 14px ; line-height: 1.2em\">$1</span>" ] ,
[ "-" + "-" + "-" , "<span style=\"font-size: 9px ; line-height: 1.2em\">$1</span>" ] 
] ;
	var x, y ;
	for ( var i = 0 ; i < patts.length ; i++ ) {
		x = patts [patts.length - 1 - i] ;
		y = x[1].replace ( /\$1/ , "((.|\\r|\\n)*)" ).replace ( /\// , "\/" ) ;
		s = s.replace( new RegExp ( y , "gi" ) , x[0] + "$1" + x[0] ) ;
	}
	s = s.replace( /&amp;/g, "&" ) ;
//	s = s.replace( /&gt;/g, ">" ) ;
//	s = s.replace( /&lt;/g, "<" ) ;
	return s ;	
}

function q_filterinput( x , h ) {
// tester TEXTAREA ??
	var validvalue = h( x.value ) ;
	if ( validvalue != x.value ) x.value = validvalue ;
}

function q_validnolt( x ) {
	return x.replace ( /</g , "LT" ) ;
}

function filterinput ( x ) {
	q_filterinput( x , q_validnolt ) ;
//	if ( /</.test ( x.value ) ) x.value = x.value.replace ( /</g , "LT" ) ;
}

function q_validforfm( x ) {
	return q_validnolt( x.replace ( /\/|:/g , "_" ) ) ;
}

function filterinputfm ( x ) {
	if ( x.id && x.id == "qlub_accesspw" ) return ;
	q_filterinput( x , q_validforfm ) ;
//	if ( /\/|:/.test ( x.value ) ) x.value = x.value.replace ( /\/|:/g , "_" ) ;
//	filterinput ( x ) ;
}

function q_urlcompliant( x ) {
	var str = x.toLowerCase() ;
	str = str.replace( /(ç|ć|ĉ|ċ|č)/g , "c" ).replace( /æ/g , "ae" ).replace( /œ/g , "oe" ) ;
	str = str.replace( /(à|â|á|ã|ä|å|ā|ă)/g , "a" ).replace( /(é|è|ê|ë|ē|ĕ|ė|ę|ě)/g , "e" ).replace( /(î|ì|í|ï|ĩ|ī|ĭ|į)/g , "i" ).replace( /(ô|ò|ó|õ|ö|ō|ŏ|ő)/g , "o" ) ;
	str = str.replace( /(û|ù|ú|ü|ũ|ū|ŭ|ů|ű)/g , "u" ).replace( /(ý|ŷ)/g , "y" ).replace( /[^a-z0-9_-]/g , "_" ) ;
	str = str.replace( /-+/g , "-" ).replace( /_+/g , "_" ) ;
	return str ;
}
function q_validur( x ) {
	return q_validurl( x ) ;
}
function q_validurl( x ) {
	return x.toLowerCase().replace( /(é|è|ê|ë)/g , "e" ).replace( /(à|â|ä)/g , "a").replace( /(î|ï)/g , "i").replace( /(ô|ö)/g , "o").replace( /(û|ü|ù)/g , "u").replace( / /g , "_" ).replace( /[^a-z0-9_]/g , "-" ) ;
}
function q_validlink( s ) {
	try { s = decodeURI( s ) ; } catch( err ) {} ;
	if ( (/^rel:(.+)$/).test( s ) ) return s;
	return "http://" + encodeURI( s.replace( /^(http:\/\/)+/ , "" ) ) ;
}

/*
function -
function EMAILS
*/

function validemail( x , silent ) { // #1510
	if ( ! x ) return false ;
	x = x.toLowerCase() ;
	var emailFilter = /^[^ @]*[a-z0-9]@[a-z0-9][^ @]*\.[a-z]{2,4}$/;
	var illegalChars = /[\(\)\<\>\,\;\:\\\/\"\[\] \t\r\n]/ ;
	var errorchars = /[áéíóúàèìòùâêîôûäëïöüéèàù]/ ;

	if ( ! ( emailFilter.test ( x ) ) ) return false ;
	if ( x.match ( illegalChars ) ) return false ;
	if ( x.match ( /\.\./ ) ) return false ;
	if ( x.match ( errorchars ) ) {
		if ( ! silent ) alert( common_message[ "noaccentinemail" ] ) ;
		return false ;
	}
	return true ;
}

function verbosevalidemail( x , defaultmsg ) { // defaultmsg peut remplacer "Adresse e-mail invalide"
	return xverbosevalidemail( x , defaultmsg , false ) ;
}

function validoptionalemail( x , optionalmsg ) {
	if ( ( x == "" ) || ( x == optionalmsg ) ) return true ;
	return validemail( x ) ;
}

function verbosevalidoptionalemail( x , optionalmsg , defaultmsg ) { // defaultmsg peut remplacer "Adresse e-mail invalide"
	return xverbosevalidemail( x , defaultmsg , true , optionalmsg ) ;
}

function xverbosevalidemail( x , defaultmsg , isoptional , optionalmsg ) {
	if ( ( x == "" ) || ( x == optionalmsg ) ) {
		if ( isoptional ) return true ;
		alert( common_message[ "noemptyemail" ] ) ;
		return false ;
	}
	var themsg = defaultmsg || common_message[ "invalidemail" ] ;
	x = x.toLowerCase() ;
	var emailFilter = /^[^ @]*[a-z0-9]@[a-z0-9][^ @]*\.[a-z]{2,4}$/;
	var illegalChars = /[\(\)\<\>\,\;\:\\\/\"\[\] \t\r\n]/ ;
	var errorchars = /[áéíóúàèìòùâêîôûäëïöüéèàù]/ ;

	if ( emailFilter.test ( x ) && ! illegalChars.test( x ) && ! errorchars.test( x ) ) return true ;
	if ( /@.*@/.test( x ) ) themsg += "\n\n" + common_message[ "onlyoneemail" ] ;
	else if ( /^( |\t)/.test( x ) ) themsg += "\n\n" + common_message[ "leadingspace" ] ;
	else if ( /( |\t)$/.test( x ) ) themsg += "\n\n" + common_message[ "trailingspace" ] ;
	else if ( /( |\t)/.test( x ) ) themsg += "\n\n" + common_message[ "nospaceinemail" ] ;
	else if ( errorchars.test( x ) ) themsg += "\n\n" + common_message[ "noaccentinemail" ].replace( /%/ , x.match( errorchars)[ 0 ] ) ;
	else if ( /ç/.test( x ) ) themsg += "\n\n" + common_message[ "nocedillainemail" ] ;
	else if ( illegalChars.test( x ) ) themsg += "\n\n" + common_message[ "invalidcharinemail" ].replace( /%/ , x.match( illegalChars)[ 0 ] ) ;
	alert( themsg ) ;
	return false ;
}

/*
function -
function DEBUG & MSG
*/

function debug_msg( s ) {
	return ;
	try {
		console.log( s ) ;
	}
	catch( e ) { 
//		alert( s ) ; 
	} 
}

function debugmail( ss , options ) {
	try {
		var s = ss || "(pas de message)" ;
		var m = { } ;
		m[ "frommail" ] = ( options && options.frommail ) || "debug@quomodo.com" ;
		m[ "objectmail" ] = ( options && options.objectmail ) || "DEBUG MAIL" ; 
		try { m[ "objectmail" ] += " from " + rights_record[ "currspaceright" ].name ; } catch(err) { } ;
		var body = "" ;
		try { body += "Date: " + new Date().toString() + "\r" ; } catch(err) { } ;
		try { body += "Page: " + q_currsvcname() + "\r" ; } catch(err) { } ;
		try { body += "Espace: " + rights_record[ "currspaceright" ].name + "\r" ; } catch(err) { } ;
		try { body += "q_space: " + document.mainform.q_space.value + "\r" ; } catch(err) { } ;
		try { body += "memberid: " + memberid + "\r" ; } catch(err) { } ;
		try { body += "firstname: " + members[ memberid ].firstname + "\r" ; } catch(err) { } ;
		try { body += "username: " + members[ memberid ].username + "\r" ; } catch(err) { } ;
		try { body += "currsvcid: " + currsvcid + "\r" ; } catch(err) { } ;
		try { body += "clubprivatedomain: " + clubprivatedomain + "\r" ; } catch(err) { } ;
		try { body += "window.location: " + window.location + "\r" ; } catch(err) { } ;
		try { body += "navigator: " + window.navigator.userAgent + "\r" ; } catch(err) { } ;
		body += "\rMessage:\r\r" + s + "\r" ;
		m[ "bodymail" ] = body ;
		m[ "tomail" ] = "debug@quomodo.com" ;
		if ( ! window.q_makeweb && ( ! isrealserver() || ( window.clubprivatedomain && ( clubprivatedomain == "otc-f" || clubprivatedomain == "otcf" ) ) ) ) alert( body ) ;
		else {
			document.mainform.mission.value = "sendemailtoto" ;
			q_ajaxsubmitwithservice( "common@" + q_lang , m ) ;
		}
	} catch( err ) { } ;
}

function timemsg( ss , wantsimple ) {
	var simple = wantsimple || false ;
	try {
		var m = { } ;
		if ( simple ) {
			m[ "text" ] = ss || "no message" ;
		} else {
			var body = "" ;
			try { body += "currsvcid: " + currsvcid + "\r" ; } catch(err) { } ;
			try { body += "clubprivatedomain: " + clubprivatedomain + "\r" ; } catch(err) { } ;
			try { body += "navigator: " + window.navigator.userAgent + "\r" ; } catch(err) { } ;
			m[ "text" ] = body + new Date().toString() + ": " + ( ss || "no message" ) ;
		}
		document.mainform.mission.value = "timemsg" ;
		q_ajaxsubmitwithservice( "common@" + q_lang , m ) ;
	} catch( err ) { } ;
}

function quietmsg( x ) {
	if ( ge( "headerinfo" ) ) ge( "headerinfo" ).innerHTML = x ;
}

function msg( x ) {
	if ( ge( "headerinfo" ) ) ge( "headerinfo" ).innerHTML = x ;
	else alert( x ) ;
}

function doinitsky() {
	if ( getelement("headerinfo") ) applymove ( getelement("headerinfo") , 0 , 0 , 0 ) ;
}

function initsky() {
	if ( ! getelement("headerinfo") ) return ;
	if ( ! getelement( "q_leftcol" ) ) {
		var headerinfo = getelement("headerinfo") ;
		if ( headerinfo ) headerinfo.style.paddingLeft = "0px" ;
	}
	setTimeout ( doinitsky , 100 ) ;
}

/*
function -
function DATE
*/

function q_isot2date( ss ){  // s="2006-01-01T00:00:00Z"
	try {
		var s = ss || "2000-01-01T00:00:00Z" ;
		var t = s.split( "T" ) ;
		var tt = t[0].split( "-" ) ;
		var ttt = t[1].split( ":" ) ;
		var d = new Date() ;
		d.setFullYear( tt[ 0 ] ) ;
		d.setMonth( tt[ 1 ] - 1 ) ;
		d.setDate( tt[ 2 ] ) ;
		var tm = d.getTimezoneOffset()/60 ;
		d.setHours( eval ( ttt[ 0 ] ) - tm ) ;
		d.setMinutes( ttt[ 1 ] ) ;
		return d ;
	} catch( err ) {
		return new Date() ;
	}
}

function q_isot2string( s ){  // s="2006-01-01T00:00:00Z"
	return ddmmyyhhmm( q_isot2date( s ) ) ;
}

function q_date2isot( d ) {
	var y = d.getUTCFullYear() ;
	var m = twodigs( 1 + d.getUTCMonth() ) ;
	var j = twodigs( d.getUTCDate() ) ;
	var h = twodigs( d.getUTCHours() ) ;
	var mi = twodigs( d.getUTCMinutes() ) ;
	var s = twodigs( d.getUTCSeconds() ) ;
	return y + "-" + m + "-" + j + "T" + h + ":" + mi + ":" + s + "Z" ;
}

function ddmmyyhhmm( d ) {
	var c = new Date() ;
	var c0 = new Date(c.getFullYear(), c.getMonth(), c.getDate()); // aujourd'hui minuit temps local
	var c1 = new Date(c.getFullYear(), c.getMonth(), c.getDate()+1); // demain minuit temps local
	var t ;
	t =  twodigs ( d.getDate() ) + '/' + twodigs ( 1 + d.getMonth() ) + '/' + twodigs( d.getFullYear() - 2000 ) ;
	if ( ! ( window.currsvcid && ( /#artemapage/.test( currsvcid ) ) && q_spacetype() == "qlub" ) ) {
		if ( Math.abs( c0 - d ) <= 86400000 ) t = (d >= c0 ) ? common_message[ "today" ] : common_message[ "yesterday" ] ;
		else if ( ( d > c1 ) && ( ( d - c1 ) <= 86400000 ) ) t = common_message[ "tomorrow" ] ;
	}
	return (t + ", " + twodigs ( d.getHours() ) + ":" + twodigs ( d.getMinutes() ) ) ;
}

/*
function -
function MATHS
*/

function rndab( a , b ) {
	return Math.round( a + ( b - a ) * Math.random() ) ;
}

function xrndab( x ) {
	if ( typeof x == "object" ) return rndab( x[ 0 ] , x[ 1 ] ) ;
	return x ;
}

function rndpx( a , b ) {
	var x = rndab( a , b ) ;
	return ( x + "px" ) ;
}

function xrndpx( x ) {
	return ( xrndab( x ) + "px" ) ;
}

function twodigs( i ) {
	return ( '' + (100 + i ) ).slice( -2 ) ;
}

function threedigs( i ) {
	return ( '' + (1000 + i ) ).slice( -3 ) ;
}

/*
function -
function MEMBERS
*/

function isadmin() {
	try { if ( window.web_js_loaded ) return false ; } catch( err ) { } ;
	try { if ( parent.web_js_loaded ) return false ; } catch( err ) { } ;
	try { if ( document.mainform.pagemode.value == "view" ) return false ; } catch( err ) { } ;
	try { if ( parent.document.mainform.pagemode.value == "view" ) return false ; } catch( err ) { } ;
	return true ;
}

function adminalert( s ) {
	if ( isadmin() ) alert( s ) ;
}

function q_displayedusername( minfos ) {
	if ( ! minfos ) return common_message[ "undefineduser" ] ;
	var username = minfos.username ;
	if ( username == undefined ) return common_message[ "undefineduser" ] ;
	if ( minfos.firstname ) return ( minfos.firstname + " " + username ) ;
	if ( minfos.civility ) return ( minfos.civility + " " + username ) ;
	return username ;
}

function q_username( m ) {
	if ( typeof m != "string" ) return q_displayedusername( m ) ;
	if ( m == "quomodo" ) return "Quomodo" ;
	return q_displayedusername( members[ m ] ) ;
}

function q_evalmember( m ) {
	var thevalue = q_tmpsortedmembers[ m ].username ; 
	var re = /[A-Z]{3,}/ ;
	thevalue = re.test( thevalue ) ? re.exec( thevalue )[ 0 ] : thevalue.replace( /^(mr|mme|mlle|mle|melle|m)\.? */i , "" ) ;
	return thevalue.toLowerCase() ;
}

function q_sortmembers( m1 , m2 ) {
	var v1 = q_tmpevalmember( m1 ) ;
	var v2 = q_tmpevalmember( m2 ) ;
	if ( v1 == v2 ) return 0 ;
	if ( v1 > v2 ) return 1 ;
	return -1 ;
}

var q_tmpsortedmembers , q_tmpevalmember ;

function q_sortedmemberids( qmembers , heval ) {
	var themembers = ( qmembers ) ? qmembers : members ;
	var sortedm = [] ;
	var n ;
	for ( var m in themembers ) if ( ( m != "quomodo" ) && ( themembers[ m ] ) ) sortedm.push( m ) ;
	q_tmpsortedmembers = themembers ;
	q_tmpevalmember = ( heval ) ? heval : q_evalmember ;
	sortedm.sort( q_sortmembers ) ;
	return sortedm ;
}

var q_membersupdatehandlers = [] ;

function q_addmembersupdatehandler( h ) { //h = string
	if ( indexOfItem( h , q_membersupdatehandlers ) == -1 ) q_membersupdatehandlers.push( h ) ;
}

function q_membersupdateall() {
	for ( var i = 0 ; i < q_membersupdatehandlers.length ; i++ ) {
		try { eval ( q_membersupdatehandlers[ i ] ).apply ( this , [] ) ; } catch(err) {}
	}
}

/*
function -
function DIVERS
*/

var requiredMajorVersion = 8;
var requiredMinorVersion = 0;
var requiredRevision = 0;
var alerte_once_flash = 0;
var uploaded_files = {} ;

function q_apply( h , args , obj ) {
	if ( ! h ) return ;
	if ( ( typeof h ) == "string" ) h = eval( h ) ;
	h.apply( obj || this , args || [] ) ;
}

function q_keycode( ee ) {
	var e = ee || window.event ;
	if ( ! e ) return null ;
	return e.keyCode || e.which || e.charCode ;
}

function q_pagemode() {
	if ( window.web_js_loaded ) return "web" ;
	if ( window.q_makeweb ) return "makeweb" ;
	if ( window.q_loggedpagemode ) return q_loggedpagemode ;
	try { return document.mainform.pagemode.value ; } catch( err ) { } ;
	return null ;
}

function q_svcfromid( svcid ) {
	for ( var i = 0 ; i < recent_services.length ; i++ ) if ( recent_services[ i ].id == svcid ) return recent_services[ i ] ;
	return null ;
}

function q_currsvcjson() {
	return q_svcfromid( currsvcid ) ;
}

function q_currsvcname() {
	var x = q_currsvcjson() ;
	if ( ! x ) return "" ;
	return x.shortname ;
}

function q_checkaccesstosvc( svcid ) {
	var svcitem = q_svcfromid( svcid ) ;
	if ( ! svcitem ) return false ;
	return ( serviceaccess( svcitem ) != "denied" ) ;
}

function serviceaccess( svcitem ) {// item de recent_services
	if ( svcitem.useraccess ) return svcitem.useraccess ;
	if ( window.members && members[ memberid ] ) return svcitem[ members[ memberid ].userlevel + "access" ] ;
	return true ; // if called from a web page
}

function q_spacetype( ) {
	var thespacetype = q_spaceparam( "right" , "" ) ;
	if ( thespacetype == "qorp" ) thespacetype = "qlub" ;
	return thespacetype ;
}

function q_spaceclient( ) {
	return q_spaceparam( "client" , "" ) ;
}

function q_spaceparam( key , emptyresult ) {
	var x = ( emptyresult == undefined ) ? null : emptyresult ;
	if ( window.rights_record && rights_record.currspaceright ) return ( rights_record.currspaceright[ key ] == undefined ) ? x : rights_record.currspaceright[ key ] ; // pour respecter la chaîne vide
	return x ;
}

function q_addspaceparams( json ) {
	if ( ! window.rights_record ) rights_record = {} ;
	if ( ! rights_record.currspaceright ) rights_record.currspaceright = {} ;
	for ( var x in json ) rights_record.currspaceright[ x ] = json[ x ] ;
}

function q_isstaticpage() {
	return ( ! document.mainform.q_space || ! document.mainform.q_space.value ) ;
}

/*
function -
*/

function writecurrsvcname( ) {
	var d = getelement( "currservicename" ) ;
	if ( ( d ) && ( recent_services ) ) q_innerHTML( d , q_currsvcname() ) ;
}

function writetitleandname( ) {
	if ( q_isstaticpage() ) {
		if ( getelement( "welcome_username" ) ) rm( getelement( "welcome_username" ) ) ;
	} else {
		var un = q_username( memberid ) ;
		document.title = un + " " + common_message[ "on" ] + " " + rights_record["currspaceright"].name ;
		var d = getelement( "welcome_username" ) ;
		if ( d != undefined ) d.innerHTML = un + " " ; // d.innerHTML.replace( /%/ , un ) ;
	}
	logouthref() ;
	writecurrsvcname() ;
}

function updatespacerightinfo() {
	getelement( "spacerightname" ).innerHTML = paypal_message[ rights_record[ "currspaceright" ].right ] ;
	getelement( "spacerightinfo" ).innerHTML = paypal_message[ rights_record[ "currspaceright" ].right + "sninstall" ] ;
}

function userstaysineditmode() {
	if ( ! window.qsn_currstate ) return false ;
	if ( qsn_currstate != "edit" ) return false ;
	if ( confirm( common_message[ "quittingeditmode" ] ) ) return false ;
	return true ;
}

function backtoservice() {
	if ( ! q_ready ) return false ;
	if ( userstaysineditmode() ) return false ;
	document.mainform.mission.value = "back" ;
	q_submit() ;
	return false ;
}

function openhomepage() {
	//document.mainform.target = '_self' ;
	if ( userstaysineditmode() ) return false ;
	document.mainform.mission.value = 'openhomepage' ;
	document.mainform.filename.value = 'index.html' ;
	q_submit() ;
	return false ;
}

function openspace( x ) {
	if ( userstaysineditmode() ) return false ;
	document.mainform.mission.value = 'openspace' ;
	document.mainform.calledspace.value = x ;
	document.mainform.calledservice.value = "" ;
	document.mainform.calledfilename.value = "" ;
	q_submit() ;
	return false ;
}

function opensnbrowser() {
	return opencalledservice( "snbrowser@" + q_lang , "snbrowser.html" ) ;
}

function openprofile() {
	return openservice( "subscribe@" + q_lang , "profile.html" ) ;
}

function opengallery() {
	return opencalledservice( "gallery@" + q_lang , "gallery.html" ) ;
}

function servicefilename( svc ) {
	if ( ! window.rights_record ) return "index.html" ;
	if ( ! rights_record[ "spaceright" ] ) return "index.html" ;
	if ( ! rights_record[ "currspaceright" ] ) return "index.html" ;
	var sr = rights_record[ "spaceright" ][ rights_record[ "currspaceright" ].right ] ;
	if ( ! sr ) return "index.html" ;
	svc = svc.replace( /^#[0-9]+/ , "" ).split( "@" )[ 0 ] + "@intl" ;
	if ( ( sr.services ) && ( sr.services[ svc ] ) && ( sr.services[ svc ].filename ) ) return sr.services[ svc ].filename ;
	return "index.html" ;
}

function openservice( svc , filename1 ) {
	if ( ( q_spacetype() == "qlub" ) && ( window.q_checkaccesstosvc ) && ( ! q_checkaccesstosvc( svc ) ) ) {
		alert( common_message[ "svcaccessdenied" ] ) ;
		return false ;
	}
	if ( userstaysineditmode() ) return false ;
	if ( ! q_readytosubmit( false ) ) return false ;
	var filename = ( filename1 === undefined ) ? servicefilename( svc ) : filename1 ;
	if ( /called@/.test( filename ) ) return opencalledservice( svc , filename ) ;
	document.mainform.callerservice.value = document.mainform.service.value ;
	document.mainform.callerfilename.value = document.mainform.filename.value ;
	document.mainform.mission.value = "openservicepage" ;
	document.mainform.service.value = svc.replace( /@intl/ , "@" + q_lang ) ;
	document.mainform.filename.value = filename ;
	q_submit() ;
	return false ;
}

function opencalledservice( svc , filename1 ) {
	if ( userstaysineditmode() ) return false ;
	if ( ! q_readytosubmit( false ) ) return false ;
	var filename = ( filename1 === undefined ) ? servicefilename( svc ) : filename1 ;
	filename = filename.replace( /called@/ , "" ) ;
	if ( ! (/\//).test( document.mainform.callerservice.value ) ) {
		document.mainform.callerservice.value = "" ;
		document.mainform.callerfilename.value = "" ;
	}
	document.mainform.mission.value = "openservicepage" ;
	document.mainform.calledservice.value = svc.replace( /@intl/ , "@" + q_lang ) ;
	document.mainform.calledfilename.value = filename ;
	q_submit() ;
	return false ;
}

function opensubscribe( sharing1 ) {
	if ( userstaysineditmode() ) return false ;
	var sharing = sharing1 === undefined ?  true : sharing1 ;
	document.mainform.mission.value = "openservicepage" ;
	if ( document.mainform.canuserid ) document.mainform.canuserid.parentNode.removeChild( document.mainform.canuserid ) ;
	document.mainform.calledfilename.value = ( sharing ) ? "index.html" : "subscribe.html" ;
	document.mainform.calledservice.value = "subscribe@" + q_lang ;
	q_submit() ;
	return false ;
}

function openadminspace() {
	if ( userstaysineditmode() ) return false ;
	document.mainform.mission.value = "openservicepage" ;
	if ( document.mainform.canuserid ) document.mainform.canuserid.parentNode.removeChild( document.mainform.canuserid ) ;
	document.mainform.calledfilename.value = "adminspace.html" ;
	document.mainform.calledservice.value = "subscribe@" + q_lang ;
	q_submit() ;
	return false ;
}

function createnewspace() {
	if ( userstaysineditmode() ) return false ;
	document.mainform.mission.value = "openservicepage" ;
	if ( document.mainform.canuserid ) document.mainform.canuserid.parentNode.removeChild( document.mainform.canuserid ) ;
	document.mainform.calledfilename.value = "newspace.html" ;
	document.mainform.calledservice.value = "subscribe@" + q_lang ;
	q_submit() ;
	return false ;
}

function defaultpagename( servicename ) {
	var d = new Date() ;
	return ( servicename + " " + d.getDate() + "/" + (1 + d.getMonth()) + "/" + ( '' + d.getFullYear() ).substring(2) ) ;
}

/*
function -
*/

function checknewpageservice( serviceid , behavior , family, servicename ) {
	var right = rights_record["currspaceright"][ "right" ] ;
	var maxpages = rights_record [ "spaceright" ] [ right ] [ "maxpages" ] ;
	var currpages = 0 ;
	var isinteractive = ( behavior == "interactive" ) ;
	if ( isinteractive ) {
		var maxboards = rights_record [ "spaceright" ] [ right ] [ "maxboards" ] ;
		var currboards = 0 ;
	}
	for ( var svc in rights_record [ "currspaceservices" ] ) {
		if ( rights_record [ "currspaceservices" ] [ svc ] [ "family" ] == "pages" ) { 
			currpages++ ;
			if ( ( isinteractive ) && ( rights_record [ "currspaceservices" ] [ svc ] [ "pagebehavior" ] == "interactive" ) ) currboards++ ;
		}
	}
	return ( family == "sad" ) || ( ( currpages < maxpages ) && ( ( ! isinteractive ) || ( currboards < maxboards ) ) ) ;
}

function createnewpageservice_callback ( r ) {
	if ( r.newpageerror ) {
		alert ( common_message [ "not enough rights" ].replace ( /%s/ , r.servicename ) ) ;
		return ;
	}
	openservice( r.newserviceid , r.filename ) ;
}

function createnewpageservice( svcref , message , defaultanswer , callback ) { // svc = string ou { svcid : "#pm@fr" , [ groupname : "mongroupe" ] }
	return xcreatenewpageservice( svcref , message , defaultanswer , {} , callback ) ;
}

function xcreatenewpageservice( svcref , message , defaultanswer , ajaxparams , callback ) { // svc = string ou { svcid : "#pm@fr" , [ groupname : "mongroupe" ] }
	qprompt_newpage( message , defaultanswer , "xcreatenewpageservice_promptdone" , [ svcref , ajaxparams , callback ] ) ;
//	qprompt ( message , "xcreatenewpageservice_promptdone" , { "default" : defaultanswer , "args" : [ false , svcref , ajaxparams , callback ] } ) ;
	return false ;
	if ( newname == null ) return false ;
	var oldname, taken;
	for ( ; ; ) {
		taken = false ;
		for ( var svc in rights_record [ "currspaceservices" ] ) {
			if ( rights_record [ "currspaceservices" ] [ svc ] [ "shortname" ] == newname ) {
				taken = true ;
				break ;
			}
		}
		if ( ! taken ) break ;
		oldname = newname ;
		newname = prompt ( common_message [ "taken" ].replace ( /%s/ , newname ) , newname ) ;
		if ( newname == null ) return false ;
		if ( newname == oldname ) break ;
	}
	document.mainform.mission.value = "newpage" ;
	if ( ! window.tabsdict ) tabsdict = { "homepage@intl" : "home" , "#schooltt@intl" : "tt" , "#pm@intl" : "pm" , "#artemadisq@intl" : "disq" } ;
	var serviceid = ( ( typeof svcref == "string" ) ? svcref : svcref.svcid ).split( "/" ) ;
	var r = ( ajaxparams ) ? ajaxparams : {} ;
	r.pagekind = serviceid[ 0 ] ;
	r.pagekindcode = tabsdict [ serviceid[ 0 ].replace( /@.*$/ , "@intl" ) ] ;
	r.pagename = newname ;
	if ( serviceid[ 1 ] ) r.pagefile = serviceid[ 1 ] ;
	if ( ( typeof svcref != "string" ) && ( svcref.groupname ) ) r.groupname = svcref.groupname ;
	q_ajaxsubmit ( r , ( callback ) ? callback : createnewpageservice_callback ) ;
	return false ;
}

function xcreatenewpageservice_promptdone( newname , svcref , ajaxparams , callback ) {
	document.mainform.mission.value = "newpage" ;
	if ( ! window.tabsdict ) tabsdict = { "homepage@intl" : "home" , "#schooltt@intl" : "tt" , "#pm@intl" : "pm" , "#artemadisq@intl" : "disq" , "#artemapage@intl" : "pages" } ;
	var serviceid = ( ( typeof svcref == "string" ) ? svcref : svcref.svcid ).split( "/" ) ;
	var r = ( ajaxparams ) ? ajaxparams : {} ;
	r.pagekind = serviceid[ 0 ] ;
	r.pagekindcode = tabsdict [ serviceid[ 0 ].replace( /@.*$/ , "@intl" ) ] ;
	r.pagename = newname ;
	if ( serviceid[ 1 ] ) r.pagefile = serviceid[ 1 ] ;
	if ( ( typeof svcref != "string" ) && ( svcref.groupname ) ) r.groupname = svcref.groupname ;
	q_ajaxsubmit ( r , ( callback ) ? callback : createnewpageservice_callback ) ;
}

function qprompt_newpage( message , defaultanswer , callback , params ) {
	qprompt( message , "qprompt_newpage_done" , { "default" : defaultanswer , "args" : [ false , callback , params ] , "emptyvalue" : false , "maxlength" : "120" } ) ;
}

function qprompt_newpage_done( newname , oldname , callback , params ) {
	if ( newname == null ) return false ;
	if ( oldname != newname ) {
		var taken = false ;
		for ( var svc in rights_record [ "currspaceservices" ] ) {
			if ( rights_record [ "currspaceservices" ] [ svc ] [ "shortname" ] == newname ) {
				taken = true ;
				break ;
			}
		}
		if ( taken ) {
			qprompt( common_message [ "taken" ].replace ( /%s/ , newname ) , "qprompt_newpage_done" , { "default" : newname , "args" : [ newname , callback , params ] , "emptyvalue" : false } ) ;
			return ;
		}
	}
	eval( callback ).apply( this , ( params ) ? [ newname ].concat( params ) : [ newname ] ) ;
}

function logouthref() {
	if ( ! ge( "logout_elem" ) ) return ;
	var sites = "club-quomodo.com, club-quomodo.fr, club.quomodo.com, club2.quomodo.com, club1.quomodo.com, clubquomodo.com, clubquomodo.fr, fffootball.fr, ffrugby.fr, quomodo-club.com, quomodo-club.fr, quomodoclub.com, quomodoclub.fr, sites.quomodo.com, localhost".split( ", ") ;
	var host = location.hostname.replace( /^www\./ , "" ) ;
	if ( indexOfItem( host , sites ) != -1 ) ge( "logout_elem" ).href = window.q_logouturl || "/" ;
	else if ( window.q_logouturl && host == "quomodo.com" ) ge( "logout_elem" ).href = "http://sites.quomodo.com" + window.q_logouturl ;
	else if ( window.q_logouturl && host == "beta2.quomodo.com" ) ge( "logout_elem" ).href = "http://club2.quomodo.com" + window.q_logouturl ;
	else ge( "logout_elem" ).href = "http://" + location.hostname;
}

function logout( target ) {
	if ( userstaysineditmode() ) return false ;
	document.mainform.mission.value = 'logout' ;
	if ( target ) return q_ajaxsubmitwithservice( "common@" + q_lang , {} , logout_done , [ target ] ) ;
	q_ready = true ;
	q_submit() ;
	return false ;
}

function logout_done( x , target ) {
	window.location.href = ( ( typeof target ) == "string" ) ? target : target.href ;
}

function selectlanguage( lang ) {
	setcookie ( 'lang' , lang , 365 ) ;
	if ( document.mainform.sessionid.value == "" ) return true ;
	document.mainform.mission.value = "openservicepage" ;
	document.mainform.service.value = document.mainform.service.value.split( "@" )[ 0 ] + "@" + lang ;
	q_submit() ;
	return false ;
}

/*
function -
*/

function q_smartbytes( n , s ) {
	if ( n  < 100 ) return ( ""+( Math.round( 10 * n ) / 10 ) ).replace ( /\.0/ , "" ).replace ( /\./ , common_message [ "decsep" ] ) + common_message[ s ] ; 
	return "" + Math.round ( n ) + common_message[ s ] ;
}

function q_smart_filesize( k ) {
	if ( k < 1024 ) return ( "" + k + common_message[ "bytesondisk" ] ) ; 
	k /= 1024 ;
	if ( k < 1024 ) return q_smartbytes( k , "kbondisk" ) ;
	k /= 1024 ; 
	if ( k < 1024 ) return q_smartbytes( k , "mbondisk" ) ;
	return q_smartbytes( k/1024 , "gbondisk" ) ;
}

function getmaxmb() {
	try { return rights_record.currspaceright.maxmb || rights_record.spaceright[ currspaceright.right ].maxmb ; }
	catch(err) { return 1 ; }
}

/*
function -
*/

function switch_tab( tabscontainer, x, anim ) {
//	if ( /_open/.test( x.className ) ) return ;
	var tabref = /([^ ]+)_title_(mouseover|open|closed)/.exec( x.className )[1] ;
	var tabcontent = gebcn( x.parentNode, tabref + "_content" ) ;
	if ( /_open/.test( x.className ) ) {
		tabcontent.style.display = "none" ;
		x.className = x.className.replace( /_open/ , "_closed" ) ;
		q_innerHTML( gebcn( x, "arrow") , "►" );
		unselect() ;
		return ;
	}
	var tabs = getElementsByClassName( ge( tabscontainer ), tabref + "_content" ) ;
	for ( var i=0; i<tabs.length; i++ ) {
		if ( tabs[ i ] == tabcontent ) {
			x.className = x.className.replace( /_(mouseover|closed|open)/, "_open" ) ;
			q_innerHTML( gebcn( x, "arrow") , "▼" );
			tabcontent.style.display = "block" ;
			if ( ( anim ) && ( anim == true ) ) {
				var h = tabcontent.offsetHeight + 15 ;
				tabcontent.style.height = "0px" ;
				tabcontent.id = "unrolltempid" ;
				dounrolldiv( "unrolltempid", h ) ;
			}
		} else {
			tabs[ i ].style.display = "none" ;
			var tabtitle = gebcn( tabs[ i ].parentNode, tabref + "_title_open" ) ;
			if ( tabtitle ){ 
				tabtitle.className = tabtitle.className.replace( /_(mouseover|closed|open)/, "_closed" ) ;
				q_innerHTML( gebcn( tabtitle, "arrow") , "►" );
			}
		}
	}
	unselect() ;
	if ( window.qsn_currstate == "edit" ) qsn_initdisplaysetting() ;
}

function unselect() {
	try { if( document.execCommand ) document.execCommand("Unselect", false, null) ; } catch ( err ) {} ; 
	return false ;
}

function q_checkimgextensionfile( x ) {
	if ( typeof x == 'string' ) x = getelement ( x ) ;
	var t = x.value.split(".") ;
	if ( t.length == 1 ) return true ;
	var theexts = [ "png" , "gif" , "jpg" , "jpeg" , "ico", "PNG" , "GIF" , "JPG" , "JPEG" , "ICO" , "tiff" , "TIFF" , "bmp" , "BMP" ] ;
	return ( indexOfItem( t[ t.length - 1 ] , theexts ) != -1 ) ;
}

function q_changebackground( oldbg , newbg ) { 
	var divs = getElementsByClassName( document.body , oldbg ) ;
	var re = new RegExp( "\\b" + oldbg + "\\b" ) ;
	for( var i = 0 ; i < divs.length ; i++ ) divs[ i ].className = divs[ i ].className.replace( re , newbg ) ;
}

function clearsel() {
	var sel ;
	if(document.selection && document.selection.empty){ document.selection.empty() ; }
	else if(window.getSelection) {
		sel=window.getSelection();
		if(sel && sel.removeAllRanges) sel.removeAllRanges() ;
		else unselect();
	}
}

var q_mbchangedhandlers = [] ;

function q_addmbchangedhandler( h ) { //h = string
	if ( indexOfItem( h , q_mbchangedhandlers ) == -1 ) q_mbchangedhandlers.push( h ) ;
}

function q_mbchangedall() {
	for ( var i = 0 ; i < q_mbchangedhandlers.length ; i++ ) {
		try { eval ( q_mbchangedhandlers[ i ] ).apply ( this , [] ) ; } catch(err) {}
	}
}

function q_fname( f ) {
	if ( ! f ) return "" ;
	var fname = f.toString().split ( "\n" ) ;
	return fname[ 0 ].replace( /function ([^ ^(]+).*/ , "$1" ) ;
}

function qsn_suppressnotecontaining ( s ) {
	var divs = getElementsByClassName ( document.body , "container" ) ;
	for ( var i = 0 ; i < divs.length ; i++ ) {
		var div = divs [ i ] ;
		if ( ( new RegExp ( s ) ).test ( div.innerHTML ) ) {
			if ( confirm ( "Found \"" + s + "\" in note " + i + " out of " + divs.length + ". Delete?" ) ) qsn_suppressnote ( div ) ;
		}
	}
}

function q_setclass ( theclass , elem , wantset ) {
	if ( elem.splice) {
		for ( var i = 0 ; i < elem.length ; i++ ) q_setclass( theclass , elem[ i ] , wantset ) ;
		return ;
	}
	var cl = elem.className ;
	var re = new RegExp( "\\b" + theclass + "\\b" ) ;
	var reg = new RegExp( "\\b" + theclass + "\\b" , "g" ) ;
	var clset = re.test(cl) ;
	if ( ( wantset ) && ( ! clset ) ) elem.className = cl + ' ' + theclass ;
	if ( ( ! wantset ) && ( clset ) ) elem.className = cl.replace( reg , "" ).replace(/ +/g," ") ;
}

function qa_elems( x ) {
	if ( typeof x == "string" ) return [ q_elems[ x ] ] ;
	var y = [] ;
	for ( var i = 0 ; i < x.length ; i++ ) y.push( q_elems[ x[ i ] ] ) ;
	return y ;
}

if ( window.q_lang ) q_elems[ "qprompt" ] = {
	id : "qprompt_elem" ,
	urls : [
		"/services/qorg/scripts/qprompt_msgs_" + q_lang + ".js" ,
		"/services/qorg/scripts/qprompt.js" ,
		"/services/qorg/style/qprompt.css" ,
		"/services/qorg/qprompt_" + q_lang + ".html"
	] ,
	dynh : "qprompt_dynload"
} ;

function qprompt( s , callback , params ) {
	var thedata = { "callback" : callback , "title" : "", "prompt" : "" } ;
	if ( typeof s == "string" ) thedata.prompt = s ;
	else {
		if ( s.length == 1 ) thedata.prompt = s[ 0 ] ;
		else {
			thedata.title = s[ 0 ] ;
			thedata.prompt = s[ 1 ] ;
		}
	}
	q_cloneObject ( params , thedata ) ;
	var qorgdir = "/services/qorg/" ;
	q_include( q_elems[ "qprompt" ] , "qprompt_reveal" , [ thedata ] ) ;
}

function isiniframe() {
	return ( parent.window != window ) ;
}

function iframeinparent() {
	var parentframes = parent.document.getElementsByTagName( "IFRAME" ) ;
	for ( var j = 0 ; j < parentframes.length ; j++ ) {
		if ( ( parentframes[ j ].contentWindow == window ) ) return parentframes[ j ] ;
	}
	return null ;
}

/*
function -
function FLASH
*/

/*	SWFObject v2.2 <http://code.google.com/p/swfobject/> 
	is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
*/
var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);
	var makeweb = q_pagemode() == "makeweb" ;
	if ( makeweb ) {
		Z.setAttribute("classid", "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000");
		var embed = Z.appendChild( C("embed") );
	}
	for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac]);}else{if(ac.toLowerCase()!="classid"){
		Z.setAttribute(ac,ai[ac]);
		if ( makeweb && (ac.toLowerCase() == "width" || ac.toLowerCase() == "height" ) ) embed.setAttribute(ac, ai[ac]);
		if ( makeweb && ac.toLowerCase() == "data" ) {
			e(Z,"Movie", ai[ac]);
			embed.setAttribute("src", ai[ac]);
		}
	}}}}for(var ab in ag){
		if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){
			e(Z,ab,ag[ab]);
			if ( makeweb ) embed.setAttribute(ab,ag[ab]);
		}
	}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){return ge(Z);var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}();



function logentry() {
	try {
		if ( getcookie( "entry" ) ) return ;
		setcookie( "entry" , window.location.pathname + window.location.search , 365 ) ;
		setcookie( "entrydate" , "" + Date.parse( new Date().toUTCString() ) , 365 ) ;
	} catch( err ) { }
}

function getcookie( name ) {
	if ( ! document.cookie ) return null ;
	var start = document.cookie.indexOf( name + "=" ) ;
	var len = start + name.length + 1 ;
	if ( ( !start ) && ( name != document.cookie.substring( 0, name.length ) ) ) return null ;
	if ( start == -1 ) return null ;
	var end = document.cookie.indexOf( ";", len ) ;
	if ( end == -1 ) end = document.cookie.length ;
	return unescape( document.cookie.substring( len, end ) ) ;
}

function setcookie( name, value, expires ) { // expires: days ;
	var today = new Date();
	today.setTime( today.getTime() );
	if ( expires ) {
		expires = expires * 1000 * 60 * 60 * 24;
		var expires_date = new Date( today.getTime() + (expires) );
	}
	document.cookie = name + "=" +escape( value ) + ";path=/" + ( ( expires ) ? ";expires=" + expires_date.toGMTString() : "" );
}

function deletecookie( name ) {
	if ( getcookie( name ) ) document.cookie = name + "=" + ";expires=Thu, 01-Jan-1970 00:00:01 GMT" + ";path=/" ;
}

function q_initlanguage() {
	if ( ! document.cookie ) return ;
	var lang = getcookie( "lang" ) ;
	if ( lang ) return ;
	lang = q_navigatorlanguage() ;
	if ( ! lang ) lang = "en" ;
	if ( lang != "fr" ) lang = "en" ;
	setcookie ( "lang" , lang , 365000 ) ;
}

function q_redirectmember() {
	var lang ;
	var url = "fv.html" ; 	
	if ( ! document.cookie ) {
		lang = q_navigatorlanguage() ;
		if ( ! lang ) lang = "en" ;
		if ( lang != "fr" ) lang = "en" ;
	} else {
		lang = getcookie( "lang" ) ;
		if ( ( getcookie ( "status" ) ) && ( getcookie ( "status" ) == "member" ) ) url = "authfv.html" ;
	}
	if ( ! lang ) lang = "en" ;
	if ( lang != "fr" ) lang = "en" ;
	window.location.replace ( "services/homepage@" + lang + "/" + url )
}

// also in q_common
function q_navigatorlanguage() {
	var lang = ( navigator.language ) ? navigator.language : ( ( navigator.userLanguage ) ? navigator.userLanguage : "fr" ) ;
	lang = lang.split("-")[ 0 ] ;
	if ( lang != "fr" ) lang = "en" ;
	return lang ;
}


var dragdisabled = false;
var zindex ;
var sliderindent = -64; //-25 ;
var qdr_leftcolwidth = 198 ;
var qdr_resizewidth = 12 ;

function q_stopPropagation( ee ){
	var e = ee || window.event ;
	if ( e.stopPropagation ) e.stopPropagation() ;
	else e.cancelBubble = true ;
}

function q_preventDefault( ee ){
	var e = ee || window.event ;
	if ( e.preventDefault ) e.preventDefault() ;
	else e.returnValue = false ;
}

function q_clientX( ee ) {
	var e = ee || window.event ;
	if ( e.pageX ) return e.pageX ;
	return e.clientX + document.documentElement.scrollLeft + document.body.scrollLeft ;
}

function q_clientY( ee ) {
	var e = ee || window.event ;
	if ( e.pageY ) return e.pageY ;
	return e.clientY + document.documentElement.scrollTop + document.body.scrollTop ;
}

function beginDragSlider( ee ){
	var e = ee || window.event ;
	var e1 = getelement("slider_thumb") ;
	var e2 = getelement("slider_panel") ;
	var x1 = sliderindent + parseInt( e1.offsetLeft , 10 ) ;
	var x2 = parseInt( e2.offsetLeft , 10) ;
	
	var dx1 = q_clientX( e ) - x1 ;
	var dx2 = q_clientX( e ) - x2 ;

	function moveHandlerSlider( ee ) {
		var em = ee || window.event ;
		var can_x = Math.max ( 0 , (q_clientX( em ) - dx1) ) ;
		if ( Math.abs ( can_x - 357 ) < 20 ) can_x = 357 ;
		if ( Math.abs ( can_x - 221 ) < 20 ) can_x = 221 ;
		if ( Math.abs ( can_x - 0 ) < 20 ) can_x = 0 ;
		e1.style.left = ( can_x - sliderindent ) + "px" ;
		e2.style.left = ( can_x + dx1 - dx2 ) + "px" ;
		if ( can_x > 0 ) {
			getelement( "imgquomodoup" ).style.display = "block" ;
			getelement( "imgquomododown" ).style.display = "none" ;
		} else {
			getelement( "imgquomodoup" ).style.display = "none" ;
			getelement( "imgquomododown" ).style.display = "block" ;
		}
		q_stopPropagation( em ) ;
		q_preventDefault( em ) ;
	}

	function upHandlerSlider( ee ) {	
		var eu = ee || window.event ;
		document.onmouseup = null ;
		document.onmousemove = null ;
		if ( Math.abs ( x1 - sliderindent - parseInt( e1.offsetLeft , 10) ) < 5 ) handlesliderclick( e1 ) ;
		q_stopPropagation( eu ) ;
		q_preventDefault( eu ) ;
	}

	document.onmousemove = moveHandlerSlider ;
	document.onmouseup = upHandlerSlider ;
	q_stopPropagation( e ) ;
	q_preventDefault( e ) ;
}

var x_slider_target = 0 ;
var dt = 100 ;
var shift = 0 ;
var slider_thumb = null ;
var slider_panel = null ;
var x_slider_thumb = 0 ;
var x_slider_panel = 0 ;

function openquomodo() {
	handlesliderclick ( parseInt ( getelement('slider_thumb').offsetLeft , 10) ) ;
	return false ;
}

function moveslider() {
	var module = 0.5 ;
	// var dx = module * ( x_slider_target + shift - parseInt(slider_thumb.offsetLeft , 10) ) ;
	var dx = module * ( x_slider_target + shift - x_slider_thumb ) ;
	x_slider_thumb = dx + x_slider_thumb ;
	x_slider_panel = dx + x_slider_panel ;
	if ( x_slider_thumb > ( -1 * sliderindent ) ) {
		getelement( "imgquomodoup" ).style.display = "block" ;
		getelement( "imgquomododown" ).style.display = "none" ;
	} else {
		getelement( "imgquomodoup" ).style.display = "none" ;
		getelement( "imgquomododown" ).style.display = "block" ;
	}
	
	slider_thumb.style.left = ( Math.round ( x_slider_thumb ) ) + "px" ;
	slider_panel.style.left = ( Math.round ( x_slider_panel ) ) + "px" ;
	if ( ( Math.abs ( x_slider_thumb - x_slider_target - shift ) > 1 ) || ( Math.abs ( dx ) > 1 ) ) setTimeout ( "moveslider()" , dt ) ;
	else {
		if ( shift == 0 ) {
			x_slider_panel = x_slider_panel + ( x_slider_target - x_slider_thumb ) ;
			x_slider_thumb = x_slider_target ;
			slider_thumb.style.left = ( Math.round ( x_slider_thumb ) ) + "px" ;
			slider_panel.style.left = ( Math.round ( x_slider_panel ) ) + "px" ;
		} else {
			shift = 0 ;
			module = module / 3 ;
			setTimeout ( "moveslider()" , dt ) ;
		}
	}
}

function handlesliderclick(xdummy) {
	slider_thumb = getelement( "slider_thumb" ) ;
	slider_panel = getelement( "slider_panel" ) ;
	x_slider_thumb = parseInt ( slider_thumb.offsetLeft , 10) ;
	x_slider_panel = parseInt ( slider_panel.offsetLeft , 10) ;
	var x = sliderindent + x_slider_thumb ;
	x_slider_target = ( x == 0 ) ? 357 : 0 ;
	shift = ( x_slider_target > x ) ? 10 : -10 ;
	x_slider_target = x_slider_target - sliderindent ;
	setTimeout ( "moveslider()" , dt ) ;
}

function beginDragE( e ){
	e = e || window.event ; // var 
	var x = getElementFromEvent ( e ) ;
	var elem = getContainer ( x ) ;
	beginDrag(elem , e ) ;
}

var latestclick = { time: (new Date()).getTime() , x: 0 , y: 0 , target: null } ;

function disabledrag() {
	dragdisabled = true ;
}

function beginDrag( elem , ee , movecallBack , upcallBack , thelimits , preparecallBack ) {
	if ( dragdisabled ) {
		dragdisabled = false ;
		return false ;
	}
	if ( window.unselect ) unselect() ;
	var e = ee || window.event ; // var 
	
	if ( ! window.qsn_currstate ) var qsn_currstate = "view" ;	
	if ( ( ( ( new Date() ).getTime() - latestclick.time ) < 700 ) && ( Math.abs ( q_clientX( e ) - latestclick.x ) < 2 ) && ( Math.abs ( q_clientY( e ) - latestclick.y ) < 2 ) && ( elem == latestclick.target ) && ( ! ( /(edit|new)/.test ( qsn_currstate ) ) ) ) return false ;
	latestclick.time = ( new Date() ).getTime() ;
	latestclick.x = q_clientX( e ) ; 
	latestclick.y = q_clientY( e ) ; 
	latestclick.target = elem ;
/*
	if ( ! ( /edit/.test ( qsn_currstate ) ) ) {
		var tx = getElementsByClassName( elem ,"text") ;
	//	for ( var i = 0 ; i < tx.length ; i++ ) if ( tx[ i ] ) tx[ i ].innerHTML = tx[ i ].innerHTML ;
	}
*/

	var x = parseInt( gcs( elem , "left" ) , 10) ;
	var y = parseInt( gcs( elem , "top" ) , 10) ;
//	var w = parseInt( gcs( elem , "width" ) , 10);
	elem.deltawidth = ( window.qsn_deltawidth ) ? qsn_deltawidth( elem ) : 0 ;
	elem.deltacontentwidth = ( window.q_deltacontentwidth ) ? q_deltacontentwidth( elem ) : 0 ;
//	var w = elem.offsetWidth - elem.deltawidth ;
	var w = elem.offsetWidth ;
	var h = elem.offsetHeight ;
	var dx = q_clientX( e ) - x ;
	var dy = q_clientY( e ) - y ;
	var dw = q_clientX( e ) - w ;
	var xylimits = thelimits ;
	var clientX0 = q_clientX( e ) ;
	var clientY0 = q_clientY( e ) ;
	if ( elem.toresize ) {
		var targets = elem.toresize() ;
		for ( var i = 0 ; i < targets.length ; i++ ) {
			var targetelem = targets[ i ] ;
			targetelem.deltawidth = q_deltawidth( targetelem ) ;
			if ( isie6() && targetelem.tagName == "IMG" && targetelem.offsetHeight && targetelem.filters[ "DXImageTransform.Microsoft.AlphaImageLoader" ] ) {
				var originalwidth = targetelem.offsetWidth - ( ( window.qsn_deltawidth ) ? qsn_deltawidth( targetelem ) : 0 ) ;
				var originalheight = targetelem.offsetHeight - ( ( window.qsn_deltaheight ) ? qsn_deltaheight( targetelem ) : 0 ) ;
				if ( originalwidth ) targetelem.dragratio = originalheight / originalwidth ;
				else targetelem.dragratio = 1 ;
			}
		}
	}
	// var isGrow = ( q_clientX( e ) > ( x + w + qdr_leftcolwidth - qdr_resizewidth ) ) ;
	var isGrow = ( q_clientX( e ) > ( elem.offsetLeft + elem.offsetWidth + ( window.qdr_authorstuffoffsetleft || 0 ) + qdr_leftcolwidth - qdr_resizewidth ) ) ;
	if ( preparecallBack ) {
		var r = preparecallBack( elem , clientX0 , isGrow ) ;
		if ( ( r ) && ( r.isgrow != null ) && ( r.isgrow != undefined ) ) isGrow = r.isgrow ;
	}

	function moveHandler( ee ) {
		var em = ee || window.event ; // var 
		if ( qsn_currstate == "tm" ) return ;
		if ( ! movecallBack ) movecallBack = q_moveHandler ;
		var qx = q_clientX( em ) - dx ;
		var qy = q_clientY( em ) - dy ;
		if ( em.shiftKey ) {
			if ( Math.abs( qx - x) < Math.abs( qy - y ) ) {
				var ex = x ;
				var ey = qy ;
			} else {
				var ex = qx ;
				var ey = y ;
			}
		} else {
			var ex = qx ;
			var ey = qy ;
		}
		var ew = q_clientX( em ) - dw ;
		movecallBack( elem , ex , ey , ew , isGrow , xylimits ) ;
		q_stopPropagation( em );
		q_preventDefault( em );
	}
	function upHandler( ee ) {
		var eu = ee || window.event ; 
		if ( ! upcallBack ) upcallBack = q_upHandler ;
		document.onmouseup = null ;
		document.onmousemove = null ;
		var qx = q_clientX( eu ) - dx ;
		var qy = q_clientY( eu ) - dy ;
		if ( eu.shiftKey ) {
			if ( Math.abs( qx - x) < Math.abs( qy - y ) ) {
				var ex = x ;
				var ey = qy ;
			} else {
				var ex = qx ;
				var ey = y ;
			}
		} else {
			var ex = qx ;
			var ey = qy ;
		}
		var ew = q_clientX( eu ) - dw ;
		var isMove = ( ( parseInt( clientX0 , 10 ) == parseInt( q_clientX( eu ) , 10 ) ) && ( parseInt( clientY0 , 10 ) == parseInt( q_clientY( eu ) , 10 ) ) ) ;
		upcallBack( elem , ex , ey , ew , isGrow , isMove , xylimits ) ;
		elem = null ;
		q_stopPropagation( eu ) ;
		q_preventDefault( eu ) ;
	}
	document.onmousemove = moveHandler ;
	document.onmouseup = upHandler ;
	q_stopPropagation( e );
	// q_preventDefault( e );
	if ( ( window.getSelection ) && ( window.getSelection() == "" ) ) q_preventDefault( e );
	if ( ! window.getSelection ) q_preventDefault( e );
}

function q_moveHandler( elem , ex , ey , ew , isGrow ) {
	if ( isGrow ) {
		elem.style.cursor = "e-resize" ;
		elem.style.width = Math.max ( 24, ew ) + "px";
	}
	else {
		elem.style.cursor = "move" ; // "default";
		if ( ex < 0 ) ex = 2 ;
		if ( ey < 0 ) ey = 0 ;
		elem.style.left = ex + "px";
		elem.style.top = ey+ "px";
	}
}

function q_upHandler( elem , ex , ey , ew , isGrow , isMove ) {
		elem.style.cursor = "auto" ; // "move" ;
}

function beginDragOnly( elem , e ) {
	beginDrag( elem , e , moveOnlyHandler , upOnlyHandler ) ;
}

function moveOnlyHandler( elem , ex , ey , ew , isGrow ) {
	q_moveHandler( elem , ex , ey , ew , false ) ;
}

function upOnlyHandler( elem , ex , ey , ew , isGrow , isMove ) {
	q_upHandler( elem , ex , ey , ew , false , isMove ) ;
}

function beginFreeDrag( elem , ee ) {
	return beginDrag( elem , ee , q_freemoveHandler ) ;
}

function q_VmoveHandler( elem , ex , ey , ew , isGrow ) {
	elem.style.cursor = "move" ; // "default";
	if ( ey < 0 ) ey = 0 ;
	elem.style.top = ey + "px";
}

function beginVDrag( elem , ee ) {
	return beginDrag( elem , ee , q_VmoveHandler ) ;
}

function q_freemoveHandler( elem , ex , ey , ew , isGrow ) {
	if ( isGrow ) {
		elem.style.cursor = "e-resize" ;
		elem.style.width = Math.max ( 24, ew ) + "px";
	}
	else {
		elem.style.cursor = "default" ; // "move" ;
		elem.style.left = ex + "px";
		elem.style.top = ey+ "px";
	}
}

function beginResize( elem , ee , h ) {
	beginDrag( elem , ee , q_moveResizeHandler , h ) ;
}

function q_moveResizeHandler( elem , ex , ey , ew , isGrow ) {
	q_moveHandler( elem , ex , ey , ew , true ) ;
}

/*
function -
function MOVE DIV BERNARD
*/
var dragison = false ; 
function compareNumber( a , b ) {
	if ( a == b ) return -1 ;
	if ( ! isNaN ( a - b ) ) return a - b ;
	return -1 ;
}

function sortElemsTop( elems ) { // liste des index des elements, trié suivant le offsetTop
	var x = new Array( elems.length ) ;
	for ( var i = 0 ; i < x.length ; i++ ) x[ i ] = Math.floor( elems[ i ].offsetTop ) + i / 1024 ;
	x = x.sort( compareNumber ) ;
	for ( var i = 0 ; i < x.length ; i++ ) x[ i ] = Math.round( 1024 * ( x[ i ] - Math.floor( x[ i ] ) ) ) ; 
	return x ; 
}

function completepositions( i0 , elems , move , sortFunction ) {
	var posy = elems[ i0 ].offsetTop ;

	var x = sortFunction( elems ) ; 
	
	if ( move ) elems[ i0 ].style.visibility = "hidden" ;
	
	var curry = 0 ; 
	for( var i = 0 ; i <  x.length ; i++ ) {
		var e = elems[ x [ i ] ] ;
		e.style.top = curry + "px" ;
		curry = e.offsetTop + e.offsetHeight ;
	}
	
	if ( move ) {
		elems[ i0 ].style.top = posy + "px" ;
		elems[ i0 ].style.visibility = "visible" ;
	}
}

function beginDragDivInList( elem , ee , sortFunction ) {
	dragison = true ;
	//elem = elem.parentNode ;
	var i0 = elem.id.replace( /c/ , "" ) - 0 ; 
	var e = ee || window.event ; // IE6
	
	var y = elem.offsetTop ; //parseInt( elem.style.top , 10) ;
	var y0 = y ;
	var dy = q_clientY( e ) - y ;
	var dx = q_clientX( e ) - elem.offsetLeft ; //parseInt( elem.style.left , 10) ;
	var container = getContainer( elem ) ;
	var elems = getElementsByClassName( container , "slider" ) ;
	elem.style.zIndex = 10 ; 
	
	function moveHandler( ee ) {
		var em = ee || window.event ; // IE6
		var ey = q_clientY( em ) - dy ;
		elem.style.top = ey+ "px";
		var ex = q_clientX( em ) - dx ;
		elem.style.left = ex+ "px" ;
		completepositions( i0 , elems , true , sortFunction ) ;
		q_stopPropagation( em ) ;
		q_preventDefault( em ) ;
	}
	function upHandler( ee ) {	
		var eu = ee || window.event ; 
		elem.style.zIndex = 0 ; 
		//if ( q_clientX( eu ) > 200 ) elem.style.top = y0 + "px" ;
		elem.style.left = "0px";
		completepositions( i0 , elems , false , sortFunction ) ;
		document.onmouseup = null ;
		document.onmousemove = null ;
		q_stopPropagation( eu ) ;
		q_preventDefault( eu ) ;
		dragison = false ;
	}
	document.onmousemove = moveHandler ;
	document.onmouseup = upHandler ;
	q_stopPropagation( e );
	if ( ( window.getSelection ) && ( window.getSelection() == "" ) ) q_preventDefault( e );
	if ( ! window.getSelection ) q_preventDefault( e );
}



var q_jstarget ; // our IFrame object

function q_document_form( formname ) {
	for ( var i = 0 ; i < document.forms.length ; i++ ) if ( document.forms[ i ].name == formname ) return document.forms[ i ] ;
	return null ;
}

function q_xrssubmit( formname ) {
	if ( q_alreadysubmitted() ) return false ;
	var theform = q_document_form( formname ) ;
	theform[ "q_method" ].value = "rscgi" ;
	return xxq_rssubmit( formname ) ;
}

function q_rssubmit() {
	if ( q_alreadysubmitted() ) return false ;
	document.mainform[ "q_method" ].value = "rscgi" ;
	return xq_rssubmit() ;
}

function xq_rssubmit() {
	return xxq_rssubmit( "mainform" ) ;
}

function xxq_rssubmit( formname ) {
	if (!document.createElement) return true ;
	if ( ! q_jstarget ) q_jstarget = getelement( "jstarget" ) ;
	if ( ! q_jstarget ) {
		var tempIFrame=document.createElement( 'iframe' ) ;
		tempIFrame.id = "jstarget"  ;
		tempIFrame.name = "jstarget"  ;
		tempIFrame.frameborder = "0"  ;
		tempIFrame.style.width='0px' ;
		tempIFrame.style.height='0px' ;
		tempIFrame.style.border='0px' ;
		q_jstarget = document.body.appendChild( tempIFrame ) ;
		q_jstarget.src = '/services/qblank' ;
	}
	var theform = q_document_form( formname ) ;
	theform.target = 'jstarget' ;
	theform.action = cgiurl() ;
	theform.submit() ;
}

function cgiurl() {
	if ( iswaiting ) {
//		if ( document.mainform.cgiurl ) return document.mainform.cgiurl.value ;
//		return "/cgi-bin/cgi_wait" ;
		return "wait" ;
	}
	var url ;
	if ( window.q_cgiurls && q_cgiurls.length ) url = q_cgiurls [ Math.floor ( Math.random() * q_cgiurls.length ) ] ;
	else {
		/* if ( document.mainform && document.mainform.q_space && document.mainform.q_space.value == "5420AF72-06F6-4116-927C-0054F6727D8E" ) url = "/cgi-bin/cgiremote" ;
		else */
		try{
			url = members[memberid].userlevel || "membre" ;
			if ( url == "member" ) url = "membre" ;
		}catch(e){
			url = "login" ;
			//url = "/cgi-bin/cgismile" ;
		}
		//url = "/cgi-bin/cgismile" ;
	}
	return url ;
}

function waitq_submit( forcesubmit ) {
	if ( ( ! forcesubmit ) && ( ! q_readytosubmit() ) ) return false ;
	document.mainform[ "q_method" ].value = "cgi" ;
	document.mainform.action = cgiurl() ;
	document.mainform.submit() ;
	return true ;
}

function q_submit( forcesubmit ) {
	if ( ( ! forcesubmit ) && ( ! q_readytosubmit() ) ) return false ;
	if ( q_alreadysubmitted() ) return false ;
	document.mainform[ "q_method" ].value = "cgi" ;
	document.mainform.action = cgiurl() ;
	document.mainform.submit() ;
	return true ;
}

var q_ready = true ;

function q_alreadysubmitted(){
	if ( iswaiting ) return true ;
	if ( q_ready ){
		q_ready = false ;
		return false ;
	}
	return true ;
}

var serverbusy = { "fr" : "Opération en cours, veuillez réessayer dans quelques instants." } ;

function q_readytosubmit( asking1 ) {
	var asking = asking1 === undefined ?  true : asking1 ;
	if ( ( ! q_ready ) || ( iswaiting ) ) {
		if ( asking ) {
			var defaultlang = "fr" ;
			var lang = ( q_lang ) ? q_lang : defaultlang ;
			var s = common_message[ "serverbusy" ] || serverbusy[ lang ] || serverbusy[ defaultlang ] ;
			alert( s ) ;
		}
		return ( ( q_ready ) && ( ! iswaiting ) ) ;
	}
	return true ;
}

function handlepurchasebutton(){
	document.mainform.target='_self' ;
	document.mainform.mission.value='purchase'	 ;
	q_submit() ;
}

function resetform( wantxml , req ) {
	if ( queuedData.length ) queuedData_ajaxsubmit( wantxml , req ) ;
	else q_ready = true ;
}

function writenewusercookie ( sid ) {
	if ( sid == undefined ) {
		sid = document.mainform.sessionid.value ;
	} else {
		document.mainform.sessionid.value = sid ;
		document.mainform[ "q_space" ].value = ( document.mainform[ "q_space" ].value != "" ) ? document.mainform[ "q_space" ].value : sid ;
	}
	if ( document.cookie ) {
		if ( ( ! getcookie( "uid" ) ) || ( getcookie( "uid" ) != "member" ) ) {
			setcookie( "uid", sid, 15 ) ;
			setcookie( "known", true, 60000 ) ;
		}
	}
}

function handlenewuser ( x ) {
	if ( window.q_nonewsessionid ) return ;
	if ( document.mainform.sessionid.value != "" ) return ;
	var sid = x [ "q_newsessionid" ] ;
	if ( x.authresult ) {
		document.mainform.sessionid.value = sid ;
		return ;
	}
	if ( ! sid ) alert ( common_message[ "unexperror" ] ) ;
	document.mainform.sessionid.value = sid ;
	document.mainform[ "q_space" ].value = ( x[ "q_newspace" ] ) ? x[ "q_newspace" ] : ( ( document.mainform[ "q_space" ].value ) ? document.mainform[ "q_space" ].value : sid ) ;
	if ( document.cookie ) {
		if ( ( ! getcookie( "uid" ) ) || ( getcookie( "uid" ) != "member" ) ) {
			setcookie( "uid", sid, 15 ) ;
			setcookie( "known", true, 60000 ) ;
		}
	}
}

var q_ajaxgetreq = null ;

function q_ajaxgetstdcallback() {
	if ( ! q_ajaxgetreq ) return ;
	if ( q_ajaxgetreq.readyState == 4 ) {
		if ( q_ajaxgetreq.status == undefined ) {
			//badrequest() ;
			return ;
		}
		if ( q_ajaxgetreq.status == 200 ) {
			if ( q_ajaxgetreq.responseText ) handleupdate ( q_ajaxgetreq.responseText ) ;
		} else {
			handleupdate ( "" ) ;
		}
		if ( issafari() ) return ;
		q_ajaxgetreq = null ;
	}
}

function q_ajaxget( url ) {
	if ( ! q_ajaxgetreq ) {
		if ( window.XMLHttpRequest ) {
	 		q_ajaxgetreq = new XMLHttpRequest() ;
			if ( q_ajaxgetreq.overrideMimeType )  { q_ajaxgetreq.overrideMimeType( 'text/plain' ) ; }
		} else if ( window.ActiveXObject ) {
			try { q_ajaxgetreq = new ActiveXObject ( "Msxml2.XMLHTTP" ) ;} 
			catch (e )  {
				try { q_ajaxgetreq = new ActiveXObject ( "Microsoft.XMLHTTP" ) ; } 
				catch (e )  {}
			}
	        }
		q_ajaxgetreq.onreadystatechange = q_ajaxgetstdcallback ;
	}
	q_ajaxgetreq.open( "GET" , url , true ) ;
	q_ajaxgetreq.setRequestHeader ( "Content-Type", "text/xml;charset=utf-8" ) ; 
	q_ajaxgetreq.send ( null ) ;
}

function badrequest() {
	var x = common_message[ "badrequest" ] ;
	if ( issafari() ) x = x+"\n\n"+common_message[ "safaribugarrow" ] ;
	else x = x+"\n\n"+common_message[ "sigbug" ] ;
	alert(x) ;
}

var queueajaxsubmit = false ;
var queuedData = [] ;

function q_ajaxsubmitqueue( callBackFunction ) {
	if ( queuedData.length == 0 ) {
		queueajaxsubmit = false ;
		return ;
	}
	queueajaxsubmit = false ;
	var r = { json : queuedData } ;
	r.upindex = document.mainform.upindex.value ;
	q_ajaxsubmit ( r , callBackFunction ) ;
	queuedData = [] ;
}

function q_queueajaxsubmit() {
	queueajaxsubmit = true ;
}

function q_ajaxsubmitwithservice ( service , q_data , callBackFunction , params ) { return xq_ajaxsubmitwithservice ( service , q_data , callBackFunction , false , params ) ; }

function q_xmlajaxsubmitwithservice ( service , q_data , callBackFunction , params ) { return xq_ajaxsubmitwithservice ( service , q_data , callBackFunction , true , params ) ; }

function xq_ajaxsubmitwithservice ( service , q_data , callBackFunction , wantxml , params ) {
	var savedservice = document.mainform.service.value ;
	document.mainform.service.value = service ;
	try { xq_ajaxsubmit( q_data , callBackFunction , wantxml , params ) ; } catch( err ) {} ;
	document.mainform.service.value = savedservice ;
}

function q_ajaxsubmit ( q_data , callBackFunction , params ) { if ( window.currsvcid && document.mainform && document.mainform.service ) document.mainform.service.value = currsvcid.replace( /@intl/ , "@" + ( window.q_lang || "fr" ) ) ; return xq_ajaxsubmit ( q_data , callBackFunction , false , params ) ; }

function q_xmlajaxsubmit ( q_data , callBackFunction , params ) { return xq_ajaxsubmit ( q_data , callBackFunction , true , params ) ; }

function xq_ajaxsubmit ( q_data , callBackFunction , wantxml , params ) {
	if ( q_alreadysubmitted() ) {
		queuedData.push( [ [ q_data , callBackFunction , wantxml , params ] , document.mainform.mission.value , document.mainform.service.value ] ) ;
		return ;
	}
	xxq_ajaxsubmit ( q_data , callBackFunction , wantxml , params ) ;
}

function queuedData_ajaxsubmit( wantxml , req ) {
	document.mainform.mission.value = queuedData[ 0 ][ 1 ] ;
	var savedservice = document.mainform.service.value ;
	document.mainform.service.value = queuedData[ 0 ][ 2 ] ;
	var r = queuedData[ 0 ][ 0 ][ 0 ] ;
	if ( req && ( ! wantxml ) && r.upindex ) {// reset form peut être appelé sans arguments donc req peut être indéfini
		var x = new Object() ;
		if ( req.responseText != "" ) {
			x = eval ( "(" + req.responseText + ")" ) ;
		}
		queuedData[ 0 ][ 0 ][ 0 ].upindex = x.upindex || document.mainform.upindex.value ;
	}
 	xxq_ajaxsubmit.apply( this , queuedData[ 0 ][ 0 ] ) ;
	document.mainform.service.value = savedservice ;
	queuedData.splice( 0, 1 ) ;
}

function xxq_ajaxsubmit ( q_data , callBackFunction , wantxml , params ) {
	document.mainform[ "q_method" ].value = "ajax" ;
	var req = null;
	if ( window.XMLHttpRequest ) {
 		req = new XMLHttpRequest() ;
		if ( req.overrideMimeType )  { req.overrideMimeType( 'text/xml' ) ; }
	} else if ( window.ActiveXObject ) {
		try { req = new ActiveXObject ( "Msxml2.XMLHTTP" ) ; } 
		catch (e )  {
			try { req = new ActiveXObject ( "Microsoft.XMLHTTP" ) ; } 
			catch (e )  {}
		}
        }

	req.open ( "POST" , cgiurl() , true ) ;
	req.setRequestHeader ( "Content-type", "application/x-www-form-urlencoded" ) ; 
	req.onreadystatechange = function() {
		if ( req.readyState == 4) {
			if ( req.status == undefined ) {
				badrequest() ;
				return false ;
			} else if ( req.status == 200) {
				if ( wantxml ) {
					resetform( wantxml , req ) ;
					if ( callBackFunction != null ) {
						if ( params ) callBackFunction.apply( this , [ req.responseXML ].concat( params ) ) ;
						else callBackFunction( req.responseXML ) ;
					}
				} else {
					var x = new Object() ;
					if ( req.responseText != "" ) {
						x = eval ( "(" + req.responseText + ")" ) ;
					}
					if ( x.ajaxerror ) {
						resetform( wantxml , req ) ;
						handleajaxerror( x ) ;
					} else if ( x.waitid ) {
						handleajaxwait( x , callBackFunction ) ;
						iswaiting = true ;
					} else {
						iswaiting = false ;
						resetform( wantxml , req ) ;
						handlenewuser( x ) ;
						if ( callBackFunction != null ) {
							if ( params ) callBackFunction.apply( this , [ x ].concat( params ) ) ;
							else callBackFunction( x ) ;
						}
					}
				}
				req = null ;
			}
		}
	} ;
	req.send ( requiredhiddendata () + "&" + reqAddData ( "data" , q_toplist ( q_data ) ) ) ;
}

function handleajaxerror( x ) {
	var lang = q_lang ;
//	window.location.replace( q_getrelativebaseurl() + '/services/common@' + lang + '/remoteerrorpage'  ) ;
	if ( x.errormessage == "forcehomepage" ) {
		alert ( common_message [ x.errormessage ] ) ;
		return openhomepage() ;
	}
	if ( ( x.errormessage ) && ( common_message [ x.errormessage ] ) ) return alert ( common_message [ x.errormessage ] ) ;
	alert ( common_message [ "ajaxerror" ] ) ;
}

var iswaiting = false ;
var rwait ;
var waitcallBackFunction ;

function handleajaxwait( x , callBackFunction ){
	rwait = x ;
	if ( callBackFunction ) {
		waitcallBackFunction = callBackFunction ;
	} else {
		waitcallBackFunction = null ;
	}
	setTimeout ( ajaxwaitsubmit , 1000 * x.waitdelay ) ;
}

function ajaxwaitsubmit() {
	xxq_ajaxsubmit( rwait , waitcallBackFunction ) ;
}

var hiddenoptional = [] ;
var hiddenrequired = [ "mission" , "sessionid" , "service" , "q_space" , "filename" , "q_method" , "loginsfolder" ] ;

function requiredhiddendata() {
	var z = hiddenrequired ;
	var s = "" ;
	var i ;
	for ( i = 0 ; i < z.length ; i++ ) {
		if ( document.mainform[ z[ i ] ] ) {
			if ( i > 0 ) s += "&" ;
			s += reqAddData( z[ i ] , document.mainform[ z[ i ] ].value ) ;
		}
	}
	for ( i = 0 ; i < hiddenoptional.length ; i++ ) {
		if ( document.mainform[ hiddenoptional[ i ] ] ) s += "&" + reqAddData( hiddenoptional[ i ] , document.mainform[ hiddenoptional[ i ] ].value ) ;
	}
	return s ;
}

function reqAddData( key , value ) {
	return encodeURIComponent( key ) + "=" + encodeURIComponent( value ) ;
}

var remote_upload_callback ;
var remote_upload_params = [] ;

function q_remote_upload_callback( x ) {
	var currspaceright = rights_record.currspaceright ;
	if ( ( ! currspaceright ) || ( ! rights_record.spaceright ) || ( ! rights_record.spaceright[ currspaceright.right ] ) ) {
		if ( remote_upload_callback ) remote_upload_callback.apply( this , [ x ].concat( remote_upload_params ) ) ;
		return ;
	}
	var maxmb = getmaxmb() * 1024 * 1024 ;
	if ( x.uploadcancelled ) {
		if ( x.overspace ) {
			alert( common_message[ "overspace" ].replace( /%maxmb/ , q_smart_filesize( maxmb ) ).replace( /%overspace/ , q_smart_filesize( x.overspace ) ) ) ;
		} else {
			alert( common_message[ "maxsizereached" ].replace( /%maxmb/ , q_smart_filesize( maxmb  ) ) ) ;
		}
		if ( remote_upload_callback ) remote_upload_callback.apply ( this , [ "stop" ].concat( remote_upload_params ) ) ;
		return ; 
	} else {
		if ( x.uploadedsize ) {
			if ( x.uploadedsize > maxmb ) {
				alert( common_message[ "firstmaxsizereached" ].replace( /%maxmb/ , q_smart_filesize( maxmb  ) ) ) ; 
			}
			rights_record.currspaceright.currsize = x.uploadedsize ; 
			//if ( window.managespace_mbchanged ) managespace_mbchanged() ;
			q_mbchangedall() ;
		}
		
	}
	if ( remote_upload_callback ) remote_upload_callback.apply ( this , [ x ].concat( remote_upload_params ) ) ;
}

function q_setinputinmainform( inputname , inputvalue ) {
	if ( ! document.mainform[ inputname ] ) q_newinputinmainform( inputname ) ;
	document.mainform[ inputname ].value = inputvalue ;
}

function q_newinputinmainform( inputname ) {
	document.mainform.innerHTML += '<input type="hidden" name="' + inputname + '" value="" />' ;
}

function q_cloneinputsfrommainform( formname , inputhidden ) {
	var z = ( inputhidden ) ? inputhidden : hiddenrequired ;
	var i ;
	var input ;
	var theform = q_document_form( formname ) ;
	var firstelem = theform.firstChild ;
	var zi ;
	for ( i = 0 ; i < z.length ; i++ ) {
		zi = z[ i ] ;
		if ( document.mainform[ zi ] ) {
			if ( ! theform[ zi ] ) {
				input = q_CloneFromNode2( document.mainform[ zi ] ) ;
				if ( firstelem ) theform.insertBefore( input , firstelem ) ;
				else theform.appendChild( input ) ;
			}
			theform[ zi ].value = document.mainform[ zi ].value ;
		}
	}
}

function q_check_overspace( displayalert ) {
	var currspaceright = rights_record.currspaceright ;
	if ( ( currspaceright ) && ( currspaceright.currsize ) && ( ( currspaceright.maxmb ) || ( rights_record.spaceright ) && ( rights_record.spaceright[ currspaceright.right ] ) ) ) {
		var currsize = currspaceright.currsize / 1024 / 1024 ; 
		var maxmb = getmaxmb() ;
		var b = maxmb && ( currsize > maxmb ) ;
		if ( b && displayalert ) alert( common_message[ "maxsizereached" ].replace( /%maxmb/ , q_smart_filesize( maxmb  ) ) ) ;
		return b ;
	}
	return false ;
}

function q_availablespace(){
	var currspaceright = rights_record.currspaceright ;
	if ( ( currspaceright ) && ( currspaceright.currsize ) && ( ( currspaceright.maxmb ) || ( rights_record.spaceright ) && ( rights_record.spaceright[ currspaceright.right ] ) ) ) {
		var currsize = currspaceright.currsize;
		var maxmb = getmaxmb() *1024 * 1024 ;
		return maxmb - currsize
	}
	return 10*1024*1024;
}

function q_remote_upload( formname , callBack , params ) {
	if ( callBack ) remote_upload_callback = callBack ;
	else remote_upload_callback = null ;
	remote_upload_params = params || [] ;
	if ( q_check_overspace() ) return q_remote_upload_callback( { uploadcancelled : "maxsizereached" , maxmb : getmaxmb() } ) ;
	q_cloneinputsfrommainform( formname ) ;
	var theform = q_document_form( formname ) ;
	theform.mission.value = "upload" ;
	q_xrssubmit( formname ) ;
}

var remote_remove_callback ;

function q_remote_remove_callback( x ) {
	if ( x.uploadedsize ) {
		rights_record.currspaceright.currsize = x.uploadedsize ; 
		//if ( window.managespace_mbchanged ) managespace_mbchanged() ;
		q_mbchangedall() ;
	}
	if ( remote_remove_callback ) remote_remove_callback( x ) ;
}

function q_remote_remove( rmfiles , callBack ) {
	var r = { json : rmfiles } ;
	document.mainform.mission.value = "rmfiles" ;
	remote_remove_callback = callBack ? callBack : null ; 
	q_ajaxsubmit( r , q_remote_remove_callback ) ;
}

function q_remote_changeuploadname( uploadid , linkname ) {
	var r = { uploadid : uploadid , linkname : linkname } ;
	document.mainform.mission.value = "changeuploadname" ;
	q_ajaxsubmit( r , null ) ;
}

function q_readusersettings( callBack ) {
	document.mainform.mission.value = "readusersettings" ;
	q_ajaxsubmitwithservice( "subscribe@" + q_lang , "" , callBack ) ;
}

function q_writeusersettings( usersettings ) {
	document.mainform.mission.value = "writeusersettings" ;
	q_ajaxsubmitwithservice( "subscribe@" + q_lang , { usersettings : usersettings } , null ) ;
}

function isbeta2(){
	return /^http:\/\/(beta2|club2).quomodo.com/.test( window.location.href ) ;
}


/*function cloneObject() {
  var o = new this.constructor();
  for (var p in this) o[p] = (typeof this[p] == 'object') ? this[p].cloneObject() : this[p];
  return o;
}

Object.prototype.clone = cloneObject


*/
function q_toplist( x ) {
	return "<?xml version='1.0' encoding='UTF-8'?>\n<!DOCTYPE plist PUBLIC '-//Apple Computer//DTD PLIST 1.0//EN' 'http://www.apple.com/DTDs/PropertyList-1.0.dtd'>\n<plist version='1.0'>\n" + q_toplisttags ( x ) + "\n</plist>\n" ;
}

function taggedescapedvalue ( s , x ) {
		return "<" + s + ">" + x.replace( /&/g , "&amp;" ).replace( /</g , "&lt;" ).replace( />/g , "&gt;" ) + "</" + s + ">" ;
}

function taggedvalue ( s , x ) {
		return "<" + s + ">" + x + "</" + s + ">" ;
}

function q_toplisttags ( x ) {
	if ( x == null) return "" ;
	var t, y, s ;
	t = typeof ( x ) ;
	if ( t == "number" ) {
		y = '' + x ;
		if ( /[Ee\.]/ . test ( y ) ) s = "real" ;
		else s = "integer" ;
		return taggedescapedvalue ( s , y ) ;
	} else if ( t == "string" ) {
		return taggedescapedvalue ( "string" , x ) ;
	} else if ( t == "function" ) {
		return taggedescapedvalue ( "string" , x.toString() ) ;
	} else if ( t == "boolean" ) {
		return ( x ) ? "<true/>" : "<false/>" ;
	} else if ( t == "object" ) {
		if ( x.tagName ) return taggedescapedvalue ( "string" , x.tagName + " element" ) ;
		s = '' ;
		if ( x.splice ) {
			for ( var i = 0 ; i < x.length ; i++ ) if ( x [ i ] != null && x [ i ] != undefined ) s += q_toplisttags ( x [ i ] ) ;
			return taggedvalue ( "array" , s ) ;
		} else {
			for ( y in x ) {
				if ( x [ y ] != null && x [ y ] != undefined ) s += "<key>" + y + "</key>" + q_toplisttags ( x [ y ] ) ;
			}
			return taggedvalue ( "dict" , s ) ;
		}
	}
}

function q_toxml( x , entete) {
	if ( entete ) return "<?xml version='1.0' encoding='UTF-8'?>\n<root>\n" + q_toxmltags ( x ) + "\n</root>\n" ;
	else return q_toxmltags ( x ) ;
}

/*
function q_toxmltags ( x ) {
	if ( x == null) return "" ;
	var t, y, s, res ;
	t = typeof ( x ) ;
	if ( t == "number" ) {
		return x ;
	} else if   ( t == "string" ) {
		return x.replace( /&/g , "&amp;" ).replace( /</g , "&lt;" ).replace( />/g , "&gt;" ) ;
	} else if ( t == "object" ) {
		res = "" ; 
		if ( x.tagName ) return res = "<" + x.tagName + "/>" ;
		if ( x.splice ) {
			for ( var i = 0 ; i < x.length ; i++ ) if ( x [ i ] != null ) res += "<item>" +  q_toxmltags ( x [ i ] ) +"</item>" ;
		} else {
			for ( y in x ) {
				if ( x [ y ] != null ) res += "<" + y + ">" + q_toxmltags ( x [ y ] ) + "</" + y + ">" ;
			}
		return res + ((x.tagName) ? (" </" + x.tagName + ">") : "") ;
		}
	}
}
*/

function q_toxmltags ( x ) {
	if ( x == null) return "" ;
	var t, y, s, res ;
	t = typeof ( x ) ;
	if ( t == "number" ) return x ;
	if ( t == "string" ) return x.replace( /&/g , "&amp;" ).replace( /</g , "&lt;" ).replace( />/g , "&gt;" ) ;
	if ( t == "object" ) {
		if ( x.tagName ) return "<" + x.tagName + "/>" ;
		res = "" ; 
		if ( x.splice ) {
			for ( var i = 0 ; i < x.length ; i++ ) if ( x [ i ] != null ) res += "<item>" +  q_toxmltags ( x [ i ] ) +"</item>" ;
		} else {
			for ( y in x ) if ( x [ y ] != null ) res += "<" + y + ">" + q_toxmltags ( x [ y ] ) + "</" + y + ">" ;
		}
		return res ;
	}
}

function q_tostring ( x , forcespace ) {
	var optionalspace = forcespace || "" ;
	try { q_debugging ; optionalspace = " " } catch ( err ) { } ;
	if ( x == null) return "" ;
	var t, y, s ;
	t = typeof ( x ) ;
	if ( t == "number" ) {
		return ('' + x) ;
	} else if ( t == "string" ) {
		return "\"" + x.replace ( /(\r|\n)/g , "\\n" ).replace ( /\\/g , "\\\\" ).replace ( /"/g , "\\\"" ) + "\"" ;
	} else if ( t == "boolean" ) {
		return ( x ) ? "true" : "false" ;
	} else if ( t == "object" ) {
		if ( x.tagName ) return "[" + x.tagName + " node]" ;
		if ( x.splice ) {
			s = "[" + optionalspace ;
			for ( var i = 0 ; i < x.length ; i++ ) if ( x [ i ] != null ) {
				if ( i > 0 ) s += "," + optionalspace ;
				s += q_tostring ( x [ i ] ) ;
			}
			return s + optionalspace + "]" ;
		} else {
			s = "{" + optionalspace ;
			i = 0 ;
			for ( y in x ) if ( x [ y ] != null ) {
				if ( i++ > 0 ) s += "," + optionalspace ;
				s += y + ":" + optionalspace + q_tostring ( x [ y ] ) ;
			}
			return s + optionalspace + "}" ;
		}
	}
}


var currleftcol = 1 ;
var q_leftcolfolded = false ; 
var q_foldedmargin = 35 ;
var recentloaded = false ;

function foldleftcol(){
	var leftcol = getelement( "q_leftcol" ) ;
	var authorstuff = getelement( "q_author_stuff" ) ;
	if ( q_leftcolfolded ) {
		qdr_leftcolwidth = 198 ;
		leftcol.style.marginLeft = "0px" ;
		
		if ( issafari() ) document.body.style.position = "absolute" ;  // SAFARI
		document.body.style.marginTop = "0px" ;
		document.body.style.marginLeft = "0px" ;
		document.body.className = "q_imgbg_bright_strings" ;
		getelement( "q_leftcol" ).className = "fixed q_imgbg_bright_strings" ;
		
		getelement( "topheader" ).style.marginTop = "" ; 
		getelement( "topheaderbis" ).style.marginTop = "" ; 
		getelement( "headerdiv" ).style.marginTop = "" ; 
		if ( getelement( "headerinfo" ) ) getelement( "headerinfo" ).style.marginLeft = "0px" ;
		try { getelement( "spacetabs_elem" ).style.display = "block" } catch ( err ) { } ;
		try { getelement( "currservicename" ).style.display = "block" } catch ( err ) { } ;
		
		var c = getcolpane( ) ;
		c.style.marginTop = "" ;
		getElementsByClassName( c, "leftcol_fold")[0].onmouseover = function() { quietmsg( common_message['msgfoldleftcol'] ) } 
	} else { 
		qdr_leftcolwidth = 0 ;
		q_authorstuffleft = q_foldedmargin - authorstuff.offsetLeft ;
		document.body.style.marginLeft = q_authorstuffleft + "px" ;
		document.body.style.marginTop = -q_foldedmargin + "px" ; //"-62px" ;
		document.body.className = "q_imgbg_bright_strings_folded" ;

		var c = getcolpane( ) ;
		if ( ! (/MSIE (5\.5|6\.)/.test( navigator.appVersion ) ) ) {
			getelement( "q_leftcol" ).className = "fixed q_imgbg_bright_strings_folded" ;
			leftcol.style.marginLeft = q_authorstuffleft + "px" ;
			getelement( "topheader" ).style.marginTop = - q_foldedmargin + "px" ;
			getelement( "topheaderbis" ).style.marginTop = - q_foldedmargin + "px" ;
			getelement( "headerdiv" ).style.marginTop = - q_foldedmargin + "px" ;
			if ( getelement( "headerinfo" ) ) getelement( "headerinfo" ).style.marginLeft = q_authorstuffleft + "px" ;
			c.style.marginTop = - q_foldedmargin + "px" ;
		}
		try { getelement( "spacetabs_elem" ).style.display = "none" } catch ( err ) { } ;
		try { getelement( "currservicename" ).style.display = "none" } catch ( err ) { } ;

		getElementsByClassName( c, "leftcol_fold")[0].onmouseover = function() { quietmsg( common_message['msgunfoldleftcol'] ) } 
	}
	visibleblock(getElementsByClassName( c, "q_leftcolitems")[0] , q_leftcolfolded ) ;
	quietmsg( "" ) ;
	q_leftcolfolded = ! q_leftcolfolded ;
}

function getcolpane( x ) {
	var y = ( x == undefined ) ? currleftcol : x ;
	return getelement( "leftcolpane" + y ) ;
}

function numcolpanes() {
	return getElementsByClassName( getelement( "q_leftcol" ), "leftcolpane" ).length ;
}

function initleftcol() {
	getcolpane().style.left = "0px" ;
	if ( getElementsByClassName( getelement( "q_leftcol" ), "managespace" ).length != 0 ) {
		if ( ! q_isstaticpage() ) {
			if ( document.mainform.q_space.value == "self" ) qdyn_qorgload( '' , [] , 'manageselfspace' ) ;
			else qdyn_qorgload( '' , [] , 'managespace' ) ; // préchargement colonne managespace
		}
	}
	var dtemp = [] ; // préchargement des images rollover
	var imgs = [ "leftcol_left", "leftcol_right", "leftcol_fold" ] ;
	for ( i = 0; i < imgs.length; i++ ) {
		dtemp[ i ] = document.createElement( "img" ) ;
		//dtemp[ i ].src = "/images/" + imgs[ i ] + "_over.png" ;
		dtemp[ i ].src = "/images/" + imgs[ i ] + ".png" ;
	}
}

function switchleftcols( n ) {
	if ( ! n ) n = 1 ;
	var c1 , c2 ; 
	var ncols = numcolpanes( ) ;
	var nextleftcol = ( currleftcol + n + ncols ) % ncols ;

	getcolpane( ).targetleft = n*200 ;
	c1 = currleftcol ;

	var c = getcolpane( nextleftcol ) ;
	c.style.left = ( -n * 200 ) + "px" ;
	c.targetleft = 0 ;
	currleftcol = nextleftcol ;
	c2 = nextleftcol ;
	if ( /recent/.test( c.className ) ) buildrecentcol() ;
	getelement( "q_leftcol" ).style.overflow = "hidden" ;
	moveleftcol( c1 , c2 ) ;
}

function moveleftcol( c1 , c2 ) {
	var module = 0.7 ;
	var lc1 = getcolpane( c1 ) ;
	var lc2 = getcolpane( c2 ) ;
	var v1 = lc1.style[ "left" ] ;
	var v2 = lc2.style[ "left" ] ;
	var again = false ;
	lc1.style[ "left" ] = ( Math.round( parseInt( v1 ) + module * ( lc1[ "targetleft" ] - parseInt( v1 ) ) ) ) + "px" ;
	lc2.style[ "left" ] = ( Math.round( parseInt( v2 ) + module * ( lc2[ "targetleft" ] - parseInt( v2 ) ) ) ) + "px" ;
	again = again || ( Math.abs( lc1[ "targetleft" ] - parseInt( lc1.style[ "left" ] ) ) > 1 ) ;
	again = again || ( Math.abs( lc2[ "targetleft" ] - parseInt( lc2.style[ "left" ] ) ) > 1 ) ;
	if ( again ) setTimeout( "moveleftcol( '" + c1 + "' , '" + c2 + "' )" , 100 ) ;
	else {
		if ( lc1[ "targetleft" ] > 0 ) lc1.style [ "left" ] = "-200px" ;
		if ( lc2[ "targetleft" ] > 0 ) lc2.style [ "left" ] = "-200px" ;
		getelement( "q_leftcol" ).style.overflow = "visible" ;
	}
}

function buildrecentcol() { // fill id = recent where there is already a div possibly filled in
	if ( recentloaded ) return ;
	recentloaded = true ;
	var recentdiv = getelement ( "recent" ) ;
	if ( ! recentdiv ) return ;
	var firstdiv = recentdiv.getElementsByTagName ( "DIV" )[0] ;
	var norecentservices = true ;
	try { norecentservices = ( recent_services.length == 0 ) ; } catch ( err ) {}
	if ( norecentservices ) {
		firstdiv.innerHTML = common_message [ "emptyrecentcol" ] ;
		return ;
	}
	firstdiv.innerHTML = "" ;
	var newdiv, newul, newli, newa ;
	var promptpages = false ;
	var promptservices = false ;
	var lang = q_lang ;
	for ( var i = 0 ; i < recent_services.length ; i++ ) {
		if ( recent_services [ i ].family != "pages" ) continue ;
		if ( serviceaccess( recent_services[ i ] ) == "denied" ) continue ;
		if ( ! promptpages ) {
			promptpages = true ;
			newdiv = firstdiv.cloneNode ( true ) ;
			newdiv.className = "square" ;
			newdiv.style.marginBottom = "0px" ;
			newdiv.innerHTML = common_message [ "promptpages" ] ;
			recentdiv.appendChild( newdiv ) ;
			newul = document.createElement( "UL" ) ;
			recentdiv.appendChild( newul ) ;
		}
		if ( recent_services [ i ].id == currsvcid ) {
			newli = document.createElement ( "LI" ) ;
			newli.innerHTML = recent_services [ i ].shortname ;
		} else {
			newa = document.createElement ( "A" ) ;
			newa.href = "" ;
			newa.svc = recent_services [ i ].id ;
			newa.onclick = function () { openservice( this.svc ) ; return false } ;
			newa.innerHTML = recent_services [ i ].shortname ;
			newli = document.createElement ( "LI" ) ;
			newli.appendChild( newa ) ;
		}
		newli.style.marginLeft = "-20px" ;
		newul.appendChild( newli ) ;
	}
	for ( var i = 0 ; i < recent_services.length ; i++ ) {
		if ( recent_services [ i ].family != "sad" ) continue ;
		if ( serviceaccess( recent_services[ i ] ) == "denied" ) continue ;
		if ( ! promptservices ) {
			promptservices = true ;
			newdiv = firstdiv.cloneNode ( true ) ;
			newdiv.className = "square" ;
			newdiv.style.marginBottom = "0px" ;
			if ( promptpages ) newdiv.style.marginTop = "16px" ;
			newdiv.innerHTML = common_message [ "promptservices" ] ;
			recentdiv.appendChild( newdiv ) ;
			newul = document.createElement( "UL" ) ;
			recentdiv.appendChild( newul ) ;
		}
		if ( recent_services [ i ].id == currsvcid ) {
			newli = document.createElement ( "LI" ) ;
			newli.innerHTML = recent_services [ i ].shortname ;
		} else {
			newa = document.createElement ( "A" ) ;
			newa.href = "" ;
			newa.svc = recent_services [ i ].id ;
			newa.onclick = function () { openservice( this.svc ) ; return false } ;
			newa.innerHTML = recent_services [ i ].shortname ;
			newli = document.createElement ( "LI" ) ;
			newli.appendChild( newa ) ;
		}
		newli.style.marginLeft = "-20px" ;
		newul.appendChild( newli ) ;
	}
	
	var d ;
	if ( recent_services.length < 4 ) {
		d = document.createElement ( "DIV" ) ;
		d.innerHTML = common_message[ "emptyrecentcol" ] ;
		recentdiv.appendChild( d ) ;
	}

/*
	d = document.createElement ( "DIV" ) ;
	d.className = "menuseparator" ;
	recentdiv.appendChild( d ) ;

	var div, anc ;

	d = document.createElement ( "DIV" ) ;
	recentdiv.appendChild( d ) ;

	div = document.createElement ( "DIV" ) ;
	div.style[ "float" ] = "left" ;
	d.appendChild ( div ) ;

	div = document.createElement ( "DIV" ) ;
	d.appendChild ( div ) ;

	anc = document.createElement ( "A" ) ;
	anc.href = "/services/gallery@" + lang + "/gallery" ;
	anc.onclick = function() { opengallery() ; return false } ;
	anc.innerHTML = common_message[ "allservices" ] ;
	div.appendChild ( anc ) ;
*/
/*
	d.innerHTML = "<div style='float: left'></div><div><a href='/services/gallery@" + lang + "/gallery' onclick='opengallery() ; return false'>" + common_message[ "allservices" ] + "</a></div>" ;
*/
	
	rm ( firstdiv ) ;
}

var pagegroupsname = { "homepage@intl" : "Pages interactives", "familyplanning@intl" : "Emplois du temps" , "schooltt@intl" : "Emplois du temps" , "spiral@intl" : "Dessins de spirales", "pm@intl" : "Pêles-mêles de photos" , "clubpage@intl" : "Pages des clubs", "artemadisq@intl" : "Pages interactives" }

function buildnavigationmenu() {
	var menudiv = getelement ( "navigationmenu" ) ;
	if ( ! menudiv ) return ;
	menudiv.style.height = "20px" ;
	menudiv.onmouseover = function () { this.style.height = "" ; }
	menudiv.onmouseout = function () { this.style.height = "20px" ; }
	menudiv.innerHTML = '<div style="padding-top: 2px; text-align: center; font-size: 13px">' + common_message[ "pagesmenuname" ] + '</div><div id="navigationmenuitems"></div><div style="padding: 7px 0; border-top: solid 1px #AAA; margin-top: 14px; text-align: center;"><a href="/services/gallery@fr/gallery" >' + common_message[ "pagescreatenew" ] + '</a></div>'
	menudiv.getElementsByTagName( "A" )[ 0 ].onclick= function() { opengallery() ; return false ; }
	
	menudiv = getelement ( "navigationmenuitems" ) ;
	var pagegroups = { } ;
	var p , g  ;
	for ( var i = 0 ; i < recent_services.length ; i++ ) {
		p = recent_services[ i ] ;
		if ( serviceaccess( p ) == "denied" ) continue ;
		g = pagegroupsname[ p.id.replace( /#.*#/, "" ) ] ;
		if ( pagegroups[ g ] ) pagegroups[ g ].push( [ p.id, p.shortname ] ) ;
		else pagegroups[ g ] = [ [ p.id, p.shortname ] ] ;
	}
	for ( var g in pagegroups ) {
		var pg = pagegroups[ g ] ;
		var gdiv = document.createElement ( "div" ) ;
		gdiv.className = "navigationmenugroup" ;
		gdiv.innerHTML = g ;
		var gdivitems = document.createElement ( "div" ) ;
		gdivitems.style.marginLeft = "15px" ;
		for ( var i = 0 ; i < pg.length ; i++ ) {
			var p = document.createElement ( "p" ) ;
			if ( pg[ i ][ 0 ] != currsvcid ) {
				var a = document.createElement ( "a" ) ;
				a.href = "" ;
				a.svc = pg[ i ][ 0 ] ;
				a.onclick = function () { openservice( this.svc ) ; return false } ;
				a.innerHTML = pg[ i ][ 1 ] ;
				p.appendChild( a ) ;
			} else {
				p.innerHTML = pg[ i ][ 1 ] ;
				p.style.fontStyle = "italic" ;
			}
			gdivitems.appendChild( p ) ;
		}
		menudiv.appendChild( gdiv ) ;
		menudiv.appendChild( gdivitems ) ;
	}
}


var q_tabs_wantnewspace = true ; 
var q_tabs_prepared = false ; 
var q_tabs_saving = null ; 
var q_tabs_firstcell = 1 ; 
var currspacetabalertdone = false ;
var currspacetabindex ;
var spacetabstocheck = [] ;
var q_sortedtabs ;
var q_tabs_changedDate ;
var updatesintabsdelay = 300000 ;
var tabsupdatetimer = null ;
var spaceref = 0 ;
var spacesvcref = 0 ;
var q_ajaxgetreq2 = null ;

//var q_spacetabs_list = { first : 2 , last : 7 , spaces:[{id:"p0", name:"p0"},{id:"p1", name:"p1"},{id:"p2", name:"p2"},{id:"p3", name:"p3"},{id:"p4", name:"p4"},{id:"p5", name:"p5"},{id:"p6", name:"p6"},{id:"p7", name:"p7"},{id:"p8", name:"p8"},{id:"p9", name:"p9"}] } ;

function q_tabs_appendnewspace( row , spacetab , foundcurrspace ) {
	var c = row.appendChild( document.createElement( "TD" ) ) ;
	c.innerHTML = '<div></div>' ;
	var div = c.getElementsByTagName( "div" )[ 0 ] ;
	var a= div.appendChild( document.createElement( "A" ) ) ;
	a.innerHTML = "" ;
	a.appendChild( document.createTextNode( spacetab.name ) ) ;
	a.style.cursor = "pointer" ;
	a.onclick = function () { qdyn_qorgload( 'newspace_reveal' , [] , 'newspace' ) ; return false ; } ;
	div.className = ( foundcurrspace ) ? "spacetabright" : "spacetab" ;
	div.style.borderTop = "dotted 1px #005081" ;
	div.style.borderRight = "dotted 1px #005081" ;
	return false ;
}

function q_tabs_news( spacetab ) {
	var svcs = spacetab.services ;
	if ( ! svcs ) return false ;
	for ( var i = 0 ; i < svcs.length ; i++ ) {
		if ( ( spacetab.id == document.mainform.q_space.value ) && ( spacetab.services[ i ][ 0 ] == currsvcid ) && ( prevuserupindex.news < spacetab.services[ i ][ 1 ].space.news ) ) {
			if ( currspacetabalertdone ) return false ;
			currspacetabalertdone = true ;
			return true ;
		}
		if ( spacetab.services[ i ][ 1 ].user.news < spacetab.services[ i ][ 1 ].space.news ) return true ;
	}
	return false ;
}

function q_tabs_newsinsvc( svcid ) {
	if ( ( ! spacetabs ) || ( ! spacetabs.spaces[ currspacetabindex ] ) ) return false ;
	var svcs = spacetabs.spaces[ currspacetabindex ].services ;
	if ( ! svcs ) return false ;
	for ( var i = 0 ; i < svcs.length ; i++ ) if ( svcs[ i ][ 0 ] == svcid ) return ( svcs[ i ][ 1 ].user.news < svcs[ i ][ 1 ].space.news ) ;
	return false ;
}

function q_tabs_append( row , spacetab , foundcurrspace ) {
	if ( spacetab.id == "newspace" ) return q_tabs_appendnewspace( row , spacetab , foundcurrspace ) ;
	var c = row.appendChild( document.createElement( "TD" ) ) ;
	c.innerHTML = '<div><div class="spacetabalert" style="visibility: ' + ( ( spacetab.news ) ? 'visible' : 'hidden' ) + '">!</div></div>' ;
	var div ;
	div = c.getElementsByTagName( "div" )[ 1 ] ;
	div.id = spacetab.id ;
	div = c.getElementsByTagName( "div" )[ 0 ] ;
	if ( spacetab.id == document.mainform.q_space.value ) {
			var span = div.appendChild( document.createElement( "SPAN" ) ) ;
			span.innerHTML = "" ;
			span.appendChild( document.createTextNode( spacetab.name ) ) ;
			div.className = "spacetabselected" ;
			return true ;
	} else {
			var a= div.appendChild( document.createElement( "A" ) ) ;
			a.innerHTML = "" ;
			a.appendChild( document.createTextNode( spacetab.name ) ) ;
			a.style.cursor = "pointer" ;
			a.onclick = function () { openspace( spacetab.id ) ; return false ; } ;
			div.className = ( foundcurrspace ) ? "spacetabright" : "spacetab" ;
			return false ;
	}
}

function q_tabs_prepare() {
	var table = getelement( "spacetabs_elem" ) ;
	if ( ! table ) {
		q_tabs_prepared = true ;
		return ;
	}
	var row = table.insertRow( 0 ) ;
	var td = row.insertCell( 0 ) ;
	td.innerHTML = '<div class="spacetab" style="padding: 1px 10px 2px 0; border: none"><img id="spacetab_left" alt="" src="/images/triangles/triangle_l2.png"  style="cursor: pointer ; filter :progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'/images/triangles/triangle_l2.png\',sizingMethod=\'scale\') ; width: 11px ; height : 9px" /><span style="padding: 0 2px"> </span><img id="spacetab_right" alt="" src="/images/triangles/triangle_r2.png"  style="cursor: pointer ; filter :progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'/images/triangles/triangle_r2.png\',sizingMethod=\'scale\') ; width: 11px ; height : 9px"  /></div>'
	var imgs = td.getElementsByTagName( "IMG" ) ;
	if ( ( navigator ) && ( navigator.userAgent ) && ( /MSIE (5\.5|6\.)/.test( navigator.userAgent ) ) ) imgs[ 0 ].src = imgs[ 1 ].src = "/images/blank.gif" ;

	q_changearrowstatus( imgs[ 0 ], "active" ) ;
	q_changearrowstatus( imgs[ 1 ], "active" ) ;
	q_tabs_prepared = true ;
}

function q_tabs_clean() {
	if ( ! getelement( "spacetabs_elem" ) ) return ;
	var row = getelement( "spacetabs_elem" ).rows[0] ;
	for( ; q_tabs_firstcell < row.cells.length ; ) row.deleteCell( q_tabs_firstcell ) ;
	return row ;
}

function q_tabs_initspacetabs() {
	if ( ( q_tabs_wantnewspace ) && ( window.spacetabs ) && ( spacetabs.spaces[ spacetabs.spaces.length - 1 ].id != "newspace" ) ) spacetabs.spaces.push( { id : "newspace" , name : common_message[ "newspacetabname" ] } ) ;
	q_sortedtabs = [] ;
	spacetabstocheck = [] ;
	var news ;
	var spacetab ;
	for ( var i = 0 ; i < spacetabs.spaces.length ; i++ ) {
		spacetab = spacetabs.spaces[ i ] ;
		if ( spacetab.id == document.mainform.q_space.value ) {
			spacetab.visibility = true ;
			currspacetabindex = i ;
		}
		spacetab.visibility = ( spacetab.visibility !== false ) ;
		if ( spacetab.visibility ) {
			news = q_tabs_news( spacetab ) ;
			if ( ( spacetab.id != "self" ) && ( spacetab.id != "newspace" ) && ( spacetab.id != document.mainform.q_space.value ) && ( ! news ) && ( spacetab.services ) && ( spacetab.services.length != 0 ) ) spacetabstocheck.push( i ) ;
			spacetab.news = ( news && ( spacetab.id != "self" ) ) ;
			q_sortedtabs.push( "" + ( ( spacetab.index ) ? spacetab.index : "nan" ) + "_" + twodigs( i ) ) ;
		}
	}
	q_sortedtabs.sort()
}

function q_init_tabs_menu() {
	if ( ! document.mainform.q_space ) return false ;
	if ( ! q_tabs_prepared ) q_tabs_prepare() ;

	q_tabs_initspacetabs() ;

	var firsttab = spacetabs.first = ( spacetabs.first ) ? spacetabs.first : 0 ;
//	var lasttab = spacetabs.last = ( spacetabs.last ) ? Math.min( spacetabs.last , spacetabs.spaces.length - 1 ) : spacetabs.spaces.length - 1 ;
	var lasttab = spacetabs.last = spacetabs.spaces.length - 1 ;
	if ( lasttab > q_sortedtabs.length ) {
		firsttab = ( ( firsttab - lasttab + q_sortedtabs.length ) > 0 ) ? firsttab - lasttab + q_sortedtabs.length : 0 ;
		lasttab = q_sortedtabs.length - 1 ;
	}
	var j ;
	var row = q_tabs_clean() ;
	var foundcurrspace = false ;
	var i = 0 ;
	if ( ! getelement( "spacetabs_elem" ) ) return ;
	for ( var i = firsttab ; i <= lasttab ; i++ ) {
		spacetab = spacetabs.spaces[ parseInt( q_sortedtabs[ i ].split( "_" )[ 1 ] , 10 ) ] ;
		foundcurrspace = q_tabs_append( row , spacetab , foundcurrspace ) ;
		if ( ( i == lasttab ) && ( spacetab.id != "newspace" ) ) row.cells[ q_tabs_firstcell + i - firsttab ].getElementsByTagName( "div" )[ 0 ].style.borderRight = ( foundcurrspace ) ? "solid 1px #000" : "solid 1px #005081" ;
	}
//	getelement( "q_change_spacetabsorder_actions" ).style.marginTop = ( spacetabs.spaces.length*25 + 20 ) + "px" ;
//	getelement( "q_change_spacetabsorder" ).style.height = ( spacetabs.spaces.length*25 + 60 ) + "px" ;
//	getelement( "q_change_spacetabsorder" ).style.display = "none" ;

	if ( spacetabs.first == 0 ) q_changearrowstatus( "spacetab_right", "disabled" ) ;
	else if ( spacetabs.first == spacetabs.last ) q_changearrowstatus( "spacetab_left", "disabled" ) ;
	
	spacetabalert() ;
	launchupdatesintabs() ;
}

function q_tabs_callBack( r ) {
//	alert( "q_tabs_callBack ok" );
	return ;
}

function q_tabschanged() { // id = qsn_edittarget.id
	if ( q_tostring( q_spacetabs_list ) == q_tostring( q_tabs_saving ) ) return ;
	var r = { json : q_spacetabs_list } ;
	document.mainform.mission.value = "tabschanged" ;
	q_ajaxsubmit( r , q_tabs_callBack ) ;
}

function q_tabs_check_changed() {
	var d = new Date() ;
	if ( ( d- q_tabs_changedDate ) < 1900 ) return ;
	q_tabschanged() ; 
}

function q_registertabs() {
	q_setinputinmainform( "q_tabs" , q_toplist( { first : spacetabs.first , last : spacetabs.last } ) )
}

function q_subtab() {
	if ( spacetabs.last - spacetabs.first <= 1 ) return ;
	spacetabs.last-- ;
	q_registertabs() ;
	q_init_tabs_menu() ;
	q_tabs_changedDate = new Date() ;
	//setTimeout ( "q_tabs_check_changed()" , 2000 ) ;
}

function q_addtab() {
	if ( ( spacetabs.first == 0 ) && ( spacetabs.last == q_sortedtabs.length - 1 ) ) return ;
	if ( spacetabs.last < q_sortedtabs.length - 1 ) spacetabs.last++ ;
	else spacetabs.first-- ;
	q_registertabs() ;
	q_init_tabs_menu() ;
	q_tabs_changedDate = new Date() ;
//	setTimeout ( "q_tabs_check_changed()" , 2000 ) ;
}

function q_lefttab() {
	if ( spacetabs.last == q_sortedtabs.length - 1 ) return ;
	spacetabs.first++ ;
	spacetabs.last++ ;
	q_registertabs() ;
	q_init_tabs_menu() ;
}

function q_righttab() {
	if ( spacetabs.first == 0 ) return ;
	spacetabs.first-- ;
	spacetabs.last-- ;
	q_registertabs() ;
	q_init_tabs_menu() ;
}

function q_translatetabs( x ) {
	//spacetabs.last = spacetabs.spaces.length - 1 ; // mise à jour pour ceux qui ont diminué le nombre d'espaces avec l'ancien système
	if ( x == 1 ) {
		if ( spacetabs.first == 0 ) return ;
		if ( spacetabs.first == spacetabs.last ) q_changearrowstatus( "spacetab_left", "active" ) ;
		spacetabs.first-- ;
		if ( spacetabs.first == 0 ) q_changearrowstatus( "spacetab_right", "disabled" ) ;
	} else {
		if ( spacetabs.first > (spacetabs.last - 1 ) ) return ;
		if ( spacetabs.first == 0 ) q_changearrowstatus( "spacetab_right", "active" ) ;
		spacetabs.first++ ;
		if ( spacetabs.first == spacetabs.last ) q_changearrowstatus( "spacetab_left", "disabled" ) ;
	}
	q_registertabs() ;
	q_init_tabs_menu() ;
}

function q_changearrowstatus( x, s ) {
	var arr = ge( x ) ;
	var id = arr.id ;
	var isIE6 = ( ( navigator ) && ( navigator.userAgent ) && ( /MSIE (5\.5|6\.)/.test( navigator.userAgent ) ) ) ;
	arr.style.cursor = ( s == "disabled" ) ? "default" : "pointer" ;
	var statusdict = { "disabled" : 0 , "over" : 1 , "active" : 2 } ;
	var arrowfilename = ( ( id == "spacetab_left" ) ? "triangle_l" : "triangle_r" ) + statusdict[ s ] + ".png" ;
	if ( isIE6 ) arr.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/images/triangles/" + arrowfilename + "',sizingMethod='scale')" ;
	else arr.src = "/images/triangles/" + arrowfilename ;
	if ( s == "disabled" ) {
		arr.onclick = function() { return false ; } ;
		arr.onmouseover = function() {} ;
		arr.onmouseout = function() {} ;
	} else {
		var z = ( id == "spacetab_left" ) ? -1 : 1 ;
		arr.onclick = function() { q_translatetabs( z ) ; return false ; } ;
		arr.onmouseover = function() { q_changearrowstatus( this , "over" ) } ;
		arr.onmouseout = function() { q_changearrowstatus( this , "active" ) } ;
	} 
}

function q_move_tab( i_elem , ee ) { 

	var e = ee || window.event ; 

	var elem = getelement( "order_" + i_elem ) ; 
	elem.className += "_selected" ; 
	elem.id = "order_selected" ; 
	var y = parseInt( elem.style.top ) ;
	var dy = q_clientY( e ) - y ;
	var clientY0 = q_clientY( e ) ;
	var curr_i = i_elem ; 	
	for ( var i = 0 ; i < spacetabs.spaces.length ; i++ ) if ( i != i_elem ) getelement( "order_" + i ).onmousedown = null ; 
	var moving_o =  spacetabs.spaces[  i_elem ]  ;
	var cells = getelement( "spacetabs_elem" ).rows[0].cells ;
	var s = cells[ q_tabs_firstcell + i_elem ].innerHTML ;

	function moveHandler( ee ) { 
		var em = ee || window.event ; 
		var ey = q_clientY( em ) - dy ;
		elem.style.cursor = "default" ; // "move" ;
		var i_curr = ( ey - 20 ) / 25 ; 
		if ( i_curr - curr_i> 0.5 ) {
			if ( curr_i + 1 < spacetabs.spaces.length ) {
				spacetabs.spaces[  curr_i  ] =  spacetabs.spaces[  curr_i  + 1 ] ;  
				spacetabs.spaces[  curr_i + 1  ] =  moving_o ;  
				var div = getelement( "order_" + ( curr_i + 1 ) ) ;
				div.style.top = ( 20 + 25 * curr_i ) + "px" ;
				div.id = "order_" + curr_i ;
				cells[ q_tabs_firstcell + curr_i ].innerHTML = cells[ q_tabs_firstcell + 1 + curr_i ].innerHTML ;
				cells[ q_tabs_firstcell + 1 + curr_i ].innerHTML = s ; 
				curr_i++ ;
			}
		} 
		if ( i_curr - curr_i < - 0.5 ) {
			if ( curr_i > 0 ) {
				spacetabs.spaces[  curr_i  ] =  spacetabs.spaces[  curr_i  - 1 ] ;  
				spacetabs.spaces[  curr_i - 1  ] =  moving_o ;  
				var div = getelement( "order_" + ( curr_i - 1 ) ) ;
				div.style.top = ( 20 + 25 * curr_i ) + "px" ;
				div.id = "order_" + curr_i ;
				cells[ q_tabs_firstcell + curr_i ].innerHTML = cells[ q_tabs_firstcell - 1 + curr_i ].innerHTML ;
				cells[ q_tabs_firstcell - 1 + curr_i ].innerHTML = s ; 
				curr_i-- ;
			}
		} 
		elem.style.top = ey+ "px";
		q_stopPropagation( em );
		q_preventDefault( em );
	}
	function upHandler( ee ) {	
		var eu = ee || window.event ; 
		document.onmouseup = null ;
		document.onmousemove = null ;
		elem.id = "order_" + curr_i ; 
		elem.style.top = ( 20 + 25 * curr_i ) + "px" ; 
		for( var j = 0 ; j < spacetabs.spaces.length ; j++ ) {
			q_tabs_addevent( getelement( "order_" + j ) , j )  ;
		}
		
		var ey = q_clientY( eu ) - dy ;
		elem.style.cursor = "auto" ;
		elem.className = elem.className.replace( /_selected$/ , "" ) ;
		q_stopPropagation( eu ) ;
		q_preventDefault( eu ) ;
	}
	document.onmousemove = moveHandler ;
	document.onmouseup = upHandler ;
	q_stopPropagation( e );
	// q_preventDefault( e );
	if ( ( window.getSelection ) && ( window.getSelection() == "" ) ) q_preventDefault( e );
	if ( ! window.getSelection ) q_preventDefault( e );
}

function q_tabs_addevent( div , i ) { 
	div.onmousedown = function( event ) { q_move_tab( i , event ) ; } ;
}

function q_change_spacetabsorder(){  // div = getelement( "q_change_spacetabsorder" ).innerHTML
	q_tabs_saving = q_cloneObject( spacetabs.spaces ) ;
	getelement( "q_change_spacetabsorder" ).style.display = "block" ;
	var divc = getelement( "q_change_spacetabsorder_content" ) ;
	var top = 20 ; 
	for ( var i = 0 ; i <  spacetabs.spaces.length  ; i++ ) {
		var div = document.createElement( "div" ) ;
		div.innerHTML = "" ;
		div.appendChild( document.createTextNode( spacetabs.spaces[ i ].name ) ) ;
		div.id = "order_"+i ;
		div.style.top = ( top + 25 * i ) + "px" ;
		div.className = "q_change_spacetabsorder" ;
		div.onmouseover = function() { this.style.cursor = "pointer"  ; } ;
		q_tabs_addevent( div , i ) ;
		divc.appendChild( div ) ;
	}	
}

function q_tabs_delete_divs() {
	getelement( "q_change_spacetabsorder_content" ).innerHTML = ""  ;
	getelement( "q_change_spacetabsorder" ).style.display = "none" ;
}

function q_tab_cancel(){
	spacetabs.spaces = q_tabs_saving ; 
	q_tabs_delete_divs() ;
	q_init_tabs_menu() ;
}

function q_tab_finish(){
	q_tabs_delete_divs() ;
	q_tabschanged() ; 
}

function launchupdatesintabs() {
	if ( tabsupdatetimer ) clearInterval( tabsupdatetimer ) ;
	tabsupdatetimer = setInterval ( "checkupdatesintabs()" , updatesintabsdelay ) ; 
}

function checkupdatesintabs() {
	if ( ( spaceref != 0 ) && ( spacesvcref != 0 ) ) return ;
	if ( ( tabsupdatetimer ) && ( spacetabstocheck.length == 0 ) ) {
		clearInterval( tabsupdatetimer ) ;
		tabsupdatetimer = null ;
	} else checkupdatesinonetab() ;
}

function checkupdatesinonetab() {
	var spacetab = spacetabs.spaces[ spacetabstocheck[ spaceref ] ] ;
	q_ajaxget2 ( q_selfbaseurl() + spacetab.id + "/services/" + encodeURIComponent( spacetab.services[ spacesvcref ][ 0 ] ) + "/upindex"  + "?" + (new Date()).getTime() ) ;
}

function q_ajaxget2( url ) {
	if ( ! q_ajaxgetreq2 ) {
		if ( window.XMLHttpRequest ) {
	 		q_ajaxgetreq2 = new XMLHttpRequest() ;
			if ( q_ajaxgetreq2.overrideMimeType )  { q_ajaxgetreq2.overrideMimeType( 'text/plain' ) ; }
		} else if ( window.ActiveXObject ) {
			try { q_ajaxgetreq2 = new ActiveXObject ( "Msxml2.XMLHTTP" ) ;} 
			catch (e )  {
				try { q_ajaxgetreq2 = new ActiveXObject ( "Microsoft.XMLHTTP" ) ; } 
				catch (e )  {}
			}
	        }
		q_ajaxgetreq2.onreadystatechange = q_ajaxget2stdcallback ;
	}
	q_ajaxgetreq2.open( "GET" , url , true ) ;
	q_ajaxgetreq2.setRequestHeader ( "Content-Type", "text/xml;charset=utf-8" ) ; 
	q_ajaxgetreq2.send ( null ) ;
}

function q_ajaxget2stdcallback() {
	if ( ! q_ajaxgetreq2 ) return ;
	if ( q_ajaxgetreq2.readyState == 4 ) {
		if ( q_ajaxgetreq2.status == 200 ) {
			handleupdatesintab ( q_ajaxgetreq2.responseText ) ;
		} else {
			handleupdatesintab ( "" ) ;
		}
		if ( issafari() ) return ;
		q_ajaxgetreq2 = null ;
	}
}

function incspacesvcref( spacetab ) {
	spacesvcref += 1 ;
	if ( spacesvcref > ( spacetab.services.length - 1 ) ) {
		spacesvcref = 0 ;
		spaceref += 1 ;
	}
}

function handleupdatesintab ( x ) {
	var spacetab = spacetabs.spaces[ spacetabstocheck[ spaceref ] ] ;
	try {
		x = eval( "(" + x + ")" ) ;
		spacetab.services[ spacesvcref ][ 1 ].space = x ;
		x = ( x[ "news" ] ) ? x[ "news" ] : "" ;
	} catch( err ) { x = "" ; }
	if ( x != "" ) {
		if ( x > spacetab.services[ spacesvcref ][ 1 ].user.news ) {
			doblink( spacetab.id , 9 ) ; // blink alerte dans le tab
			spacetabstocheck.splice( spaceref, 1 ) ; // suppression de l'espace dans le tableau des updates
			spacesvcref = 0 ;
		} else {
			incspacesvcref( spacetab ) ;
		}
	} else incspacesvcref( spacetab ) ;
	if ( spaceref > ( spacetabstocheck.length - 1 ) ) {
		spaceref = 0 ;
		spacesvcref = 0 ;
	}
	else setTimeout( "checkupdatesinonetab()", 1000 ) ;
}

function spacetabalert() {
	if ( ! currspacetabindex ) return ;
	var d = getelement( document.mainform.q_space.value ) ;
	if ( ( d ) && ( d.style ) && ( d.style.visibility == "visible" ) ) doblink( d , 13 ) ;
}


// proposition : tant qu'on bouge la souris on se met à jour toutes les 10 secondes

var mousemoveinstalltimer ; // le mécanisme de mousemoveinstalltimer est uniquement destiné à assurer le fonctionnement de stopupdates, que presque personne n'exploite en fait

function handleupdate ( x ) {
	if ( ! x ) return ;
	if ( qsn_currstate != "view" ) return ;
	var y = document.mainform.upindex.value ;
	x = eval( "(" + x + ")" ) ;
	x = x.high || "" ;
	if ( x != ""  && ( x.length > y.length || x > y ) ) {
		setTimeout ( "qsn_refreshnotes()", 1000 ) ;
		doblink( document.mainform.q_space.value, 12 ) ; // blink alerte dans l'espace courrant
		relaunchupdates() ;
	}
}

function pollupdates() {
	if ( qsn_currstate != "view" ) return ;
	if ( ! q_readytosubmit( false ) ) return ;
	q_ajaxget ( q_spacebaseurl() + "services/" + escape( currsvcid ) + "/upindex" + "?" + (new Date()).getTime() ) ;
}

function handlemousemove( ) {
	stopupdates() ;
	pollupdates() ;
	relaunchupdates() ;
}
function installmousemovehandler( ) {
	mousemoveinstalltimer = null ;
	document.body.onmousemove = handlemousemove ;
}
function relaunchupdates() {
	if ( mousemoveinstalltimer ) return ;
	mousemoveinstalltimer = setTimeout ( installmousemovehandler , 10000 ) ;
}
function stopupdates() {
	if ( mousemoveinstalltimer ) clearTimeout( mousemoveinstalltimer ) ;
	document.body.onmousemove = mousemoveinstalltimer = null ;
}
function checkactivity() { // for compatibility
	try { if ( document.mainform.q_space.value == "self" ) return ; } catch( err ) { return ; }
	stopupdates() ;
	relaunchupdates() ;
}

function disableupdates() {
	stopupdates() ;
}

/*

var pollupdateenabled = true ;
var pollupdatedelay0 = 5000 ;
var maxpollupdatedelay = 600000 ;
var maxidledelay = 60000 ;
var pollupdatedelay = pollupdatedelay0 ;
var brokenpollupdatedelay = 30000 ;
var pollupdatesid = null ;
var q_lastmovetime = null ;

function handleupdate ( x ) {
	if ( x == "" ) return ;
	if ( qsn_currstate != "view" ) return ;
	var y = document.mainform.upindex.value ;
	x = eval( "(" + x + ")" ) ;
	x = ( x[ "high" ] ) ? x[ "high" ] : "" ;
	if ( ( x != '' ) && ( ( x.length > y.length ) || ( x > y ) ) ) {
		setTimeout ( "qsn_refreshnotes()", 1000 ) ;
		doblink( document.mainform.q_space.value, 12 ) ; // blink alerte dans l'espace courrant
		relaunchupdates() ;
	}
}

function stopupdates() {
	if ( pollupdatesid ) clearInterval( pollupdatesid ) ;
	pollupdatesid = null ;
}

function pollupdates() {
	if ( qsn_currstate != "view" ) return ;
	if ( ! q_readytosubmit( false ) ) return ;
	q_ajaxget ( q_spacebaseurl() + "services/" + escape( currsvcid ) + "/upindex" + "?" + (new Date()).getTime() ) ;
//	q_ajaxget ( q_spaceabsoluteurl( null , "services/" + escape( currsvcid ) + "/upindex" ) + "?" + (new Date()).getTime() ) ;
	//q_ajaxget ( q_getrelativebaseurl() + "/updates/" + document.mainform.q_space.value + "?" + (new Date()).getTime() ) ;
	if ( ( new Date() - q_lastmovetime ) < maxidledelay ) return true ;
	pollupdatedelay *= 2 ;
	if ( pollupdatedelay > maxpollupdatedelay ) pollupdatedelay = maxpollupdatedelay ;
	stopupdates() ;
	pollupdatesid = setInterval ( "pollupdates()" , pollupdatedelay ) ;
}

function disableupdates() {
	stopupdates()
	pollupdateenabled = false ;
}

function relaunchupdates() {
	stopupdates() ;
	q_lastmovetime = new Date() ;
	pollupdatedelay = pollupdatedelay0 ;
	if ( ! pollupdateenabled ) return ;
	if ( qsn_currstate != "view" ) return ;
	pollupdatesid = setInterval ( "pollupdates()" , pollupdatedelay )
}

function checkactivity(){
	if ( pollupdatedelay != pollupdatedelay0 ) {
		relaunchupdates() ; 
		return ;
	}
	q_lastmovetime = new Date() ;
}

*/

var qdyn_queue = [ ] ;
var qdyn_loading = " " ;
// [ { h: "getSum" , args: [ 2, 20 ] , waiting: " truc_js machin_html " ] } , { h: etc } ] ;

function qdyn_load ( h , args , url ) {
	if ( typeof ( url ) == "string" ) url = [ url ] ;
	if ( url.length < 2 ) xqdyn_load ( h , args , url ) ;
	else {
		var oneurl = url.splice( 0 , 1 ) ;
		xqdyn_load ( "qdyn_load" , [ h , args , url ] , oneurl ) ;
	}
}

function xqdyn_load ( h , args , url ) {
	var waiting = " " ;
	var toload = [ ] ;
	var ready = true ;
	var s ;
	if ( typeof ( url ) == "string" ) url = [ url ] ;
	for ( var k = 0 ; k < url.length ; k++ ) {
		s = urltoteststring ( url [ k ] ) ;
		if ( eval( "window." + s ) ) continue ;
		ready = false ;
		if ( waiting.indexOf ( " " + s + " " ) == -1 ) waiting += s + " " ;
		if ( qdyn_loading.indexOf ( " " + s + " " ) == -1 ) {
			toload.push ( url [ k ] ) ;
			qdyn_loading += s + " " ;
		}
	}
	if ( ready ) {
		if ( h != "" ) eval ( h ).apply ( this , args ) ;
	} else {
		qdyn_queue.push ( { h: h, args: args, waiting: waiting } ) ;
		loadfiles( toload ) ;
	}
}

/*		try {
			if ( ! eval( s ) ) throw ( "missing") ;
		} catch ( err ) {
			etc
		}
*/

function qdyn_urlloaded( url ) {
	var s = urltoteststring ( url ) ;
	return ( eval( "window." + s ) ) ;
}

function qdyn_loaded ( s ) {
	if ( ! window.qdyn_loading ) return ; // comportement bizarre au chargement le handler est là, mais pas la variable
	qdyn_loading = qdyn_loading.replace ( " " + s + " " , " " ) ;
	var r ;
	eval ( s + " = true ;" ) ;
	for ( var i = 0 ; i < qdyn_queue.length ; i++ ) {	
		r = qdyn_queue [ i ] ;
		if ( r.waiting.indexOf ( " " + s + " " ) == -1 ) continue ;
		r.waiting = r.waiting.replace ( " " + s + " " , " " ) ;
		if ( r.waiting.length > 1 ) continue ;
		if ( r.h != "" ) eval ( r.h ).apply ( this , r.args ) ;
		qdyn_queue.splice ( i-- , 1 ) ;
	}
}

function urltoteststring( url ) {
	if ( /\.js$/.test ( url ) ) return url.replace ( /(.*\/)?([^\/]+)\.js$/ , "$2_js_loaded" ) ;
	if ( /\.css$/.test ( url ) ) return url.replace ( /(.*\/)?([^\/]+)\.css$/ , "$2_css_loaded" ) ;
	if ( /\.html$/.test ( url ) ) return url.replace ( /(.*\/)?([^\/]+)\.html$/ , "$2_html_loaded" ) ;
}

function loadfiles( url ) {
	for ( var k = 0 ; k < url.length ; k++ ) loadfile( url [ k ] ) ;
}

function loadfile ( url ) {
	if ( /\.js$/.test ( url ) ) return loadscript ( url ) ;
	if ( /\.css$/.test ( url ) ) return loadcss ( url ) ;
	if ( /\.html$/.test ( url ) ) return loadhtml ( url ) ;
}

function loadscript( url ) {
	var s = document.createElement( "script" ) ;
	s.setAttribute ( "type" , "text/javascript" ) ;
	s.setAttribute ( "charset" , "UTF-8" ) ;
	s.setAttribute ( "src" , url.replace(/\.js$/ , "") + ( ( window.q_jscssversion ) ? ( "?v=" + window.q_jscssversion ) : "" ) ) ;
	document.getElementsByTagName("head")[ 0 ].appendChild ( s ) ;
}

function loadcss( url ) {
	var s = document.createElement( "link" ) ;
	s.setAttribute ( "type" , "text/css" ) ;
	s.setAttribute ( "rel" , "stylesheet" ) ;
	s.setAttribute ( "href" , url.replace(/\.css$/ , "") + ( ( window.q_jscssversion ) ? ( "?v=" + window.q_jscssversion ) : "" ) ) ;
	document.getElementsByTagName("head")[ 0 ].appendChild ( s ) ;
	qdyn_loaded( urltoteststring( url ) ) ;
}

function loadhtml( url ) {
	var iframeid = url.replace ( /(.*\/)?([^\/]+)\.html$/ , "$2_html_loaded" ) + "ifid" ;
	var iframe = document.createElement( "iframe" ) ;
	iframe.id = iframeid ;
	iframe.name = iframeid ;
	iframe.className = "jstarget" ;
	iframe.scrolling = "no" ;
	iframe.style.borderWidth = "0px" ;
	iframe.style.width = "0px" ;
	iframe.style.height = "0px" ;
	iframe.src = url.replace(/\.html$/ , "") + ( ( window.q_jscssversion ) ? ( "?v=" + window.q_jscssversion ) : "" ) ;
	document.body.appendChild( iframe ) ;
}

function framedocument( theframe ) {
	theframe = ge( theframe );
	if ( theframe.contentDocument ) return theframe.contentDocument ;
	return theframe.contentWindow.document ;
}

function qdyn_snloaddone( h , args , snkinds , loopcounter ) {
	if ( typeof snkinds == "string" ) snkinds = [ snkinds ] ;
	var shortsnkind , iframeid , snkind ;
	var inheritedsn = [] ;
	for ( var i = 0 ; i < snkinds.length ; i++ ) {
		snkind = snkinds[ i ] ;
		shortsnkind = snkind.replace( /_intl/ , "" ) ;
		iframeid = shortsnkind + "_" + q_lang + "_html_loaded" + "ifid" ;
		//var x = document.getElementById ( iframeid ) ;
		//x.parentNode.removeChild( x ) ;
		inheritedsn = inheritedsn.concat( qsn_dynload( snkind , iframeid ) ) ;
	}
	if ( inheritedsn.length == 0 ) {
		if ( h != "" ) eval ( h ).apply ( this , args ) ;	
		return ;
	}
	qdyn_snload( h , args , inheritedsn , loopcounter ) ;
}

function qdyn_snurlstoload( snkind ) {
	if ( typeof snkind == "object" ) {
		var urls = [] ;
		for ( var i = 0 ; i < snkind.length ; i++ ) urls = urls.concat( qdyn_snurlstoload( snkind[ i ] ) ) ;
		return urls ;
	}
//	if ( qsn_dynloaddone( snkind ) ) return [] ; // vh 090901 : qsn_dynloaddone se fait recouvrir de manière erronée par welcome. Par ailleurs, n'apporte pas grand chose et empêche parfois de charger un fichier qui aurait été mal chargé dans le header
	var shortsnkind = snkind.replace( /_intl/ , "" ) ;
	var dir = "/services/" + snkind + "/" ;
	var ulang = "_" + q_lang ;
	return [ dir + "style/" + snkind + ".css" , dir + shortsnkind + ulang + ".html" , dir + "scripts/" + shortsnkind + "_msgs" + ulang + ".js" , dir + "scripts/" + snkind + ".js" ] ;
}

function qdyn_snload( h , args , snkind , loopcounter ) {
	if ( loopcounter == undefined ) var loopcounter = 1 ;
	else loopcounter++ ;
	if ( loopcounter > 10 ) {
		alert ( "Infinite recursion suspected." ) ;
		return ;
	}
	var urls = qdyn_snurlstoload( snkind ) ;
	if ( urls.length == 0 ) {
		if ( h != "" ) eval ( h ).apply ( this , args ) ;	
		return ;
	}
	qdyn_load ( "qdyn_snloaddone" , [ h , args , snkind , loopcounter ] , urls ) ;
}

function qdyn_qorgiframeid( qorgref ) {
	if ( typeof qorgref != "string" ) qorgref = qorgref.id ;
	return qorgref + "_" + q_lang + "_html_loaded" + "ifid" ;
}

function qdyn_qorgfilesloaded( qorgref ) {
	if ( ( typeof qorgref == "object" ) && ( qorgref.splice ) ) {
		for ( var i = 0 ; i < qorgref.length ; i++ ) qdyn_qorgfilesloaded( qorgref[ i ] ) ;
	}
	if ( typeof qorgref != "string" ) qorgref = qorgref.id ;
	eval ( qorgref + "_filesloaded = true ;" ) ;
}

function qdyn_qorgloaddone( h , args , theref , params ) {
	qdyn_qorgfilesloaded( theref ) ;
	var hh , dynloadparams ;
	if ( ( typeof theref == "object" ) && ( theref.splice ) ) dynloadparams = [ theref ] ;
	else dynloadparams = [ qdyn_qorgiframeid( theref ) , qdyn_qorgforceload( theref ) ] ;
	var qorgcontainer = [] ;
	if ( ( params ) && ( params.dynloadhandler ) ) hh = eval ( params.dynloadhandler ) ;
	else try { hh = eval ( ( ( typeof theref == "string" ) ? theref : theref.id ) + "_dynload" ) ; } catch(err) {}
	if ( ( params ) && ( params.dynloadparams ) ) dynloadparams = dynloadparams.concat( params.dynloadparams ) ;
	if ( hh ) qorgcontainer = hh.apply ( this , dynloadparams ) ;
	if ( ( qorgcontainer ) && ( qorgcontainer.length != 0 ) ) return qdyn_qorgload.apply ( this , [ qdyn_qorgloaddone , [ h , args , theref , params ] ].concat( qorgcontainer ) ) ;
	if ( h != "" ) eval ( h ).apply ( this , args ) ;	
	//var x = document.getElementById ( iframeid ) ;
	//x.parentNode.removeChild( x ) ;
}

function indexOfItem( theitem , thelist ) { // aussi dans q_common
	var thesep, s, i ;
	thesep = "\n" ;
	s = thesep + thelist.join( thesep ) + thesep ;
	i = s.indexOf( thesep + theitem + thesep ) ;
	if ( i == -1 ) return i ;
	return ( s.substring( 0 , i ).split( thesep ).length ) - 1 ;
}

function qdyn_qorgloaded( qorgref ) {
	return eval( "window." + qorgref + "_filesloaded" ) ;
}

function qdyn_qorgurlstoload( theref , wantmsgs ) {
	if ( wantmsgs == undefined ) wantmsgs = true ;
	if ( ( typeof theref == "object" ) && ( theref.splice ) ) {
		var urls = [] ;
		for ( var i = 0 ; i < theref.length ; i++ ) urls = urls.concat( qdyn_qorgurlstoload( theref[ i ] , wantmsgs ) ) ;
		return urls ;
	}
	var qorgref ;
	if ( typeof theref == "string" ) qorgref = theref ;
	else {
		qorgref = theref.id ;
	}
	if ( qdyn_qorgloaded( qorgref ) ) return [] ; // risque de ne pas charger les addedfiles si on a déjà été chargé
	var dir , forceload , addedfiles ;
	dir = "/services/qorg/" ;
	forceload = false ;
	addedfiles = [] ;
	if ( typeof theref != "string" ) {
		if ( theref.dir ) dir = theref.dir ;
		if ( theref.forceload ) forceload = true ;
		if ( theref.addedfiles ) addedfiles = theref.addedfiles ;
	}
	var ulang = "_" + q_lang ;
	var urls = addedfiles.concat( [ dir + qorgref + ulang + ".html" , dir + "scripts/" + qorgref + ".js" ] ) ;
	if ( wantmsgs ) urls.push( dir + "scripts/" + qorgref + "_msgs" + ulang + ".js" ) ;
	if ( indexOfItem( qorgref , [ "rights" , "managespace" , "manageselfspace" , "familyrights" ] ) != -1 ) {
		urls.push( "/services/paypal_intl/scripts/paypal_msgs" + ulang + ".js" ) ;
		urls.push( "/services/paypal_intl/scripts/paypal.js" ) ;
	}
	if ( indexOfItem( qorgref , [ "notepad" ] ) != -1 ) urls.push( dir + "style/" + qorgref + ".css" ) ;
	if ( indexOfItem( qorgref , [ "qu" ] ) != -1 ) {
		urls.push( "/services/swfs/scripts/swfupload.js" );
		urls.push( "/services/swfs/scripts/swfupload_queue.js" );
		urls.push( "/services/swfs/scripts/swfupload_swfobject.js" );
		urls.push( "/services/swfs/scripts/swfupload_functions.js" );
		urls.push( "/services/swfs/style/swfupload.css" );
	}
	return urls ;
}

function qdyn_qorgforceload( theref ) {
	if ( ( typeof theref == "object" ) && ( theref.splice ) ) {
		for ( var i = 0 ; i < theref.length ; i++ ) if ( qdyn_qorgforceload( theref[ i ] ) ) return true ;
		return false ;
	}
	if ( ( typeof theref != "string" ) && ( theref.forceload ) ) return true ;
	return false ;
}

function qdyn_qorgloadwom( h , args , theref , params ) { qdyn_xqorgload( h , args , theref , params , false ) ; }
function qdyn_qorgload( h , args , theref , params ) { qdyn_xqorgload( h , args , theref , params , true ) ; }
function qdyn_xqorgload( h , args , theref , params , wantmsgs ) {
	if ( typeof h == "object" ) return qdyn_qorglistload( h , wantmsgs ) ;
	var urls = qdyn_qorgurlstoload( theref , wantmsgs ) ;
	if ( urls.length == 0 ) {
		if ( qdyn_qorgforceload( theref ) ) qdyn_qorgloaddone( h , args , theref , params ) ;
		else if ( h != "" ) eval ( h ).apply ( this , args ) ;	
		return true ;
	}
	qdyn_load ( "qdyn_qorgloaddone" , [ h , args , theref , params ] , urls ) ;
	return false ;
}

function qdyn_qorglistloaddone( qorgloads , wantmsgs , h , args , theref , params ) {
	qdyn_qorgloaddone( h , args , theref , params ) ;
	qdyn_qorglistload( qorgloads , wantmsgs ) ; 
}

function qdyn_qorglistload( qorgloads , wantmsgs ) {
	if ( wantmsgs == undefined ) wantmsgs = true ;
	if ( qorgloads.length == 0 ) return ;
	var p = qorgloads[ 0 ] ;
	qorgloads.splice( 0 , 1 ) ;
	var theref = p[ 2 ] ;
	var urls = qdyn_qorgurlstoload( theref , wantmsgs ) ;
	if ( urls.length == 0 ) {
		if ( qdyn_qorgforceload( theref ) ) return qdyn_qorglistloaddone.apply( this , [ qorgloads , wantmsgs ].concat( p ) ) ;
		else if ( h != "" ) eval ( p[ 0 ] ).apply ( this , p[ 1 ] ) ;
		return qdyn_qorglistload( qorgloads , wantmsgs ) ;
	}
	qdyn_load ( "qdyn_qorglistloaddone" , [ qorgloads , wantmsgs ].concat( p ) , urls ) ;
	return false ;
}

function qdyn_finishload( iframeid , target ) {
	var elem , div ;
	var mode = "append" ;
	if ( eval( "window." + iframeid + "_finishloaddone" ) ) return ;
	if ( ( typeof target == "string" ) || ( target.tagName ) ) elem = ge( target ) ;
	else {
		elem = ge( target.target ) ;
		if ( target.mode ) mode = target.mode ;
	}
	if ( mode == "append" ) div = elem.appendChild( document.createElement( "DIV" ) ) ;
	else if ( mode == "insert" ) div = elem.parentNode.insertBefore( document.createElement( "DIV" ) , elem ) ;
	else if ( mode == "replace" ) div = elem ;
	if ( target.id ) div.id = target.id ;
	div.innerHTML = framedocument( iframeid ).getElementById( "qorg_block" ).innerHTML ;
	eval ( iframeid + "_finishloaddone = true ;" ) ;
}

function qdyn_q_partial_done( x ) {
	if ( x.clienturls ) {
		var urls = [ ] ;
		for ( var i in x.clienturls ) urls.push( x.clienturls[ i ] ) ;
		qdyn_load( "qdyn_q_done" , [ x ] , urls ) ;
	} else qdyn_q_done( x ) ;
}

function qdyn_q_done( x ) {
	if ( x.id ) eval ( x.id + " = true ;" ) ;	
	var iframeid = [] ;
	var t = x.urls.join( " " ).match( new RegExp( "/?([^/.]+\.html)" , "g" ) ) ;
	for ( var i = 0 ; i < t.length ; i++ ) iframeid.push( urltoteststring( t[ i ] ) + "ifid" ) ;
	if ( iframeid.length == 1 ) iframeid = iframeid[ 0 ] ;
	if ( x.target ) qdyn_finishload( iframeid , x.target ) ;
	else if ( x.dynh ) {
		var hh = eval ( x.dynh ) ;
		var dynargs = [ iframeid ] ;
		if ( x.dynargs ) dynargs = dynargs.concat( x.dynargs ) ;
		hh.apply ( this , dynargs ) ;
	}
	if ( x.target && ( x.target == "q_drawers" || x.target == ge( "q_drawers" ) ) ) showblock( "q_drawers" ) ;
	if ( ( x.h ) && ( x.h != "" ) ) eval ( x.h ).apply ( this , ( x.args ) ? x.args : [] ) ;
}

function q_( x ) { // { [ target : objHTML ou id ] , [ dynh : string handler de chargement dynamique ] , [ dynargs : [ params ] ] , [ id : string identifiant du chargement à effectuer ] , urls : [ paths ] , [ h : string handler à exécuter ] , [ args : [ params ] ] }
	if ( ( x.id ) && ( eval( "window." + x.id ) ) ) {
		if ( x.target && ( x.target == "q_drawers" || x.target == ge( "q_drawers" ) ) ) showblock( "q_drawers" ) ;
		if ( ( x.h ) && ( x.h != "" ) ) eval ( x.h ).apply ( this , ( x.args ) ? x.args : [] ) ;	
		return true ;
	}
	var urls = [ ] ;
	for ( var i in x.urls ) urls.push( x.urls[ i ] ) ;
	qdyn_load( "qdyn_q_partial_done" , [ x ] , urls ) ;
}

function q_include( x , h , args ) {
// x = liste d'éléments [ { target: "", urls : [ paths ] } , { } , ... ] 
// h, args : fonction et arguments exécutée une fois tous les éléments chargés
	var xx ;
	if ( ! x.splice ) xx = [ x ] ;
	else xx = x ;
	if ( xx.length == 0 ) {
		if ( ( h ) && ( h != "" ) ) eval ( h ).apply ( this , ( args ) ? args : [] ) ;
		return ;
	}
	var p = xx[ 0 ] ;
	xx.splice( 0 , 1 ) ;
	p.h = "q_include" ;
	p.args = [ xx , h , args ] ;
	q_( p ) ;
}


var qdyn_message = { 
"trylater": "Network access error. Please retry later."
} ;

var qsn_currstate = "view" ;
var qsn_edittarget = null ;

// DEFAULT HANDLERS, MAY BE OVERRIDDEN WITH fred_en_routinename

function qsn_handler( notekind , handler , wantdefault ) {
	if ( ( wantdefault ) && ( wantdefault == true ) ) return false ;
	var h ;
	try { h = eval ( handler.replace( /\bqsn/ , notekind ) ) ; } catch(err) {}
	if ( h ) return h ;
	var jsonnewnote = eval ( notekind + "_json_template" ) ;
	if ( ( jsonnewnote.common ) && ( jsonnewnote.common.inherited ) ) {
		var inherited = jsonnewnote.common.inherited ;
		for ( var i = 0 ; i < inherited.length ; i++ ) {
			h = qsn_handler( inherited[ i ].notekind , handler , wantdefault ) ;
			if ( h ) return h ;
		}
	}
	return false ;
}

function qsn_handlenewunique( notekind ) {
	var ids = qsn_noteidssortedlist() ;
	var childids = [] ;
	var parentid = null ;
	var id , r ;
	for ( var i = 0 ; i < ids.length ; i++ ) {
		id = ids[ i ] ;
		r = qsn_thenotes[ id ] ;
		if ( ! r ) continue ;
		if ( r.common.notekind != notekind ) continue ;
		if ( r.parentid ) childids.push( id ) ;
		else parentid = id ;
	}
	if ( parentid ) {
		r = qsn_thenotes[ parentid ] ;
		if ( ( r.members[ memberid ] ) && ( r.members[ memberid ].common ) && ( r.members[memberid].common.invisible ) ) {
			r.members[memberid].common.invisible = false ;
			qsn_notechanged( parentid , "notechanged" ) ;
			qsn_addnote( parentid ) ;
			for ( var i = 0 ; i < childids.length ; i++) qsn_addnote( childids[ i ] ) ;
		} else qsn_puttofront( parentid ) ;
		return true ;
	}
	return false ;
}

function qsn_newnote( notekind , wantdefault ) {
	if ( qsn_currstate != "view" ) {
		alert ( qsn_message [ "notviewmode" ] ) ;
		return false ;
	}
	try { if ( ! qsn_initdone () ) return ; } catch ( err ) { }
	var h = qsn_handler( notekind , "qsn_newnote" , wantdefault ) ;
	if ( h ) return h( ) ;

// DEFAULT BEHAVIOR
	// We check if it's a unique note
	var jsonnewnote = qsn_fulljson_template( notekind ) ;
	if ( ( jsonnewnote.common ) && ( jsonnewnote.common.unique ) ) if ( qsn_handlenewunique( notekind ) ) return ;
	var id = qsn_makenewfulljson( notekind , jsonnewnote ) ;
	qsn_currstate = "edit" ;
	qsn_addnote( id ) ;
	qsn_entereditmode( id ) ;
}

function qsn_clonejsontemplate( notekind , wantdefault , version ) {
	var h = qsn_handler( notekind , "qsn_clonejsontemplate" , wantdefault ) ;
	if ( h ) return h( version ) ;

// DEFAULT BEHAVIOR
	if ( version != undefined && version != null ) {
		var x = eval ( "window." + notekind + "_oldjson_template" ) ;
		if ( x && x[ "" + version ] ) return q_cloneObject( x[ "" + version ] ) ;
	}
	return q_cloneObject( eval ( notekind + "_json_template" ) ) ;
}

function qsn_safeaddnote( id , wantdefault ) {
	try {
		return qsn_addnote( id , wantdefault ) ;
	} catch( err ) {
		var s = "" ;
		try { s += "json: " + q_tostring( qsn_thenotes[ id ] ) + "\n\n" ; } catch(err2) { } ;
		try { s += "addnote in " + qsn_currstate + " mode for " + id + " : " + ( err.message || "(no message)" ) + "\n" ; } catch(err2) { } ;
		try { s += ( err.description || "(no description)" ) + "\n" ; } catch(err2) { } ;
		try { s += "File: " + ( err.fileName || "(no fileName)" ) + "\n" ; } catch(err2) { } ;
		try { s += "Line: " + ( err.lineNumber || "(no lineNumber)" ) + "\n" ; } catch(err2) { } ;
		debugmail( s ) ;
		return true ;
	}
}

function qsn_addnote( id , wantdefault ) {
	var r = qsn_thenotes[ id ] ;
	if ( ! r ) {
		id = q_idalias[ id ] ;
		if ( ! id ) return false ;
		r = qsn_thenotes[ id ] ;
		if ( ! r ) return false ;
	}
	var notekind = r.common.notekind ;
	var appendtarget = r.common.appendtarget ;
	r.common.appendtarget = null ;
	qsn_doupgradejson( id ) ;
	if ( appendtarget ) qsn_thenotes[ id ].common.appendtarget = appendtarget ;
	var h = qsn_handler( notekind , "qsn_addnote" , wantdefault ) ;
	if ( h ) return h( id ) ;

// DEFAULT BEHAVIOR
	var template = qsn_template( id ) ;
	var div = qsn_clonetemplate( id , template ) ;
	qsn_renderhtml( id ) ;
	return div ;
}

function qsn_template( id , wantdefault ) {
	var notekind = qsn_thenotes[ id ].common.notekind ;
	var h = qsn_handler( notekind , "qsn_template" , wantdefault ) ;
	if ( h ) return h( id ) ;

// DEFAULT BEHAVIOR
	if ( qsn_currstate == "edit" ) return notekind + "_notetemplate_edit" ;
	if ( qsn_currstate == "purchase" ) {
		if ( getelement( notekind + "_notetemplate_purchase" ) ) return notekind + "_notetemplate_purchase" ;
		return "purchase_intl_notetemplate" ;
	}
	return notekind + "_notetemplate" ;
	return ( qsn_currstate == "edit" ) ? notekind + "_notetemplate_edit" : notekind + "_notetemplate" ;
}

function qsn_renderhtml( id ) {
// COMMON BEHAVIOR
	common_renderhtml( id ) ;
// CUSTOM HANDLER REQUIRED
	var notekind = qsn_thenotes[ id ].common.notekind ;
	qsn_handler( notekind , "qsn_renderhtml" )( id ) ;// ••• fred_en_renderhtml is required
}

var qsn_savedchildrenids = [ ] ;
function qsn_entereditmode( id , wantdefault ) {
	if ( qsn_thenotes[ id ].common.duplicateid ) {
		qsn_finishedit() ;
		return alert( qsn_message[ "duplicationinprogress" ] ) ;
	}
	var notekind = qsn_thenotes[ id ].common.notekind ;
	qsn_savedchildrenids = [] ;
	var children = getElementsByClassName( ge( id ) , "container" ) ;
	for ( var i = 0 ; i < children.length ; i++ ) if ( children[ i ].id && qsn_thenotes[ children[ i ].id ] ) qsn_savedchildrenids.push( children[ i ].id ) ;
	var h  = qsn_handler( notekind , "qsn_entereditmode" , wantdefault ) ;
	if ( h ) return h( id ) ;

// DEFAULT BEHAVIOR
	qsn_makeedittarget( id ) ;
	qsn_showsettings( id ) ;
	qsn_dimothers( id ) ;
	qsn_puttofront ( ( qsn_thenotes [ qsn_edittarget.id ].parentid ) ? qsn_thenotes [ qsn_edittarget.id ].parentid : id ) ;
	initsky() ;
}

function qsn_backupid( id ) {
	return id + "_bk" ;
}

function qsn_makeedittarget( id ) {
	var x = getelement( id ) ;
	if ( ! qsn_isnewnote ) {
		rm( x ) ;
		qsn_thenotes[ qsn_backupid( id ) ] = q_cloneObject( qsn_thenotes[ id ] ) ;
		qsn_addnote( id ) ;
		qsn_edittarget = getelement( id ) ;
	} else qsn_edittarget = x ;
	qsn_showlinks( qsn_edittarget , false ) ;
	qsn_setselected( qsn_edittarget , true ) ;
}

function qsn_showsettings( id ) {
	var notekind = qsn_thenotes[ id ].common.notekind ;
	var h = qsn_handler( notekind , "qsn_editblockid" ) ;
	var editblockid = ( h ) ? h( id ) : notekind + "_editblock" ;
// UNLESS THERE IS NO fred_en_editblock IN THE HTML...
	if ( ! getelement ( editblockid ) ) return ; 
	qsn_currentleftcol = editblockid ;
	hideshowblock ( "cycliccols" , qsn_currentleftcol ) ;

	var t = ge( "q_drawerleftcoltitle" ) ;
	if ( t ) {
		t.prevtitle = t.innerHTML ;
		var p = eval ( ( notekind.replace( /_intl$/, "" ) ) + "_message[ 'plug_qlub' ]" ) ;
		p = p || eval ( ( notekind.replace( /_intl$/, "" ) ) + "_message[ 'plug' ]" ) ;
		p = p.replace( /_.*/, "" ) ;
		q_innerHTML( t , common_message[ "smartnotename" ].replace( /%/, p ) ) ;
	}

// CUSTOM HANDLER REQUIRED
	qsn_handler( notekind , "qsn_displaysettings" )( id ) ;// ••• fred_en_displaysettings is required
}

function qsn_closenote( x , wantdefault ){
	if ( typeof x == "string" ) x = getelement( x ) ;
	var div = getContainer( x ) ;
	var id = div.id ;
	var r = qsn_thenotes[ id ] ;
	if ( ! r ) return false ;
	var notekind = r.common.notekind ;
	var h = qsn_handler( notekind , "qsn_closenote" , wantdefault ) ;
	if ( h ) return h( id ) ;

// DEFAULT BEHAVIOR
	if ( ! r.common.unique ) return qsn_suppressnote( id ) ;
	r.members[ memberid ] = q_cloneObject( { common : { invisible : true } } , r.members[ memberid ] ) ;
	rm( id ) ;
	qsn_notechanged( id , "notechanged" ) ;
}

function qsn_suppressnote( x , wantdefault ){ //recouvert et donc à reporter en cas de modif dans pages.js
	if ( typeof x == "string" ) x = getelement( x ) ;
	var div = getContainer( x ) ;
	var id = div.id ;
	var notekind = qsn_thenotes[ id ].common.notekind ;
	var h = qsn_handler( notekind , "qsn_suppressnote" , wantdefault ) ;
	if ( h ) return h( id ) ;

// DEFAULT BEHAVIOR
	if ( ! q_readytosubmit() ) return false ;
	if ( ! qsn_allowsuppress( id ) ) return false ;

	var noteslist = [ id ] ;
	var children = getElementsByClassName( div , "container" ) ;
	var cdiv , cid, ind ;
	for ( var i = 0 ; i < children.length ; i++ ) {
		cdiv = children[ i ] ;
		cid = cdiv.id ;
		noteslist[ noteslist.length ] = cid ;
		if ( qsn_thenotes[ cid ] ) delete qsn_thenotes[ cid ] ;
		ind = indexOfItem( cid , qsn_userrefreshid ) ;
		if ( ind != -1 ) qsn_userrefreshid.splice ( ind , 1 ) ;
		rm ( cdiv ) ;
	}
	var parentid = qsn_thenotes [ id ].parentid ;
	delete qsn_thenotes[ id ] ;
	ind = indexOfItem( id , qsn_userrefreshid ) ;
	if ( ind != -1 ) qsn_userrefreshid.splice ( ind , 1 ) ;
	rm ( div ) ;
	qsn_notesuppressed( noteslist ) ;
	if ( parentid ) qsn_childremoved ( parentid ) ;
	qsn_noteidslist = qsn_noteidssortedlist() ; // E 03/08/1009
	qsn_initfooter( true ) ;
	return true ;
}

function qsn_childremoved ( id ) { 
	if ( ! qsn_thenotes [ id ] ) return ;
	var h = qsn_handler( qsn_thenotes[ id ].common.notekind , "qsn_childremoved" ) ;
	if ( h ) return h( id ) ;
// DEFAULT BEHAVIOR does nothing
}

function qsn_allowsuppress( id , wantdefault ) {
	var notekind = qsn_thenotes[ id ].common.notekind ;
	var h = qsn_handler( notekind , "qsn_allowsuppress" , wantdefault ) ;
	if ( h ) return h( id ) ;

// DEFAULT BEHAVIOR
	return ( ( qsn_thenotes[ id ].common.ownerid == "quomodo" ) || ( confirm( qsn_message[ "suppressnote" ] ) ) ) ;
}

function qsn_finishedit() {
	if ( qsn_currentleftcol ) {
		hideshowblock ( qsn_currentleftcol , "cycliccols" ) ;
		qsn_currentleftcol = "" ;
	}
	qsn_currstate = "view" ;
	hideblock( "combos" ) ;

	qsn_undimall() ;

	qsn_edittarget = null ;
	qsn_isnewnote = false ;

	initsky();

	var t = ge( "q_drawerleftcoltitle" ) ;
	if ( t && t.prevtitle ) q_innerHTML( t , t.prevtitle ) ;
}

function qsn_editnote( x ) {
	if ( qsn_currstate == "edit" ) return ;
	var div = getContainer( x ) ;
	qsn_isnewnote = false ;
	qsn_currstate = "edit" ;
	qsn_entereditmode( div.id ) ;
}

function qsn_canceledit( wantdefault ) {
	if ( ! qsn_edittarget ) return ;
	var id = qsn_edittarget.id ;
	if ( ! qsn_thenotes[ id ] ) return ;
	var notekind = qsn_thenotes[ id ].common.notekind ;
	var h = qsn_handler( notekind , "qsn_canceledit" , wantdefault ) ;
	if ( h ) return h( id ) ;

// DEFAULT BEHAVIOR
	var div = getelement( id ) ; // actually, qsn_edittarget
	rm ( div ) ; 
	if ( qsn_isnewnote ) delete qsn_thenotes[ id ] ;
	else {
		qsn_thenotes[ id ] = q_cloneObject( qsn_thenotes[ qsn_backupid( id ) ] ) ;
		delete qsn_thenotes[ qsn_backupid( id ) ] ;
		qsn_currstate = "view" ;
		qsn_addnote( id ) ;
	}
	if ( ! qsn_isnewnote && qsn_thenotes[ id ].common.notekind != "dn" ) for  ( var i  in qsn_savedchildrenids ) qsn_addnote( qsn_savedchildrenids[ i ] ) ;
	qsn_savedchildrenids = [] ;
	qsn_finishedit() ;
}
	
function qsn_saveedit_invitepromptdone( id , savecallback ) {
	qsn_thenotes[ id ].common.signature = members.invite.username ;
	qsn_saveedit_invitenamedone( id , savecallback ) ;
}

function qsn_saveedit_invitenamedone( id , savecallback ) {// recouvert dans pages.js
	if ( ! q_readytosubmit() ) return false ;
	qsn_currstate = "view" ;
	if ( ! qsn_isnewnote ) delete qsn_thenotes[ qsn_backupid( id ) ] ;
	rm ( qsn_edittarget ) ;
	qsn_edittarget = null ; 
	qsn_addnote( id ) ;
	qsn_notechanged( id , ( qsn_isnewnote ) ? "newnote" : "notechanged" , savecallback ) ;
	if ( qsn_thenotes[ id ].common.notekind != "dn" ) for  ( var i  in qsn_savedchildrenids ) qsn_addnote( qsn_savedchildrenids[ i ] ) ;
	qsn_savedchildrenids = [] ;
	qsn_initfooter( true ) ;
	qsn_finishedit() ;
}
	
function qsn_saveedit( wantdefault , callback , savecallback ) {
	var id = qsn_edittarget.id ;
	var r = qsn_thenotes[ id ] ;
	var notekind = r.common.notekind ;
	var h = qsn_handler( notekind , "qsn_saveedit" , wantdefault ) ;
	if ( h ) return h( id ) ;

// DEFAULT BEHAVIOR
	r.common.date = q_date2isot( new Date() ) ;
	var notememberid = r.common.ownerid ;
	if ( notememberid == "invite" ) qsn_inviteusername( ( callback ) ? callback : "qsn_saveedit_invitepromptdone" , { "args" : [ id , savecallback ] , "cancel" : { "callback" : "qsn_canceledit" , "args" : [] } } ) ;
	else qsn_saveedit_invitenamedone( id , savecallback ) ;
}

function qsn_setColorTransparentBorders( elem , ee , wantdefault, over ) {
	//  border d'une note transparente onmouseover/out
	var id = elem.id ;
	var e = ee || window.event ; 
	var r = qsn_thenotes[ id ] ;
	var notekind = r.common.notekind ;
	var h = qsn_handler( notekind , "qsn_setColorTransparentBorders" , wantdefault ) ;
	if ( h ) return h( elem , e ) ;

// DEFAULT BEHAVIOR
	
	if ( elem.style.backgroundColor == "transparent" || r.textopacity == 4 ) {
		if ( over ) {
			elem.style.marginLeft = "-1px" ;
			elem.style.marginTop = "-1px" ;
			elem.style.marginRight = "-1px" ;
			elem.style.marginBottom = "-1px" ;
			elem.style.borderWidth = "1px" ;
			elem.transparentOffsetWidth = ( isIE ) ? 0 : 2 ;
			if (q_spacetype( ) == "qlub") elem.style.borderColor = rgbcomplement ( getpagebackgroundcolor() );
			else elem.style.borderColor = "#333" ;
			elem.style.borderStyle = "dotted" ;
			var tb = qsn_gettoolbar( elem ) ;
			if ( tb ) qsn_placetoolbar( elem , tb ) ;
		} else {
			elem.style.marginLeft = "0px" ;
			elem.style.marginTop = "0px" ;
			elem.style.marginRight = "0px" ;
			elem.style.marginBottom = "0px" ;
			elem.style.borderWidth = "0px" ;
			elem.transparentOffsetWidth = 0 ;
		}
	}
}

function qsn_mouseover( elem , ee , wantdefault ) {
	if ( isremoved( elem ) ) return ;
	var id = elem.id ;
	if ( ! id ) return ;
	var e = ee || window.event ;
// #1512 pour éviter de tout allumer bêtement
	if ( elem != getContainer( getElementFromEvent( ee ) ) ) return ;
//	id = qsn_thenotes[ id ].parentid || id ;
	var notekind = elem.notekind ;
	var h = qsn_handler( notekind , "qsn_mouseover" , wantdefault ) ;
	if ( h ) return h( elem , e ) ;

// DEFAULT BEHAVIOR
	if ( qsn_currstate == "view" ) {
		if ( ! qsn_thenotes[ id ] ) {
			var sdebug = "qsn_mouseover called with id " + id + " ; notekind : " + notekind + "\r" ;
			try {
				sdebug += "outerHTML :" + "\r" + elem.outerHTML + "\r" ;
			} catch( err ) {
				try {
					sdebug += "innerHTML :" + "\r" + elem.innerHTML + "\r" ;
				} catch( err ) { } 
			}
			var idlist = [] ;
			try { for ( var z in qsn_thenotes ) idlist.push( z ) ; sdebug += "qsn_thenotes: " + idlist.join( ", " ) + "\r" ; } catch( err ) { sdebug += "making idslist: " + err.message + "\r" ; }
			try { elem.onmouseover = null ; elem.onmouseout = null ; sdebug += "disabled mouse events for element\r" ; } catch( err ) { sdebug += "disabling mouse events: " + err.message + "\r" ; }
			return debugmail( sdebug ) ;
		}
		var cursor = ( q_clientX( e ) > ( qsn_trueleft( id ) + elem.offsetWidth + qdr_leftcolwidth - qdr_resizewidth ) ) ? "e-resize" : "default" ;
		if ( elem.style.cursor != cursor ) elem.style.cursor = cursor ;
		qsn_setColorTransparentBorders( elem , ee , wantdefault , 1 ) ;
	}
	qsn_showlinks( elem, true ) ;
}

function qsn_mouseout( elem , ee , wantdefault ) {
	if ( isremoved( elem ) ) return ;
	var id = elem.id ;
	if ( ! id ) return ;
//	id = ( qsn_thenotes[ id ].parentid ) ? qsn_thenotes[ id ].parentid : id ;
	var notekind = qsn_thenotes[ id ].common.notekind ;
	var h = qsn_handler( notekind , "qsn_mouseout" , wantdefault ) ;
	if ( h ) {
		var e = ee || window.event ; 
		return h( elem , e ) ;
	}

// DEFAULT BEHAVIOR
	qsn_showlinks( elem, false ) ;
	elem.style.cursor = "default" ;
	
//	if ( ! qsn_thenotes[ id ].parentid ) qsn_setColorTransparentBorders ( elem , ee , wantdefault , 0) ;
	qsn_setColorTransparentBorders ( elem , ee , wantdefault , 0 ) ;
}

function qsn_beginDrag( elem , ee , wantdefault ) {
	var e = ee || window.event ; 
	var id = elem.id ;
	var notekind = qsn_thenotes[ id ].common.notekind ;
	var h = qsn_handler( notekind , "qsn_beginDrag" , wantdefault ) ;
	if ( h ) return h( elem , e ) ;

// DEFAULT BEHAVIOR
	xqsn_beginDrag( elem , e ) ;
}

function qsn_beginDragOnly( elem , ee , wantdefault ) {
	var e = ee || window.event ; 
	var id = elem.id ;
	var notekind = qsn_thenotes[ id ].common.notekind ;
	var h = qsn_handler( notekind , "qsn_beginDragOnly" , wantdefault ) ;
	if ( h ) return h( elem , e ) ;

// DEFAULT BEHAVIOR
	xqsn_beginDragOnly( elem , e ) ;
}

function qsn_handleclick( x , callBack ) {
	var notekind ;
	var s = x.className ;
	var id = ( radiobutton( s ) ) ? x.id : s.split( " " )[ 0 ] ;
	var y = setchecked( x , ! getchecked( x ) ) ;
	if ( callBack ) return callBack ( { name: y.name , id: id , checked: getchecked( y ) } ) ;
	if ( qsn_edittarget ) notekind = qsn_thenotes[ qsn_edittarget.id ].common.notekind ;
	else notekind = qsn_thenotes[ getContainer( y ).id ].common.notekind ;

// CUSTOM HANDLER REQUIRED
	qsn_handler( notekind , "qsn_handleclick" )( { name: y.name , id: id , checked: getchecked( y ) } ) ;
}

/*
function qsn_handleclickbyclass( x , callBack ) {
	var notekind ;
	var s = x.className.split( " " ) ;
	var xname = s[ indexOfItem( "radio" , s ) + 1 ] ;
	var id = s[ 0 ] ;
	var y = setchecked( x , ! getchecked( x ) ) ;
	if ( callBack ) return callBack ( { name: xname , id: id , checked: getchecked(y) } ) ;
	if ( qsn_edittarget ) notekind = qsn_thenotes[ qsn_edittarget.id ].common.notekind ;
	else notekind = qsn_thenotes[ getContainer( x ).id ].common.notekind ;

// CUSTOM HANDLER REQUIRED
	var h = qsn_handler( notekind , "qsn_handleclick" ) ;
	h ( { name: xname , id: id , checked: getchecked( y ) } ) ;
}
*/

function qsn_dim ( div , dimtarget , slow , wantdefault ) {
	if ( typeof ( div ) == "string" ) div = getelement ( div ) ;
	var notekind = qsn_thenotes[ div.id ].common.notekind ;
	var h = qsn_handler( notekind , "qsn_dim" , wantdefault ) ;
	if ( h ) return h( div , dimtarget , slow ) ;

// DEFAULT BEHAVIOR
	q_dim( div , dimtarget , slow ) ;
}

function qsn_widthinfos( r , wantdefault ) {
	var notekind = r.common.notekind ;
	var h = qsn_handler( notekind , "qsn_widthinfos" , wantdefault ) ;
	if ( h ) return h( r ) ;

// DEFAULT BEHAVIOR
	return {} ;
}

function q_makeColorsTemplate ( ) {
	if (q_spacetype( ) == "qlub") {
	}
}

function qsn_richnotes( id , wantdefault ) {
	var r = qsn_thenotes[ id ] ;
	var notekind = r.common.notekind ;
	var h = qsn_handler( notekind , "qsn_richnotes" , wantdefault ) ;
	if ( h ) return h( id ) ;

// DEFAULT BEHAVIOR
	return (decor_fulllist || [ "mcn" , "silhouette" , "pimg" , "pmtxt" , "comment" , "charmessage" ]) ;
}

function qsn_focusdefault( x , msgkey ) {
	var div = getContainer( x ) || qsn_edittarget ;
	if ( x.value == qsn_getmessage( msgkey || "newnoteprompt" , div.notekind ) ) x.value="" ;
}


function qsn_blurdefault( x , msgkey , xvalue ) {
	var div = getContainer( x ) || qsn_edittarget ;
	if ( x.value == ( xvalue || "" ) ) x.value = qsn_getmessage( msgkey || "newnoteprompt" , div.notekind ) ;
}

/*
function -
function TOOLBAR
*/

function qsn_toolbaroptions( elem , wantdefault ) {
	var id = elem.id ;
	var r = qsn_thenotes[ id ] ;
	var h = qsn_handler( r.common.notekind , "qsn_toolbaroptions" , wantdefault ) ;
	if ( h ) return h( elem ) ;

// DEFAULT BEHAVIOR

	var options = [ ] ;
	var isquomodo = ( r.common.ownerid == "quomodo" ) ;
	if ( ! isquomodo ) options.push( "edit" ) ;
	options.push( "suppress" ) ;
	if ( ! isquomodo && window.currsvcid && /artemapage/.test( currsvcid ) ) options.push( "duplicate" ) ;
	if ( ! isquomodo && window.currsvcid && /artemapage/.test( currsvcid ) && ! r.pagesparent ) options.push( "rich" ) ;
	var helphandler = eval ( "window." + r.common.notekind + "_helpnote" ) ;
	if ( helphandler && ! isquomodo && window.currsvcid && /artemapage/.test( currsvcid ) ) options.push( "help" ) ;
	return options ;
}

function qsn_setnotecolor( x, c , wantdefault ) {
	var id = qsn_edittarget.id ;
	var notekind = qsn_thenotes[ id ].common.notekind ;
	var h = qsn_handler( notekind , "qsn_setnotecolor" , wantdefault ) ;
	if ( h ) return h( x, c ) ;

// DEFAULT BEHAVIOR
	var r = qsn_thenotes[ id ] ;
	//B#1611 : si la note est totalement transparente, on enlève la transparence
	if ( r.textopacity && r.textopacity == 4 ) {
		r.textopacity = 0 ;
		qsn_settextproperties( id ) ;
		var elem = gebcn( notekind+"_editblock" , "qsn_textopacity_elem" ) ;
		try{
			if ( elem ) eval( elem.getAttribute( "setsetting" ) )( elem , 0 ) ;
		} catch( err ) { debugmail( "setting missing in qsn_setnotecolor for id " + id ) ; }
	}
	r.color = x.target ;
//	r.color = c ? c : x.style.backgroundColor ;
	qsn_setcolors( id ) ;
}

function qsn_modifynotecolor( id , wantdefault ) {
	var id = qsn_edittarget.id ;
	var notekind = qsn_thenotes[ id ].common.notekind ;
	var h = qsn_handler( notekind , "qsn_modifynotecolor" , wantdefault ) ;
	if ( h ) return h( id ) ;

// DEFAULT BEHAVIOR
	var r = qsn_thenotes[ id ] ;
	//B#1611 : si la note est totalement transparente, on enlève la transparence
	if ( r.textopacity && r.textopacity == 4 ) {
		r.textopacity = 0 ;
		qsn_settextproperties( id ) ;
		var elem = gebcn( notekind+"_editblock" , "qsn_textopacity_elem" ) ;
		try{
			if ( elem ) eval( elem.getAttribute( "setsetting" ) )( elem , 0 ) ;
		} catch( err ) { debugmail( "setting missing in qsn_setnotecolor for id " + id ) ; }
	}
	qsn_setcolors( id ) ;
}

function qsn_settextcolor( x, c , wantdefault ) {
	var id = qsn_edittarget.id ;
	var notekind = qsn_thenotes[ id ].common.notekind ;
	var h = qsn_handler( notekind , "qsn_settextcolor" , wantdefault ) ;
	if ( h ) return h( x, c ) ;

// DEFAULT BEHAVIOR
	var r = qsn_thenotes[ id ] ;
	r.textcolor = c ? c : x.style.backgroundColor ;
	qsn_setcolors( id ) ;
}

/*
function -
function QWIZ
*/

function qsn_mergeqwizdata( notekind, notejson, noteqwizkeys, qwiz_data, noteid ) {
	var h = qsn_handler( notekind , "qsn_mergeqwizdata" , false ) ;
	if ( h ) return h( notejson, noteqwizkeys, qwiz_data, noteid ) ;
	
// DEFAULT BEHAVIOR
	for ( var x in noteqwizkeys ) notejson[ x ] = qwiz_data[ noteqwizkeys[ x ] ] ;
	return notejson ;
}


var maxnoteid = 0 ;
var qsn_currentleftcol = "" ;
var zindexmax = 0 ;
var nvalidate = 0 ;
var qsn_isnewnote = false ;
var qsn_userrefreshid = [] ;
var qsn_init_maxindex = 0 ;
var qsn_init_currindex = 0 ;
var qsn_notestyles = {} ;
var qsn_sniconborderColor = "#FFF" ;
var qsn_hasmoved = false ;
var qsn_globalversion = 1 ;

function qsn_initdone() {
	try { return ( qsn_init_currindex == qsn_init_maxindex ) ; } catch ( err ) { }
	return true ;
}

function qsn_init_iterate() {
	if ( qsn_init_currindex == qsn_init_maxindex ) {
		if ( getelement ( "q_mainscreenmask" ) ) {
			hideblock ( "q_mainscreenmask" ) ;
			getelement ( "q_mainscreenmask" ).style.opacity = "0.5" ; 
			getelement ( "q_mainscreenmask" ).style.filter = "alpha(opacity=50)" ;
		}
		qsn_initfooter() ;
		return ;
	}
	qsn_initnote( qsn_noteidslist [ qsn_init_currindex++ ] ) ;
//	setTimeout ( qsn_init_iterate , 10 ) ;
	qsn_init_iterate() ;
}

function qsn_init() {
	if ( ! qsn_thenotes ) return ;
	qsn_init_maxindex = qsn_noteidslist.length ;
	qsn_init_currindex = 0 ;
	if ( getelement ( "q_mainscreenmask" ) ) {
		showblock ( "q_mainscreenmask" ) ;
		getelement ( "q_mainscreenmask" ).style.opacity = "0.01" ; 
		getelement ( "q_mainscreenmask" ).style.filter = "alpha(opacity=1)" ;
	}
	qsn_init_iterate() ;
}

function qsn_noteidssortedlist() {
	var idslist = [] ;
	for ( var id in qsn_thenotes ) if ( qsn_thenotes[ id ] ) idslist.push( id ) ;
	return idslist.sort() ;
}

function qsn_reinit() {
	var idslist = qsn_noteidssortedlist() ;
	for( var i = 0 ; i < idslist.length ; i++ ) if ( getelement ( idslist[ i ] ) ) rm ( getelement ( idslist[ i ] ) ) ;
	for( var i = 0 ; i < idslist.length ; i++ ) qsn_initnote( idslist[ i ] ) ;
}

function qsn_fullrefresh( notes ) {
	var idslist = qsn_noteidssortedlist() ;
	for( var i = 0 ; i < idslist.length ; i++ ) if ( getelement ( idslist[ i ] ) ) rm ( getelement ( idslist[ i ] ) ) ;
	qsn_thenotes = q_cloneObject( notes ) ;
	idslist = qsn_noteidssortedlist() ;
	for( var i = 0 ; i < idslist.length ; i++ ) qsn_initnote( idslist[ i ] ) ;
}

function qsn_initnote( id ) {
	var r = qsn_thenotes[ id ] ;
	if ( ! r ) return ;
	try { if( r.members[ memberid ].common.invisible ) return; } catch ( e ) {}
	try { if( qsn_thenotes[ r.parentid ].members[ memberid ].common.invisible ) return; } catch ( e ) {}
	var notekind = r.common.notekind ;
	var noteadded ;
	noteadded = qsn_safeaddnote( id ) ; // production
//	noteadded = qsn_addnote( id ) ; // debug
	if ( ! noteadded ) {
		if ( r.parentid ) return ;
		try { if ( q_debugging ) return ; } catch ( e ) {}
		var uc = r.user.common ;
		var sc = r.spacedefaults.common ;
		uc.width = ( uc.width ) ? uc.width : sc.width ;
		uc.left = ( uc.left ) ? uc.left : sc.left ;
		uc.top = ( uc.top ) ? uc.top : sc.top ;
		if ( ! uc.zindex ) uc.zindex = "" + qsn_inczindexmax( id ) ;
		qsn_thenotes[ id ] = q_cloneObject ( missing_json_template ) ;
		qsn_thenotes[ id ].missingnotekind = notekind ;
		qsn_thenotes[ id ].user = { common : uc } ;
		qsn_thenotes[ id ].spacedefaults = { common : sc } ;
		qsn_addnote( id ) ;
	}
	var h = qsn_handler( notekind , "qsn_editblockid" ) ;
	var editblockid = ( h ) ? h( id ) : notekind + "_editblock" ;
	if ( getelement ( editblockid ) ) getelement( editblockid ).style.display = "none" ; 
	var zindex = qsn_getzindex( id ) ;
	qsn_updatezindexmax( id , zindex ) ;
}

function qsn_getzindex( id ) {
	var uc = qsn_thenotes[ id ] ;
	if ( ! uc ) return false ;
	uc = uc.user ;
	if ( ! uc ) return false ;
	uc = uc.common ;
	if ( ! uc ) return false ;
	uc = uc.zindex ;
	if ( ! uc ) return false ;
	return parseInt( uc , 10 ) ;
}

function qsn_buildnewPosition( r ) {
	var positions = r.common ;
	var leftposition = ( positions && positions.left ) || [ 50 , 150 ] ;
	r.spacedefaults.common.left = ( xrndab( leftposition ) +  q_windowscrollX() ) + "px" ;
	var topposition = ( positions && positions.top ) || [ 0 , 50 ] ;
	r.spacedefaults.common.top = ( xrndab( topposition ) +  q_windowscrollY() ) + "px" ;
	var widthposition = ( positions && positions.width ) || [ 300 , 400 ] ;
	r.spacedefaults.common.width = xrndpx( widthposition ) ;
	r.user.common.zindex = "" + qsn_inczindexmax( positions.noteid ) ;
}

function qsn_newnotetmpid( notekind ) {
	return notekind + "_" + memberid + "_" + maxnoteid++ + "_" + Math.floor ( Math.random() * 999 ) ;
}

function qsn_makenewjson( notekind ) {
	var tmpid = qsn_newnotetmpid( notekind ) ;
	var r = { common : {} , members : {} , spacedefaults : { common : {} } , user : { common : {} } } ;
	r.common.notekind = notekind ;
	r.common.ownerid = memberid ;
	r.common.noteid = tmpid ;
	r.common.date = q_date2isot( new Date() ) ;
	qsn_isnewnote = true ;
	qsn_thenotes[ tmpid ] = r ;
	return tmpid ;
}

function qsn_fulljson_template( notekind , version ) {
	var jsonnewnote = qsn_clonejsontemplate( notekind , false , version ) ;
	var jsontemplate = {} ;
	var commoninherited = [] ;
	var inheritednotekind , json ;
	if ( ( jsonnewnote.common ) && ( jsonnewnote.common.inherited ) ) {
		var inherited = jsonnewnote.common.inherited ;
		for ( var i = inherited.length - 1 ; i >= 0 ; i-- ) {
			inheritednotekind = inherited[ i ].notekind ;
			json = qsn_fulljson_template( inheritednotekind , false , inherited[ i ].version ) ;
			if ( ( json.common ) && ( json.common.inherited ) ) commoninherited = json.common.inherited.concat( commoninherited ) ;
			q_cloneObject( json , jsontemplate ) ;
       			commoninherited = [ { notekind : inheritednotekind , version : json.version } ].concat( commoninherited ) ;
		}
	}
	q_cloneObject( jsonnewnote , jsontemplate ) ;
	if ( commoninherited.length != 0 ) jsontemplate.common.inherited = commoninherited ;
	return jsontemplate ;
}

function qsn_makenewfulljson( notekind , jsonnewnote ) {
	var id = qsn_makenewjson( notekind ) ;
	var r = qsn_thenotes[ id ] ;
	q_cloneObject( ( jsonnewnote ) ? jsonnewnote : qsn_fulljson_template( notekind ) , r ) ;
	qsn_buildnewPosition( r ) ;
	if ( r.modmemberid !== undefined ) r.modmemberid = memberid;
	return id ;
}

function qsn_clonetemplate( id , id_template , target , appendkind ) {
	if ( ! target ) target = ge( "q_author_stuff" ) ;
	if ( ! appendkind ) appendkind = "append" ;
	var div = q_CloneFromID( id_template ) ;
	div.id = id ;
	var r = qsn_thenotes[ id ] ;
	if ( r ) div.notekind = r.common.notekind ;
	if ( r && r.common && r.common.appendtarget ) {
		div = r.common.appendtarget.appendChild( div ) ;
		r.common.appendtarget = null ;
		return div ;
	}
	if ( r && r.spacedefaults && r.common.ghost && r.common.ghost != "ghost" ) {
		if ( ge( r.common.ghost ) ) {
			div = ge( r.common.ghost ).parentNode.appendChild( div ) ;
			r.common.appendtarget = null ;
			return div ;
		} else {
			r.common.ghost = null ;
		}
	}
	if ( r && r.common && r.common.col != undefined ) {
		if ( ge( "ghost_" + id ) ) {
			div = ge( "ghost_" + id ).appendChild( div ) ;
			div.style.position = "relative" ;
			return div ;
		}
	}
	if ( r && r.parentid && r.pagesparent ) {
		var parentdiv = ge( r.parentid ) ;
		var parenttarget = qsn_getrichtarget( parentdiv ) ;
		if ( parenttarget ) parentdiv = parenttarget ;
		else if ( parentdiv.tagName.toLowerCase() == "table" ) {
			parentdiv = parentdiv.getElementsByTagName( "TD" )[ 0 ] ;
			var parentdivdiv = parentdiv.getElementsByTagName( "DIV" )[ 0 ] ;
			if ( parentdivdiv && parentdivdiv.parentNode == parentdiv && gcs( parentdivdiv , "position" ) =="relative" ) parentdiv = parentdivdiv ;
		}
		div = parentdiv.appendChild( div ) ;
		return div ;
	}
//B#1565
	if ( r && r.parentid && target.tagName == "TABLE" ) {
		if ( appendkind == "append" ) {
			var cell = target.insertRow( -1 ).insertCell( 0 ) ;
			div = cell.appendChild( div ) ;
		}
		else if ( appendkind == "insert" ) div = target.parentNode.insertBefore( div , target ) ;  // <---------- A CORRIGER
		return div ;
	}	
	if ( appendkind == "append" ) div = target.appendChild( div ) ;
	else if ( appendkind == "insert" ) div = target.parentNode.insertBefore( div , target ) ;
	return div ;
}

function qsn_getrichtarget( elem ) {
	var targets = getElementsByClassName( elem , "richtarget" ) ;
	for ( var i = 0 ; i < targets.length ; i++ ) if ( getContainer( targets[ i ] ) == elem ) return targets[ i ] ;
	return null ;
}

function qsn_parentnoteidslist() {
	var thelist = [] ;
	var r ;
	for ( var id in qsn_thenotes ) {
		if ( ! getelement( id ) ) continue ;
		r = qsn_thenotes [ id ] ;
		if ( r == null) continue ;
		if ( r.parentid ) continue ;
		thelist.push ( id ) ;
	}
	return thelist ;
}

function qsn_dimothers( id ) {
	var ids = qsn_parentnoteidslist() ;
	var slow = ( ids.length < 11 ) ;
	var r = qsn_thenotes [ id ] ;
	for ( var i=0 ; i<ids.length ; i++ ) {
		if ( ( id != ids [ i ] ) && ( ( ! r ) || ( ! r.parentid ) || ( r.parentid != ids [ i ] ) ) ) qsn_dim ( ids [ i ] , 0.33 , slow ) ;
	}
}

function qsn_undimall() {
	var ids = qsn_parentnoteidslist() ;
	var slow = ( ids.length < 11 ) ;
	for ( var i=0 ; i<ids.length ; i++ ) {
		qsn_dim ( ids [ i ] , 1 , slow ) ;
	}
}

function qsn_updateuserrefresh( id ) {
	var x = [] ;
	for ( var i = 0 ; i < qsn_userrefreshid.length ; i++ ) {
		if ( ! qsn_thenotes[ qsn_userrefreshid[ i ] ] ) continue ; 
		if ( ! qsn_thenotes[ qsn_userrefreshid[ i ] ].user ) continue ; 
		x.push ( { common : { noteid : qsn_userrefreshid[ i ] } , user : q_cloneObject( qsn_thenotes[ qsn_userrefreshid[ i ] ].user ) } ) ;
	}
	qsn_userrefreshid = [] ;
	return x ;
}

function qsn_adduserrefreshid( id ) {
	if ( indexOfItem ( id , qsn_userrefreshid ) != -1 ) return ;
	qsn_userrefreshid[ qsn_userrefreshid.length ] = id ;
}

function qsn_position( id , position , spacedefault ) {
	var sc = qsn_thenotes[ id ].spacedefaults.common ;
	if ( ! sc[ position ] ) return null ;
	if ( spacedefault ) return sc[ position ] ;
	var uc = qsn_thenotes[ id ].user.common ;
	return ( uc[ position ] ) ? uc[ position ] : sc[ position ] ;
}

function qsn_bounds( id , spacedefault ) {
	var div = ge( id ) ;
	if ( ! div ) return [] ;
	var l = parseInt( qsn_left( id , spacedefault ) , 10 ) ;
	var t = parseInt( qsn_top( id , spacedefault ) , 10 ) ;
	var r = l + div.offsetWidth ;
	var b = t + div.offsetHeight ;
	return [ l , t , r , b ] ;
}

function qsn_trueXY( id ) {
	var y = ge( id ) ;
	if ( ! qsn_thenotes[ id ] || isremoved( y ) ) {
		if ( ! qsn_thenotes[ id ] ) debugmail( "qsn_trueXY called for " + id + ", qsn_thenotes missing" ) ;
		if ( isremoved( y ) ) debugmail( "qsn_trueXY called for " + id + ", element missing" ) ;
		return [ 0 , 0 ] ;
	}
	var ypos = q_trueXY( y ) ;
	var refpos = q_trueXY( "q_author_stuff" ) ;
	return [ ypos[0] - refpos[0] , ypos[1] - refpos[1] ] ;
}
function qsn_trueleft( id ) {
	var pos =  qsn_trueXY( id ) ;
	return pos[ 0 ] ;
}
function qsn_left( id , spacedefault ) {
	return qsn_position( id , "left" , spacedefault ) ;
}
function qsn_truetop( id ) {
	var pos =  qsn_trueXY( id ) ;
	return pos[ 1 ] ;
}
function qsn_top( id , spacedefault ) {
	return qsn_position( id , "top" , spacedefault ) ;
}
function qsn_contentwidth( id , spacedefault ) {
	var div = ge( id ) ;
	return parseInt( qsn_width( id , spacedefault ) , 10 ) + q_deltawidth( div ) - q_deltacontentwidth( div ) ;
}
function qsn_width( id , spacedefault ) {
	return qsn_position( id , "width" , spacedefault ) ;
}
function qsn_truewidth( id ) {
	return ge( id ).offsetWidth ;
}

function common_renderhtml( id ) {// attention recouvert dans pages.js
	var div = getelement ( id ) ;
	id = div.id ;
	showblock( div ) ;
	var r = qsn_thenotes[ id ] ;
	if ( members && members[ r.common.ownerid ] ) r.common.savedmember = { username : members[ r.common.ownerid ].username , firstname : members[ r.common.ownerid ].firstname } ;
	var sc = r.spacedefaults.common ;
	if ( ! sc.left ) return false ;
	var uc = r.user.common ;
	var w = uc.width || sc.width || "200px" ;
	if ( w == "NaNpx" ) w = "200px" ;
	div.style[ "width" ] = w ;
	div.style[ "left" ] = uc.left || sc.left || "50px" ;
	div.style[ "top" ] = uc.top || sc.top || "50px" ;
	if ( uc.zindex ) {
		var newindex = eval ( uc.zindex ) ;
		div.style[ "zIndex" ]  = newindex ;
		qsn_updatezindexmax( id , newindex ) ;
	} else {
		qsn_adduserrefreshid( id ) ;
		qsn_puttofront( id ) ;
	}
	applymoveslist( [ id ] ) ;
}

/* saving */
function qsn_notechanged( id , action , callBack ) { // id = qsn_edittarget.id
	if ( /_static/.test ( qsn_thenotes[ id ].common.notekind ) ) return ;
	if ( q_isstaticpage() ) return ;
	if ( callBack === undefined ) callBack = qsn_applynoterefresh ;
	if ( action == undefined ) action = "notechanged" ;
	// qsn_thenotes[ id ].common.date = q_date2isot( new Date() ) ;
	if ( qsn_thenotes[ id ].modmemberid !== undefined ) qsn_thenotes[ id ].modmemberid = memberid ;
	var r = { json : qsn_thenotes[ id ] } ;
	if ( qsn_userrefreshid.length ) r.userrefresh = qsn_updateuserrefresh( id ) ;
 	r.upindex = document.mainform.upindex.value ;
	document.mainform.mission.value = action ;
	q_ajaxsubmit( r , callBack ) ;
}

function qsn_spacedefaultsnotechanged( id , callBack ) { // id = qsn_edittarget.id
	if ( /_static/.test ( qsn_thenotes[ id ].common.notekind ) ) return ;
	if ( q_isstaticpage() ) return ;
	if ( callBack === undefined ) callBack = qsn_applynoterefresh ;
	var r = { json : qsn_thenotes[ id ] } ;
	if ( ! q_readytosubmit( false ) ) return false ;
	if ( qsn_userrefreshid.length ) r.userrefresh = qsn_updateuserrefresh( id ) ;
	r.upindex = document.mainform.upindex.value ;
	document.mainform.mission.value = "registerspacedefaultschanges" ;
	q_ajaxsubmit( r , callBack ) ;
}

function qsn_usernotechanged( id , callBack ) { // id = qsn_edittarget.id
	if ( /_static/.test ( qsn_thenotes[ id ].common.notekind ) ) return ;
	if ( q_isstaticpage() ) return ;
	if ( callBack === undefined ) callBack = qsn_applynoterefresh ;
	var r = { json : qsn_thenotes[ id ] } ;
	if ( ! q_readytosubmit( false ) ) return false ;
	if ( qsn_userrefreshid.length ) r.userrefresh = qsn_updateuserrefresh( id ) ;
	r.upindex = document.mainform.upindex.value ;
	document.mainform.mission.value = "registeruserchanges" ;
	q_ajaxsubmit( r , callBack ) ;
}

function qsn_notesuppressed( noteslist ) {
	if ( q_isstaticpage() ) return ;
	document.mainform.mission.value = "notesuppressed" ;
	q_ajaxsubmit( { noteid: noteslist , upindex: document.mainform.upindex.value } , qsn_handlerefreshnotes ) ;
}

function qsn_applynoterefresh( xs ) { //attention recouvert dans pages.js
	if ( qsn_currstate == "tm" ) return ;
	if ( xs.newid ) {
		q_idalias [ xs.oldid ] = xs.newid ;
		qsn_thenotes[ xs.newid ] = q_cloneObject( qsn_thenotes[ xs.oldid ] ) ;
		qsn_thenotes[ xs.newid ].common.noteid = xs.newid ;
		delete qsn_thenotes[ xs.oldid ] ;
		if ( ge( xs.oldid ) ) ge( xs.oldid ).setAttribute( "id" , xs.newid ) ;
		var h = qsn_handler( qsn_thenotes[ xs.newid ].common.notekind , "qsn_applynewnoterefresh" ) ;
		if ( h ) h( xs.newid , xs.oldid ) ;
		if ( qsn_thenotes[ xs.newid ].common.duplicateid ) {
			delete qsn_thenotes[ xs.newid ].common.duplicateid ;
			if ( qsn_thenotes[ xs.newid ].common.duplicatesvcid ) delete qsn_thenotes[ xs.newid ].common.duplicatesvcid ;
			if ( qsn_thenotes[ xs.newid ].common.duplicatetmpid ) delete qsn_thenotes[ xs.newid ].common.duplicatetmpid ;
			rm( xs.newid ) ;
			qsn_safeaddnote( xs.newid ) ;
		}
	}
	if ( qsn_currstate != "view" ) return ;
	if ( xs.upindex ) document.mainform.upindex.value = xs.upindex ;
	if ( xs.changes ) {
		for ( var i = 0 ; i < xs.changes.length ; i++ ) qsn_applyaction( xs.changes [ i ] ) ;
	}
	if ( window.notepad_update ) notepad_update() ;
}

function qsn_handlerefreshnotes( xs ) {
	if ( qsn_currstate != "view" ) return false ;
	qsn_applynoterefresh( xs ) ;
	qsn_noteidslist = qsn_noteidssortedlist() ; // E 03/08/1009
}

function qsn_refreshnotes() {
	if ( qsn_currstate != "view" ) return false ;
	if ( q_isstaticpage() ) return ;
	if ( ! q_readytosubmit( false ) ) {
		return false ;
	}
	document.mainform.mission.value = "refreshnotes" ;
	q_ajaxsubmit( { upindex: document.mainform.upindex.value } , qsn_handlerefreshnotes ) ;
}

function qsn_applyaction( x ) {
	var div ;
	switch ( x.action ) {
		case "remove" :
			div = getelement( x.theid ) ;
			if ( div ) {
				var zindex = qsn_getzindex( x.theid ) ;
//				if ( ( zindex ) && ( zindex == zindexmax ) ) zindexmax-- ;
				rm ( div ) ;
			}
			if ( ! qsn_thenotes[ x.theid ] ) return ;
			var parentid = qsn_thenotes [ x.theid ].parentid ;
			delete qsn_thenotes[ x.theid ] ;
			if ( parentid ) qsn_childremoved ( parentid ) ;
			break ; 
		case "change" :
			if ( x.data.constructor.prototype.splice ) {
				for ( var i = 0 ; i<x.data.length ; i++ ) qsn_changeorcreate( x.data[ i ] , true ) ;
			} else qsn_changeorcreate( x.data , true ) ;
			break ; 
		case "create" : 
			if ( x.data.constructor.prototype.splice ) {
				for ( var i = 0 ; i<x.data.length ; i++ ) qsn_changeorcreate( x.data[ i ] , false ) ;
			} else qsn_changeorcreate( x.data , false ) ;
			break ;
		case "spacedefaultschange" :
			if ( ! qsn_thenotes[ x.theid ] ) return ;
			qsn_thenotes[ x.theid ].spacedefaults = x.data ; 
			var div = getelement( x.theid ) ;
			if ( ! div ) return ;			
			var noteslist = rmListDeleted( div ) ;
			for ( var i = 0 ; i < noteslist.length ; i++ ) {
				qsn_addnote( noteslist[ i ] ) ;
			}
			break ;
	}
}

function rmListDeleted( div ) {
	var noteslist = [ div.id ] ;
	var cnodes = getElementsByClassName( div , "container" ) ;
	var cdiv , cid ;
	for ( var i = 0 ; i < cnodes.length ; i++ ) {
		cdiv = cnodes[ i ] ;
		cid = cdiv.id ;
		if ( qsn_thenotes[ cid ] ) noteslist[ noteslist.length ] = cid ;
	}
	rm ( div ) ;
	return noteslist ;
}

function qsn_changeorcreate( r , ischange ) {
	var id = r.common.noteid ;
	if ( ( ischange ) && ( qsn_thenotes[ id ] ) ) {
		r.user = q_cloneObject( qsn_thenotes[ id ].user ) ;
		if ( q_emptyjson( r.spacedefaults.common ) ) r.spacedefaults = q_cloneObject( qsn_thenotes[ id ].spacedefaults ) ;
	}
	var isdeleted = false ;
	var div = getelement( id ) ;
	if ( ischange ) isdeleted = ( ! div ) ;
	if ( isdeleted ) {
		if ( ( r.members [ memberid ] ) && ( r.members [ memberid ].common ) && ( r.members [ memberid ].common.invisible ) ) qsn_thenotes[ id ] = r ;
		else if ( qsn_thenotes[ id ] ) delete qsn_thenotes[ id ] ;
	} else {
		qsn_thenotes[ id ] = r ;
		var noteslist ;
		noteslist = [ id ] ;
		if ( ischange ) {
			//var zindex = qsn_getzindex( id ) ;
			noteslist = rmListDeleted( div ) ;
		}
		var x ;
		for ( var i = 0 ; i < noteslist.length ; i++ ) {
			x = qsn_thenotes[ noteslist[ i ] ] ;
			if ( x ) qdyn_snload( 'qsn_addnote' , [ noteslist[ i ] ] , x.common.notekind ) ;
			//qsn_addnote( noteslist[ i ] ) ;
		}
	}
}

function applymove3d( div , zindex , left , top , width ) {
	if ( !div ) return ;
	div.style[ "zIndex" ] = zindex ;
	applymove( div , left , top , width ) ;
}

function applymoveslist( x ) {
	if ( ! x.length ) return ;
	var id , sc , uc , left , top , width ;
	for ( var i = 0 ; i < x.length ; i++ ) {
		id = x[ i ] ;
		if ( ( qsn_thenotes[ id ] ) && ( getelement( id ) ) ) {
			sc = qsn_thenotes[ id ].spacedefaults.common ;
			uc = qsn_thenotes[ id ].user.common ;
			left = ( uc.left ) ? uc.left : sc.left ;
			top = ( uc.top ) ? uc.top : sc.top ;
			width = ( uc.width ) ? uc.width : sc.width ;
			if ( ( left ) && ( top ) & ( width ) ) applymove3d( getelement( id ) , ( uc.zindex ) ? uc.zindex : qsn_zindexmax( id ) , left , top , width ) ;
		}
	}
}

function compareObject( o1 , o2 ){
	return xcompareObject( o1 , o2 , false ) ;
}

function xcompareObject( o1 , o2 , with_idalias ){// ne marche pas si les idalias sont dans des clés des objets
	if ( typeof o1 != typeof o2 ) return false ;
	if ( o1 === null || o2 === null ) return ( o1 === null && o2 === null ) ;
	if ( o1 === undefined ) return true ;
	var v ;
	if ( o1.splice ) {
		if ( o1.length != o2.length ) return false ;
		for ( var i = 0 ; i < o1.length ; i++ ) {
			if ( ! xcompareObject( o1[ i ] , o2[ i ] , with_idalias ) ) return false ;
		}
		return true ;
	}
	if ( typeof o1 == "object" ) {  
		for ( var x in o1 ) if ( ( o2[ x ] == undefined ) || ! xcompareObject( o1[ x ] , o2[ x ] , with_idalias ) ) return false ;
		for ( var x in o2 ) if (   o1[ x ] == undefined ) return false ;
		return true ;
	}
	if ( ! with_idalias ) return o1 == o2  ;
	return ( o1 == o2 || q_idalias[ o1 ] == o2 || o1 == q_idalias[ o2 ] ) ;
}

function doyoureally() {
	// if ( qsn_currstate == "edit" ) return common_message[ "alertdoyoureally" ] ;
	return ;
}

/*
function -
function BEGIN DRAG
*/

function xqsn_beginDrag( elem , e , moveHandler , upHandler , xylimits ) {
	qsn_hasmoved = false ;
	beginDrag( elem , e , moveHandler || qsn_moveHandler , upHandler || qsn_upHandler , xylimits ) ;
}

function xqsn_beginDragOnly( elem , e , moveHandler , upHandler , xylimits ) {
	qsn_hasmoved = false ;
	beginDrag( elem , e , moveHandler || qsn_moveOnlyHandler , upHandler || qsn_upOnlyHandler , xylimits ) ;
}

function qsn_beginDragStatic( elem , e ) {
	beginDrag( elem , e , qsn_moveHandler , qsn_upHandler_static ) ;
}

function qsn_beginDragOnlyStatic( elem , e ) {
	beginDrag( elem , e , qsn_moveOnlyHandler , qsn_upHandler_static ) ;
}

function qsn_beginDragInSamePlane( elem , e ) {
	beginDrag( elem , e , qsn_moveHandler_samePlane , qsn_upHandler_samePlane ) ;
}

function qsn_beginDragStaticInSamePlane( elem , e ) {
	beginDrag( elem , e , qsn_moveHandler_samePlane , qsn_upHandler_static_samePlane ) ;
}

function qsn_rawBeginDrag( elem , e ) {
//	beginDrag( elem , e , qsn_rawMoveHandler , qsn_rawUpHandler ) ;
	beginDrag( elem , e , qsn_rawMoveHandler , qsn_upHandler_static ) ;
}

/*
function -
function MOVE HANDLER
*/

function qsn_moveHandler( elem , ex , ey , ew , isGrow , xylimits ) {
	qsn_xmoveHandler( elem , ex , ey , ew , isGrow , false , xylimits ) ;
}

function qsn_moveHandler_samePlane( elem , ex , ey , ew , isGrow , xylimits ) {
	qsn_xmoveHandler( elem , ex , ey , ew , isGrow , true , xylimits ) ;
}

function qsn_moveOnlyHandler( elem , ex , ey , ew , isGrow , xylimits ) {
	qsn_moveHandler( elem , ex , ey , ew , false , xylimits ) ;
}

function qsn_moveOnlyHandler_samePlane( elem , ex , ey , ew , isGrow , xylimits ) {
	qsn_moveHandler_samePlane( elem , ex , ey , ew , false , xylimits ) ;
}

function qsn_xmoveHandler( elem , ex , ey , ew , isGrow , sameplane , xylimits ) {
	if ( isremoved( getContainer( elem ) ) ) {
		document.onmouseup = null ;
		document.onmousemove = null ;
		return ;
	}
	qsn_hasmoved = true ;
	if ( isGrow ) {
		var currwidth = elem.offsetWidth ;
		var currstylewidth = elem.style.width ;
		var deltawidth = currwidth - parseInt( currstylewidth , 10 ) ;
		ew = Math.max ( 24, ew ) ;
		var xmax = ( ( xylimits ) && ( xylimits.xwmax != undefined ) ) ? xylimits.xwmax : null ;
		xmax = xmax || ( ( ( xylimits ) && ( xylimits.xmax != undefined ) ) ? xylimits.xmax : null ) ;
		if ( ( xmax != null ) && ( elem.offsetLeft + ew > xmax ) ) ew = xmax - elem.offsetLeft ;
		if ( elem.minWidth && ( ew < parseInt( elem.minWidth , 10 ) ) ) ew = parseInt( elem.minWidth , 10 ) ;
		if ( elem.maxWidth && ( ew > parseInt( elem.maxWidth , 10 ) ) ) ew = parseInt( elem.maxWidth , 10 ) ;
		elem.style.cursor = "e-resize" ;
//		elem.style.width = ew + "px" ;
// 1. on essaie de forcer la largeur
// et 2. on rectifie style.width si on n'a pas pu prendre la largeur
		if ( ! q_changedwidth( elem , ew ) ) q_changedwidth( elem ) ;
		var tb = qsn_gettoolbar( elem ) ;
		if ( tb ) qsn_placetoolbar( elem , tb ) ;
/*
		if( isie6() ) {
			var imgs = elem.getElementsByTagName( "IMG" ) ;
			for ( var i = 0 ; i < imgs.length ; i++ ) if ( imgs[ i ].ratio ) imgs[ i ].style.height = Math.round( imgs[ i ].offsetWidth * imgs[ i ].ratio ) + "px" ;
		}
*/
// fait dans le 2.
		// if ( currwidth == elem.offsetWidth ) elem.style.width = currstylewidth ;
		// qsn_growelems( elem ) ;
	}
	else {
		elem.style.cursor = "move" ; // "default" ;
		var xmin = ( ( xylimits ) && ( xylimits.xmin != undefined ) ) ? xylimits.xmin : 2 ;
		var ymin = ( ( xylimits ) && ( xylimits.ymin != undefined ) ) ? xylimits.ymin : 0 ;
		if ( ex < xmin ) ex = xmin ;
		if ( ey < ymin ) ey = ymin ;

		var xmax = ( ( xylimits ) && ( xylimits.xmax != undefined ) ) ? xylimits.xmax : null ;
		var ymax = ( ( xylimits ) && ( xylimits.ymax != undefined ) ) ? xylimits.ymax : null ;
		if ( ( xmax != null ) && ( ex > ( xmax - elem.offsetWidth ) ) ) ex = xmax - elem.offsetWidth ;
		if ( ( ymax != null ) && ( ey > ( ymax - elem.offsetHeight ) ) ) ey = ymax - elem.offsetHeight ;
		elem.style.left = ex + "px";
		elem.style.top = ey+ "px";
		var tb = qsn_gettoolbar( elem ) ;
		if ( tb ) qsn_placetoolbar( elem , tb ) ;
	}
	if ( elem.parentid && window.pages_richnoteoffsets ) {
		var d = pages_richnoteoffsets( elem.parentid ) ;
		var richelem = ge( "pages_richelem" ) ;
		richelem.style.top = d.offsetTop - 2 + "px" ;
		richelem.style.left = d.offsetLeft - 2 + "px" ;
		richelem.style.width = d.offsetWidth + "px" ;
		richelem.style.height = d.offsetHeight + "px" ;
	} 
	if ( sameplane ) return ;
	if ( ( qsn_currstate == "view" ) || ( qsn_currstate == "tm" ) ) if ( ! isGrow ) qsn_puttofront( getContainer( elem ).id ) ;
}

function qsn_rawMoveHandler( elem , ex , ey ) {
	elem.style.cursor = "move" ; // "default" ;
	elem.style.left = ex + "px";
	elem.style.top = ey+ "px";
}

/*
function -
function UP HANDLER
*/

function qsn_upHandler( elem , ex , ey , ew , isGrow , isMove , xylimits ) {
	qsn_xupHandler( elem , ex , ey , ew , isGrow , isMove , false , xylimits ) ;
}

function qsn_upOnlyHandler( elem , ex , ey , ew , isGrow , isMove , xylimits ) {
	qsn_upHandler( elem , ex , ey , ew , false , isMove , xylimits ) ;
}

function qsn_upHandler_samePlane( elem , ex , ey , ew , isGrow , isMove , xylimits ) {
	qsn_xupHandler( elem , ex , ey , ew , isGrow , isMove , true , xylimits ) ;
}

function qsn_upHandler_static( elem , ex , ey , ew , isGrow , isMove ) {
	elem.style.cursor = "auto" ;
	var y = getContainer( elem ) ;
	if ( y.id ) qsn_puttofront( y.id ) ;
}

function qsn_upHandler_static_samePlane( elem , ex , ey , ew , isGrow , isMove ) {
	elem.style.cursor = "auto" ;
}

function qsn_xupHandler( elem , ex , ey , ew , isGrow , isMove , sameplane , xylimits ) {// recouvert dans pages.js
	var b = qsn_upsetjson( elem , ex , ey , ew , isGrow , isMove , sameplane , xylimits ) ;
	var theid = getContainer( elem ).id ;
	var r = qsn_thenotes[ theid ] ;
	if ( isGrow && elem.growingupdone ) elem.growingupdone() ;
	if ( isMove && elem.movingupdone ) elem.movingupdone() ;
	if ( elem.dragupdone ) elem.dragupdone() ;
	if ( b ) qsn_saveupHandler( theid , ( r.common.ownerid == memberid ) , r.user.common.reduced ) ;
	qsn_initfooter( true ) ;	
}

function qsn_upsetjson( elem , ex , ey , ew , isGrow , isMove , sameplane , xylimits ) {
//	if ( qsn_currstate == "view" ) qsn_mouseout( elem ) ;
	elem.style.cursor = "auto" ;
	var div = getContainer( elem ) ;
	var theid = div.id ;
	var r = qsn_thenotes[ theid ] ;
	var sc = r.spacedefaults.common ;
	var uc = r.user.common ;
	var isreduce = false ;
	if ( ! uc ) {
		r.user.common = {} ;
		uc = r.user.common ;
	}
	var ucw = uc ;
	if ( uc.reduced ) {
		isreduce = true ;
		ucw = uc.reducedpos ;
		if ( ! ucw ) {
			uc.reducedpos = {} ;
			ucw = uc.reducedpos ;
		}
	}
//	var left = ( uc.left ) ? uc.left : sc.left ;
//	var top = ( uc.top ) ? uc.top : sc.top ;
//	if ( ( ! isGrow ) && ( parseInt( clientX0 , 10 ) == parseInt( left , 10 ) ) && ( parseInt( elem.style.top , 10 ) == parseInt( top , 10 ) ) ) {
	var oldzindex = div.style[ "zIndex" ] ;
	if ( ! sameplane ) {
		var isselected = ( ( qsn_currstate == "view" ) || ( qsn_currstate == "tm" ) ) ;
		if ( qsn_currstate == "tm" ) isselected = tmswitchSelected ( elem ) ;
		if ( isselected ) if ( ! isGrow ) qsn_puttofront( theid ) ;
	}
	if ( qsn_currstate == "tm" ) return false ;
	var isowner = ( r.common.ownerid == memberid ) ;
	if ( ! qsn_hasmoved ) {
		if ( oldzindex != div.style[ "zIndex" ] ) qsn_saveupHandler( theid , isowner , isreduce ) ;
		return false ;
	}
//	if ( ! ( /note/.test( y.className ) ) ) return false ;
	if ( isGrow ) {
		var currwidth = elem.offsetWidth ;
		var currstylewidth = elem.style.width ;
		var deltawidth = currwidth - parseInt( currstylewidth , 10 ) ;
		ew = Math.max ( 24, ew ) ;
		var xmax = ( ( xylimits ) && ( xylimits.xwmax != undefined ) ) ? xylimits.xwmax : null ;
		xmax = xmax || ( ( ( xylimits ) && ( xylimits.xmax != undefined ) ) ? xylimits.xmax : null ) ;
		if ( xmax != null && ( elem.offsetLeft + ew > xmax ) ) ew = xmax - elem.offsetLeft ;
		if ( elem.minWidth && ( ew < parseInt( elem.minWidth , 10 ) ) ) ew = parseInt( elem.minWidth , 10 ) ;
		if ( elem.maxWidth && ( ew > parseInt( elem.maxWidth , 10 ) ) ) ew = parseInt( elem.maxWidth , 10 ) ;
//		elem.style.width = ew + "px" ;
// 1. on essaie de forcer la largeur
// 2. on rectifie style.width si on n'a pas pu prendre la largeur
		if ( ! q_changedwidth( elem , ew ) ) q_changedwidth( elem ) ;
		ucw.width = elem.style.width ;
//		if ( ( ! isreduce ) && ( isowner ) ) sc.width = "" + ew + "px" ;
		if ( ( ! isreduce ) && ( isowner ) ) sc.width = elem.style.width ;
	} else {
		var xmin = ( ( xylimits ) && ( xylimits.xmin != undefined ) ) ? xylimits.xmin : 2 ;
		var ymin = ( ( xylimits ) && ( xylimits.ymin != undefined ) ) ? xylimits.ymin : 0 ;
		if ( ex < xmin ) ex = xmin ;
		if ( ey < ymin ) ey = ymin ;
		var xmax = ( ( xylimits ) && ( xylimits.xmax != undefined ) ) ? xylimits.xmax : null ;
		var ymax = ( ( xylimits ) && ( xylimits.ymax != undefined ) ) ? xylimits.ymax : null ;
		if ( ( xmax != null ) && ( ex > ( xmax - elem.offsetWidth ) ) ) ex = xmax - elem.offsetWidth ;
		if ( ( ymax != null ) && ( ey > ( ymax - elem.offsetHeight ) ) ) ey = ymax - elem.offsetHeight ;

		uc.left = "" + ex + "px" ;
		uc.top =  "" + ey + "px"  ;
		if ( ( ! isreduce ) && ( isowner ) ) {
			sc.left = "" + ex + "px" ;
			sc.top =  "" + ey + "px"  ;
		}
	}
	return true ;
}

function qsn_saveupHandler( theid , isowner , isreduce ) {
	if ( qsn_edittarget != null ) return false ;
	if ( ( ! isreduce ) && ( isowner ) ) {
		qsn_adduserrefreshid( theid ) ;
		qsn_spacedefaultsnotechanged( theid ) ;
	} else {
		qsn_usernotechanged( theid ) ;
	}
}

function qsn_rawUpHandler( elem , ex , ey , ew , isGrow , isMove ) {
	elem.style.cursor = "auto" ;
}

/*
function -
*/

function qsn_puttofront( id ) {
	var currZ ;
	try {	currZ = eval ( qsn_thenotes[ id ].user.common.zindex ) ;} catch ( err ) {} ;
	if ( ( currZ != null ) && ( currZ == qsn_zindexmax( id ) ) ) return false ;
	qsn_hasmoved = true ;
	currZ = qsn_inczindexmax( id ) ;
	qsn_thenotes[ id ].user.common.zindex = "" + currZ ;
	getelement( id ).style[ "zIndex" ] = currZ ;
	return true ;
}

var qsn_hidelinkstimers = { } ;

function qsn_hidelinks( x ) {
	x = ge( x ) ;
	if ( ! x ) return ;
	var y = getElementsByClassName( x , "hiddenlink" ) ;
	for ( var i = 0 ; i < y.length ; i++ ) if ( getContainer ( y[ i ] ) == x ) y[ i ].style.visibility = "hidden" ;
}

function qsn_showlinks( x , makevisible ) {
	if ( makevisible && ( ( qsn_currstate == "edit" ) || ( qsn_currstate == "tm" ) ) ) return ;
	x = getContainer( x ) ;
	var id = x.id ;
	var notekind = qsn_thenotes[ id ].common.notekind ;
	var h ;
	try { h = eval ( notekind + "_toolbarversion( '" + id + "' )" ) ; } catch(err) {}
	if ( ! h ) return qsn_showoldlinks( x , makevisible ) ;
	else return qsn_showtoolbar( x , makevisible ) ;
}

function qsn_showoldlinks( x , makevisible ) {
	var id = x.id ;
	if ( makevisible ) {
		if ( qsn_hidelinkstimers[ id ] ) {
			clearTimeout( qsn_hidelinkstimers[ id ] ) ;
			qsn_hidelinkstimers[ id ] = null ;
		}
		var y = getElementsByClassName( x , "hiddenlink" ) ;
		for ( var i = 0 ; i < y.length ; i++ ) if ( getContainer ( y[ i ] ) == x ) y[ i ].style.visibility = "visible" ;
	} else qsn_hidelinkstimers[ id ] = setTimeout ( "qsn_hidelinks('" + id + "')" , 1000 ) ;
}

function qsn_setselected( x, isSelected ) { 
	if ( x == null ) return ;
	var f , newtop, newleft ;
	if ( isSelected ) {
		newtop = ( x.offsetTop - 2 ) + "px" ;
		newleft = ( x.offsetLeft - 2 ) + "px" ;
		if ( ( x.className ) && ( /\bselected\b/.test( x.className ) ) ) return false ;
		if ( x.className ) x.className += " selected" ;
		else x.className = " selected" ;
	} else {
		newtop = ( x.offsetTop + 2 ) + "px" ;
		newleft = ( x.offsetLeft + 2 ) + "px" ;
		if ( ( ! x.className ) || ( ! (/\bselected\b/.test( x.className ) ) ) ) return false ;
		x.className = x.className.replace( / selected\b/, "" );
	}
	x.style["left"] = newleft ;
	x.style["top"] = newtop ;
}

function qsn_seticonselected( x, isSelected ) { 
	if ( x == null ) return ;
	if ( isSelected ) {
		x.style[ "borderColor" ] = q_blue ;
	} else {
		x.style[ "borderColor" ] = qsn_sniconborderColor ;
	}
}

function qsn_hideshowplug( x ) {
	if ( ! getelement( "snplugs" ) ) return ;
	if ( x ) showblock ( "snplugs" ) ;
	else getelement( "snplugs" ).innerHTML = qsn_message[ "plug" ].replace( /^(.*)_/, "<b>$1</b><br/>" ) ;
}

function qsn_changeplug( x ) {
	if ( ! x ) return ;
	if ( ! getelement( "snplugs" ) ) return ;
	var snkind ;
	if ( typeof( x ) == "string" ) snkind = x ;
	else snkind = rights_record["currsnright"][ firstsnicon + parseInt( x.id.replace( "snicon_", "" ) ) ] ;
	var p = eval ( ( snkind.replace( /_intl$/, "" ) ) + "_message[ 'plug' ]" ) ;
	getelement( "snplugs" ).innerHTML = p.replace( /^(.*)_/, "<b>$1</b><br/>" ) ;
}

function helpnotefromicon( x ) { 
	var snkind = rights_record["currsnright"][ firstsnicon + parseInt( x.id.replace( "snicon_", "" ) ) ] ;
	openhelpwindow( "/services/" + snkind + "/help_" + snkind.replace( /^(.*_).*/, "$1" ) + q_lang );
}

function xcreatesntable( action ) {
	var td = getElementsByClassName( getelement( "q_favorites_sn" ), "q_favorites_sn" ) ;
	var lang = q_lang ;
	for (i = 0; i < 9; i++) {
		var j = i + firstsnicon ;
		if ( j < rights_record["currsnright"].length ) {
			var snkind = rights_record["currsnright"][ j ] ;
			var srcicon = "/services/" + snkind + "/images/" + snkind + "_32x32.png" ;
			if ( td[i].firstChild != null ) td[i].firstChild.firstChild.src = srcicon ;
			else {
				var link = document.createElement( "a" ) ;
				var helppath = "/services/" + snkind + "/help_" + snkind.replace( /_intl$/, "" ) + "_" + lang ;
				link.href = helppath ;
				var img = document.createElement( "img" ) ;
				img.id = "snicon_" + i ;
				img.src = srcicon ;
				img.alt = "" ;
				img.style.position = "relative" ;
				img.style.top = "0px" ;
				img.style.left = "0px" ;
				img.style.borderColor = qsn_sniconborderColor ;
				img.onmouseover = function () { qsn_seticonselected( this, true ); qsn_changeplug( this ) ; } ;
				img.onmouseout = function () { qsn_seticonselected( this, false ); return false ; } ;
				if ( action == "help" ) {
					img.onclick = function () { quietmsg('') ; qsn_seticonselected( this, false ) ; qsn_hideshowplug( false ) ; helpnotefromicon( this ); return false ;} ;
				} else {
					img.onclick = function () { quietmsg('') ; qsn_seticonselected( this, false ) ; qsn_hideshowplug( false ) ; newnotefromicon( this ); return false ;} ;
				}
				link.appendChild( img ) ;
				td[i].appendChild( link ) ;
			}
		} else if ( td[i].firstChild != null ) td[i].removeChild( td[i].firstChild ) ;
	}
	var arrowup = getelement( "sntablearrowup" ) ;
	var arrowdown = getelement( "sntablearrowdown" ) ;
	if ( rights_record["currsnright"].length < 10 ) arrowup.style.display = arrowdown.style.display = "none" ;
	else {
		arrowup.style.display = arrowdown.style.display = "block" ;
		if ( firstsnicon > 0 ) {
			arrowup.onclick = function () { updatesntable(this, -1, 'note'); return false ; } ;
			arrowup.onmouseover = function () { oversntablearrow( this, "over" ) ; } ;
			arrowup.onmouseout = function () { oversntablearrow( this, "out" ) ; } ;
		} else {
			arrowup.onclick = function () { return false ; } ;
			arrowup.onmouseover = function () {} ;
			arrowup.onmouseout = function () {} ;
		}
		var x = ( firstsnicon > 0 ) ? "1.png" : "0.png"  ;
		arrowup.style.backgroundImage = "url(/images/triangles/triangle_up_"  + x  + ")" ;
		if ( firstsnicon + 9 < rights_record["currsnright"].length ) {
			arrowdown.onclick = function () { updatesntable(this, 1, 'note'); return false ; } ;
			arrowdown.onmouseover = function () { oversntablearrow( this, "over" ) ; } ;
			arrowdown.onmouseout = function () { oversntablearrow( this, "out" ) ; } ;
		} else {
			arrowdown.onclick = function () { return false ; } ;
			arrowdown.onmouseover = function () {} ;
			arrowdown.onmouseout = function () {} ;
		}
		x = ( firstsnicon + 9 < rights_record["currsnright"].length ) ? "1.png" : "0.png"  ;
		arrowdown.style.backgroundImage = "url(/images/triangles/triangle_down_"  + x  + ")" ;
	}
}

function createsntable( action ) { // action = "note" | "help"
	if ( ( ! rights_record ) || ( ! rights_record["currsnright"] ) ) return false ;
	if ( ! getelement( "q_favorites_sn" ) ) return false ;
	var url = [] ;
	var lang = q_lang ;
	for ( var i = 0 ; i < rights_record["currsnright"].length; i++ ) url.push( qsn_msgsurl( rights_record["currsnright"][ i ] , lang ) ) ;
	qdyn_load ( "xcreatesntable" , [ action ] , url ) ;
}

function updatesntable( a, x, action ) {
	if ( a.style.backgroundImage.match( /[0-9]/) != "0" ) {
		firstsnicon += x * 3 ;
		if ( firstsnicon < 0 ) firstsnicon = 0 ;
		createsntable( action ) ;
	}
}

function newnotefromicon( x ) { 
	var snkind = rights_record["currsnright"][ firstsnicon + parseInt( x.id.replace( "snicon_", "" ) ) ] ;
	qdyn_snload( 'qsn_newnote' , [ snkind ] , snkind );
}

function oversntablearrow( a , s ) { 
	var id = a.id ;
	if ( id == "sntablearrowup" ) {
		if ( s == "over" ) a.style.backgroundImage = "url(/images/triangles/triangle_up_2.png)" ;
		else if ( s == "out" ) a.style.backgroundImage = "url(/images/triangles/triangle_up_1.png)" ;
	} else if ( id == "sntablearrowdown" ) {
		if ( s == "over" ) a.style.backgroundImage = "url(/images/triangles/triangle_down_2.png)" ;
		else if ( s == "out" ) a.style.backgroundImage = "url(/images/triangles/triangle_down_1.png)" ;
	}
}

function qsn_msgsurl( snkind , lang ) {
	var shortsnkind = snkind.replace( /_intl/ , "" ) ;
	var dir = "/services/" + snkind + "/" ;
	return ( dir + "scripts/" + shortsnkind + "_msgs_" + lang + ".js" ) ;
}

function qsn_dynload( snkind , iframeid ) {
	if ( ! ( eval( "window." + snkind + "_loaded" ) ) && ge( iframeid ) ) {
		var elem = framedocument( ge( iframeid ) ).getElementById( snkind + "_editblocks" ) ;
		if ( ( elem ) && ( ge( "qsn_editblocks" ) ) ) ge( "qsn_editblocks" ).appendChild( document.createElement( "DIV" ) ).innerHTML = elem.innerHTML ;
		elem = framedocument( ge( iframeid ) ).getElementById( snkind + "_templates" ) ;
		if ( elem ) ge( "q_author_stuff" ).appendChild( document.createElement( "DIV" ) ).innerHTML = elem.innerHTML ;
	}
	eval( snkind + "_loaded = true" ) ;
	var jsonnewnote = eval ( snkind + "_json_template" ) ;
	if ( ! jsonnewnote.common ) return [] ;
	if ( ! jsonnewnote.common.inherited ) return [] ;
	var inherited = jsonnewnote.common.inherited ;
	var inheritedsn = [] ;
	for ( var i = 0 ; i < inherited.length ; i++ ) inheritedsn.push( inherited[ i ].notekind ) ;
	return inheritedsn ;
}

function qsn_dynloaddone( snkind ) {
	var h ;
	try { h = eval ( notekind + "_dynloaddone" ) ; } catch(err) {}
	if ( h ) return h() ;
	try {
		if ( eval( snkind + "_loaded" ) ) return true ;
	} catch(err) {}
	return false ;
}

function qsn_addnotestyle( notekind , styleref , thestyle ) {//thestyle = un json
	if ( ! qsn_notestyles[ notekind ] ) qsn_notestyles[ notekind ] = {} ;
	qsn_notestyles[ notekind ][ styleref ] = thestyle ;
}

function qsn_notestyle( notekind , styleref ) {
	var thestyle = ( styleref ) ? styleref : "default" ;
	if ( ( qsn_notestyles[ notekind ] ) && ( qsn_notestyles[ notekind ][ thestyle ] ) ) return qsn_notestyles[ notekind ][ thestyle ] ;
	if ( ( thestyle != "default" ) && ( qsn_notestyles[ notekind ] ) && ( qsn_notestyles[ notekind ][ "default" ] ) ) return qsn_notestyles[ notekind ][ "default" ] ;
	if ( eval( "window." + notekind + "_defaultstyle" ) ) return eval( notekind + "_defaultstyle" ) ;
	return {} ;
}

function qsn_currnotestyle( any ) { // id ou json
	if ( typeof any == "string" ) any = qsn_thenotes[ any ] ;
	var thestyle = any.common.style ;
	var notekind = any.common.notekind ;
	return qsn_notestyle( notekind , thestyle ) ;
}

function qsn_username( morr , dontask ) {
	var m = ( typeof morr == "string" ) ? morr : morr.common.ownerid ;
	if ( m == "quomodo" ) return " " ;
	if ( ( m == "invite" ) && ( typeof morr != "string" ) ) return morr.common.signature ;
	if ( ! members[ m ] && ( typeof morr != "string" ) && morr.common.savedmember ) return q_displayedusername( morr.common.savedmember ) ;
	return q_username( m ) ;
}

function qsn_inviteusername( callback , params ) {
	var m = "invite" ;
	if ( ! members[ m ] ) members[ m ] = {} ;
	if ( members[ m ].username ) return qsn_inviteusername_promptdone( members[ m ].username , callback , ( params ) ? params : {} ) ;
	qprompt( qsn_message[ "inviteusername" ] , "qsn_inviteusername_promptdone" , { "args" : [ callback , params ] , "cancel" : { "callback": ( ( params ) && ( params.cancel ) && ( params.cancel.callback ) ) ? params.cancel.callback : "", "args" : ( ( params ) && ( params.cancel ) && ( params.cancel.args ) ) ? params.cancel.args : [] } } ) ;
}

function qsn_inviteusername_promptdone( inviteusername , callback , params ) {
	members[ "invite" ].username = inviteusername ;
	eval( callback ).apply( this , ( ( params ) && ( params.args ) ) ? params.args : [] ) ;	
}

function qsn_zindexmaxkey( id ) {
	return "q_author_stuff" ;
}
function qsn_zindexmax( id ) {
	if ( typeof zindexmax != "object" ) return zindexmax ;
	return zindexmax[ qsn_zindexmaxkey( id ) ] ;
}
function qsn_inczindexmax( id ) {
	var z = ( typeof zindexmax == "object" ) ? ++zindexmax[ qsn_zindexmaxkey( id ) ] : ++zindexmax ; 
	return z ;
}
function qsn_zindexmaxinc( id ) {
	var z = ( typeof zindexmax == "object" ) ? zindexmax[ qsn_zindexmaxkey( id ) ]++ : zindexmax++ ; 
	return z ;
}
function qsn_updatezindexmax( id , newz ) {
	if ( typeof zindexmax == "object" ) {
		var key = qsn_zindexmaxkey( id ) ;
		if ( newz > zindexmax[ key ] ) zindexmax[ key ] = newz ;
	} else if ( newz > zindexmax ) zindexmax = newz ;
}

function qsn_screenfilepath( r , imgwidth ) { //r = json d'une qsn_thenotes avec img : { downloadsrc : url , [formats : { screen : url , ... }] }
	var rimg = r.img ;
	var gaprate = 1.15 ;
	var wquarter = gaprate*200 ;
	var whalf = gaprate*400 ;
	if ( rimg.imagewidth && rimg.imageheight && ( rimg.imagewidth / rimg.imageheight ) < ( 800 / 640 ) ) {
		var wquarter = 160 * rimg.imagewidth / rimg.imageheight ;
		var whalf = 320 * rimg.imagewidth / rimg.imageheight ;
	}
	var width = parseInt( imgwidth || rimg.width || qsn_width( r.common.noteid ) , 10 ) ;
	var formats = [ "quarterscreen" , "halfscreen" , "screen" ] ;
	if ( width > whalf ) formats = [ "screen" , "halfscreen" , "quarterscreen" ] ;
	else if ( width > wquarter ) formats = [ "halfscreen" , "screen" , "quarterscreen" ] ;
	if ( ! rimg.formats ) return rimg.downloadsrc || rimg.src ;
	var screenfilepath = rimg.formats[ formats[ 0 ] ] ;
	if ( ! screenfilepath ) screenfilepath = rimg.formats[ formats[ 1 ] ] ;
	if ( ! screenfilepath ) screenfilepath = rimg.formats[ formats[ 2 ] ] ;
	return screenfilepath ;
}

function qsn_deltawidth( elem ) {
	return q_deltawidth( elem ) ;
}

function qsn_deltaheight( elem ) {
	return q_deltaheight( elem ) ;
}

/*
function -
function COLORS
*/

function qsn_setcolors( id ) {
	var res = qsn_gettargetsbykeys( id , "color" ) ;
	var notekind = res[ 0 ] ;
	var alltargets = res[ 1 ] ;
	var r = res [ 2 ] ;
	var colordesc = eval( "window." + notekind + "_colordesc" ) ;
	if ( ! colordesc ) return ;
	var colorvalue , colorrules , elem ;
	for ( var key in colordesc ) {
		var targets = alltargets[ key ] ;
		if ( targets ) {
			colorvalue = qsn_desc2rvalue( r , colordesc , key ) ;
			for ( var i = 0 ; i < targets.length ; i++ ) {
				elem = targets[ i ] ;
				var re = new RegExp ( "^.*\\b" + key + " +([^ ]+).*$" ) ;
				colorrules = elem.className.replace( re , "$1" ).split( "__" ) ;
				for ( var j in colorrules ) qsn_applycolorrule( id , elem , colorvalue , colorrules[ j ] ) ;
			}
		}
	}
}

function qsn_desc2rvalue( r , thedesc , thekey ) {//thedesc = wsg_colordesc , thekey = "qmc1"
	var value = r ;
	if ( ( typeof thedesc[ thekey ] ) == "function" ) value = thedesc[ thekey ]( value ) ;
	else if ( ( typeof thedesc[ thekey ] ) == "object" ) {
		var values = [] ;
		for ( var j in thedesc[ thekey ] ) values.push( qsn_desc2rvalue( r , thedesc[ thekey ] , j ) ) ;
		return values ;
	} else {
		var keys = thedesc[ thekey ].split( "." ) ;
		for ( var i in keys ) value = value[ keys[ i ] ] ;
	}
	if ( value != "0" ||  ! ( /_/.test( thekey ) ) ) return value ;
	return qsn_desc2rvalue( r , thedesc , thekey.replace( /^[^_]+_/ , "" ) ) ;
}

function qsn_colorvalue( id , colorkey ) {//colorkey = "qmc1"...
	var r = qsn_thenotes[ id ] ;
	if ( ! r ) return null ;
	var notekind = r.common.notekind ;
	var colordesc = ( eval( "window." + notekind + "_colordesc" ) ) ? eval( notekind + "_colordesc" ) : null ;
	if ( ! colordesc ) return null ;
	return qsn_desc2rvalue( r , colordesc , colorkey ) ;
}

function qsn_applycolorrule( id , elem , colorvalue , colorrule , rgbonly ) {
	var therule = colorrule.split( "_" ) ;
	var themode = therule[ 1 ] ;
	var styledict = { "bg" : "backgroundColor" , "bd" : "borderColor" , "text" : "color" } ;
	var thestyle = styledict[ therule[ 0 ] ] || therule[ 0 ] ;
	if ( /noteborder/.test(thestyle) ) return qsn_colornoteborder( elem , colorvalue , /[0-9]*$/.exec( thestyle )[ 0 ] ) ;
	if ( thestyle == "isdark" ) return qsn_colorisdark( elem , colorvalue ) ;
	if ( thestyle == "setdark" ) return qsn_colorsetdark( elem , colorvalue ) ;
	if ( thestyle == "headericon" ) return qsn_headericon( elem , colorvalue ) ;
	if ( thestyle == "button" ) return qsn_colorbutton( elem , colorvalue , themode ) ;
	var cc ;
	if ( themode == "self" ) cc = qsn_selfclasscolor( colorvalue , thestyle , rgbonly ) ;
	else if ( themode == "selfbg" ) cc = qsn_selfbgclasscolor( colorvalue , thestyle , rgbonly ) ;
	else if ( themode == "contrast150" ) cc = qsn_contrast150classcolor( colorvalue , thestyle , rgbonly ) ;
	else if ( themode == "contrast9" ) cc = qsn_contrastXclasscolor( 9, colorvalue , thestyle , rgbonly ) ;
	else if ( themode == "contrast13" ) cc = qsn_contrastXclasscolor( 13, colorvalue , thestyle , rgbonly ) ;
	else if ( themode == "contrast19" ) cc = qsn_contrastXclasscolor( 19, colorvalue , thestyle , rgbonly ) ;
	else if ( themode == "contrast27" ) cc = qsn_contrastXclasscolor( 27, colorvalue , thestyle , rgbonly ) ;
	else if ( themode == "contrast40" ) cc = qsn_contrastXclasscolor( 40, colorvalue , thestyle , rgbonly ) ;
	else if ( themode == "bw" ) cc = qsn_bwclasscolor( colorvalue , thestyle , rgbonly ) ;
	if ( rgbonly ) return cc[ 0 ] ;
	elem.className = elem.className.replace( cc[ 2 ] , "" ) + ( ( cc[ 1 ] != "" ) ? " " + cc[ 1 ] : "" ) ;
	elem.style[ thestyle ] = cc[ 0 ] ;
}

function qsn_headericon( elem , colorvalue ) {
	if ( ! colorvalue ) {
		elem.innerHTML = "" ;
		elem.style.width="10px" ;
		elem.style.paddingRight = "0px" ;
		return ;
	}
	elem.innerHTML = "<div style=\"position: relative ; top : 0px ; left : 0px ; width: 48px;\"><div style=\"position: absolute; top : -16px ; width: 48px; height: 48px; background: transparent top left no-repeat ; background-image : url(" + colorvalue + ") ; _filter :progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + colorvalue + "',sizingMethod='scale') ; _background-image : none\"></div>" ;
	elem.style.width = "48px" ;
	elem.style.paddingRight = "8px" ;
//	showblock( elem ) ;
}

function qsn_colornoteborder( elem , colorvalue , borderwidth ) {
	if ( qsn_currstate == "edit" ) {
		elem.style.borderStyle = "solid" ;
		elem.style.borderWidth = (borderwidth) ? (borderwidth +"px" ) : "3px" ;
		elem.style.borderColor = rgb2brightness( getpagebackgroundcolor( ) ) < 50  ? "#fff" : "#444" ; 
		return ;
	} 
	var c = parseInt( colorvalue , 10 ) ;
	if ( c == -1 ) {
		elem.style.borderStyle = "none" ;
		return ;
	}
	c = ( typeof c == "number" && c < 10 ) ? getsncontextualbackgroundcolors( 7 )[ c - 1 ] : qsn_colorforcergb( colorvalue ) ;
	elem.style.borderStyle = "solid" ;
	elem.style.borderWidth = ( borderwidth != undefined && borderwidth != null && borderwidth != "" ) ? ( borderwidth +"px" ) : "1px" ;
	elem.style.borderColor = ( rgb2brightness( c ) < 50 ) ? "#CCC #CCC #AAA #CCC" : "#AAA #AAA #777 #AAA" ;
}

function qsn_colorisdark( elem , colorvalue ) {
	var c = getrealcolor( colorvalue ) ;
	elem.isdark = ( rgb2brightness( c ) < 50 ) ;
}

function qsn_colorsetdark( elem , colorvalue ) {
	var c = getrealcolor( colorvalue ) ;
	var b = ( rgb2brightness( c ) < 50 ) ;
	var re = new RegExp( "\\bdarkvador *" ) ;
	elem.className = elem.className.replace( re , "" ) + ( ( b ) ? " darkvador" : "" ) ;
}

function qsn_colorbutton( elem , colorvalue , themode ) {
	var c = getrealcolor( colorvalue ) ;
	var c2 = rgbcontrastcolor( c , 150 ) ;
	if ( themode == "bw" ) c2 = ( rgb2brightness( c ) < 50 ) ? "#FFF" : "#000" ;
	elem.onmouseout = function () { this.style.color = this.style.borderColor = c2 ; this.style.backgroundColor = c ; } ;
	elem.onmouseover = function () { this.style.backgroundColor = this.style.borderColor = c2 ; this.style.color = c ; } ;
	elem.style.color = elem.style.borderColor = c2 ;
	elem.style.backgroundColor = c ;
	if ( !(/\bbutton\b/.test( elem.className )) ) elem.className = "button " + elem.className ;
}

function qsn_colorforcergb( colorvalue ) {	
	var namedcolor = { "black" : "rgb(0,0,0)" , "white" : "rgb(255,255,255)" } ;
	return namedcolor[ colorvalue ] || colorvalue ;
}

function qsn_selfclasscolor( colorvalue , thestyle , rgbonly ) {
	if ( typeof colorvalue == "object" && colorvalue[ 0 ] == -1 ) return qsn_contrast150classcolor( colorvalue[ 1 ] , thestyle , rgbonly ) ;
	if ( typeof colorvalue == "object" ) colorvalue = colorvalue[ 0 ] ;
	var re ;
	if ( thestyle != "color" ) re = new RegExp( "club" + thestyle.toLowerCase() +"[^ ]* ?" ) ;
	else re = new RegExp( "(pagetextcolor|club" + thestyle.toLowerCase() +"[^ ]*) ?" , "g" ) ;
	if ( ( /rgb/.test( colorvalue ) ) ) return [ colorvalue , "" , re ] ;
	if ( /^c(1|2)$/.test( colorvalue ) ) return ( rgbonly ) ? [ qsn_colorforcergb( club_siteelemscolor[ colorvalue ] ) , "" , "" ] : [ "" , "club" + thestyle.toLowerCase() + colorvalue , re ] ;
	var c = parseInt( colorvalue , 10 ) ;
	if ( c == -1 && thestyle != "color" ) return [ "transparent" , "" , re ] ;
	if ( c == -1 && thestyle == "color" ) return ( rgbonly ) ? [ getpagecolor( ) , "" , "" ] : [ "" , "pagetextcolor" , re ] ;
	var thecolor = getsncontextualbackgroundcolors( 7 , true )[ c - 1 ] ;
	if ( q_spacetype( ) == "family" ) return [ qsn_colorforcergb( thecolor ) , "" , re ] ;
	if ( c < 10 ) return ( rgbonly ) ? [ qsn_colorforcergb( getsncontextualbackgroundcolors( 7 )[ c - 1 ] ) , "" , "" ] : [ "" , "club" + thestyle.toLowerCase() + thecolor , re ] ;
	return [ qsn_colorforcergb( colorvalue ) , "" , re ] ;
}

function qsn_selfbgclasscolor( colorvalue , thestyle , rgbonly ) {
	var re ;
	if ( thestyle != "color" ) re = new RegExp( "club" + thestyle.toLowerCase() +"[^ ]* ?" ) ;
	else re = new RegExp( "(pagetextcolor|club" + thestyle.toLowerCase() +"[^ ]*) ?" , "g" ) ;
	if ( /^c(1|2)$/.test( colorvalue ) ) return ( rgbonly ) ? [ qsn_colorforcergb( club_siteelemscolor[ colorvalue ] ) , "" , "" ] : [ "" , "club" + thestyle.toLowerCase() + colorvalue , re ] ;
	if ( ( /rgb/.test( colorvalue ) ) ) return [ colorvalue , "" , re ] ;
	var c = parseInt( colorvalue , 10 ) ;
	if ( c == -1 && thestyle != "color" ) return [ getpagebackgroundcolor( ) , "" , re ] ;
	if ( c == -1 && thestyle == "color" ) return ( rgbonly ) ? [ getpagecolor( ) , "" , "" ] : [ "" , "pagetextcolor" , re ] ;
	var thecolor = getsncontextualbackgroundcolors( 7 , true )[ c - 1 ] ;
	if ( q_spacetype( ) == "family" ) return [ qsn_colorforcergb( thecolor ) , "" , re ] ;
	if ( c < 10 ) return ( rgbonly ) ? [ qsn_colorforcergb( getsncontextualbackgroundcolors( 7 )[ c - 1 ] ) , "" , "" ] : [ "" , "club" + thestyle.toLowerCase() + thecolor , re ] ;
	return [ qsn_colorforcergb( colorvalue ) , "" , re ] ;
}

function qsn_contrast150classcolor( colorvalue , thestyle , rgbonly ) {
	return qsn_contrastXclasscolor( 150, colorvalue , thestyle , rgbonly ) ;
}

function qsn_contrastXclasscolor( x, colorvalue , thestyle , rgbonly ) {
	var re ;
	if ( thestyle != "color" ) re = new RegExp( "club" + thestyle.toLowerCase() + "c" + x + "[^ ]* ?" ) ;
	else re = new RegExp( "(pagetextcolorc" + x + "|club" + thestyle.toLowerCase() +"c" + x + "[^ ]*) ?" , "g" ) ;
	if ( ( /rgb/.test( colorvalue ) ) ) return [ rgbcontrastcolor( colorvalue, x ) , "" , re ] ;
	if ( /^c(1|2)$/.test( colorvalue ) ) return ( rgbonly ) ? [ rgbcontrastcolor( qsn_colorforcergb( club_siteelemscolor[ colorvalue ] ) , x ) , "" , "" ] : [ "" , "club" + thestyle.toLowerCase() + "c" + x + colorvalue , re ] ;
	var c = parseInt( colorvalue , 10 ) ;
	if ( c == -1 && thestyle != "color" ) return [ rgbcontrastcolor( getpagebackgroundcolor( ), x ) , "" , re ] ;
	if ( c == -1 && thestyle == "color" ) return ( rgbonly ) ? [ rgbcontrastcolor( getpagebackgroundcolor( ), x ) , "" , "" ] : [ "" , "pagetextcolorc" + x , re ] ;
	var thecolor = getsncontextualbackgroundcolors( 7 , true )[ c - 1 ] ;
	if ( q_spacetype( ) == "family" ) return [ rgbcontrastcolor( qsn_colorforcergb( thecolor ), x ) , "" , re ] ;
	if ( c < 10 ) return ( rgbonly ) ? [ rgbcontrastcolor( qsn_colorforcergb( getsncontextualbackgroundcolors( 7 )[ c - 1 ] ), x ) , "" , "" ] : [ "" , "club" + thestyle.toLowerCase() + "c" + x + thecolor , re ] ;
	return [ rgbcontrastcolor( qsn_colorforcergb( colorvalue ), x ) , "" , re ] ;
}

function qsn_bwclasscolor( colorvalue , thestyle , rgbonly ) {
	var re ;
	if ( thestyle != "color" ) re = new RegExp( "club" + thestyle.toLowerCase() +"bw[^ ]* ?" ) ;
	else re = new RegExp( "(bwpagetextcolor|club" + thestyle.toLowerCase() +"bw[^ ]*) ?" , "g" ) ;
	if ( ( /rgb/.test( colorvalue ) ) ) return [ ( rgb2brightness( colorvalue ) < 50 ) ? "#FFF" : "#000" , "" , re ] ;
	if ( /^c(1|2)$/.test( colorvalue ) ) return ( rgbonly ) ? [ (rgb2brightness( qsn_colorforcergb( club_siteelemscolor[ colorvalue ] ) ) < 50 ) ? "#FFF" : "#000" , "" , "" ] : [ "" , "club" + thestyle.toLowerCase() + "bw" + colorvalue , re ] ;
	var c = parseInt( colorvalue , 10 ) ;
	if ( c == -1 && thestyle != "color" ) return [ ( rgb2brightness( getpagebackgroundcolor() ) < 50 ) ? "#FFF" : "#000" , "" , re ] ;
	if ( c == -1 && thestyle == "color" ) return ( rgbonly ) ? [ ( rgb2brightness( getpagebackgroundcolor() ) < 50 ) ? "#FFF" : "#000" , "" , "" ] : [ "" , "bwpagetextcolor" , re ] ;
	var thecolor = getsncontextualbackgroundcolors( 7 , true )[ c - 1 ] ;
	if ( q_spacetype( ) == "family" ) return [ ( rgb2brightness( qsn_colorforcergb( thecolor ) ) < 50 ) ? "#FFF" : "#000" , "" , re ] ;
	if ( c < 10 ) return ( rgbonly ) ? [ ( rgb2brightness( qsn_colorforcergb( getsncontextualbackgroundcolors( 7 )[ c - 1 ] ) ) < 50 ) ? "#FFF" : "#000" , "" , "" ] : [ "" , "club" + thestyle.toLowerCase() + "bw" + thecolor , re ] ;
	return [ ( rgb2brightness( qsn_colorforcergb( colorvalue ) ) < 50 ) ? "#FFF" : "#000" , "" , re ] ;
}

function qsn_setnotecolors( id, elemsToDark ) {
	var div = getelement ( id ) ;
	var r = qsn_thenotes[ id ] ;
	var c ;
	// set background
	c = getrealcolor( r.color , true );
	div.style.backgroundColor = c;

	c = div.style.backgroundColor;
	// set borders
	var isdark = false ;
	if ( c == "transparent" ) {
		if ( qsn_currstate == "edit" ) {
			div.style.borderStyle = "solid" ;
			if (q_spacetype( ) == "qlub") div.style.borderColor = rgbcomplement( getpagebackgroundcolor() ) ;
		} else if ( r.common.notekind != "wsg" ) div.style.borderStyle = "none" ; 
	} else {
		c = ( typeof c == "number" && c < 10 ) ? getsncontextualbackgroundcolors( 7 )[ c - 1 ] : r.color ;
		div.style.borderStyle = "solid" ;
		isdark = ( rgb2brightness( c ) < 50 ) ;
		if ( qsn_currstate == "edit" ) {
			if ( q_spacetype( ) == "qlub") div.style.borderColor = rgbcomplement ( getpagebackgroundcolor() );
		} else div.style.borderColor = ( isdark ) ? "#CCC #CCC #AAA #CCC" : "#AAA #AAA #777 #AAA" ;
	}
	
	c = div.style.backgroundColor;
	if ( c == "transparent" ) c = getpagebackgroundcolor() ;
	// set contrast elemsToDark
	if ( q_spacetype( ) == "qlub") {
		var g;
		if ( elemsToDark == undefined) var elemsToDark = [ "linkinnote", "signature", "button"];
		else elemsToDark.push (  "linkinnote", "signature" , "button" ) ;
		for ( var i=0; i<elemsToDark.length; i++) {
			g = getElementsByClassName( div , elemsToDark[i] );
			for ( var j=0; j<g.length; j++) {
				if ( qsn_currstate == "edit" && g [ j ].className  == "button") g [ j ].className = "buttonbg";
				else g [ j ].style.color = rgbcontrastcolor150 (c) ;
			}
		}
		var help = gebcn( div, "howtolink");
		if ( help && help != null && help != undefined) {
			// obsolete en qlub, on le vire, 20px = cosmetik
			help.innerHTML = "";
			help.style.height = "20px";
		}
	}
}

function qsn_rendertextcolor( div , r ) { // mise en commun du cas couleur non encore changée
	if ( r.textcolor == "-1" ) {  // le HTML décrit la couleur qmc2 text_self
		var elem = gebcn( div , "text" ) ;
		var c = elem.className ;
		if ( ( /qmc1 /.test( c ) ) ) elem.className = c.replace( /qmc2 text_self/ , "" ).replace( /(qmc1 [^ ]+)/ , "$1__text_contrast150" ) ;
		else elem.className = c.replace( /qmc2 text_self/ , "qmc1 text_contrast150" ) ;
	}
}

function qsn_defaultcolor() {
	if (q_spacetype( ) == "qlub") return 1;
	else return 3;
}

function qsn_forceColor( id, toForce, bold ) {
	var c = getrealcolor( qsn_thenotes[ id ].color );
	for ( var i = 0; i< toForce.length; i++) {
		if ( toForce[ i ] && toForce[ i ] != null && toForce[ i ] != undefined) toForce[ i ].style.color = rgbcontrastcolor150(c);
	}
}

function switch_qlub_colors( x , mode ) {
	if ( mode == "over" ) {
		x.style.border = "1px solid" ;
		x.style.borderColor = rgbcontrastcolor150 (getleftcolbackgroundcolor( )) ;
	} else x.style.border = "solid 1px #AAA" ;
} 

function qsn_makecolortable( elem, options ) { // options : colors, ids, cols, tableclass, callback
	var defaut_colors = [[50,0,0],[50,50,0],[0,50,0],[0,50,50],[0,0,50],[50,0,50],[50,50,50],[50,25,0],[25,50,0],[0,50,25],[0,25,50],[25,0,50],[50,0,25],[25,25,25],[100,0,0],[100,100,0],[0,100,0],[0,100,100],[0,0,100],[100,0,100],[100,100,100],[100,50,0],[50,100,0],[0,100,50],[0,50,100],[50,0,100],[100,0,50],[80,80,80],[100,40,40],[100,100,40],[40,100,40],[40,100,100],[40,40,100],[100,40,100],[40,40,40],[100,80,40],[80,100,40],[40,100,80],[40,80,100],[80,40,100],[100,40,80],[0,0,0]] ;
	var table_colors = options.colors || defaut_colors ;
	var table_cols = options.cols || 7 ;
	var table_ids = options.ids || null ;
	var table_class = options.tableclass || null ;
	var table_callback = options.callback || null ;
	
	var table = create_elem( "TABLE", { cellPadding: "0", cellSpacing: "3", align: "center" , style : isIE_6 ? { marginLeft : "-30px" } : {} } ) ;
	var tr = table.insertRow( -1 ) ;
	var td, tc ;
	for( var i = 0 ; i < table_colors.length ; i++ ) {
		if ( i % table_cols == 0 ) tr = table.insertRow( -1 ) ;
		td = create_td( tr, { align : "left", innerHTML : "", style : { width : "18px", height : "18px", lineHeight : "18px", border : "solid 1px #AAA", cursor : "pointer" } } ) ;
		tc = table_colors[ i ] ;
		var c = "rgb(" + tc[0] + "%," + tc[1] + "%," + tc[2] + "%)" ;
		td.style.backgroundColor = c ;
		td.target = c ;
		if ( table_ids ) td.id = table_ids[ i ] ;
		if ( table_callback ) td.onclick =  function( ) { table_callback( this ) ; } ;
		td.onmouseover = function( ) { switch_qlub_colors( this, 'over' ) ; } ;
		td.onmouseout = function( ) { switch_qlub_colors( this, 'out' ) ; } ;
	}
	if ( table_class ) table.className = table_class ;
	table = elem.appendChild( table ) ;
	return table ;
}

function xqsn_colorblock ( elem, others, transparent, title, menuseparator, scallback ) {
	// others = palette 7*6, transparent ou pas	
	var fo = q_spacetype( ) != "qlub" ;
	var nbc = fo ? 4 : 7;
	var fo_backgrounds = [ "#FFF", "#BFE3F9" , "#DBEC35" , "#FFF" , "#E73352" ] ; 
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
		
	// fncts anti closure
	var callback = ( typeof scallback == "string" ) ? eval( scallback ) : scallback ;
	function set_tdcbk ( elem, callback, i) {	
		elem.onclick =  function( ) { callback( this, i ) ; } ;
		elem.onmouseover = function( ) { switch_qlub_colors( this, 'over' ) ; } ;
		elem.onmouseout = function( ) { switch_qlub_colors( this, 'out' ) ; } ;
	} ;
	function switch_fo_colors ( x , i, mode ) {	
		if ( mode == "over" ) {
			if ( i == -1 ) x.style.border = "1px #00F dashed";
			else if  ( i == 3 ) x.style.border = "1px #00F solid";
			else {
				x.style.border = "1px #00F solid" ;
				x.style.width =  "20px" ;
				x.style.height = "11px" ;
			}
		} else {
			if ( i == -1 ) x.style.border = "1px #389D41 dotted";
			else if  ( i == 3 ) x.style.border = "1px #CCC solid";
			else {
				x.style.border = ( i == 3) ? "1px #CCC solid" : "0px none" ;
				x.style.width =  "22px" ;
				x.style.height = "13px" ;
			}
		}
	} ;
	function set_fo_fnct ( elem, i, callback) {
		elem.onmouseover = function( ) { switch_fo_colors( this, i, 'over' ) ; } ;
		elem.onmouseout = function( ) { switch_fo_colors( this, i, 'out' ) ; } ;
		// décalage index transparent 
		i = ( i == 0 ) ? -1 : i ;
 		elem.onclick = function( ) { callback (this, i) ; } ;
	} ;
	
	function switch_transparent ( elem, mode) {
		// patch button class
		if (mode == "out" ) elem.style.color = rgbcontrastcolor150 ( getleftcolbackgroundcolor( ) ) ;
		else elem.style.color = "#FFF" ;
	} ;
	
	function add_fo_colors_div ( i, callback) {
		div = document.createElement( "DIV" ) ;
		div.style.width = ( i == 3 || i == 0 ) ? "20px" : "22px" ;
		div.style.height = ( i == 3 || i == 0 ) ? "11px" : "13px" ;
		if ( i == 0 ) div.style.border = "1px #389D41 dotted";
		else div.style.border = ( i == 3) ? "1px #CCC solid" : "0px none" ;
		div.style.backgroundColor = fo_backgrounds [ i ] ;
		div.target = i ;
		set_fo_fnct (div, i, callback) ;
		return div;
	} ;	
	if ( fo ) {
		elem.appendChild( create_elem( "DIV" , { className : "square changecolortitle", innerHTML : qsn_message[ "notecolor" ] } ) ) ;
		var table = create_elem( "TABLE", { cellSpacing : "5" } ) ;
		var tr = table.insertRow( -1 ) ;
		var td ;
		for( var i = 1 ; i <= nbc ; i++ ) { 
			td = tr.insertCell( -1 ) ;
			td.style.borderWidth = "0px";
			td.appendChild( add_fo_colors_div ( i , callback ) ) ;
		}
		if ( transparent ) {
			td = tr.insertCell( -1 ) ;
			td.style.borderWidth = "0px";
			td.appendChild( add_fo_colors_div ( 0 , callback ) ) ;
		}
		elem.appendChild( table ) ;
		return ;
	}
		
	// qlub
	if ( title ) { elem.appendChild( create_elem( "DIV", { className : "square changecolortitle", innerHTML : qsn_message[ "color" ] } ) ) ; }
	
	// couleurs du site, 7 colors, toujours
	elem.appendChild( create_elem( "DIV", { className : "leftcoltext" , innerHTML : qsn_message[ "sitecolor" ], style : { marginTop : "6px", lineHeight : "20px" } } ) ) ;
	var c = getsncontextualbackgroundcolors( nbc ) ;
	var table = create_elem( "TABLE", { className : r.common.notekind + "_editblock", cellPadding: "0", cellSpacing: "3", align: "center" , style : isIE_6 ? { marginLeft : "-30px" } : {}  } ) ;
	var tr = table.insertRow( -1 ) ;
	var td , div ;
	for( var i = 0 ; i < nbc ; i++ ) {
		td = create_td( tr, { width : "18", height : "18", align : "left", innerHTML : "", style : { border : "solid 1px #AAA", cursor : "pointer", backgroundColor : c[ i ]  } } );
		set_tdcbk ( td, callback, i + 1) ;
		td.setAttribute( "target" , i + 1 ) ; 
	}
	elem.appendChild( table ) ;
	
	// other colors
	if ( others ) {
		div = create_elem( "DIV", { className: "leftcoltext", innerHTML: qsn_message[ "otherscolors" ], style: { marginTop: "6px", lineHeight: "20px" } } ) ;
		elem.appendChild( div ) ;
		qsn_makecolortable ( elem, { tableclass: r.common.notekind + "_editblock", callback: callback } ) ;
	}
	
	// transparent
	if ( transparent ) {
		div = create_elem( "DIV", { style: { textAlign: "center", marginTop: "10px" } } ) ;
		var a = create_elem( "A", { className: "button", href: "quomodo:background", innerHTML: qsn_message[ "transparent" ] } ) ;
		a.onclick = function( ) { callback( this, -1 ) ; return false ;} ;
		a.onmouseover = function( ) { switch_transparent( this, 'over' ) ; } ;
		a.onmouseout = function( ) { switch_transparent( this, 'out' ) ; } ;
		a.target = -1 ;
		div.appendChild( a ) ;
		elem.appendChild( div ) ;
	}
	
	// menuseparator
	if ( menuseparator ) elem.appendChild(  create_elem( "DIV", { className: "menuseparator" } ) ) ;
}

function qsn_colorblock ( others, transparent, callback ) {
	return xxqsn_colorblock ( others, transparent, callback , "_colorblock" ) ;
}
function qsn_colorblock2 ( others, transparent, callback ) {
	return xxqsn_colorblock ( others, transparent, callback , "_colorblock2" ) ;
}
function xxqsn_colorblock ( others, transparent, callback , suffix ) {
	qsn_addcolorblock( qsn_thenotes[ qsn_edittarget.id ].common.notekind + suffix, others, transparent, true, true, callback ) ;
}

function qsn_addcolorblock( target, others, transparent, title, menuseparator, callback ) {
	var elem = ge( target ) ;
	if ( ! elem ) {
		alert ( ( ( typeof target == "string" ) ? ( target + " " ) : "" ) + qsn_message[ "missingeditblocks" ] ); 
		return false ;
	}
	xqsn_colorblock( elem, others, transparent, title, menuseparator, callback ) ;
}

function jqsn_addcolorblock( target , js ) {
	qsn_addcolorblock( target , js.others, js.transparent, js.title, js.menuseparator, js.callback ) ;
	if ( js.title == "" ) rm ( gebcn( target , "changecolortitle" ) ) ;
	else if ( js.title !== undefined ) gebcn( target , "changecolortitle" ).innerHTML = qsn_getmessage( "tablecolortitle" , qsn_edittarget.notekind )  ;
}

function qsn_qmc3( r ) {
	if ( ! r.header.icon ) return null ;
	return "/services/wsg/images/icons/" + r.header.icon + ".png" ;
}


/*
function -
function BANDEAU LEFTCOL
*/

// fonctions obsolètes après passage à json_leftcol : 
// encore utilisé par : Documents/services/meteo/scripts/meteo.js et Documents/services/qwiz@fr/scripts/meteo.js
//                               Documents/services/meteo/meteo_xx.htm
function qsn_setleftcol_bandeau_color( notekind , rhcolor) {
	var s = notekind + "_headercoloroptions" ;
	var thea = ge( s ).getElementsByTagName( "A" ) ;
	var hcolor = ( rhcolor == "white" || rhcolor == "black" ) ? rhcolor :  "0" ;
	for ( var i = 0 ; i < thea.length ; i++ ) {
		if ( thea[ i ].target == hcolor ) setchecked( thea[ i ] , true , s ) ;
		else setchecked( thea[ i ] , false , s ) ;
	}
}

function qsn_getleftcol_bandeau_color( notekind , x ) {
	if ( x.tagName ) x = x.target ;
	var radios = ge( notekind + "_headercoloroptions" ).getElementsByTagName( "A" ) ;
	for ( var i=0; i<radios.length; i++ ) radios[ i ].className = ( radios[ i ].target == x ) ? "radio on" : "radio off" ;
	return x ;
}

function qsn_setheadercolor( x ) {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	var notekind = r.common.notekind ;
	var target = qsn_getleftcol_bandeau_color( notekind , x ) ;
	r.header.color = target == "0" ? r.color : target ;
	visibleblock( notekind + "_noteheader" , r.headerdisplay == "1" , qsn_edittarget ) ;
	qsn_setcolors( qsn_edittarget.id ) ;
}

/*
function -
function SLIDER LEFTCOL
*/

function qsn_displayslider( id, v ) { // update slider dans tab fermé
	var d = ge( id ).parentNode.parentNode.parentNode ;
	e = d.style.display ;
	d.style.display = "block" ;
	qsn_updateslider( id, v ) ;
	d.style.display = e ;
}

function xqsn_updateslider( x , v ) {
	x.style.width = Math.round ( parseInt( x.parentNode.offsetWidth , 10 ) * ( v / 100 ) ) + "px" ;
}

function qsn_updateslider( x, v ) {
	if ( typeof x == 'string' ) x = getelement ( x ) ;
	xqsn_updateslider( x , v ) ;
//	x.style.width = Math.round ( parseInt( x.parentNode.offsetWidth , 10 ) * ( v / 100 ) ) + "px" ;
}

function qsn_moveSliderHandler( elem , ex , ey , ew ) {
	elem.style.cursor = "pointer" ;
	var wmax = parseInt ( elem.parentNode.offsetWidth , 10 ) ;
	elem.style.width = Math.min ( wmax , Math.max ( 0, ew ) ) + "px" ;
	return Math.round ( 100 * elem.offsetWidth / wmax ) ; // x entre 0 et 100
}

var qsn_textsizemin = 7 ;
var qsn_textsizemax = 100 ;


function xqsn_moveSliderHandler( elem , ex , ey , ew ) {
	if ( qsn_currstate != "edit" ) return ;
	var x = qsn_moveSliderHandler( elem , ex , ey , ew ) ;
	var notekind = qsn_edittarget.notekind ;
	var s = notekind + "_textsizemin" ;
	var thesize = Math.max( x , window[ s ] || qsn_textsizemin ) ;
	qsn_thenotes[ qsn_edittarget.id ].textsize = thesize ;
	qsn_setsettingslider( ge( notekind + "_textsizeslider_elem" ) , thesize ) ;
	ge( notekind +"_textsizeinfo" ).innerHTML = thesize ;
	qsn_settextproperties( qsn_edittarget.id ) ;
}

function qsn_beginSlider( elem , ee ) {
	beginDrag( elem , ee , xqsn_moveSliderHandler ) ;
}

/*
function -
*/

function qsn_globalupgradejson( id ) {
	var r = qsn_thenotes[ id ] ;
	if ( ! r ) return ;
	if ( ! r.qsnversion ) r.qsnversion = 0 ;
	if ( r.qsnversion < 1 ) r = qsn_globalupgradejsontov1( r ) ;
	r.qsnversion = qsn_globalversion ;
	return r ;
}
function qsn_globalupgradejsontov1( r ) {
	if ( ! r.spacedefaults || ! r.spacedefaults.common ) return r ;
	if ( r.spacedefaults.common.ghost != undefined ) r.common.ghost = r.spacedefaults.common.ghost ;
	if ( r.spacedefaults.common.row != undefined ) r.common.row = r.spacedefaults.common.row ;
	if ( r.spacedefaults.common.col != undefined ) r.common.col = r.spacedefaults.common.col ;
	return r ;
}

function qsn_doupgradejson( id ) {
	var r = qsn_thenotes[ id ] ;
	var notekind = r.common.notekind ;
	if ( ! r ) return ;
	qsn_globalupgradejson( id ) ;
	var inheriteds = [ { notekind : notekind , version : r.version } ] ;
	if ( r.common.inherited ) inheriteds = inheriteds.concat( r.common.inherited ) ;
	inheriteds.reverse() ;
	var inheritednotekind , inheritedversion , json , appendtarget ;
	var n = inheriteds.length ;
	for ( var i = 0 ; i < n ; i++ ) {
		inheritednotekind = inheriteds[ i ].notekind ;
		inheritedversion = inheriteds[ i ].version ;
		json = eval ( "window." + inheritednotekind + "_json_template" ) ;
		if ( ! json ) return false ;
		r.version = inheritedversion ;
		if ( ( inheritedversion == undefined ) || ( json.version > inheritedversion ) ) r = qsn_thenotes[ id ] = ( eval ( inheritednotekind + "_upgradejson" ) )( r ) ;
		if ( inheritednotekind != notekind ) r.common.inherited[ n-i-2 ].version = r.version ;
	}
}

function qsn_duplicatenote( x ) {
	return qsn_duplicate( x ) ;
}

function qsn_duplicate( x ) {
	q_elems[ "duplicate" ] = { 
		id : "duplicate_mainblock" , 
		urls : [ 
			"/services/qorg/scripts/duplicate.js",  
			"/services/qorg/scripts/duplicate_msgs_" + q_lang + ".js", 
			"/services/qorg/duplicate_" + q_lang + ".html" ] , 
		target : "q_fullscreenmask" 
	} ;
	q_fsm_reveal( { src : q_elems[ "duplicate" ] , title : qsn_message[ "duplicatenote"] , reveal_callback : "duplicate_reveal" , reveal_args : [ x ] } ) ;
}

function qsn_duplicatenotejson( id , duplicatetarget , xresetposition , xchangeowner , withparent ) {
	var duplicatenote = q_cloneObject(qsn_thenotes[ id ] ) ;
	var isrichchild = duplicatenote.pagesparent ;
	var isnotrichchild = duplicatenote.parentid && ! isrichchild ;
	var resetposition = xresetposition != false && ! isnotrichchild && ( ! isrichchild || ! withparent ) ;
	var changeowner = xchangeowner != false ;
	var isaligned = window.pages_isaligned && pages_isaligned() ;
	var richpos ;
	var currleft = qsn_trueleft( id ) ;
	var currtop = qsn_truetop( id ) ;
	if ( window.pages_isrichnote && pages_isrichnote( id ) ) richpos = pages_richnoteoffsets( id ) ;
	else richpos = { "offsetLeft" : currleft , "offsetTop" : currtop , "offsetWidth" : qsn_truewidth( id ) , "isrichnote" : false } ;
	if ( duplicatetarget == "note" ) {
		currleft = parseInt( qsn_left( id , true ) , 10 ) ;
		currtop = parseInt( qsn_top( id , true ) , 10 ) ;
	}
	if ( resetposition ) {
		if ( duplicatetarget == "page" || duplicatetarget == "note" ) {
			var defaultposition = { left : "0px" , top : "0px" } ;
			if ( isaligned && ! isrichchild ) {
				defaultposition.left = currleft + "px" ;
				defaultposition.top = ( currtop + 40 ) + "px" ;
			} else {
				var newleft = currleft + 40 ;
				if ( window.pages_dragLimits ) newleft = Math.min( newleft , pages_dragLimits( ( ! isrichchild || duplicatetarget == "note" ) ? ge( id ) : null ).xmax - ge( id ).offsetWidth ) ;
				defaultposition.left = newleft + "px" ;
				defaultposition.top = ( currtop + 40 ) + "px" ;
			}
		} else {
			var defaultposition = { left : Math.max( currleft - richpos.offsetLeft , 0 ) + "px" , top : Math.max( currtop - richpos.offsetTop , 0 ) + "px" } ;
			if ( richpos.isrichnote ) richpos.offsetLeft = richpos.offsetTop = 0 ;
		}
		var newposition = xresetposition || defaultposition ;
	}
	if ( changeowner && qsn_thenotes[ id ].modmemberid !== undefined ) qsn_thenotes[ id ].modmemberid = memberid ;
	if ( ! duplicatenote.common ) duplicatenote.common = {} ;
	if ( resetposition ) {
		duplicatenote.common.left = newposition.left ;
		duplicatenote.common.top = newposition.top ;
		try { duplicatenote.spacedefaults.common.left = newposition.left ; } catch(e){} ;
		try { duplicatenote.spacedefaults.common.top = newposition.top ; } catch(e){} ;
		try { duplicatenote.user.common.left = newposition.left ; } catch(e){} ;
		try { duplicatenote.user.common.top = newposition.top ; } catch(e){} ;
		try { duplicatenote.common.col = null ; } catch(e){} ;
		try { duplicatenote.common.row = null ; } catch(e){} ;
	}
	if ( changeowner ) duplicatenote.common.ownerid = memberid ;
	if ( changeowner && members && members[ memberid ] ) duplicatenote.common.savedmember = { username : members[ memberid ].username , firstname : members[ memberid ].firstname } ;
	duplicatenote.common.date = q_date2isot( new Date() ) ;
	if ( duplicatetarget != "note" && ! withparent && duplicatenote.pagesparent ) duplicatenote.pagesparent = false ;
	if ( duplicatetarget != "note" && ! withparent && duplicatenote.parentid ) duplicatenote.parentid = null ;
	duplicatenote.common.duplicateid = id ;
	duplicatenote.common.duplicatesvcid = currsvcid.replace( /@intl/ , "@" + ( window.q_lang || "fr" ) ) ;
	var tmpid = qsn_newnotetmpid( duplicatenote.common.notekind ) ;
	duplicatenote.common.noteid = tmpid ;
	if ( duplicatetarget == "page" || duplicatetarget == "note" ) {
		try { duplicatenote.user.common.zindex = qsn_inczindexmax( id ) ; } catch(e){} ;
		duplicatenote.common.duplicatetmpid = true ;
	} else {
		if ( richpos && richpos.isrichnote ) duplicatenote.common.duplicaterichinfos = richpos ;
		duplicatenote.common.duplicate = true ;
	}
	return duplicatenote ;
}

function qsn_duplicate_incurrpage( x , xduplicatetarget ) {
	var duplicatetarget = xduplicatetarget || "page" ;
	if ( typeof x == "string" ) x = ge( x ) ;
	var div = getContainer( x ) ;
	var id = div.id ;

	if ( window.pages_confirm_align ) {// on est dans un service #artemapage
		var rnew = qsn_duplicatenotejson( id , duplicatetarget ) ;
		var tmpid = rnew.common.noteid ;
		qsn_thenotes[ tmpid ] = q_cloneObject( rnew ) ;
		qsn_safeaddnote( tmpid ) ;
		var ids = [ tmpid ] ;
		for ( var childid in qsn_thenotes ) {
			if ( ! qsn_thenotes[ childid ] || ! qsn_thenotes[ childid ].parentid || qsn_thenotes[ childid ].parentid != id ) continue ;
			rnew = qsn_duplicatenotejson( childid , duplicatetarget , false , false , true ) ;
			rnew.parentid = tmpid ;
			var tmpchildid = rnew.common.noteid ;
			qsn_thenotes[ tmpchildid ] = q_cloneObject( rnew ) ;
			qsn_safeaddnote( tmpchildid ) ;
			ids.push( tmpchildid ) ;
		}
		var richparentid = pages_richparentid( tmpid ) ;
		pages_notechanged( ids , ( richparentid == tmpid ) ? null : richparentid ) ;
	} else {
		var rnew = qsn_duplicatenotejson( id , duplicatetarget ) ;
		qsn_isnewnote = true ;
		var tmpid = rnew.common.noteid ;
		qsn_thenotes[ tmpid ] = rnew ;
		qsn_safeaddnote( tmpid ) ;
		qsn_notechanged( tmpid , "newnote" ) ;
	}
}

function qsn_notechangedwithservice( id , svc , callBack ) {
	if ( /_static/.test ( qsn_thenotes[ id ].common.notekind ) ) return ;
	if ( q_isstaticpage() ) return ;
	if ( callBack === undefined ) callBack = null ;
	if ( window.pages_confirm_align ) {// on est dans un service #artemapage
		var r = { changednotes : [] , removednotes : [] } ;
		var rnew = qsn_duplicatenotejson( id , "otherpage" ) ;
		var tmpid = rnew.common.noteid ;
		var l = [ rnew ] ;
		for ( var childid in qsn_thenotes ) {
			if ( ! qsn_thenotes[ childid ] || ! qsn_thenotes[ childid ].parentid || qsn_thenotes[ childid ].parentid != id ) continue ;
			rnew = qsn_duplicatenotejson( childid , "otherpage" , false , false , true ) ;
			rnew.parentid = tmpid ;
			l.push( rnew ) ;
		}
		r.newnotes = l ;
		var themission = "alignnotes" ;
	} else {
		var r = { json : qsn_duplicatenotejson( id , "otherpage" ) } ;
		var themission = "newnote" ;
	}
	r.upindex = 536870911 ; // upindex super grand pour etre tranquil
	document.mainform.mission.value = themission ;
	q_ajaxsubmitwithservice( svc.replace( /@intl/ , "@" + ( window.q_lang || "fr" ) ) , r , callBack ) ;
}

function qsn_spawnnewnote( notekind , json , format ) {// qwiz ; format pour le service pages : correspond à settings.spacedefaults.format
	var jsonnewnote = qsn_fulljson_template( notekind , json.version ) ;
	if ( ( jsonnewnote.common ) && ( jsonnewnote.common.unique ) ) if ( qsn_handlenewunique( notekind ) ) return ;
	var id = qsn_makenewfulljson( notekind , jsonnewnote ) ;
	qsn_isnewnote = false ;
	if ( json ) {
		var r = qsn_thenotes[ id ] ;
		if ( format ) {
			if ( json.common.col ) {
				json.spacedefaults.common.left = "0px" ;
				json.spacedefaults.common.top = "0px" ;
				json.spacedefaults.common.width = align_maxwidth( r , json.common.col , format ) + "px" ;
			} else debugmail( "r.common.col missing in qsn_spawnnewnote for " + q_tostring( json ) + "\nwith format : " + q_tostring( format ) ) ;
		}
		qsn_thenotes[ id ] = xq_cloneObject( json , false , r ) ;
	}
	return id ;
}

function qsn_spawnnote( notekind , json , unsaved ) { // qwiz
	var id = qsn_spawnnewnote( notekind , json ) ;
	qsn_addnote( id ) ;
	if ( ! unsaved ) qsn_notechanged( id , "newnote" ) ;
	return id ;
}

function qsn_childparentid( id ) { // renvoie l'id du parentid s'il y en a un et que ce n'est pas un pagesparent
	if ( ! qsn_thenotes[ id ].parentid ) return null ;
	if ( qsn_thenotes[ id ].pagesparent ) return null ;
	return qsn_thenotes[ id ].parentid ;
}

function qsn_relativefiximg( id ) {
	var div = ge( id ) ;
	if ( ! div ) return ;
	var imgs = div.getElementsByTagName( "IMG" ) ;
	for ( var i = 0 ; i < imgs.length ; i++ ) q_waitimgloaded( imgs[ i ].src , qsn_relativefiximgdone , [ imgs[ i ] ] ) ;
}
	
function qsn_relativefiximgdone( img ) {
	if ( ! img || ! img.parentNode ) return ;
	img.style.width = img.offsetWidth + "px" ;
}

function qsn_richnote( x ) {
	try { return pages_richnote( x ); } catch(err) {}
}

/*
function -
function TOOLBAR
*/

function qsn_toolbartip( elem, x ) {
	var id = elem.id ;
	var notekind = qsn_thenotes[ id ].common.notekind ;
	var m = eval( notekind + "_message" )[ "tip_" + x ] ;
	if ( ! m ) m = qsn_message[ "tip_" + x ] ;
	// if ( ! m ) m = qsn_message[ "undefinedtip" ] ;
	if ( ! m ) m = "" ;
	return m ;
}

function qsn_hidetoolbar( elem ) {
	elem = ge( elem ) ;
	if ( ! elem ) return ;
	if ( ! elem.parentNode ) return ;
	var tb = qsn_gettoolbar( elem ) ;
	if ( tb ) hideblock( tb ) ;
}

function qsn_placetoolbar( elem , tb ) {
	if ( isremoved( elem ) ) return ;
	var id = elem.id ;
	var r = qsn_thenotes[ id ] ;
	var x = elem.offsetWidth ;
	var y = -7 ;
	if ( ! qsn_thenotes[ id ] ) debugmail( "qsn_placetoolbar called with id " + id ) ;
	var dx = qsn_trueleft( id ) ;
	var dy = qsn_truetop( id ) ;
	var xMax = q_windowInnerWidth() + q_windowscrollX() - ( ge( "q_author_stuff" ).offsetLeft + ge( "maindiv" ).offsetLeft + ge( "adminpagediv" ).offsetLeft ) ;
	var yMax = q_windowInnerHeight() + q_windowscrollY() - ( ge( "q_author_stuff" ).offsetTop + ge( "maindiv" ).offsetTop + ge( "adminpagediv" ).offsetTop ) ;
	var xMin = q_windowscrollX() ;
	var yMin = q_windowscrollY() + ge( "adminpagediv" ).offsetTop + ge( "q_author_stuff" ).offsetTop - ( ge( "q_author_stuff" ).offsetTop + ge( "maindiv" ).offsetTop + ge( "adminpagediv" ).offsetTop ) ;
	var tbwidth = 38 ;
	var tbheight = 10 + 30 * ( tb.getElementsByTagName( "TR" ).length - 1 ) ;
	if ( ( x + dx ) > xMax - tbwidth + 5 ) x = xMax - dx - tbwidth + 5 ;
	if ( ( y + dy ) > yMax - tbheight ) y = yMax - dy - tbheight ;
	if ( ( x + dx ) < xMin ) x = xMin - dx ;
	if ( ( y + dy ) < yMin ) y = yMin - dy ;
	x -= 6 ;
	tb.style.left = x + "px" ;
	tb.style.top = y + "px" ;
	showblock( tb ) ;
}

function qsn_gettoolbar( elem ){
	var list = getElementsByClassName( elem , "notetoolbar" ) ;
	for ( var i = 0 ; i < list.length ; i++ ) if ( getContainer( list[ i ] ) == elem ) return gebcn( list[ i ] , "toolbar" ) ;
	return null ;
}

function qsn_showtoolbar( elem , makevisible ) {
	var id = elem.id ;
	if ( makevisible ) {
		if ( qsn_hidelinkstimers[ id ] ) {
			clearTimeout( qsn_hidelinkstimers[ id ] ) ;
			qsn_hidelinkstimers[ id ] = null ;
		}
		var r = qsn_thenotes[ id ] ;
		var tb = qsn_gettoolbar( elem ) || gebcn( qsn_installtoolbar( elem ) , "toolbar" ) ;
		if ( tb ) qsn_placetoolbar( elem , tb ) ;
	} else qsn_hidelinkstimers[ id ] = setTimeout ( function () { qsn_hidetoolbar( elem ) ; } , 200 ) ;
//	} else qsn_hidetoolbar( elem ) ; 
}

function qsn_installtoolbar( elem ) {
	var tbdiv ;
	var tb = gebcn( elem, "notetoolbarholder" ) ;
	if ( tb && getContainer( tb ) == elem ) tbdiv = tb.appendChild( create_elem( "div", { style: { position: "relative" } } ) ) ;
	else {
		if ( elem.tagName == "TABLE" ) {
			var td = elem.rows[ 0 ].cells[ 0 ] ;
			if ( td.firstChild ) tbdiv = td.insertBefore( create_elem( "div", { style: { position: "relative" } } ), td.firstChild ) ;
			else tbdiv = td.appendChild( create_elem( "div", { style: { position: "relative" } } ) ) ;
		} else {
			if ( elem.firstChild ) tbdiv = elem.insertBefore( create_elem( "div" ), elem.firstChild ) ;
			else tbdiv = elem.appendChild( create_elem( "div" ) ) ;
		}
	}
	tbdiv.className = "notetoolbar" ;
	var d = tbdiv.appendChild( create_elem( "div", { className: "toolbar", style: { display: "none" } } ) ) ;
	d.style.padding = "5px" ;
	d.style.backgroundImage = "url('/images/blank.gif')" ;
	var tools = qsn_toolbaroptions( elem ) ;
	if ( tools.length > 0 ) {
		var t = create_table( d ) ;
		var td = create_td( t.insertRow( -1 ) , { height: "18", vAlign: "top" } ) ;
		var msg = td.appendChild( create_elem( "div", { className: "toolbarmsg", style: { visibility: "hidden" } } ) ) ;
		msg.appendChild( create_elem( "span", { innerHTML: "N/A" } ) ) ;
		for ( var i=0; i<tools.length; i++ ) {
			var tdtool = create_td( t.insertRow( -1 ) ).appendChild( create_elem( "div", { className: tools[ i ] + " toolbartool" } ) ) ;
			if ( tools[ i ] == "move" ) tdtool.onmousedown = function( event ) { qsn_beginDragOnly( getContainer( this ) , event ) ; } ;
		}
		t.onmousedown = function( event ) { q_stopPropagation( event ) ; } ;
	}
	d.onmouseover = function( event ) { q_coremouseio( event , "toolbartool" , qsn_mouseovertoolbar ) ; } ;
	d.onmouseout = function( event ) { q_coremouseio( event , "toolbartool" , qsn_mouseouttoolbar ) ; } ;
	d.onclick = function( event ) { q_coremouseclick( event , "toolbartool" , qsn_clickintoolbar ) ; } ;
	return tbdiv ;
}

function qsn_mouseovertoolbar( x, ee ) {
	var elem = getContainer( x ) ;
	var tool = x.className.split(" ")[ 0 ] ;
	var m = gebcn( elem, "toolbarmsg" ) ;
	gebtn( m, "span" ).innerHTML = qsn_toolbartip( elem, tool ) ;
	showblock( m ) ;
	if (isfirefox()) x.className = x.className + " hover";
	else q_mouseoverbutton( x );
}

function qsn_mouseouttoolbar( x, ee ) {
	var elem = getContainer( x ) ;
	var tool = x.className.split(" ")[ 0 ] ;
	hideblock( gebcn( elem, "toolbarmsg" )) ;
	if (isfirefox()) x.className = x.className.replace( / hover/ , "");
	else q_mouseoutbutton( x );
}

function qsn_clickintoolbar( x, ee ) {
	var elem = getContainer( x ) ;
	var tool = x.className.split(" ")[ 0 ] ;
	var h = eval( "window.qsn_" + tool + "note" ) || eval( "window." + qsn_thenotes[ elem.id ].common.notekind + "_" + tool + "note" ) ;
	if ( h ) return h( elem ) ;
	alert( qsn_message[ "undefinedhandler" ] ) ;
}

/*
function -
function CONTAINER
*/

function qsn_getcontainertemplate( container ) {//container : pour l'instant : le mode edit ou view
	var mode =  container ;
	var containerid = "qsnelem_containertemplate" + ( ( mode == "edit" ) ? "_edit" : "" ) ;
	if ( ge( containerid ) ) return ge( containerid ) ;
	var divtemplates = ge( "qsnelem_container_templates" ) ;
	if ( ! divtemplates ) {
		divtemplates = document.createElement( "DIV" ) ;
		divtemplates.id = "qsnelem_container_templates" ;
		ge( "q_author_stuff" ).appendChild( divtemplates ) ;
	}
	var div = document.createElement( "DIV" ) ;
	div.className = "note" ; // vh : pour que le template dégage lors de la webbisation
	if ( mode == "edit" ) {
		div.innerHTML = '<table id="' + containerid + '" class="note stickynote qsn_note container qmc1 bg_self__noteborder_self__isdark_self" style="top: -2000px ; left : -2000px" onmousedown="qsn_beginDrag( this , event )" cellspacing="0" cellpadding="0"><tr><td><div class="richtarget notetoolbarholder" style="position : relative ; top : 0px ; left : 0px"><table width="100%" cellspacing="0" cellpadding="0" style="position : relative ; top : 0px ; left : 0px"><tr><td><table class="qlubcontainer_noteheader qmc2_qmc1 bg_self" width="100%" cellspacing="0" cellpadding="0" border="0" style="position : relative ; width: 100%;"><tr><td class="qmc3 headericon" valign="top"></td><td align="left"><div class="qlubcontainer_headerbckg" style="position: relative ; top : 0px ; left : 0px ; margin-top: 0px; cursor: move; border-width: 1px"><textarea type="text" class="qlubcontainer_headertext qmc2_qmc1 bg_self__text_bw" value="" onmousedown="q_stopPropagation( event )" onfocus="qsn_container_focusdefault( this ); " onblur="qsn_container_blurdefault( this ); " style="border: none 0px #000; font-family: Arial, sans-serif; line-height: 24px; font-size : 14px ; margin-top: 2px ; width : 98% ; border : solid 1px"></textarea></div><div class="qlubcontainer_headermeasure" style="line-height: 24px; font-size: 14px; font-weight: bold"></div></td></tr></table></td></tr><tr><td align="left" class="qlubcontainer_content"></td></tr></table></div></td></tr><tr><td align="center"><div style="position:relative ; height : 36px"><table class="cancelokelem" cellspacing="0" cellpadding="0" border="0" style="padding: 8px 0px ; position : absolute ; top : 0px ; left : 0px"><tr><td align="right"><div class="cancelokbtn btnbtn" onmousedown="q_stopPropagation( event )" onmouseover="q_mouseoverbutton( this ); this.style.color=\'#FFF\'" onmouseout="q_mouseoutbutton( this ); this.style.color=\'#333\'" onclick="qsn_canceledit() ; return false;" style="position :relative ; overflow:hidden"><div class="divimg" style="position : absolute ; top:0px;left:0px;"></div><div class="divtxt" style="position : absolute ; top:0px;left:0px;">' + qsn_message[ "cancel" ] + '</div></div></td><td width="25"></td><td align="left"><div class="cancelokbtn btnbtn" onmousedown="q_stopPropagation( event )" onmouseover="q_mouseoverbutton( this ); this.style.color=\'#FFF\'" onmouseout="q_mouseoutbutton( this ); this.style.color=\'#333\'" onclick="qsn_saveedit() ; return false;" style="position :relative ; overflow:hidden"><div class="divimg" style="position : absolute ; top:0px;left:0px; "></div><div class="divtxt" style="position : absolute ; top:0px;left:0px; ">' + qsn_message[ "ok" ] + '</div></div></td></tr></table></div></td></tr></table>' ;
	} else {
		div.innerHTML = '<table id="' + containerid + '" class="note stickynote qsn_note container qmc1 bg_self__noteborder_self__isdark_self" style="top: -2000px ; left : -2000px" onmouseover="qsn_mouseover( this , event )" onmouseout="qsn_mouseout( this , event )" onmousedown="qsn_beginDrag( this , event )" cellspacing="0" cellpadding="0"><tr><td><div class="notetoolbarholder" style="position : relative ; top : 0px ; left : 0px ; z-index : 1"></div><div class="richtarget" style="position : relative ; top : 0px ; left : 0px"><table width="100%" cellspacing="0" cellpadding="0" border="0" style="position : relative ; top : 0px ; left : 0px"><tr><td><table class="qlubcontainer_noteheader qmc2_qmc1 bg_self" width="100%" cellspacing="0" cellpadding="0" border="0" style="position : relative ; width: 100%;"><tr><td class="qmc3 headericon" valign="top"></td><td align="left"><div class="qlubcontainer_headerbckg" style="position: relative ; top : 0px ; left : 0px ; margin-top: 0px; cursor: move; border-width: 1px"><h3 class="qlubcontainer_headertext qmc2_qmc1 bg_self__text_bw" style="line-height: 24px; font-size: 14px; font-weight: bold; margin:0;padding:0;"></h3></div></td></tr></table></td></tr><tr><td align="left" class="qlubcontainer_content"></td></tr><tr><td align="right" class="qlubcontainer_signature qmc1 text_contrast150" style="visibility : visible ; font-size: 11px; line-height: 20px; text-align: right; padding-right: 10px">Quomodo</td></tr></table></div></td></tr></table>' ;
	}
	divtemplates.appendChild( div ) ;
	return ge( containerid ) ;
}

function qsn_installcontainer( container , notekind , notecontent ) {//container : pour l'instant : le mode edit ou view
	var containertemplate = qsn_getcontainertemplate( container ) ;
	var mode =  container ;
	var notetemplateid = notekind + "_notetemplate" + ( ( mode == "edit" ) ? "_edit" : "" ) ;
	var notetemplate = containertemplate.cloneNode( true ) ;
	notetemplate.id = notetemplateid ;
	notetemplate.className = notetemplate.className.replace( /qsn_note/ , notekind + "_note" + ( ( mode == "edit" ) ? "_edit" : "" ) ) ;
	ge( "q_author_stuff" ).appendChild( notetemplate ) ;
	gebcn( notetemplate , "qlubcontainer_content" ).innerHTML = notecontent ;
	rm( notekind + "_notecontent" + ( ( mode == "edit" ) ? "_edit" : "" ) ) ;
	return ge( notetemplateid ) ;
}

function qsn_container_toresize( div ) {//container : pour l'instant : le mode edit ou view
	if ( qsn_currstate != "edit" ) return [] ;
	return [ gebcn( div , "cancelokelem" ) ] ;
}

function qsn_container_renderheader( div , r ) {
	if ( ! gebcn( div , "qlubcontainer_noteheader" ) ) return ;
	if ( ! r.header ) return hideblock( gebcn( div , "qlubcontainer_noteheader" ).parentNode.parentNode ) ;
	visibleblock( gebcn( div , "qlubcontainer_noteheader" ).parentNode.parentNode , ( r.header.display == "true" ) ) ;
	if ( r.header.display != "true" ) {
		if ( qsn_currstate != "edit" ) rm( gebcn( div , "qlubcontainer_noteheader" ).parentNode.parentNode ) ;
		return ;
	}
	if ( qsn_currstate != "edit" ) {
		gebcn( div, "qlubcontainer_headerbckg" ).style.cursor = "";
		q_innerHTML( gebcn( div , "qlubcontainer_headertext" ) , r.header.text || " " ) ;
	} else {
		var t = gebcn( div , "qlubcontainer_headertext" ) ;
		var t2 = gebcn( div , "qlubcontainer_headermeasure" ) ;
		showblock( t2 ) ;
		t.value = r.header.text ;
		q_innerHTML( t2 , r.header.text || " " ) ;
		var h = t2.offsetHeight ;
		t.style.height = h + "px" ;
		hideblock( t2 ) ;
		qsn_container_blurdefault( t ) ;
	}
}

function qsn_container_rendersignature( div , r ) {
	if ( qsn_currstate == "edit" ) return ;
	var s = gebcn( div, "qlubcontainer_signature" ) ;
	if ( ! s ) return ;
	if ( r.showsignature == "true" ) {
		s.innerHTML = qsn_username( r ) ;
		s.style.display = "block" ;
	} else rm(s.parentNode); // anciennement s.style.display = "none" ;
}

function qsn_container_renderhtml( div , r ) {
	if ( ! div.toresize ) div.toresize = function () { return qsn_container_toresize( this ) ; } ;
	qsn_container_renderheader( div , r ) ;
	qsn_container_rendersignature( div , r ) ;
	if ( qsn_currstate == "edit" ) gebcn( div , "cancelokelem" ).style.width = qsn_width( r.common.noteid ) ;
}

function qsn_container_saveedit() {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	r.header.text = gebcn( qsn_edittarget, "qlubcontainer_headertext" ).value ;
	if ( r.header.text == qsn_container_blurmessage( qsn_edittarget ) ) r.header.text = "" ;
}

function qsn_container_blurmessage( x ) {
	var elem = getContainer( x ) ;
	var notekind = elem.notekind ;
	var m = eval( notekind + "_message" )[ "notetitleprompt" ] ;
	if ( ! m ) m = qsn_message[ "notetitleprompt" ] ;
	return m ;
}

function qsn_container_focusdefault( x ) {
	if ( x.value == qsn_container_blurmessage( x ) ) x.value = "" ;
}

function qsn_container_blurdefault( x ) {
	var m = qsn_container_blurmessage( x ) ;
	if ( ( x.value == "" ) || ( x.value == m ) ) x.value = m ;
}

/*
function -
*/

function qsn_editnotekind( notekind ) {
	if ( notekind ) return notekind ;
	return qsn_thenotes[ qsn_edittarget.id ].common.notekind ;
}

function qsn_getmessage( key , notekind ) {
	return xqsn_getmessage( key , notekind , false ) ;
}

function qsn_getescapedmessage( key , notekind ) {
	return qsn_getattributemessage( key , notekind ) ;
}

function qsn_getattributemessage( key , notekind ) {
	return xqsn_getmessage( key , notekind , "attribute" ) ;
}

function qsn_getHTMLmessage( key , notekind ) {
	return xqsn_getmessage( key , notekind , "HTML" ) ;
}

function xqsn_getmessage( key , notekind , HTMLencode ) {
	var m = eval( qsn_editnotekind( notekind ) + "_message" )[ key ] ;
	if ( ! m ) m = qsn_message[ key ] ;
	if ( ! m ) m = key ;
	if ( ! HTMLencode ) return m ;
	if ( HTMLencode == "HTML" ) return escapeHTML( m ) ;
	return escapeattribute( m ) ;
}

function getTargetsByClassName( elem , cont ){  // build a json { class : [ list of HTML nodes ] , ... }
	if ( ! elem || elem.nodeType != 1 ) {
		if ( getElementsByClassName.caller ) return debug_msg( "getElementsByClassName called by " + q_fname( getElementsByClassName.caller ) ) ;
	}
	var fl = cont === undefined  ? true : cont ;
	var t = {} ;
	function find( x ) {
		if ( x.nodeType == 1 ) {
			if ( x.className ) {
				var ws = x.className.replace( / +/g , " " ).split( " " ) ;
				for ( var i = 0 ; i < ws.length ; i++ ) {
					var w = ws[ i ] ;
					if ( t[ w ] ) t[ w ].push( x ) ;
					else t[ w ] = [ x ] ;
				}
			}
			if ( fl ) for ( var i = 0 ; i < x.childNodes.length ; i++ ) find ( x.childNodes[ i ] );
		}
	}
	find( elem ) ;
	return t ;
}

function qsn_getdesctargets( elem , notekind , kind , cont ) {  
// return the json { color : { colorkey1 : [ list of nodes with colorkey1 ] , ... } , text : { textkey1 : list of nodes with textkey1 ] , ... } }
// if kind is defined return the list res[ kind ]
	var fl = cont === undefined  ? true : cont ;
	var t = getTargetsByClassName( elem , fl ) ;
	if ( kind ) { var res ={} ; res[ kind ] = {} ; }
	else var res ={ color:{} , text:{} } ;
	var desckinds = q_getkeys( res ) ;
	for ( var k = 0 ; k < desckinds.length ; k++ ) {
		var desckind = desckinds[ k ] ;
		var r = res[ desckind ] ;
		var thedesc = eval( "window." + notekind + "_" + desckind + "desc" ) ;
		if ( thedesc ) {
			var keys = q_getkeys( thedesc ) ;
			for ( var i = 0 ; i < keys.length ; i++ ) r[ keys[ i ] ] = t[ keys[ i ] ] ;
		}
	}
	return kind ? res[ kind ] : res ;
}

function qsn_gettargetsbykeys( id , kind ) { // id is a string or a list of nodes
	if ( typeof id == "string" ) {
		var div = ge( id ) ;
		id = div.id ;
		var r = qsn_thenotes[ id ] ;
		var notekind = r.common.notekind ;
		var alltargets = qsn_getdesctargets( div , notekind , kind , true ) ;
	} else {
		var targets = id ; 
		if ( ! targets.length ) return {} ;
		var div = targets[ 0 ] ;
		if ( ! div.notekind ) div = getContainer( targets[ 0 ] ) ;
		notekind = div.notekind ; // pb avec broll -> iframe
		r = qsn_thenotes[ div.noteid || div.id ] ;
		var alltargets = {} ;
		for ( var i = 0 ; i < targets.length ; i++ ) {
			var oldid = div.id ; 
			if ( div.noteid ) div.id = div.noteid ;
			//var res = qsn_getdesctargets( div , notekind , kind , false ) ; 
			var res = qsn_getdesctargets( targets[ i ] , notekind , kind , false ) ; // modife récupérée de JG, #1609
			div.id = oldid ;
			for ( var k in res ) {
				if ( alltargets[ k ] ) alltargets[ k ].concat( res[ k ] ) ; 
				else alltargets[ k ] = res[ k ] ; 
			}
		}
	}
	return [ notekind , alltargets , r ] ;
}

function qsn_settextproperties( id ) { // id is a string or a list of nodes
	var res = qsn_gettargetsbykeys( id , "text" ) ;
	var notekind = res[ 0 ] ;
	var alltargets = res[ 1 ] ;
	var r = res [ 2 ] ;
	var textdesc = eval( "window." + notekind + "_textdesc" ) ;
	if ( ! textdesc ) return ;
	var colorvalue , colorrules , elem ;
	for ( var key in textdesc ) {
		var targets = alltargets[ key ] ;
		if ( targets ) {
			var textvalues = {} ;
			for ( var keyt in textdesc[ key ] ) textvalues[ keyt ] = qsn_desc2rvalue( r , textdesc[ key ] , keyt ) ;
			for ( var i = 0 ; i < targets.length ; i++ ) {
				elem = targets[ i ] ;
				var re = new RegExp ( "^.*\\b" + key + " +([^ ]+).*$" ) ;
				var stextrules = elem.className.replace( re , "$1" ) ;
				var textrules = stextrules.split( "_" ) ;
				if ( textrules[ 0 ] =="all" ) {
					if ( textrules.length == 1 ) textrules = q_getkeys( textvalues ) ;
					else {
						var sall = q_getkeys( textvalues ).join( " " ) ;
						for ( var j = 1 ; j < textrules.length ; j++ ) {
							var re = new RegExp( "\\b" + textrules[ j ] + "\\b" ) ;
							sall = sall.replace( re , "" ) ;
						}
						textrules = sall.replace(/ +/g," ").split( " " ) ;
					}
				}
				for ( var j in textrules ) qsn_applytextrule( notekind , elem , textvalues[ textrules[ j ] ] , textrules[ j ] ) ;
			}
		}
	}
	var h = qsn_handler( notekind , "qsn_posttreatment" , false ) ;
	if ( h ) h( id  ) ;
}

function qsn_applytextrule( notekind , elem , textvalue , textrule ) {
	switch( textrule.toLowerCase() ) {
		case "align" : 
			elem.style[ "textAlign" ] =qsn_definetextaligns( notekind )[ textvalue ] ;
			break ;
		case "bold" : 
			elem.style[ "fontWeight" ] = ( textvalue == "true" ) ? "bold" : "normal" ;
			break ;
		case "center" : 
			elem.style[ "textAlign" ] = ( textvalue == "true" ) ? "center" : "left" ;
			break ;
		case "font" : 
			elem.style[ "fontFamily" ] = qsn_definefontfamilies( notekind )[ textvalue ] ;
			break ;
		case "italic" : 
			elem.style[ "fontStyle" ] = ( textvalue == "true" ) ? "italic" : "normal" ;
			break ;
		case "margin" : 
			elem.style.margin = qsn_definemargins( notekind )[ textvalue ] ;
			break ;
		case "opacity" : 
			if ( qsn_currstate == "edit" && qsn_edittarget ) qsn_setcolors( qsn_edittarget.id ) ;
			var op = qsn_defineopacities( notekind )[ textvalue ] ;
			elem.style.opacity = op ;
			var intop = 5 * Math.round( 20 * op ) ;
			elem.style.filter = "alpha(opacity=" + intop + ")" ;
			elem.className = elem.className.replace( / ?qsn_trans[0-9]+/g , "" )  + " qsn_trans" + intop ;
			break ;
		case "padding" : 
			elem.style.padding = qsn_definepaddings( notekind )[ textvalue ] ;
			break ;
		case "paddingslider" : 
			elem.style.padding = textvalue + "px" ;
			break ;
		case "slider" : 
			elem.style[ "fontSize" ] = textvalue + "px" ;
			elem.style[ "lineHeight" ] = Math.round(textvalue*1.2) + "px" ;
			break ;
		case "size" : 
			elem.style[ "fontSize" ] = qsn_definefontsizes( notekind )[ textvalue ] ;
			elem.style[ "lineHeight" ] = qsn_definelineheights( notekind )[ textvalue ] ;
			break ;
		case "uppercase" : 
			elem.style.textTransform = ( textvalue == "true" ) ? "uppercase" : "none" ;
			break ;
		case "spacing" : 
			elem.style[ "letterSpacing" ] =qsn_definetextspacings( notekind )[ textvalue ] ;
			break ;
	}
}


function qsn_noteoffsets( id ) {
	var div = ge( id ) ;
	var l = qsn_trueleft( id ) ;
	var t = qsn_truetop( id ) ;
	var r = l + div.offsetWidth ;
	var b = t + div.offsetHeight ;
	return { "offsetLeft" : l , "offsetTop" : t , "offsetWidth" : r-l , "offsetHeight" : b-t } ;
}

function qsn_calcpageheight() {
	var d , noteh ;
	var maxh = 0 ;
	qsn_noteidslist = qsn_noteidssortedlist() ;
	for ( var i = 0 ; i < qsn_noteidslist.length ; i++ ) {
		var id = qsn_noteidslist[ i ] ;
		if ( ! qsn_thenotes[ id ] || ! ge ( id ) ) continue ;
		if ( qsn_thenotes[ id ].common.notekind == "settings" || qsn_thenotes[ id ].parentid ) continue ;
		d = ( window.pages_richnoteoffsets ) ? pages_richnoteoffsets( id ) : qsn_noteoffsets( id ) ;
		noteh = d.offsetTop + d.offsetHeight + ( ( window.pages_bottomsecuremargin ) ? pages_bottomsecuremargin : 12 ) ;
		if ( noteh > maxh ) maxh = noteh ;
	}
	return maxh ;
}

function qsn_initfooter( reseth ) {
	if ( ge( "q_author_stuff" ).getAttribute( "initfooter" ) != "true" ) return ;
	qsn_initfooter_setheight( reseth ) ;
}

function qsn_initfooter_setheight( reseth ) {
	if ( qsn_currstate == "edit" ) return ;
	var div = ge( "q_author_stuff" ) ;
	var hdiv = ( div.style.height && parseInt( div.style.height , 10 ) ) ? parseInt( div.style.height , 10 ) : 0 ;
	if ( reseth ) hdiv = 0 ;
	if ( hdiv && ! div.lastheight ) {// la hauteur est déjà mise, on lance un contrôle pour dans 5 secondes
		div.lastheight = hdiv ;
		if ( q_pagemode() != "makeweb" ) setTimeout( qsn_initfooter_setheight , 5000 ) ;
		return ;
	}
//	var h = Math.max( q_windowInnerHeight() , pages_calcpageheight() ) ; // prise en compte d'une hauteur mini directement dans pages_calcpageheight()
	var h = qsn_calcpageheight() ;
	h = Math.max( h , hdiv ) ;
	div.style.height = h + "px" ;
	if ( h == div.lastheight ) return ;
	div.lastheight = h ;
	if ( q_pagemode() != "makeweb" ) setTimeout( qsn_initfooter_setheight , 1000 ) ;
}

function qsn_sndatafilepath( svcid , noteid , endpath ) {
	return "/uploads/" + ( ( q_pagemode() == "edit" ) ? "" : "public" ) + "sndata/" + qsn_sndatafoldername( svcid , noteid ) + "/" + endpath ;
}

function qsn_sndatafoldername( svcid , noteid ) {
	var r = qsn_thenotes[ noteid ] ;
	if ( r && r.common && r.common.duplicateid ) noteid = r.common.duplicateid ;
	// ••• ATTENTION ••• rester synchrone avec q_notes_lib.applescript/notes_sndatafoldername(svc, noteid)
	var svcnumber = "00" ;
	var svcname = svcid.replace( /@.*$/ , "" ) ;
	if ( /#/.test( svcid ) ) {
		svcnumber = svcid.replace( /#([0-9]+)#.*/ , "$1" ) ;
		svcname = svcname.replace( /#[0-9]+#/ , "" ) ;
	}
	var svcnamenumber = indexOfItem( svcname , [ "artemapage" , "homepage" ] ) ;
	return "" + svcnamenumber + svcnumber + noteid.replace( /note_/ , "" ) ;
}


/*
function -
function FILES LIST
*/

var qsn_filestable_defaultoptions = {
	filespath : "",
	pics : "false",
	links : "true", 
	linksonclick : "qsn_filestable_defaultlinkonclick",
	size : "false" , 
	date : "false" ,
	rmline : "false",
	rmlineonclick : "qsn_filestable_defaultrmlineonclick",
	sort :  { active : "true", target : "name",  order : "up", type : "string" },
	selection : { active : "false", multiple : "true", selected : [] },
	titles : "true" , 
	maxfiles : 12
};

var qsn_filestable_sortoptions;

function qsn_filestable_add( noteid , fileslist_options ){
	var options = q_cloneObject( qsn_filestable_defaultoptions );
	q_cloneObject ( fileslist_options , options ) ;
	
	var thediv = create_elem( "DIV", { className : "qsn_filestable" } ); 
	thediv.onmousedown = function( event ){ q_stopPropagation( event ); };

	var titlesdiv = thediv.appendChild( create_elem( "DIV" , { className : "qsn_filestable_titlesdiv"} ) ) ;
	titlesdiv.appendChild( qsn_filestable_maketitles( noteid,  options ) );

	var filesdiv = thediv.appendChild( create_elem( "DIV" , { className : "qsn_filestable_filesdiv" , style : { overflow : "auto", maxHeight : ( Math.round( 20* options.maxfiles ) + "px" ) }} ) ) ;
	filesdiv.appendChild( qsn_filestable_maketable( noteid,  options ) );

	return thediv;
};

function qsn_filestable_maketitles( noteid, options ){
	var thediv = gebcn( noteid, "qsn_filestable_titlesdiv" );
	q_innerHTML( thediv , "");
	var thetable = create_elem( "TABLE", { cellSpacing : "0", cellPadding: "0", border : "0", width:"100%", className : "qsn_filestable_titlestable qmc1 bd_bw" } );
		
	//titles et  sort
	if ( options.titles == "true" ){
		var therow = thetable.insertRow( -1 );

		if ( options.pics == "true" ) create_td( therow, { className : "qmc1 text_contrast150", width : "50" } );
		
		var thecell = create_td( therow, { className : "qmc1 text_contrast150", align : "center", style : { height: "20px"}} );
		if ( options.sort.active == "true" ){
			var a = create_elem( "A", { href : "#", innerHTML : qsn_message["filename"], className : "qsn_filestable_sortitems qmc1 text_contrast150", target : "filename_up" } );
			qsn_filestable_sortOnclick( a, options ) ;
			thecell.appendChild( a );
		} else q_innerHTML( thecell, qsn_message[ "filename" ] );
		
		if ( options.size == "true" ) {
			var thecell = create_td( therow, { className : "qmc1 text_contrast150", align : "center", width : "70", style : { height: "20px"} } );
			if ( options.sort.active == "true" ){
				var a = create_elem("A", { href : "#", innerHTML : qsn_message[ "size" ], className : "qsn_filestable_sortitems qmc1 text_contrast150", target : "size_up" } );
				qsn_filestable_sortOnclick( a, options ) ;
				thecell.appendChild( a );
			} else q_innerHTML( thecell, qsn_message[ "size" ] );
		}
		
		if ( options.date == "true" ) {
			var thecell = create_td( therow, { className : "qmc1 text_contrast150", align : "center", width : "120", style : { height: "20px"} } );
			if ( options.sort.active == "true" ){
				var a = create_elem("A", { href : "#", innerHTML : qsn_message[ "date" ], className : "qsn_filestable_sortitems qmc1 text_contrast150", target : "date_up" } );
				qsn_filestable_sortOnclick( a, options ) ;
				thecell.appendChild( a );
			} else q_innerHTML( thecell, qsn_message[ "date" ] );
		}
		
		if ( options.rmline == "true" ) create_td( therow, { className : "qmc1 text_contrast150", width : "20" } );
		
		if ( options.selection.active == "true" && options.selection.multiple == "true" ) {
			var thecell = create_td( therow, { className : "qmc1 text_contrast150", width : "20" } );
			var thecheck = create_elem( "INPUT", { type : "checkbox", style : { height : "16px", width : "16px", cursor : "pointer" } } );
			qsn_filestable_selectOnclick( thecheck, options ) ;
			thecell.appendChild( thecheck );
		}
	}
	return thetable;
}

function qsn_filestable_maketable( noteid, options ){
	var thediv = gebcn( noteid, "qsn_filestable_filesdiv" );
	q_innerHTML( thediv , "");
	var thetable = create_elem( "TABLE", { cellSpacing : "0", cellPadding: "0", border : "0",  width:"100%", className : "qsn_filestable_filestable qmc1 bd_bw" } );
	
	var items = qsn_thenotes[ noteid ][ options.filespath ] 		
	for ( var i = 0; i < items.length; i++ ) {
		var item = items[ i ] ;
		var therow = thetable.insertRow( -1 );
		therow.onmouseover = function() { this.className = "qsn_filestablerow qmc1 bg_contrast13"; qsn_setcolors( [ this ] ); } ;
		therow.onmouseout = function() { this.className = "qsn_filestablerow qmc1 bg_self"; qsn_setcolors( [ this ] ); } ;
				
		if ( options.pics == "true" ) { // pictures
			var thecell = create_td( therow, { className : "qsn_filestablecell qmc1 bd_bw__text_contrast150", width : "50", align : "center", style : { height: "20px"} } );
			var thesrc = ( item.formats && ( item.formats.height50 || item.formats.quarterscreen ) ) ? q_spacebaseurl( memberid ) + ( item.formats.height50 || item.formats.quarterscreen ) : "/images/blank.gif";
			var thethumb = create_elem( "IMG", { border : "0" , alt : item.linkname } );
			q_setimgsrc( thethumb, thesrc );
			
			if ( item.imagewidth && item.imageheight ) {
				var ratio = item.imagewidth / item.imageheight ;
				if ( ratio >= 2.5 ) {
					thethumb.width = "50";
					thethumb.style.width = thethumb.width + "px";
					thethumb.height = Math.round( thethumb.width / ratio );
					thethumb.style.height = thethumb.height + "px"; 
				} else {
					thethumb.height = "20";
					thethumb.style.height = thethumb.height + "px";
					thethumb.width = Math.round( thethumb.height * ratio );
					thethumb.style.width = thethumb.width + "px";
				}
			}
			thecell.appendChild( thethumb ) ;
		}
		
		thecell = create_td( therow, { className : "qsn_filestablecell qmc1 bd_bw__text_contrast150", align : "left" } ) ; // filename
		if ( options.links == "true" ) {
			var thelink = create_elem( "A", { className: "qmc1 text_contrast150 qtxt1 size_font_italic_bold", innerHTML : qsn_filestable_formatdata( item.linkname, "linkname" ), href: encodeURI( item.filename ), target : "_blank", style : { cursor : "pointer" } } );
			qsn_filestable_linkOnclick( noteid, thelink, options );
			thecell.appendChild( thelink );
		} else q_innerHTML( thecell, qsn_filestable_formatdata( item.linkname, "linkname" ) ) ;
		
		
		if ( options.size == "true" ) { create_td( therow, { className: "qsn_filestablecell qmc1 bd_bw__text_contrast150 qtxt1 size_font_italic_bold", align:"center", innerHTML : qsn_filestable_formatdata( item.exactfilesize, "exactfilesize" ) , width : "70" } ); } // size
		if ( options.date == "true" ) { create_td( therow, { className: "qsn_filestablecell qmc1 bd_bw__text_contrast150 qtxt1 size_font_italic_bold", align:"center", innerHTML : qsn_filestable_formatdata( item.filedate, "filedate" ) , width : "120" } ); } // date
		
		if ( options.rmline == "true" ){ // delete
			thecell = create_td( therow, { className : "qsn_filestablecell qmc1 bd_bw", align : "right" , width: "20" } );
			var theimg = create_elem( "IMG", { alt : qsn_message[ "deletefilealt" ], src : "/images/delete16.png", className : "png" , style : { height : "16px", width : "16px", cursor : "pointer" } } );
			theimg.setAttribute( "q_fileid", item.newuploadid );
			qsn_filestable_rmlineOnclick( noteid, theimg, options );
			thecell.appendChild( theimg );
		}
			
		if ( options.selection.active == "true" ){ // multiple
			thecell = create_td( therow, { className : "qsn_filestablecell qmc1 bd_bw", align : "right" , width: "20" } );
			var thecheck = create_elem( "INPUT", { type : "checkbox", className : "qsn_filestable_select" , style : { height : "16px", width : "16px", cursor : "pointer" } } );
			thecheck.setAttribute( "q_fileid", item.newuploadid );
			qsn_filestable_selectOnclick( thecheck, options) ;
			thecell.appendChild( thecheck );
		}
	}
	return thetable;
}

function qsn_filestable_sortOnclick( elem, options ){
	elem.onclick = function(){ qsn_filestable_sorttable( this , options ); return false; };
}

function qsn_filestable_selectOnclick( elem, options ){
	if ( elem.className == "qsn_filestable_select") elem.onclick = function(){ qsn_filestable_select( this, options ); };
	else elem.onclick = function(){ qsn_filestable_selectall( this, options ); };
}

function qsn_filestable_linkOnclick( noteid , elem , options ) {
	if ( ! options.linksonclick  ) return; 
	elem.onclick = function(){ eval( options.linksonclick ).apply( this, [ elem, noteid ] ) ; return false; };
}

function qsn_filestable_defaultlinkonclick( elem ){
	var x = decodeURI( elem.href ) ;
	window.open( q_spacebaseurl( memberid ) + x.replace( /^.*\/(uploads\/.*)$/ , "$1" ) ) ; 
};

function qsn_filestable_rmlineOnclick( noteid, elem, options ) {
	if ( ! options.rmlineonclick  ) return; 
	elem.onclick = function(){ if ( confirm ( qsn_message[ "confirmdelete" ] ) ) eval( options.rmlineonclick ).apply( this, [  noteid, elem, options ] ); };
};

function qsn_filestable_defaultrmlineonclick( noteid, elem, options ){
	var r = qsn_thenotes[ noteid ];
	var items = r[ options.filespath ];
	for ( var i in items ) if ( items[ i ].newuploadid == elem.getAttribute( "q_fileid" ) ) items.splice( i , 1 );
	qsn_filestable_sorttable( noteid, options ) ;
}

function qsn_filestable_select( elem, options ){
	var noteid = getContainer( elem ).id ;
	var r = qsn_thenotes[ noteid ];
	var fileid = elem.getAttribute("q_fileid");
	
	if ( ! options.selection ) options.selection = qsn_filestable_defaultoptions.selection;
	var selection = options.selection;
	
	if ( elem.checked ) {
		if ( selection.multiple == "false" ) {
			var thetable = getContainer( elem, "qsn_filestable_filesdiv");
			var thetds = getElementsByClassName( thetable, "qsn_filestable_select" );
			for ( var i in thetds ) if ( thetds[ i ] != elem ) thetds[ i ].checked = "";
			selection.selected = [ fileid ] ; 
		}
		else if ( indexOfItem( fileid, selection.selected ) == -1 ) selection.selected.push( fileid );
	} else {
		if ( selection.multiple == "false" ) selection.selected = [ ]; 
		else if ( indexOfItem( fileid, selection.selected ) != -1 ) selection.selected.splice( indexOfItem( fileid, selection.selected ), 1 );
	}
}

function qsn_filestable_selectall( elem, options ){
	var noteid = getContainer( elem ).id;
	var r = qsn_thenotes[ noteid ];
	
	if ( ! options.selection ) options.selection = qsn_filestable_defaultoptions.selection;
	var selection = options.selection;
	
	selection.selected = [];
	var items = r[ options.filespath ];
	if ( elem.checked ) for ( var i in items ) selection.selected.push( items[ i ].id );
	
	var thetable = gebcn( noteid, "qsn_filestable_filesdiv");
	var thetds = getElementsByClassName( thetable, "qsn_filestable_select" );
	for ( var i in thetds ) if ( thetds[ i ] != elem ) thetds[ i ].checked = ( elem.checked ) ?  "checked" : "";
}

function qsn_filestable_sorttable( x, fileslist_options ) {
	var options = q_cloneObject( qsn_filestable_defaultoptions );
	q_cloneObject( fileslist_options , options ) ;

	if ( ! x.tagName ) {
		var noteid = x;
		var target = ( options && options.sort ) ? options.sort.target : "name";
		var order = ( options && options.sort ) ? options.sort.order : "up";
	} else {
		if ( x.tagName && x.tagName == "IMG") x = x.parentNode;
		var noteid = getContainer( x ).id ;
		var t = x.target.split( "_" );
		var target = t[ 0 ];
		var order = t[ 1 ];
	}

	var filesdiv = gebcn( noteid, "qsn_filestable_filesdiv");
	qsn_filestable_sortoptions = { target : target,  order : order, type : ( target == "size" ) ? "number" : "string" };
	qsn_filestable_sort_updatetitles( noteid, qsn_filestable_sortoptions );
	
	qsn_thenotes[ noteid ][ options.filespath ].sort( qsn_filestable_sort ) ;

	filesdiv.appendChild( qsn_filestable_maketable( noteid, options ) );
	qsn_setcolors( noteid ) ;
	qsn_settextproperties( noteid ) ;
}

function qsn_filestable_sort_updatetitles( noteid, options ){
	var neworder = ( options.order == "up" ) ? "down" : "up";
	var sortitems = getElementsByClassName( noteid, "qsn_filestable_sortitems");
	for ( var i in sortitems) {
		var img = gebtn( sortitems[ i ], "IMG" );
		if ( sortitems[ i ].target.match( options.target ) ){
			sortitems[ i ].target = sortitems[ i ].target.replace( options.order , neworder );
			if ( img ) {
				img.className  = img.className.replace( neworder , options.order );
				img.style.visibility = "visible";
			} else sortitems[ i ].appendChild( create_elem( "IMG", { className : "qsn_filestable_sort_up png", src : "/images/blank.gif" } ) );
		} else {
			if ( img ) img.style.visibility = "hidden";
		}
	}
}

function qsn_filestable_sort( a, b ) {
	var i = ( qsn_filestable_sortoptions.target || "name" )  ;
	if ( i == "kind" ) i = "filekind";
	else if ( i == "size" ) i = "exactfilesize";
	else if ( i == "date" ) i = "filedate";
	else i = "linkname";
	
	var o = ( qsn_filestable_sortoptions.order || "up" )  ; 
	o = ( qsn_filestable_sortoptions.order == "up" ) ? (1) : (-1) ;
	
	var t = ( qsn_filestable_sortoptions.type || "string" )  ;
	if ( t == "string" ) {
		var aa = ( ( i == 2 ) ?  a[ i ]  : a[ i ] ).toLowerCase() ;
		var bb = ( ( i == 2 ) ?  b[ i ] : b[ i ] ).toLowerCase() ;
		if ( aa > bb ) return 1 * o ;
		if ( aa < bb ) return -1 * o ;
		return 0 ;
	} else if ( t == "number" ) return ( a[ i ] - b[ i ] ) * o ;
}

function qsn_filestable_formatdata( data, format ) {
	if ( ! format  || format == undefined || format == "" ) return data;
	if ( format == "linkname" ) return data.replace( /.*\/(.*)$/, "$1" ) ;
	if ( format == "filekind" ) return ( qsn_message[ data ] || data ) ;
	if ( format == "filedate" ) return q_isot2string( data ) ;
	if ( format == "exactfilesize" ) return q_smart_filesize( data ) ;
}


/*
function -
function à remettre dans QSN_LIB
function -
*/

function qsn_setcheckbox( tt , v ) {
	var target = tt.getElementsByTagName( 'A' )[ 0 ] ;
	target.setAttribute( "target" , v == "true" ? "false" : "true" ) ;
	target.parentNode.setAttribute( "target" , v == "true" ? "false" : "true" ) ;
	tt.getElementsByTagName( 'IMG' )[ 0 ].setAttribute( "target" , v == "true" ? "false" : "true" ) ;
	target.className = v == "true" ? "radio on" : "radio off" ;
}

function qsn_updatejsonnote( keys , value ) {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	for ( var i = 0 ; i < keys.length - 1 ; i++ ) r = r[ keys[ i ] ] ;
	r[ keys[ keys.length - 1 ] ] = value ;
}

function qsn_default_handleclick( tt , ee ) {
	var target = getElementFromEvent( ee ) ;
	xqsn_default_handleclick( tt , target ) ;
	q_stopPropagation( ee || window.event ) ;
}

function xqsn_default_handleclick( tt , target ) {
/*
	var savedtarget = target ;
	var value = target.target ;
	if ( value == undefined ) value = target.getAttribute( "target" ) ;
	if ( value == undefined && target.parentNode.target != undefined ) { target = target.parentNode ; value = target.target ; } // img dans le a radio avec ou sans getsetting
	if ( value == undefined && target.parentNode.getAttribute( "target" ) != undefined ) { target = target.parentNode ; value = target.getAttribute( "target" ) ; }
	if ( value == undefined ) target = savedtarget ; // après tout peut-être qu'il n'y a pas du tout d'attribut target dans ce système, laissons faire getsetting
*/
	var h = tt.getAttribute( "getsetting" ) ;
	var value ;
	if ( h ) value = eval( h )( tt , target ) ; 
	else value = ( target.target == undefined ) ? target.getAttribute( "target" ) : target.target ;
	if ( value == undefined || value == null ) return ;
	if ( typeof value == "object" && typeof value[ 0 ] == "function" ) return value[ 0 ].apply( this , value[ 1 ] ) ;
	else xqsn_default_handleclick2( value , [ tt ] )  ;
}

function xqsn_default_handleclick2( value , args ) { //args = [ tt ]
	if ( value == undefined || value == null ) return ;
	var tt = args[ 0 ] ;
	var jsonpath = tt.getAttribute( "jsonpath" ) ;
	var keys = jsonpath.split( "." ) ;
	eval( tt.getAttribute( "setsetting" ) )( tt , value ) ;
	qsn_updatejsonnote( keys , value ) ;
	var h = tt.getAttribute( "modifynote" ) ;
	if ( h ) eval( h )( qsn_edittarget.id ) ;
}

function qsn_prepare_displaysettings( notekind ) {
	if ( window[ notekind + "_leftcol_prepared" ] ) return ;
	if ( ! window[ notekind + "_leftcol_description" ] ) return ;
	var leftcol = eval( notekind + "_leftcol_description" ) ;
	if ( typeof leftcol == "function" ) leftcol = leftcol.apply( this , [] ) ;
	var standardhandlers = "qsn_addselect qsn_addcheckboxtable qsn_addradiotable qsn_addtableimages qsn_addtextinput" ;
	for ( var i = 0 ; i < leftcol.length ; i++ ) {
		var tab = leftcol[ i ] ;
		var target = qsn_addlctab( tab.tabname , tab.visible ) ;
		var elems = tab.elems ;
		for ( var j = 0 ; j < elems.length ; j++ ) {
			var js = elems[ j ].params ;
			if ( elems[ j ].prepareparams ) eval( elems[ j ].prepareparams ) ( js ) ;
			var thehandler = elems[ j ].handler ;
			var re = new RegExp( thehandler ) ;
			if ( ! js.className ) js.className = notekind + "_" + ( js.jsonpath || js.html ) + "_elem" ;
			if ( ( re.test( standardhandlers ) ) ) qsn_addleftcolelem( target , eval( thehandler ).apply( this , [ js ] ) , js.className ) ;
			else eval( elems[ j ].handler ).apply( this , [ target , js ] ) ;
		}
	}
	window[ notekind + "_leftcol_prepared" ] = true ;
}

function qsn_initdisplaysetting() {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	var notekind = qsn_edittarget.notekind ;
	qsn_prepare_displaysettings( notekind ) ;
	var settings = ge( notekind + "_editblock" ).displaysettings || [] ;
	for ( var i = 0 ; i < settings.length ; i++ ) qsn_setsetting( settings[ i ] , r ) ;
}


/*
function -
function GENERAL
function -
*/

function qsn_selectgetdefault ( elem , target ) {
	if ( ! elem.multiple && target ) return target.value ;
	var listv = [] ;
	for ( var i = 0 ; i < elem.options.length ; i++ ) if ( elem.options[ i ].selected ) {
		if ( ! elem.multiple ) return elem.options[ i ].value ;
		listv.push( elem.options[ i ].value ) ;
	}
	return listv ;
}

function qsn_check_value_is_in_list( v , r ) {
	if ( typeof r == "object" ) { // assumed a table
		for ( var i in r ) if ( v == r[ i ] ) return true ;
		return false ;
	} else return v == r ;
}

function qsn_selectsetdefault ( elem , r ) {
	var options = elem.options ;
	elem.target = null ;
	if ( ! options.length ) return ;
	for ( var i = 0 ; i < options.length ; i++ ) {
		if ( qsn_check_value_is_in_list( options[ i ].value , r ) ) {
			options[ i ].selected = "selected" ;
			elem.target = r ;
		}
		else options[ i ].selected = false ;
	}
	if ( ! elem.multiple && elem.selectedIndex == -1 ) { elem.selectedIndex = 0 ; elem.target = options[ 0 ].value ; } // for safari
}

function qsn_setsetting( elem , r ) {
	var keys = elem.getAttribute( "jsonpath" ).split( "." ) ;
	var v = r ;
	for ( var i = 0 ; i < keys.length ; i++ ) v = v[ keys[ i ] ] ;
	eval( elem.getAttribute( "setsetting" ) )( elem , v ) ;
}

function qsn_adddisplaysetting( newsetting ) { // newsetting = un elem ou un array [ elem , function ]
	var notekind = qsn_edittarget.notekind ;
	var x = ge( notekind + "_editblock" ).displaysettings || [] ;
	x.push( newsetting ) ;
	ge( notekind + "_editblock" ).displaysettings = x ;
}

function qsn_addleftcolelem( target , content , newsettingclass ) {
	var div = document.createElement( "DIV" ) ;
	target.appendChild( div ) ;
	div.innerHTML = content ;
	if ( newsettingclass ) {
		var elems = getElementsByClassName( div , newsettingclass ) ;
		for ( var i = 0 ; i < elems.length ; i++ ) qsn_adddisplaysetting( elems[ i ] ) ;
	}
	return div ;
}

function qsn_addlctab( key , visible ) {
	var notekind = qsn_editnotekind() ;
	var div = qsn_addleftcolelem( ge( notekind + "_editblock" ) , '<div class="leftcoltab_title_' + ( ( visible ) ? 'open' : 'closed' ) + '" onmouseover="mouseover_tabtitle( this )" onmouseout="mouseout_tabtitle( this )" onclick="switch_tab( this.parentNode.parentNode , this, false )">\n<span class="arrow">'+  ( ( visible ) ? '▼' : '►' )  + '</span><span>' + qsn_getHTMLmessage( key , notekind ) + '</span>\n</div>\n<div class="leftcoltab_content" style="display: ' + ( ( visible ) ? 'block' : 'none' ) + '"></div>' ) ;
	return gebcn( div , "leftcoltab_content" ) ;
}

function qsn_makeradiolist( nvals , msgname , emptycells ) {
	var tt = [] ;
	var ii = 0 ; 
	var j = emptycells ? emptycells[ ii ] : -1 ;
	for ( var i = 0 ; i < nvals ; ) { // i=0
		if ( i == j ) { 
			tt.push( [] ) ; 
			ii++ ;
			j = ii < emptycells.length ? emptycells[ ii ] : -1 ;
		} else {
			tt.push( [ "" + i , msgname + i ] ) ;
			i++ ;
		}
	}
	return tt ;
}

function qsn_build_setting_string( desc ) {
	var s = 'class="' + desc.className + '" jsonpath="' + desc.jsonpath + '" setsetting="' + desc.setsetting + '" ' + desc.thefunc + '="' + (( desc.addtofunc ) ? desc.addtofunc : "") + 'qsn_default_handleclick( this , event )"' ;
	if ( desc.getsetting ) s += ' getsetting="' + desc.getsetting + '"' ;
	if ( desc.modifynote ) s += ' modifynote="' + desc.modifynote + '"' ;
	if ( desc.idprefix ) s += ' idprefix="' + desc.idprefix + '"' ;
	if ( desc.attributes ) for ( var i = 0 ; i < desc.attributes.length ; i++ ) s += ' ' + desc.attributes[ i++ ] + '="' + desc.attributes[ i ] + '"' ;
	return s ;
}

function qsn_addselectoption( option , selectedoptions ) {
	var disabled = false ;
	if ( option.splice ) {// array : [ value , [ display (type string) ] , [ disabled (type boolean) ] ]
		value = option[ 0 ] ;
		name = ( option.length > 1 && ( typeof option[ 1 ] ) == "string" ) ? option[ 1 ] : option[ 0 ] ;
		if ( option.length > 1 && ( typeof option[ 1 ] ) == "boolean" ) disabled = option[ 1 ] ;
		else if ( option.length > 2 ) disabled = option[ 2 ] ;
	} else {
		value = option.value ;
		name = ( option.name != undefined ) ? option.name : option.value ;
		if ( option.disabled ) disabled = option.disabled ;
	}
	var s = '<option value="' + escapeattribute( value ) + '"' ;
	if ( selectedoptions && indexOfItem( value , selectedoptions ) != -1 ) s+= ' selected="selected"' ;
	if ( disabled ) s+= ' disabled="disabled"' ;
	s+= '>' + qsn_getHTMLmessage( name ) + '</option>' ;
	return s ;
}

function qsn_addselect( desc ) {
	var n = desc.selects.length ; 
	if ( ! n ) return "" ;
	if ( ! desc.setsetting ) desc.setsetting = "qsn_selectsetdefault" ;
	if ( ! desc.getsetting ) desc.getsetting = "qsn_selectgetdefault" ;
	desc.thefunc = "onchange" ;
	if ( desc.selected && ( typeof desc.selected ) == "string" ) desc.selected = [ desc.selected ] ;
	var s = '<select onclick="q_stopPropagation( event )"' + qsn_build_setting_string( desc ) + ' style="margin-top:10px; width:150px"';
	if ( desc.multiple ) {
		if ( desc.size === undefined ) desc.size = 3 ;
		s += ' multiple="multiple" size="' + desc.size + '"' ;
	}
	s += '>' ;
	var value , name ;
	for ( var i = 0 ; i < n ; i++ ) {
		var option = desc.selects[ i ] ;
		if ( ( typeof option ) == "string" ) option = [ option ] ;
		if ( ! option.splice && option.label ) {
			s += '<optgroup label="' + qsn_getattributemessage( option.label ) + '">' + ( issafari() ? qsn_getHTMLmessage( option.label ) : "" ) ;
			for ( var j in option.options ) s += qsn_addselectoption( option.options[ j ] , desc.selected ) ;
			s += "</optgroup>" ;
		} else s+= qsn_addselectoption( option , desc.selected ) ;
	}
	s+= '</select>' ;
	if ( ! desc.title ) return s ;
	else return '<div class="square" style="margin-top: 6px">' + qsn_getHTMLmessage( desc.title ) + '</div>' + s ;
}

function qsn_addcheckboxtable( desc ) {
	var n = desc.checkboxes.length ; 
	if ( ! n ) return "" ;
	var ncols = desc.ncols || 1 ;
	if ( ! ncols ) ncols = 1 ;
	var nrows = n / ncols ;
	var w = isIE_6 ? "170" : "100%" ;
	var s = '<table width="' + w + '" cellspacing="0" cellpadding="0"><tbody>' ;
	var tr=[] , td ;
	for ( var i = 0 ; i < n ; i++ ) {
		var checkbox = desc.checkboxes[ i ] ;
		if ( i % ncols == 0 ) {
			if ( i > 0 ) tr.push( "<tr>" + td.join( "" ) + "</tr>" ) ;
			td=[] ;
		}
		if ( ! checkbox.setsetting ) checkbox.setsetting = "qsn_setcheckbox" ;
		if ( ! checkbox.className ) checkbox.className = desc.className ;
		checkbox.thefunc = "onclick" ;
		var stemp = qsn_build_setting_string( checkbox ) ;
		var ss = '<td ' + stemp + ' checkbox="true" target="false"><a class="radio off" target="false" href="#" onclick="return false"><img target="false" src="/images/blank.gif" border="0" />' + qsn_getHTMLmessage( checkbox.name ) + '</a></td>' ;
		td.push( ss ) ;
	}
	if ( td.length ) {
		for ( var i = td.length ; i < ncols ; i++ ) td.push( "<td />" ) ;
		tr.push( '<tr>' + td.join( "" ) + '</tr>' ) ;
	}
	var colspan = td.length || 1 ;
	if ( ! desc.title ) return s + '<tr height="12px"><td colspan="' + colspan + '" height="12px"><img src="/images/blank.gif" height="12px"/></td></tr>' + tr.join( "" ) + ' </tbody></table>' ;
	else return '<div class="square" style="margin-top: 6px">' + qsn_getHTMLmessage( desc.title ) + '</div>' + s + tr.join( "" ) + ' </tbody></table>' ;
}

function qsn_addradiotable( desc ) {
	if ( ! desc.radios.length ) desc.radios = qsn_makeradiolist( desc.radios.n , desc.radios.key , desc.radios.emptycells ) ;
	var n = desc.radios.length ; 
	if ( ! n ) return "" ;
	var ncols = desc.ncols || 1 ;
	if ( ! ncols ) ncols = 1 ;
	var nrows = n / ncols ;
	if ( ! desc.setsetting ) desc.setsetting = "q_handleradio" ;
	desc.thefunc = "onclick" ;
	var stemp = qsn_build_setting_string( desc ) ;
	var w = isIE_6 ? "170" : "100%" ;
	var s = '<table width="' + w + '" cellspacing="0" cellpadding="0" ' + stemp + '><tbody>' ;
	var tr=[] , td ;
	for ( var i = 0 ; i < n ; i++ ) {
		if ( i % ncols == 0 ) {
			if ( i > 0 ) tr.push( "<tr>" + td.join( "" ) + "</tr>" ) ;
			td=[] ;
		}
		var ss = "<td />" ;
		if ( desc.radios[ i ].length == 2 ) {
			var v = desc.radios[ i ][ 0 ] ;
			ss = '<td target="' + v + '"><a class="radio off" target="' + v + '" href="#" onclick="return false"><img target="' + v + '" src="/images/blank.gif" border="0" />' + qsn_getHTMLmessage( desc.radios[ i ][ 1 ] ) + '</a></td>' ;
		}
		td.push( ss ) ;
	}
	if ( td.length ) {
		for ( var i = td.length ; i < ncols ; i++ ) td.push( "<td />" ) ;
		tr.push( "<tr>" + td.join( "" ) + "</tr>" ) ;
	}
	
	var colspan = td.length || 1 ;
	if ( ! desc.title ) return s + '<tr height="12px"><td colspan="' + colspan + '" height="12px"><img src="/images/blank.gif" height="12px"/></td></tr>' + tr.join( "" ) + ' </tbody></table>' ;
	else return '<div class="square" style="margin-top: 6px">' + qsn_getHTMLmessage( desc.title ) + '</div>' + s + tr.join( "" ) + ' </tbody></table>' ;
	
}

function qsn_addtableimages( desc ) {  // tableau d'image : button veut dire une image qui change sur mouseover/out 
	desc.thefunc = "onclick" ;
	if ( desc.width === undefined ) desc.width= isIE_6 ? "170" : "100%" ;
	if ( desc.border === undefined ) desc.border = 0 ;
	if ( desc.cellspacing === undefined ) desc.cellspacing = 0 ;
	if ( desc.cellpadding === undefined ) desc.cellpadding = 0 ;
	if ( desc.align === undefined ) desc.align = "center" ;
	var cc = rgbcontrastcolor( getleftcolbackgroundcolor() ) ;
	if ( ! desc.offset ) desc.offset = 0 ;
	var s = '<table' ;
	var t = [ "border" , "cellspacing" , "cellpadding" , "width" , "offset" , "align" ] ;
	for ( var i in t ) s+= ( ' %s="%v"' ).replace( /%s/ , t[ i ] ).replace( /%v/ , desc[ t[ i ] ] ) ;
	s += qsn_build_setting_string( desc )  ;
	if ( desc.tablemargin === undefined ) desc.tablemargin = "10px 0 0 0px" ;
	if ( desc.tablemargin ) s += ' style="margin: ' + desc.tablemargin + '"' ;
	s += '><tbody><tr>' ;
	var tdatts = ' class="qsn_elemimg_off" align="center" valign="middle"  onmouseover ="this.className=this.className.replace( /_off/ , \'_onoff\' )" onmouseout="this.className=this.className.replace( /_onoff/ , \'_off\')"' ;
	var tdstyles = [] ;
	if ( desc.tdborder ) tdstyles = tdstyles.concat( [ "border-color:" + cc , "border-width:" + desc.tdborder ] ) ;
	else tdstyles.push( "border-width: 0px" ) ;
	if ( desc.tdovertransparent ) tdstyles.push( "background-color:transparent" ) ;
	tdatts += ' style="' + tdstyles.join( ";" ) + '"' ;
	var ttd = [ "width" , "height" ] ;
	for ( var i in ttd ) if ( desc[ "td" + ttd[ i ] ] != undefined ) tdatts += ' ' + ttd[ i ] + '="' + desc[ "td" + ttd[ i ] ] + '"'
	var nbimages = desc.table_number || ( desc.targets || desc.images ).length ;
	for ( var i = 0 ; i < nbimages ; i++ ) {
		if ( i && i % desc.ncols == 0 ) s += '</tr><tr>' ;
		var ii = i + desc.offset ;
		ii = desc.targets ? desc.targets[ ii ] : ii ;
		var imgsrc = desc.srcprefix ? ( '' + desc.srcprefix + ii + '.png' ) : desc.images[ i ] ;
		s+=imgsrc ? '<td target="' + ii + '"' + tdatts + '>' : '<td onclick="q_stopPropagation() ;">' ;
		if ( imgsrc ) {
			if ( desc.button ) {
				var img ;
				if ( isie6() ) img = 'background-image:url(\'/images/blank.gif\'); filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + escape( imgsrc ) + '\',sizingMethod=\'image\')' ;
				else img = 'background-image:url(\'' + escape( imgsrc ) + '\');' ; 
					
				ss = '<div style="height:32px; width:32px ; overflow:hidden; position:relative;top:0px;left:0px"><div target="' + ii + '" style="position:absolute;margin:0px;top:0px;left:0px;height:64px;width:32px;' + img + '"></div></div>' ;
				s += ss ;
			} else {
				if ( ( /\.png$/.test( imgsrc ) ) & isie6() ) s += '<img target="' + ii + '" src="/images/blank.gif" style=" height:32px ; width:32px ; border: solid 0px ' + cc + '; filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + escape( imgsrc ) + '\',sizingMethod=\'scale\')"/>' ;
				else s += '<img target="' + ii + '" src="' + escape( imgsrc ) + '" style=" height:32px ; width:32px ; border: solid 0px ' + cc + '"/>' ;
			}
		}
		s += '</td>' ;
	}
	s += '</tr></tbody></table>' ;
	if ( desc.msg != undefined ) s += '<span id="' + desc.className + '_message" class="leftcoltext" style="padding : 5px 0 px" >' + desc.msg + '</span>'
	return s ;
}

function qsn_getsettingtext( elem , target ) {
	if ( target.target ) return target.target ;
	var v = target.value ;
	if ( elem.getAttribute( "defaultstringblur" ) && ( v == qsn_getmessage( elem.getAttribute( "defaultstringblur" ) , qsn_edittarget.notekind ) ) ) v = "" ;
	return v ;
}

function qsn_setsettingtext( elem , v ) {
	var vv = v || "" ;
	if ( elem.getAttribute( "defaultstringfocus" ) && vv == "" ) vv = qsn_getmessage( elem.getAttribute( "defaultstringfocus" ) , qsn_edittarget.notekind ) ;
	if ( elem.value != vv ) elem.value = vv ;
}

function qsn_addtextinput( js ) {
	var notekind = qsn_edittarget.notekind ;
	if ( ! js.func ) js.thefunc = "onblur"  ;
	var rows = js.rows ? eval( js.rows ) : 1 ;
	var s ; 
	if ( rows > 1 ) s = '<textarea rows="' + rows +'"' ;
	else s = '<input' ;
	if ( js.onmousedown ) s += ' onmousedown="' + js.onmousedown + '"' ;
	else s += ' onmousedown="q_stopPropagation( event )"' ;
	if ( js.onclick ) s += ' onclick="' + js.onclick + '"' ;
	else s+= '  onclick="q_stopPropagation( event )" ' ; 
	if ( ! js.getsetting ) js.getsetting = "qsn_getsettingtext" ;
	if ( ! js.setsetting ) js.setsetting = "qsn_setsettingtext" ;
	s += qsn_build_setting_string( js )  ;
	if ( js.onfocus ) s += ' onfocus="' + js.onfocus + '"' ;
	var attributes = [ "defaultstringfocus" , "defaultstringblur" , "oninput" , "onpaste" , "onchange" , "onkeypress" , "onkeyup" , "title" ] ;
	for ( var i = 0 ; i < attributes.length ; i++ ) if ( js[ attributes[ i ] ] ) s += ( " %att='%value'" ).replace( /%att/ , attributes[ i ] ).replace( /%value/ , js[ attributes[ i ] ] ) ;
	if ( js.inputmargin ) s += 'style="margin : ' + js.inputmargin + '"' ;
	if ( rows > 1 ) s += '></textarea>' ;
	else s += '></input>' ;
	if ( ! js.title ) return s ;
	else return '<div class="square" style="margin-top: 6px">' + qsn_getHTMLmessage( js.title ) + '</div>' + s ;
}

function qsn_addcustom( target , js ) {
	return qsn_addleftcolelem( target , eval( js.html ).apply( this, [] )  , "" ) ;
}

/*
function -
function TEXT PROPERTIES / RADIO
function -
*/

function qsn_definefontfamilies( notekind , wantdefault ) {
	var h = qsn_handler( notekind , "qsn_definefontfamilies" , wantdefault ) ;
	if ( h ) return h() ;
	return [ "Arial, Helvetica, sans-serif" , "Times, 'Times New Roman', serif" , "Zapf-Chancery, 'Segoe Script', cursive" , "'Courier New', Courier, monospace" , "Verdana, sans-serif" ] ;
}

function qsn_addfontfamilies( target , js ) {
	var notekind = qsn_thenotes[ qsn_edittarget.id ].common.notekind ;
	var numberoffonts = qsn_definefontfamilies( notekind ).length ;
	if ( ! js.radios ) js.radios =qsn_makeradiolist( numberoffonts , ( js.msgnameprefix ==undefined ) ? "font" : js.msgnameprefix , js.emptycells ) ;
	if ( ! js.modifynote ) js.modifynote = "qsn_settextproperties" ;
	if ( ! js.className ) js.className = notekind + "_textfont_elem" ;
	if ( js.title === undefined ) js.title = "qsn_textfont" ;
	if ( ! js.ncols ) js.ncols = 1 ;
	var div = qsn_addleftcolelem( target , qsn_addradiotable( js ) , js.className ) ;
	var a = div.getElementsByTagName( "A" ) ; 
	for ( var i = 0 ; i < a.length ; i++ ) qsn_applytextrule( notekind , a[ i ] , i , "font" ) ;
	return div ;
}

function qsn_definefontsizes( notekind , wantdefault ) {
	var h = qsn_handler( notekind , "qsn_definefontsizes" , wantdefault ) ;
	if ( h ) return h() ;
	return [ "15px" , "12px" , "10px" ] ;
}

function qsn_definelineheights( notekind , wantdefault ) {
	var h = qsn_handler( notekind , "qsn_definelineheights" , wantdefault ) ;
	if ( h ) return h() ;
	return [ "18px" , "15px " , "13px" ] ;
}

function qsn_addfontfsizes( target , js ) {
	var notekind = qsn_thenotes[ qsn_edittarget.id ].common.notekind ;
	var numberofsizes = qsn_definefontsizes( notekind ).length ;
	var tt =qsn_makeradiolist( numberofsizes , js.msgnameprefix ==undefined ? "size" : js.msgnameprefix , js.emptycells ) ;
	return qsn_addleftcolelem( target , qsn_addradiotable( { "className" : "qsn_textsize_elem" , title : js.title===undefined ? "qsn_textsize" : js.title , jsonpath : js.jsonpath , modifynote : js.modifynote || "qsn_settextproperties" , ncols : js.ncols , radios : tt } ) , "qsn_textsize_elem" ) ;
}

function qsn_defineopacities( notekind , wantdefault ) {
	var h = qsn_handler( notekind , "qsn_defineopacities" , wantdefault ) ;
	if ( h ) return h() ;
	return [ 1 , 0.75 , 0.5, 0.25, 0 ] ;
}

function qsn_addopacities( target , js ) {
	var numberofopacities = qsn_defineopacities( qsn_edittarget.notekind ).length ;
	var tt =qsn_makeradiolist( numberofopacities , js.msgnameprefix ==undefined ? "opacity" : js.msgnameprefix , js.emptycells ) ;
	return qsn_addleftcolelem( target , qsn_addradiotable( { "className" : "qsn_textopacity_elem" , title : js.title===undefined ? "qsn_textopacity" : js.title , jsonpath : js.jsonpath , modifynote : "qsn_settextproperties" , ncols : js.ncols , radios : tt } ) , "qsn_textopacity_elem" ) ;
}

function qsn_definemargins( notekind , wantdefault ) {
	var h = qsn_handler( notekind , "qsn_definemargins" , wantdefault ) ;
	if ( h ) return h() ;
	return [ "0", "5px", "10px", "15px", "20px" ] ;
}

function qsn_definepaddings( notekind , wantdefault ) {
	var h = qsn_handler( notekind , "qsn_definepaddings" , wantdefault ) ;
	if ( h ) return h() ;
	return [ "0px", "5px", "10px", "15px", "20px" ] ;
}

function qsn_addmargins( target , js ) {
	var numberofmargins = qsn_definemargins( qsn_edittarget.notekind ).length ;
	var tt =qsn_makeradiolist( numberofmargins , js.msgnameprefix ==undefined ? "margin" : js.msgnameprefix , js.emptycells ) ;
	return qsn_addleftcolelem( target , qsn_addradiotable( { "className" : "qsn_textmargin_elem" , title : js.title===undefined ? "qsn_textmargin" : js.title , jsonpath : js.jsonpath , modifynote : js.modifynote || "qsn_settextproperties" , ncols : js.ncols , radios : tt } ) , "qsn_textmargin_elem" ) ;
}

function qsn_addpaddings( target , js ) {
	var numberofmargins = qsn_definepaddings( qsn_edittarget.notekind ).length ;
	var tt =qsn_makeradiolist( numberofmargins , js.msgnameprefix ==undefined ? "margin" : js.msgnameprefix , js.emptycells ) ;
	return qsn_addleftcolelem( target , qsn_addradiotable( { "className" : "qsn_textmargin_elem" , title : js.title===undefined ? "qsn_textmargin" : js.title , jsonpath : js.jsonpath , modifynote : "qsn_settextproperties" , ncols : js.ncols , radios : tt } ) , "qsn_textmargin_elem" ) ;
}

function qsn_definetextaligns( notekind , wantdefault ) {
	var h = qsn_handler( notekind , "qsn_definetextaligns" , wantdefault ) ;
	if ( h ) return h() ;
	return [ "left" , "right" , "center" , "justify" ] ;
}

function qsn_addtextaligns( target , js ) {
	var notekind = qsn_edittarget.notekind ;
	var numberoftextalign = qsn_definetextaligns( notekind ).length ;
	var tt =qsn_makeradiolist( numberoftextalign , js.msgnameprefix ==undefined ? "align" : js.msgnameprefix , js.emptycells ) ;
	return qsn_addleftcolelem( target , qsn_addradiotable( { "className" : "qsn_textalign_elem" , title : js.title===undefined ? "qsn_textalign" : js.title , jsonpath : js.jsonpath , modifynote : "qsn_settextproperties" , ncols : js.ncols , radios : tt } ) , "qsn_textalign_elem" ) ;
}

function qsn_definetextspacings( notekind , wantdefault ) {
	var h = qsn_handler( notekind , "qsn_definetextspacings" , wantdefault ) ;
	if ( h ) return h() ;
	return [ "-1px", "0px", "3px" ] ;
}

function qsn_addtextspacings( target , js ) {
	var notekind = qsn_edittarget.notekind ;
	var numberofspacings = qsn_definetextspacings( notekind ).length ;
	var tt =qsn_makeradiolist( numberofspacings , js.msgnameprefix ==undefined ? "spacing" : js.msgnameprefix , js.emptycells ) ;
	var div = qsn_addleftcolelem( target , qsn_addradiotable( { "className" : "qsn_textspacing_elem" , title : js.title===undefined ? "qsn_textspacing" : js.title , jsonpath : js.jsonpath , modifynote : "qsn_settextproperties" , ncols : js.ncols , radios : tt } ) , "qsn_textspacing_elem" ) ;
	var a = div.getElementsByTagName( "A" ) ; 
	for ( var i = 0 ; i < a.length ; i++ ) qsn_applytextrule( notekind , a[ i ] , i , "spacing" ) ;
	return div ;
}

function qsn_setsettingslider( elem , v ) {
	elem.target = v ;
	var notekind = qsn_edittarget.notekind ;
	ge( notekind + "_textsizeinfo" ).innerHTML = v ; 
	qsn_updateslider( notekind + "_textsizeslider", v ) ;
	var as = elem.getElementsByTagName( "A" ) ;
	var tmp = notekind + "_textsizemin" ;
	var vmin = window[ tmp ] ? eval( tmp ) : qsn_textsizemin ;
	as[ 0 ].target = vmin ;
	var vm = Math.floor( v / 10 ) ;
	vm = ( vm == v / 10 ) ? ( vm - 1 ) * 10 : vm * 10 ;
	as[ 1 ].target = ( vm < vmin ) ? vmin : vm ;
	tmp = notekind + "_textsizemax" ;
	var vmax = window[ tmp ] ? eval( tmp ) : qsn_textsizemax ;
	var vp = ( 1 + Math.floor( v / 10 ) ) * 10 ;
	as[ 2 ].target = vp > vmax ? vmax : vp ;
	as[ 3 ].target = vmax ;
}

function qsn_getsettingslider( tt , target ) {
	return target.target || tt.target ;
}
/*
function qsn_addtextsizeslider( target , js ) {
	if ( ! js.setsetting ) js.setsetting = "qsn_setsettingslider" ;
	if ( ! js.getsetting ) js.getsetting = "qsn_getsettingslider" ;
	if ( ! js.modifynote ) js.modifynote = "qsn_settextproperties" ;
	var notekind = qsn_edittarget.notekind ;
	js.className = notekind + "_textsizeslider_elem" ;
	js.thefunc = "onclick" ;
	var stemp = qsn_build_setting_string( js ) ;
	var s = "<div class='square'>" + qsn_message[ 'qsn_textsize:' ] + "<span id='%notekind_textsizeinfo'></span></div><div id='%notekind_textsizeslider_elem' " + stemp + " style='width: 150px; padding: 0;position:relative'><div style='width: 148px; line-height: 4px; height: 4px; border: solid 1px #ccc; padding: 0;'></div><div style='text-align: center; padding-top: 5px ; line-height: 20px'><table width='150' cellspacing='0' cellpadding='0' border='0'><tr><td align='left'><a href='#' onclick='return false'>%small</a></td><td align='right'><a class='button' href='#' onclick='return false'>-</a></td><td align='left'><a class='button' href='#' onclick='return false'>+</a></td><td align='right'><a href='#' onclick='return false'>%large</a></td></tr></table></div><div id='%notekind_textsizeslider' class='container' onmousedown='qsn_beginSlider( this , event )' style='position: absolute; left: 0px ; top: -5px ; width: 100px; max-width: 150px; text-align: right;'><img src='/images/blank.gif' alt='' style='cursor: pointer ; width: 16px ; height : 16px ; background: transparent url(\"/images/slider.png\") top right no-repeat; _background-image: url(\"/images/blank.gif\") ; _filter :progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\"/images/slider.png\",sizingMethod=\"image\") ;' /></div></div>" ;
	s = s.replace( /%notekind/g , notekind ).replace( /%small/ , qsn_message[ "small" ] ).replace( /%large/ , qsn_message[ "large" ] ) ;
	return qsn_addleftcolelem( target , s , notekind + "_textsizeslider_elem" ) ;
}

*/

function qsn_setsettingslidergen( elem , v ) {
	elem.target = v ;
	var notekind = qsn_edittarget.notekind ;
	var div = elem.parentNode ;
	var sliderinfo = gebcn( div , "sliderinfo" ) ;
	if ( sliderinfo ) sliderinfo.innerHTML = v ; 
	var theslider = gebcn( elem , "sliderslider" ) ;
	var vmin = eval( elem.getAttribute( "slidermin" ) ) ;
	var vmax = eval( elem.getAttribute( "slidermax" ) ) ;
	theslider.style.width = Math.round ( elem.fact * ( v - vmin ) ) + "px" ;
	var as = elem.getElementsByTagName( "A" ) ;
	as[ 0 ].target = vmin ;
	var vm = Math.floor( v / 10 ) ;
	vm = ( vm == v / 10 ) ? ( vm - 1 ) * 10 : vm * 10 ;
	as[ 1 ].target = ( vm < vmin ) ? vmin : vm ;
	var vp = ( 1 + Math.floor( v / 10 ) ) * 10 ;
	as[ 2 ].target = vp > vmax ? vmax : vp ;
	as[ 3 ].target = vmax ;
}

function qsn_moveSliderGenHandler( elem , ex , ey , ew ) {
	if ( qsn_currstate != "edit" ) return ;
	var tt = elem.parentNode ;
	var vmin = eval( tt.getAttribute( "slidermin" ) ) ;
	var vmax = eval( tt.getAttribute( "slidermax" ) ) ;
	elem.target = Math.round( Math.max( vmin, Math.min( vmax , vmin + ew / tt.fact ) ) ) ; 
	xqsn_default_handleclick( tt , elem ) ;
}

function qsn_beginSliderGen( elem , ee ) {
	beginDrag( elem , ee , qsn_moveSliderGenHandler ) ;
}

var slidernumber = 0 ; 
function qsn_addslider( target , js ) {
	if ( ! js.setsetting ) js.setsetting = "qsn_setsettingslidergen" ;
	if ( ! js.getsetting ) js.getsetting = "qsn_getsettingslider" ;
	var jstitle = js.title || "sliderlabel" ;
	var notekind = qsn_edittarget.notekind ;
	if ( js.sliderlabelmin == undefined ) js.sliderlabelmin = jstitle + "min" ;
	if ( js.sliderlabelmax == undefined ) js.sliderlabelmax = jstitle + "max" ;
	var sliderlabelmin = js.sliderlabelmin ;
	if (  sliderlabelmin != "" ) sliderlabelmin = qsn_getattributemessage( sliderlabelmin , notekind ) ;
	var sliderlabelmax = js.sliderlabelmax ;
	if (  sliderlabelmax != "" ) sliderlabelmax = qsn_getattributemessage( sliderlabelmax , notekind ) ;
	js.className = notekind + "_" + ( ( js.title == undefined || js.title == "" ) ? "slider" : js.title ) + ( slidernumber++ ) + "_slider_elem" ;

	js.thefunc = "onclick" ;
	var stemp = qsn_build_setting_string( js ) ;
	var msg = js.title ? qsn_getHTMLmessage( js.title , notekind ) : "" ;
	var s = '<div class="square">' + msg ;
	if ( js.sliderinfo ) s += '<span class="sliderinfo"></span>' ;

	s += '</div><div ' + stemp + ' slidermin="' + js.slidermin + '" slidermax="' + js.slidermax + '" style="width: 150px; padding: 0;margin-left: 13px ; position:relative"><div style="width: 148px; line-height: 4px; height: 4px; border: solid 1px #ccc; padding: 0;"></div><div style="text-align: center; padding-top: 5px ; line-height: 20px"><table width="150" cellspacing="0" cellpadding="0" border="0"><tr><td align="left"><a href="#" onclick="return false">' + sliderlabelmin + '</a></td><td align="right"><a class="button" href="#" onclick="return false">-</a></td><td width="2"> </td><td align="left"><a class="button" href="#" onclick="return false">+</a></td><td align="right"><a href="#" onclick="return false">' + sliderlabelmax + '</a></td></tr></table></div><div class="container sliderslider" onmousedown="qsn_beginSliderGen( this , event )" style="position: absolute; left: 0px ; top: -5px ; width: 100px; max-width: 150px; text-align: right;"><img src="/images/blank.gif" alt="" style="cursor: pointer ; width: 16px ; height : 16px ; background: transparent url(\'/images/slider.png\') top right no-repeat; _background-image: url(\'/images/blank.gif\') ; _filter :progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'/images/slider.png\',sizingMethod=\'image\') ;" /></div></div>' ;
	var div = qsn_addleftcolelem( target , s , js.className ) ;
	var dive = gebcn( div , js.className ) ;
	dive.fact = 150 / ( js.slidermax - js.slidermin ) ;
	return div ;
}

function qsn_addtextsizeslider( target , js ) {
	if ( ! js.title ) js.title = "qsn_textsize:" ;
	if ( ! js.modifynote ) js.modifynote = "qsn_settextproperties" ;
	var notekind = qsn_edittarget.notekind ;
	js.slidermin = window[ notekind + "_textsizemin" ] || qsn_textsizemin ;
	js.slidermax = window[ notekind + "_textsizemax" ] || qsn_textsizemax ;
	if ( js.sliderinfo != false ) js.sliderinfo = true ;
	qsn_addslider( target , js ) ;
}

/*
function -
function TEXT PROPERTIES / CHECKBOX
function -
*/

function qsn_addtextoptions( target , js ) {
	var topts = [] ;
	for( var i = 0 ; i < js.opts.length ; i++ ) {
		if ( js.opts[ i ] == "" ) topts.push( [] );
		else topts.push( { name : js.opts[ i ] , jsonpath : js.jsonpath + "." + js.opts[ i ] , modifynote : "qsn_settextproperties" } ) ;
	}
	var desc = { "className" : "qsn_textoption_elem" , title : js.title===undefined ? "qsn_textoptions" : js.title , ncols : js.ncols , checkboxes : topts } ;
	var div = qsn_addleftcolelem( target , qsn_addcheckboxtable( desc ) , "qsn_textoption_elem" ) ;
	var a = div.getElementsByTagName( "A" ) ; 
	var notekind = qsn_edittarget.notekind ;
	for ( var i = 0 ; i < a.length ; i++ ) 	qsn_applytextrule( notekind , a[ i ] , "true" , desc.checkboxes[ i ].name ) ; // [ 0 ] ) ;	
	return div ;
}


/*
function -
function HEADER + SIGNATURE
function -
*/

function qsn_headerhideshow_setsetting( elem , v ) {
	q_handleradio( elem , v ) ;
	visibleblock( gebcn( elem.parentNode , "qsn_headeroptionsmask" ) , ! eval( v ) ) ;
}

function qsn_addheaderhideshow( target , js ) {
	return qsn_addleftcolelem( target , qsn_addradiotable( { "className" : "qsn_headerdisplay_elem" , jsonpath: "header.display" , setsetting : "qsn_headerhideshow_setsetting" , modifynote : "qsn_modifyheadernote" , radios : [ [ "false" , "maskheader" ] , [ "true" , "displayheader" ] ] } ) + '<div class="qsn_headeroptionsmask" style="position: absolute; left: 0px; width: 185px; height: 280px; z-index: 5; opacity: 0.7; filter: alpha(opacity=70); display : none ; background-color : ' + club_menucolorpalette[ 0 ] + '"></div>\n<div class="qsn_headermask_content"></div>' , "qsn_headerdisplay_elem" ) ;
}

function qsn_modifyheadernote( id ) {
	var r = qsn_thenotes[ id ] ;
	r.header.text = gebcn( qsn_edittarget, "qlubcontainer_headertext" ).value ;
	qsn_container_renderheader( qsn_edittarget , r ) ;
	qsn_setcolors( id ) ;
}

function qsn_addheadercolor( target , js ) {
	//return qsn_addleftcolelem( target , '<div class="square" style="padding : 0px ; margin-top: 10px">' + qsn_getHTMLmessage( "headercolortitle" , qsn_edittarget.notekind ) + '</div>' + qsn_addradiotable( { "className" : "qsn_headercolor_elem" , jsonpath : "header.color" , modifynote : "qsn_modifyheadernote" , radios : [ [ "0" , "headercolorlikenote" ] , [ "white" , "headercolorwhite" ] , [ "black" , "headercolorblack" ] ] } ) , "qsn_headercolor_elem" ) ;
	js.jsonpath = "header.color";
	js.modifynote = "qsn_modifyheadernote" ;
	js.transparent = { target : "0" , message : qsn_message[ "headercolorlikenote" ] } ;
	return qsn_addqlubcolorblock( target, js) ;
}

function qsn_addheadericons( target , js ) {
	var notekind = qsn_edittarget.notekind ;
	var s = '<div class="square" style="margin-top: 10px">' + qsn_getHTMLmessage( "headericontitle" , notekind ) + '</div>\n<div class="qsn_iconstable" style="margin: 10px 0 0 0px"><table align="center" cellspacing="2" cellpadding="0" onmouseover = "q_coremouseio( event , \'btnbtn\' , function( target , ee ) { q_mouseoverbutton( target ) } )" onmouseout = "q_coremouseio( event , \'btnbtn\' , function( target , ee ) { q_mouseoutbutton( target ) } )" onclick="q_coremouseonclick( event , \'btnbtn\' , function( target , ee ) { q_mouseoutbutton( target ); qsn_headericon_handleclick( target ) ; } )"><tbody>' ;
	
	var icons = ["agreement.png", "alerts.png", "attachment.png", "baseball.png", "basketball.png", "billiard.png", "billiard8.png", "bomb.png", "bowling.png", "boxing.png", "briefcase.png", "bus.png", "butterfly.png", "calendarevents.png", "calendarred.png", "camera.png", "cleanup.png", "clockalarm.png", "compass.png", "dice.png", "download.png", "effects.png", "entertainmentmask.png", "error.png", "favorites.png", "football.png", "footsteps.png", "gift.png", "globe.png", "guitar.png", "heart.png", "help.png", "hockey.png", "iceskate.png", "information.png", "information2.png", "light.png", "motorcyclehelmet.png", "movieproduction.png", "newspaper.png", "phone.png", "pingpong.png", "popcorn.png", "pushpin.png", "reservations.png", "rugby.png", "savings.png", "sos.png", "statusflagblue.png", "statusflaggreen.png", "statusflagred.png", "statusflagyellow.png", "sunny.png", "symbolwarning.png", "target.png", "tennisball.png", "thumbsdown.png", "thumbsup.png", "trophy.png", "umbrella.png", "boy.png", "calculator.png", "diploma.png", "folder.png", "girl.png", "legal.png", "mouse.png", "pdf.png", "pencil.png", "schedule_boy.png", "schedule_girl.png", "shirt.png", "traffic_green.png", "traffic_red.png", "traffic.png"] ;

	var n = icons.length ;
	var ncols = 5 ;
	var nrows = 3 ;
	var iconbaseurl = "/services/wsg/images/iconsbuttons/" ;
	for ( var i = 0 ; i < Math.round( n / ncols ) ; i++ ) {
		if ( i < nrows ) s += '<tr>' ;
		else s += '<tr style="display: none">' ;
		for ( var j = 0 ; j < ncols ; j++ ) {
			if ( ( i * ncols + j ) < n ) s += '<td>' + qsn_addoneheadericon( iconbaseurl + icons[ i*ncols + j ] ) + '</td>' ;
			else s += '<td> </td>' ;
		}
		s += '</tr>' ;
	}
	s += '</tbody></table></div>\n<div class="qsn_iconsbuttons" style="margin: 10px 0 0 6px ; "><table cellspacing="0" cellpadding="5" border="0"><tbody><tr><td><a class="button" href="#" onclick="qsn_prevnextheadericons( this, -1 ); return false" title="' + qsn_getattributemessage( "headericonprevious" , notekind ) + '" style="visibility: hidden; padding : 2px 5px;">«</a></td><td><a class="button" href="#" onclick="qsn_headericon_handleclick( ); return false" style="padding : 2px 5px;">' + qsn_getHTMLmessage( "headericonnone" , notekind ) + '</a></td><td><a class="button" href="#" onclick="qsn_prevnextheadericons( this, 1 ); return false" title="' + qsn_getHTMLmessage( "headericonnext" , notekind ) + '" style="padding : 2px 5px;">»</a></td></tr></tbody></table></div>' ;
	var div = qsn_addleftcolelem( target , s ) ;
	return div ;
}

function qsn_prevnextheadericons( x, v ) {
	var t = gebcn( getContainer( x , "qsn_iconsbuttons" ).parentNode , "qsn_iconstable" ).getElementsByTagName( "TABLE" )[ 0 ] ;
	var n = t.rows.length ;
	if ( ! t.pos ) t.pos = 0 ;
	t.pos += ( v * 3 ) ;
	if ( t.pos < 0 ) t.pos = 0 ;
	if ( t.pos > n - 1 ) t.pos = n - 1 ;
	var tr ;
	for ( var i=0; i < n; i++ ) {
		if ( ( i >= t.pos ) && ( i < t.pos + 3 ) ) showblock( t.rows[ i ] ) ;
		else hideblock( t.rows[ i ] ) ;
	}
	var b = x.parentNode.parentNode.getElementsByTagName( "A" ) ;
	b[ 0 ].style.visibility = ( t.pos > 0 ) ? "visible" : "hidden" ;
	b[ 2 ].style.visibility = ( t.pos + 3 < n - 1 ) ? "visible" : "hidden" ;
}

function qsn_addoneheadericon( iconurl ) {
	var sie6 = ( isie6() ) ? ' _background-image: url(\'/images/blank.gif\') ; _filter : progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'' + iconurl + '\',sizingMethod=\'image\' ) ;' : '' ;
	return '<div class="btnbtn" style="width: 32px; height: 32px">\n<div class="divimg" style="top : 0px ; left :0px ;width: 32px; height: 64px; background-image : url(' + iconurl + ') ;' + sie6 + '"></div>\n</div>' ;
}

function qsn_headericon_handleclick( x ) {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	if ( x ) r.header.icon = q_pngbgimagename( x ) ;
	else r.header.icon = "" ;
	qsn_setcolors( qsn_edittarget.id ) ;
}

function xqsn_addheadercolor( target , js ) { // obso à changer dans toutes les notes
	return qsn_addheadercolor( target , js ) ;
}

function xqsn_addheadericons( target , js ) {// obso à changer dans toutes les notes
	return qsn_addheadericons( target , js ) ;
}

function qsn_addsignature( target , js ) {
	return qsn_addleftcolelem( target , qsn_addradiotable( { "className" : "qsn_signature_elem" , jsonpath : js && js.jsonpath ? js.jsonpath : "showsignature" , radios : [ [ "false" , "masksignature" ] , [ "true" , "displaysignature" ] ] } ) , "qsn_signature_elem" ) ;
}

/*
function -
function COLOR BLOCK
function -
*/

function qsn_getcolorsetting( elem , target ) {
	if ( target.getAttribute( "target" ) == undefined ) target = getContainer( target , "colorcontainer" ) ;
	if ( target.getAttribute( "target" ) != "othercolor" ) {
		value = target.getAttribute( "target" ) ;
		return value ;
	} else {
		var c = qsn_thenotes[ qsn_edittarget.id ].color;
		return [ qlub_colorsblockopen , [ getrealcolor( c ) , xqsn_default_handleclick2 , [ elem ] , true ] ] ;
	}
}

function qsn_setcolorsetting( elem , v ){ // on reçoit rgb(255, 0, 0) au lieu de (100% etc) mais en fait sur Safari rgb(%,%,%)
	if ( v == null ) return ;
	if ( elem.oldselected && ge( elem.oldselected ) ) {
		var x = ge( elem.oldselected ) ;
		x.style.borderColor= "#CCC" ;
		x.style.borderWidth = "1px" ;
		x.style.lineHeight = "18px" ;
		x.style.width = "18px" ;
		x.style.height = "18px" ;
		x.isselected = null ;
	}
	var id = ( elem.idprefix || elem.getAttribute( "idprefix" ) || "" ) + "tableid_" ;
	var c = v ;
	if ( (/^rgb/).test( v ) && ! (/%/).test( v ) ) v = rgb100( v ) ;
	if ( (/^rgb/).test( v ) ) {
		id += v.replace( /%,/g , "_" ).replace( /[^0-9^_]/g , "" ) ;
		if ( ! ge( id ) ) {
			id = ( elem.idprefix || elem.getAttribute( "idprefix" ) || "" ) + "tableid_othercolor" ;
			c = ( ge( id ) && ( ge( id ).targetcolor || ge( id ).getAttribute( "targetcolor" ) ) ) || "rgb(255,255,255)" ;
		}
	} else {
		if ( v == "-1" || v == "0" ) id += "m1" ;
		else id += v ;
		c = ( ge( id ) && ( ge( id ).targetcolor || ge( id ).getAttribute( "targetcolor" ) ) ) || "rgb(255,255,255)" ;
	}
	elem.oldselected = id ;
	var x = ge( id ) ;
	if ( ! x ) return ;
//	x.style.borderColor = ( club_sitecolorpalette && club_sitecolorpalette[ 6 ] ) || "#0F0" ;
	x.style.borderColor = rgbcontrastcolor150( c ) ;
	x.style.borderWidth = "3px" ;
	x.style.lineHeight = "14px" ;
	x.style.width = "14px" ;
	x.style.height = "14px" ;
	x.isselected = "true" ;
}

function switch_transparent ( elem, mode) {
	// patch button class
	return ;
	if ( mode == "out" ) elem.style.color = rgbcontrastcolor150 ( getleftcolbackgroundcolor( ) ) ;
	else elem.style.color = "#CCC" ;
} ;


function xswitch_qlub_colors ( x , mode ) {
	if ( x.isselected ) return ;
	if ( mode == "over" ) {
		x.style.border = "1px solid" ;
		x.style.borderColor = rgbcontrastcolor150 (getleftcolbackgroundcolor( )) ;
	} else x.style.border = "solid 1px #CCC" ;
} 

function define_default_colors() {
	return ["rgb(50%,0%,0%)","rgb(50%,50%,0%)","rgb(0%,50%,0%)","rgb(0%,50%,50%)","rgb(0%,0%,50%)","rgb(50%,0%,50%)","rgb(50%,50%,50%)","rgb(50%,25%,0%)","rgb(25%,50%,0%)","rgb(0%,50%,25%)","rgb(0%,25%,50%)","rgb(25%,0%,50%)","rgb(50%,0%,25%)","rgb(25%,25%,25%)","rgb(100%,0%,0%)","rgb(100%,100%,0%)","rgb(0%,100%,0%)","rgb(0%,100%,100%)","rgb(0%,0%,100%)","rgb(100%,0%,100%)","rgb(100%,100%,100%)","rgb(100%,50%,0%)","rgb(50%,100%,0%)","rgb(0%,100%,50%)","rgb(0%,50%,100%)","rgb(50%,0%,100%)","rgb(100%,0%,50%)","rgb(80%,80%,80%)","rgb(100%,40%,40%)","rgb(100%,100%,40%)","rgb(40%,100%,40%)","rgb(40%,100%,100%)","rgb(40%,40%,100%)","rgb(100%,40%,100%)","rgb(40%,40%,40%)","rgb(100%,80%,40%)","rgb(80%,100%,40%)","rgb(40%,100%,80%)","rgb(40%,80%,100%)","rgb(80%,40%,100%)","rgb(100%,40%,80%)","rgb(0%,0%,0%)"] ;
}

function xqsn_makecolortable( options ) { // options : colors, ids, cols, tableclass, callback?, idprefix
	var table_colors = options.colors || define_default_colors() ;  // le tableau des couleurs doit être un tableau de string "rgb" ou des string de couleurs reconnues par background-color : "red" , ... ou un array de 2 éléments : [ target , color ]
	var table_cols = options.cols || 7 ;
	var idprefix = options.idprefix || "" ;
	

	var s = '<table cellpadding="0" cellspacing="3" align="center"><tbody><tr>' ;

	var tc ;
	for( var i = 0 ; i < table_colors.length ; i++ ) {
		var colorvalue = table_colors[ i ] ;
		if ( ( typeof colorvalue ) == "string" ) {
			var target = null ;
			var c = colorvalue ;
			if ( (/^rgb/).test( c ) && ! (/%/).test( c ) ) c = rgb100( c ) ;
			var id = idprefix + "tableid_" + colorvalue.replace( /,/g , "_" ).replace( /[%rgb() ]/g , "" ) ;
		} else { // array [ target , color ]
			var target = colorvalue[ 0 ] ;
			var c = colorvalue[ 1 ] ;
			var id = idprefix + "tableid_" + target ;
		}
		if ( i != 0 && i % table_cols == 0 ) s += "</tr><tr>" ;
		s += '<td id="' + id + '" style="width:18px; height:18px; line-height:18px ; border : solid 1px #CCC ; cursor: pointer ; background-color:' + c + '" align="left" target="' + ( target || c ) + ( ( target ) ? ( '"  targetcolor="' + c ) : '' ) + '" onmouseover="xswitch_qlub_colors( this, \'over\' )" onmouseout="xswitch_qlub_colors( this, \'out\' ) "> </td>';
	}
	s += "</tr></tbody></table>" ;
	return s ;
}

function qsn_definesitecolorblock( options ) {
	var nbc = 7 ;
	if ( options && options.nbc ) nbc = options.nbc ;
	var defaultcolorindexes = [] ;
	if ( options && options.colors ) defaultcolorindexes = options.colors ;
	else for ( var i = 0 ; i < nbc ; i++ ) defaultcolorindexes.push( i ) ;
	var c = getsncontextualbackgroundcolors( nbc ) ;
	var defaultsitecolorstable = [] ;
	for ( var i in defaultcolorindexes ) defaultsitecolorstable.push( [ "" + ( defaultcolorindexes[ i ] + 1 ) , c[ defaultcolorindexes [ i ] ] ] ) ;
	return { title : "sitecolor" , colors : defaultsitecolorstable } ;
}

function qsn_define_c1c2BW_and_more_colorblock() {
	return { kind : "c1c2BW_and_more" } ;
}

function qsn_defineothercolorblock() {
	return { title : "otherscolors" } ;
}

function qsn_addoldqlubcolorblock( target , js ) {
	var jscolorblocks = [] ;
	jscolorblocks.push( qsn_definesitecolorblock() ) ;
	if ( js.others ) jscolorblocks.push( qsn_defineothercolorblock() ) ;
	js.colorblocks = jscolorblocks ;
	qsn_addcolorcontrol( target , js ) ;
}

function qsn_addqlubcolorblock( target , js ) {
	var jscolorblocks = [] ;
	jscolorblocks.push( qsn_define_c1c2BW_and_more_colorblock() ) ;
	js.colorblocks = jscolorblocks ;
	qsn_addcolorcontrol( target , js ) ;
}

function qsn_colorblock_c1c2BW_and_more( js ) {
	return '<table cellpadding="0" cellspacing="0" align="center"><tbody><tr><td valign="middle">' + xqsn_makecolortable( { colors : [ [ "c1" , club_siteelemscolor.c1 ] , [ "c2" , club_siteelemscolor.c2 ] , "rgb(0%,0%,0%)" , "rgb(100%,100%,100%)" ] , cols : 2 , idprefix : js.idprefix } ) + '</td><td width="6"> </td><td width="92" valign="middle"  onmouseover="switch_transparent( this, \'over\' )" onmouseout="switch_transparent( this, \'out\' )" style="border : solid 1px #CCC ; cursor: pointer ;" class="colorcontainer" target="othercolor" id ="' + js.idprefix + 'tableid_othercolor"><table width="100%"><tr><td><img src="/images/othercolors_32.png" class="png" border="0" /></td><td valign="middle" align="left"><a href="#" onclick="return false;">' +qsn_message[ "morecolors" ] + '</a></td></tr></table></td></tr></table>' ;
}

function qsn_addcolorcontrol( target , js ) {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	
	// container des tables de couleur qui possède jsonpath, ...
	var notekind = qsn_edittarget.notekind ;
	js.className = notekind + "_" + js.jsonpath.replace( /\./g , "_" )  + "_elem" ; 
	js.idprefix = js.idprefix || js.className ;
	js.thefunc = "onclick" ;
	js.setsetting = js.setsetting || "qsn_setcolorsetting" ;
	js.getsetting = js.getsetting || "qsn_getcolorsetting" ;
	var s = '<div ' + qsn_build_setting_string( js ) + '>' ;

	if ( js.title !== undefined && js.title != "" ) s += '<div class="square changecolortitle">' + qsn_getHTMLmessage( js.title , qsn_edittarget.notekind ) + '</div>' ;
	
	// blocs de couleurs
/*
array de json, chaque json :
{ [ title : "le_titre" ] , [ colors : [ array des couleurs conforme à xqsn_makecolortable ] }
*/	
	if ( js.colorblocks ) {
		for ( var i in js.colorblocks ) {
			var jscolor = js.colorblocks[ i ] ;
			var kind = jscolor.kind ;
			if ( kind == "c1c2BW_and_more" ) s+= qsn_colorblock_c1c2BW_and_more( js ) ;
			else {
				var title = "" , top = 6 ;
				if ( jscolor.title !== undefined ) title = jscolor.title ;
				if ( title == "" ) top = 0 ;
				s += '<div class="leftcoltext" style="padding-top: ' + top + 'px">' + qsn_getHTMLmessage( title , qsn_edittarget.notekind ) + '</div>' ;
				jscolor.idprefix = js.idprefix ;
				if ( ! jscolor.cols && js.cols ) jscolor.cols = js.cols ;
				s += xqsn_makecolortable( jscolor ) ;
			}
		}
	}
	
	// transparent
	if ( js.transparent ) {
		s += '<div style="text-align:center; margin-top:10px"><a class="button" id="' + js.idprefix + 'tableid_m1" target="' + ( ( js.transparent == true ) ? '-1' : js.transparent.target ) + '" targetcolor="' + getleftcolbackgroundcolor() + '" href="#" onmouseover="switch_transparent( this, \'over\' )" onmouseout="switch_transparent( this, \'out\' )" onclick="return false">' + ( ( js.transparent == true ) ? qsn_message[ "transparent" ] : js.transparent.message ) + '</a></div>' ;
	}
	
	// menuseparator
	if ( js.menuseparator ) s += '<div class="menuseparator"></div>' ;

	s += '</div>' ;
	var div = qsn_addleftcolelem( target , s , js.className ) ;

}

/*
function -
function LINKS
function -
*/

function qsn_validlink( s ) {
	return q_validlink( s ) ;
}

function qsn_definelinks( notekind , wantdefault ) {
	var h = qsn_handler( notekind , "qsn_definelinks" , wantdefault ) ;
	if ( h ) return h() ;
	return [ 0 , 1 , 2 , 6, 3 , 5 , 4 ] ;
}

function qsn_addlinks( target , js ) {
	var notekind = qsn_edittarget.notekind ;
	var linktypes = qsn_definelinks( notekind ) ;
	var numberoflinks = linktypes.length ;
	var tt =new Array( numberoflinks ) ; 
	for ( var i = 0 ; i < tt.length ; i++ ) tt[ i ] = [ "" + linktypes[ i ] , "link" + linktypes[ i ] ] ;
	var div = qsn_addleftcolelem( target , qsn_addradiotable( { "className" : notekind + "_link_elem" , title : js.title===undefined ? "qsn_linktitle" : js.title , jsonpath : js.jsonpath + ".kind" , setsetting : "qsn_link_setsetting" , getsetting : "qsn_link_getsetting" , ncols : js.ncols , radios : tt, modifynote : js.modifynote } ) , notekind + "_link_elem" ) ;
	var table = gebtn( div, "table" ) ;
	var tds = table.getElementsByTagName( "TD" ) ;
	for ( var i = 0 ; i < numberoflinks ; i++ ) {
		switch( eval( linktypes[ i ] ) ) {
		case( 0 ) : // aucun lien
			break ;
		case( 1 ) : // web page
			var cln = notekind + "_link_urlinput_elem" ;
			var div_urlinput = create_elem( "DIV" , { id:notekind + "_link_urlinput" , style: {display:"none"} } ) ; // accolades display: none ajoutées suite maj JP #1580 09_05_15
			tds[ i ].appendChild( div_urlinput ) ;
			var desc =  { "className" : cln , rows : 3 , jsonpath: js.jsonpath +".address" , setsetting : "qsn_setsettingtext" , defaultstringfocus: "link", defaultstringblur: "http://" , onfocus:"qsn_focusdefault( this, 'link')" , onblur:"qsn_default_handleclick( this , event );" , addtofunc:"q_filterinput( this , qsn_validlink );"} ; 
			qsn_addleftcolelem( div_urlinput , qsn_addtextinput ( desc ) , cln ) ; 
			break ;
		case( 2 ) : // site page
			var cln = notekind + "_link_selectpage_elem" ;		
			var div_selectpage = create_elem( "DIV" , { id:notekind + "_link_selectpage" , style: {display:"none" , paddingLeft : "10px" } } ) ;
			tds[ i ].appendChild( div_selectpage ) ;
			var pageselect = new Array() ;
			var pagelink = qsn_thenotes[ qsn_edittarget.id ][ js.jsonpath ].pagelink ; 
			for ( var k in sitemap ) {
				var smi = sitemap[ k ] ;
				var options = [] ;
				for ( var j = 0 ; j < smi.links.length ; j++ ) {
					var t = [ smi.links[ j ] , q_svcfromid( smi.links[ j ] ).shortname ] ;
					if ( smi.links[ j ] == currsvcid ) t.push( true ) ;// on disable la page courante
					options.push( t ) ;
				}
				pageselect.push( { label : common_message[ "rubric" ] + " \"" + smi.name + "\"" , options : options } ) ;
			}
			var desc =  { "className" : cln , jsonpath: js.jsonpath + ".pagelink" , selects : pageselect , selected : ( pagelink ) ? pagelink : null } ; 
			qsn_addleftcolelem( div_selectpage , qsn_addselect( desc ) , cln );
			break ;
		case( 3 ) : // file
			var cln = notekind + "_link_selectfile_elem" ;		
			var div_selectfile = create_elem( "DIV" , { id: notekind + "_link_selectfile" , style: {display:"none"} } ) ;
			tds[ i ].appendChild ( div_selectfile ) ;
			var desc =  { "className" : cln , jsonpath: js.jsonpath + ".filename" , setsetting : "qsn_setsettingfile" ,  defaultstringblur : "nofile" , onfocus:"qsn_focusdefault( this, \'nofile\')" , onchange:"return false" ,  onkeypress:"return false", onkeyup:"return false" , onclick:"q_stopPropagation( event ); qsn_launch_upload(\'file\'); return false;" } ; 
			qsn_addleftcolelem( div_selectfile , qsn_addtextinput ( desc ) , cln ) ; 
			break ;
		case( 4 ) : // js
			var cln = notekind + "_link_jsinput_elem" ;
			var div_jsinput = create_elem( "DIV" , { id:notekind + "_link_jsinput" , style: {display:"none"} } ) ; // accolades display: none ajoutées suite maj JP #1580 09_05_15
			tds[ i ].appendChild( div_jsinput ) ;
			var desc =  { "className" : cln , rows : 3 , jsonpath: js.jsonpath + ".js" , setsetting : "qsn_setsettingtext" , getsetting : "qsn_getsettingjslink" } ; 
			qsn_addleftcolelem( div_jsinput , qsn_addtextinput ( desc ) , cln ) ; 
			break ;
		case( 5 ) : // mailto
			var cln = notekind + "_link_mailtoinput_elem" ;
			var div_mailtoinput = create_elem( "DIV" , { id:notekind + "_link_mailtoinput" , style: { display:"none" } } ) ; // accolades display: none ajoutées suite maj JP #1580 09_05_15
			tds[ i ].appendChild( div_mailtoinput ) ;
			var desc =  { "className" : cln , rows : 3 , jsonpath: js.jsonpath + ".mailto" , setsetting : "qsn_setsettingtext" } ; 
			qsn_addleftcolelem( div_mailtoinput , qsn_addtextinput ( desc ) , cln ) ; 
			break ;
		case( 6 ) : // note
			var cln = notekind + "_link_noteinput_elem" ;
			var div_noteinput = create_elem( "DIV" , { id:notekind + "_link_noteinput" , style : { display : "none" } } ) ;
			tds[ i ].appendChild( div_noteinput ) ;
			var desc =  { "className" : cln , rows : 1 , jsonpath: js.jsonpath + ".note" , setsetting : "qsn_setsettingtext", onchange:"return false" ,  onkeypress:"return false", onkeyup:"return false" , onclick:"q_stopPropagation( event ); qsn_selectnote(); return false;" } ; 
			qsn_addleftcolelem( div_noteinput , qsn_addtextinput ( desc ) , cln ) ; 
			break ;
		}
	}	
	return div ;
}

function qsn_getsettingjslink( elem , target ) {
	var v = target.value ;
	return v.replace( /<[^ ]/g , "< " ) ;
}

function qsn_link_getsetting( tt , target ) {
	return target.target ;// uniquement le kind
}

/*
//#1644 : modification du fonctionnement = on enregistre les valeurs des champs de texte ou des selects dans le json sur différents events.
function qsn_link_setsetting( tt , r ) {
	var x = eval( r ) ;
	tt.address = x.address || "" ; 
	q_handleradio( tt , x.kind ) ;
	qsn_hideshowlinks( tt , r ) ;
}

*/

function qsn_link_setsetting( elem , v ) {
	q_handleradio( elem , v ) ;
	if ( elem.visibleblock ) hideblock( elem.visibleblock ) ;
	var visibleblock = null ;
	switch( parseInt( v , 10 ) ) {
		case( 0 ) : // no link
			break ;
		case( 1 ) : // web page
			visibleblock = "_link_urlinput"  ;
			break ;
		case( 2 ) : // site page
			visibleblock = "_link_selectpage" ;
			break ;
		case( 3 ) : // file
			visibleblock = "_link_selectfile" ;
			break ;
		case( 4 ) : // js
			visibleblock = "_link_jsinput" ;
			break ;
		case( 5 ) : // mailto
			visibleblock = "_link_mailtoinput" ;
			break ;
		case( 6 ) : // note
			visibleblock = "_link_noteinput" ;
			break ;
	}
	if ( visibleblock ) {
		visibleblock = qsn_edittarget.notekind + visibleblock ;
		elem.visibleblock = visibleblock ;
		showblock( visibleblock ) ;
		//vh 100517 : chaque interface de lien s'initialise très bien toute seule alors que la ligne ci-dessous "casse" l'initialisation du select des pages
		//if ( parseInt( v , 10 ) == 2 ) xqsn_default_handleclick( gebcn( visibleblock , visibleblock + "_elem" ) ) ; //sinon, si l'utilisateur ne change pas la valuer du select, aucune info n'est mémorisé.
	}
}

/*
//#1644 : modification du fonctionnement = on enregistre les valeurs des champs de texte ou des selects dans le json sur différents events.
function qsn_hideshowlinks( tt , value ) {
	var x = eval( value ) ;
	var v = eval( x.kind ) ;
	var notekind = qsn_edittarget.notekind ;
	var ta = gebcn ( ge ( notekind + "_link_input" ) , notekind + "_textarea" ) ;
	ta.value = "" ;
	switch( v ) {
		case( 0 ) :
			hideblock( [ notekind + "_link_input", notekind + "_link_selectpage" ] ) ;
			break ;
		case( 1 ) :
			hideshowblock( notekind + "_link_selectpage", notekind + "_link_input" ) ;
			ta.value = x.address || "" ;	
			qsn_blurdefault( ta, "link" ) ;
			break ;
		case( 2 ) :
			hideshowblock( notekind + "_link_input", notekind + "_link_selectpage" ) ;
			break ;
	}
}
*/
function qsn_hideshowlinks( tt , v ) {
	var hideblocks = [ notekind + "_link_urlinput", notekind + "_link_selectpage", notekind + "_link_selectfile", notekind + "_link_jsinput" , notekind + "_link_mailtoinput", notekind + "_link_noteinput"] ;
	switch( parseInt( v, 10 ) ) {
		case( 0 ) : // no link
			hideblock( hideblocks ) ;
			break ;
		case( 1 ) : // web page
			hideshowblock( hideblocks , notekind + "_link_urlinput" ) ;
			break ;
		case( 2 ) : // site page
			hideshowblock( hideblocks , notekind + "_link_selectpage" ) ;
			break ;
		case( 3 ) : // file
			hideshowblock( hideblocks , notekind + "_link_selectfile" ) ;
			break ;
		case( 4 ) : // js
			hideshowblock( hideblocks , notekind + "_link_jsinput" ) ;
			break ;
		case( 5 ) : // mailto
			hideshowblock( hideblocks , notekind + "_link_mailtoinput" ) ;
			break ;
		case( 6 ) : // note
			hideshowblock( hideblocks , notekind + "_link_noteinput" ) ;
			break ;
	}
}

var qsn_upload_request = {
	"callerid" : "" ,
	"uploadkind" : "" ,
	"title" : "" ,
	"prompt" : "" ,
	"multiple" : false ,
	"extensions" : [ ] ,
	"namingdata" : { "wantname" : false } ,
	"formats" : "screen",
	"callback" : "",
	"resize" : true ,
	"resize_option" : { "ratio" : "image" } ,
	"transparency" : "image" ,
	"cancel": { } ,
	"web" : false ,
	"webcallback" : ""
} ;

function qsn_launch_upload( x ) {
	if ( x == "file" ) {
		qsn_upload_request.uploadkind = "" ;
		qsn_upload_request.callback = "qsn_uploadfile_done" ;
		qsn_upload_request.cancel = { "callback" : "qsn_uploadfile_cancel", "args" : [] } ;
		qsn_upload_request.prompt = qsn_message[ "selectafile" ] ;
		qsn_upload_request.formats = "screen halfscreen quarterscreen" ;
		qsn_upload_request.title = qsn_message[ "uploadtitlefile" ] ;
		qsn_upload_request.extensions = [] ;
		qsn_upload_request.callerid = qsn_edittarget.id ;
		qsn_upload_request.web = false ;
		qdyn_qorgload( 'qu_reveal', [ qsn_upload_request ], 'qu' ) ;
	}
}

function qsn_uploadfile_done( x ) {
	var notekind = qsn_edittarget.notekind ;
	var h = qsn_handler( notekind , "qsn_uploadfile_done" ) ;
	if ( h ) return h( x ) ;
	if ( x && x.files && x.files[ 0 ] ) {
		var n = x.files[ 0 ].filename ;
		var inp = gebtn( ge( notekind + "_link_selectfile" ), "input" ) ;
		inp.target = n ; 
		inp.value = n.replace( /.*\/([^\/]*$)/g, "$1") ;
		xqsn_default_handleclick( inp , inp ) ;
	}
	return false ;
}

function qsn_setsettingfile( elem , v ) {
	v = v || "" ;
	elem.target = v ; 
	elem.value = v.replace( /.*\/([^\/]*$)/g, "$1") ;
}

function qsn_uploadfile_cancel() {
	var h = qsn_handler( qsn_edittarget.notekind , "qsn_uploadfile_cancel" ) ;
	if ( h ) return h() ;
	return false ;
}

function qsn_selectnote(){
	qsn_undimall();
	showblock("q_fullscreenmask");
	var thelist = qsn_noteidslist;
	var noteid;
	for (var i in thelist) {
		var div = ge( thelist[ i ] );
		if ( div ) {
			var isalign = pages_getpageformat();
			if ( ! isalign ) qsn_selectnote_movenoteinfsm( div, "move" ) ;
			else { self.location.hash = "#" + div.id; window.scrollBy( 0, -200 ) ; }		
			var text = "";
			if ( qsn_thenotes[ div.id ].header && qsn_thenotes[ div.id ].header.text) text = qsn_thenotes[ div.id ].header.text;
			else if ( qsn_thenotes[ div.id ].text) text = qsn_thenotes[ div.id ].text;
			if ( text != "" ) text = text.slice( 0,30 ) + "...";
			var divnotekind = qsn_thenotes[ div.id ].common.notekind;
			divnotekind = eval( divnotekind + "_message[\"plug\"].split(\"_\")[0]" ) || divnotekind;
			if ( confirm( qsn_message[ "selectnote" ].replace( "%s", thelist[ i ] ).replace( "%v", divnotekind ) + "\n\"" + text + "\"" ) ) {
				noteid = thelist[ i ];
				if ( ! isalign ) qsn_selectnote_movenoteinfsm( div, "remove" ) ;
				break;
			}
			if ( ! isalign ) qsn_selectnote_movenoteinfsm( div, "remove" ) ;
		}
	}
	qsn_dimothers( qsn_edittarget.id );
	hideblock("q_fullscreenmask");
	
	var notekind = qsn_edittarget.notekind ;
	if ( noteid ) {
		var inp = gebtn( ge( notekind + "_link_noteinput"), "INPUT" );
		inp.target = noteid ; 
		inp.value = noteid ;
		xqsn_default_handleclick( inp , inp ) ;
	} else return false ;
}

function qsn_selectnote_movenoteinfsm( div, mode) {
	if ( mode == "move" ) {
		var ww = q_windowInnerWidth() ;
		div.style.top = "230px" ;
		div.style.left = ( ww - parseInt( div.style.width, 10 ) ) / 2 + "px" ;
		ge( "q_fullscreenmask" ).appendChild( div ) ;
	} else {
		var r = qsn_thenotes[ div.id ];
		div.style.top = r.spacedefaults.common.top;
		div.style.left = r.spacedefaults.common.left;
		ge( "q_author_stuff" ).appendChild( div ) ;
	}
}



var qsn_message = {
"duplicationinprogress" : "L'opération de duplication est en cours. Veuillez patienter..." ,
"suppressnote" : "Êtes-vous certain de vouloir supprimer cette note ?" ,
"suppressreplynote" : "Êtes-vous certain de vouloir supprimer cette réponse ?" ,
"notviewmode" : "Opération impossible pour l'instant. Si une note est actuellement en mode édition, cliquez d'abord sur annuler ou sur ok." ,
"plug" : "Vos smartnotes_Choisissez celles que vous voulez avoir toujours sous la main." ,
"newnoteprompt" : "cliquez ici pour rédiger une nouvelle note" ,
"inviteusername" : "Veuillez indiquer un nom pour signer votre message." ,
"undefineduser" : "membre inconnu",
"missingeditblocks" : "missing in editblocks html",
"notecolor" : "Couleur de la note",
"color" : "Couleur",
"sitecolor" : "Couleurs du site :" ,
"morecolors" : "autres couleurs",
"otherscolors" : "Autres couleurs :",
"transparent" : "fond transparent" ,
"undefinedhandler" : "Cette fonction n'est pas disponible. Veuillez nous excuser." ,
"undefinedtip" : "(aide non disponible)" ,
"tip_edit" : "modifier la note" ,
"tip_replyto" : "répondre à la note" ,
"tip_reduce" : "réduire" ,
"tip_expand" : "agrandir" ,
"tip_hideanswers" : "masquer les réponses" ,
"tip_showanswers" : "voir les réponses" ,
"tip_suppress" : "supprimer la note" ,
"tip_suppressreply" : "supprimer la réponse" ,
"tip_duplicate" : "dupliquer la note" ,
"tip_rich" : "décorer la note" ,
"tip_help" : "aide" ,
"tip_sendtobckg" : "mettre en arrière-plan" ,
"tip_move" : "déplacer la note",
"notetitleprompt" : "Cliquez ici pour ajouter un titre..." ,
"tabcolor" : "Couleur" ,
"tabheader" : "Bandeau" ,
"tabsignature" : "Signature" ,
"tabtext" : "Texte" ,
"maskheader" : "masquer le bandeau" ,
"displayheader" : "afficher le bandeau" ,
"headercolortitle" : "Couleur :" ,
"headercolorlikenote" : "comme la note" ,
"headercolorwhite" : "blanc" , 
"headercolorblack" : "noir" ,
"headericontitle" : "Icône :" ,
"headericonprevious" : "Icônes précédentes" ,
"headericonnone" : "aucune icône" ,
"headericonnext" : "Icônes suivantes" ,
"masksignature" : "masquer la signature" ,
"displaysignature" : "afficher la signature" ,
"qsn_textsize" : "Taille du texte" ,
"qsn_textsize:" : "Taille du texte : " ,
"qsn_textfont" : "Type de lettres" ,
"font0" : "Arial" ,
"font1" : "Times" ,
"font2" : "Cursive" ,
"font3" : "Courier" ,
"font4" : "Moderne" ,
"size0" : "grand" ,
"size1" : "moyen" ,
"size2" : "petit" ,
"qsn_textoptions" : "Options" ,
"textstyleoptions" : "Options de style" ,
"bold" : "gras" ,
"center" : "centré" ,
"italic" : "italique" ,
"uppercase" : "maj." ,
"qsn_textalign" : "Alignement" , 
"align0" : "gauche" ,
"align1" : "droite" ,
"align2" : "centré" ,
"align3" : "justifié" ,
"qsn_textspacing" : "Espacement" , 
"spacing0" : "réduit" ,
"spacing1" : "normal" ,
"spacing2" : "fort" ,
"qsn_tabmargin" : "Marge" , 
"qsn_textmargin" : "Marge autour du texte" , 
"margin0" : "aucune" ,
"margin1" : "fine" ,
"margin2" : "normale" ,
"margin3" : "grande" ,
"margin4" : "très grande" ,
"qsn_textopacity" : "Transparence" , 
"opacity0" : "aucune" ,
"opacity1" : "légère" ,
"opacity2" : "moyenne" ,
"opacity3" : "forte" ,
"opacity4" : "complète" ,
"tabtextcolor" : "Couleur du texte" , 
"qsn_tablinks" : "Lien" , 
"qsn_linktitle" : "Type de lien" ,
"link" : "URL de la page" ,
"link0" : "aucun lien" , 
"link1" : "lien vers une page web" , 
"link2" : "lien vers une page du site" , 
"link3" : "lien vers un fichier" , 
"link4" : "lien javascript (expert)" , 
"link5" : "lien envoi d'un e-mail" , 
"link6" : "lien vers une note" , 
"Choosepage" : "Choisissez une page" , 
"nofile" : "Aucun fichier sélectionné" , 
"clicktochooseafile" : "Cliquez pour choisir un fichier." , 
"selectnote" : "Voulez-vous sélectionner la note numéro \n%s \nde type %v \net commancant par le texte suivant : ",
"cancel" : "annuler" , 
"small" : "petit" , 
"large" : "grand" , 
"qsn_textsize:min" : "petit" , 
"qsn_textsize:max" : "grand" , 
"ok" : "ok",
"confirmdelete" : "Voulez-vous vraiment supprimer ce fichier ?",
"deletefilealt" : "Supprimer le fichier",
"filename" : "Nom du fichier", 
"comment" : "Commentaire :", 
"link" : "Lien :",
"size" : "Taille", 
"date" : "Date", 
"duplicatenote" : "Dupliquer la note"
} ;


var artema_corplinksid ;
var artema_imgnotloaded = [] ;
var artema_prepared = false ;
var artema_pagesvcname = "artemapage" ;
var artema_disqsvcname = "artemadisq" ;
var artema_disqfilename = "index.html" ;
var std_margin = 15 ; // marge entre les notes
var pagesdir = "/services/artemapage@" + q_lang + "/" ;
var scriptsdir = pagesdir + "scripts/" ;
var elemsdir = pagesdir + "elems/" ;
q_elems[ "pageslinks" ] = { id : "artema_editlinks" , urls : [ scriptsdir + "pages_dyn_elems.js" , elemsdir + "artema_editlinks.html" ] , target : "q_drawers" } ;
q_elems[ "customizepage" ] = { id : "artema_customizepage" , urls : [ scriptsdir + "pages_dyn_elems.js" , elemsdir + "artema_customizepage.html" ] , target : "q_drawers" } ;
q_elems[ "pagescombos" ] = { id : "combos" , urls : [ elemsdir + "artema_combos.html" ] , target : "combos_palette" } ;
q_elems[ "publicleftcol" ] = { id : "artema_publicleftcol" , urls : [ elemsdir + "artema_publicleftcol.html", scriptsdir + "artema_admin.js" ] , target : "defaultleftcol" } ;
q_elems[ "adminleftcol" ] = { id : "artema_adminleftcol" , urls : [ elemsdir + "artema_adminleftcol.html", scriptsdir + "artema_admin.js" ] , target : "defaultleftcol" } ;
q_elems[ "pages_confirmaligninclude" ] = { id : "pages_confirmalignelem" , urls : [ elemsdir + "pages_confirmalign.html" ] , target : "q_fullscreenmask" } ;

/*
function -
function INIT PAGE
*/

function init_svc() {
	if ( window.init_bundle ) init_bundle() ;
	else init_svcsvc() ;
}

var ASresumepause = 1 ;
var AStasks = [] ;
function ASresumepause_inc() {
	if ( q_pagemode() != "makeweb" ) return ;
	ASresumepause ++ ;
}
function ASresumepause_dec() {
	if ( q_pagemode() != "makeweb" ) return ;
	if ( !--ASresumepause ) {
		for ( var i = 0 ; i < AStasks.length ; i++ ) AStasks[ i ]() ;
		AS.resumepause() ;
	}
}
function init_svcsvc() {
	if ( document.mainform.pagemode.value == "view" ) {
		if ( q_elems[ "publicleftcol" ] ) q_include( q_elems[ "publicleftcol" ] , "finish_init_artemapage" , [ "view" ] ) ;
		else finish_init_artemapage( "view" ) ;
	} else q_include( q_elems[ "adminleftcol" ] , "finish_init_artemapage" , [ "edit" ] ) ; //q_include( qa_elems( [ "pageslinks" , "pagescombos" , "adminleftcol" ] ) , "finish_init_artemapage" , [ "edit" ] ) ;
	ASresumepause_dec() ;
}

function finish_init_artemapage( mode ) {	
	artema_imgnotloaded = [] ;
	artema_prepared = false ;

	settings_addchangedhandler( "pages_init_pageformat" ) ;
	qsnartema_init() ;
	if ( mode == "edit" ) {
		relaunchupdates() ;
		if ( ge( "artema_editname_pagenameentry" ) ) ge( "artema_editname_pagenameentry" ).value = q_currsvcname() ;
		if ( /#0#artemapage/.test( currsvcid ) ) rm( "artema_removepage_elem" ) ;
	}
	
	if ( mode == "edit" ) finish_init_editpage() ;
	else finish_init_viewpage() ;
	if ( q_pagemode() != "makeweb" ) checkuseremailinfo( ) ;
	if ( members[ memberid ].userlevel != "admin" ) {
		rm( "emablock" ) ;
		hideblock( "modebuttons" ) ;
		return ;
	}
	var b = ( document.mainform.pagemode.value == "edit" ) ;
	if ( ge( "viewmodebutton" ) ) ge( "viewmodebutton" ).className = ( b ) ? "modebuttonoff" : "modebuttonon" ;
	if ( ge( "editmodebutton" ) ) ge( "editmodebutton" ).className = ( ! b ) ? "modebuttonoff" : "modebuttonon" ;
	showblock( "modebuttons" ) ;
}

function checkuseremailinfo( ) {
	document.mainform.mission.value = "getuseremailinfo" ;
	q_ajaxsubmitwithservice( "common@" + q_lang , { }, checkuseremailinfo_callback ) ;
}

function checkuseremailinfo_callback( x ) {
	if ( ! ( memberid && members[ memberid ] && members[ memberid ].userlevel ) ) return ;
	var userlevel = members[ memberid ].userlevel ;
	if ( ! x.email && userlevel != "admin" ) return ;
	if ( x.email && x.bounces != "true" && x.invalid != "true" ) return ;
	var checkmail_elems = { id : "qlub_checkmailmgr" , urls : [ "/services/qorg/checkmail_" + q_lang + ".html" , "/services/qorg/scripts/checkmail.js" ] , target : "q_fullscreenmask" } ;
	q_include( [ checkmail_elems ] , "checkmail_reveal" , [ x ] ) ;
}

function finish_init_editpage() {
}
function finish_init_viewpage() {
}
function artemapage_editmode() {
	if ( document.mainform.pagemode.value == "edit" ) return false ;
	document.mainform.pagemode.value = "edit" ;
	document.mainform.mission.value = "openservicepage" ;
	q_submit() ;
}

function artemapage_viewmode() {
	if ( document.mainform.pagemode.value == "view" ) return false ;
	if ( qsn_currstate == "edit" ) return alert ( artema_message[ "currstateedit" ] ) ;
	document.mainform.pagemode.value = "view" ;
	document.mainform.mission.value = "openservicepage" ;
	q_submit() ;
}

var artemapage_cmax , artemapage_rmax , artemapage_pos ;
function pages_duplicateinitcol( col ) {
	var fullwidthcol = [ ] ;
	for ( var i = 0 ; i < ( col_def.length - 1 ) ; i++ ) fullwidthcol.push( "" + i ) ;
	fullwidthcol = fullwidthcol.join( "-" ) ;
	return fullwidthcol ; //on force la note à prendre la largeur totale
	if ( ! col ) return fullwidthcol ;
	if ( ! width_def[ col ] ) return fullwidthcol ;
	return col ;
}
function qsnartema_init() {
	if ( ! qsn_thenotes ) return ;
	var align_list = [] ;
	var ghostviewed = " " ;
	var re ;
	for( var i = 0 ; i < qsn_noteidslist.length ; i++ ) {
		var id = qsn_noteidslist[ i ] ;
		rm( id ) ;
		if ( ! qsn_thenotes[ id ] ) continue ;
		if ( qsn_thenotes[ id ].common.notekind != "settings" ) continue ;
		qsn_globalupgradejson( id ) ;
		qsn_thenotes[ id ].user = xq_cloneObject( qsn_thenotes[ id ].spacedefaults , false , qsn_thenotes[ id ].user ) ;
		qsn_initnote( id ) ;
		break ;
	}
	var pageformat = pages_getpageformat() ;
	var h = pages_getpageheight() ;
	if ( ! pageformat && h != -1 ) ge( "q_author_stuff" ).style.height = h + "px" ;
	else if ( pageformat ) ge( "q_author_stuff" ).style.height = "auto" ;
	for( var i = 0 ; i < qsn_noteidslist.length ; i++ ) {
		try {
			var id = qsn_noteidslist[ i ] ;
			if ( ! qsn_thenotes[ id ] ) continue ;
			if ( qsn_thenotes[ id ].common.notekind == "settings" ) continue ;
			rm( id ) ;
			if ( qsn_thenotes[ id ].parentid && ! qsn_thenotes[ id ].pagesparent ) continue ;
			if ( qsn_thenotes[ id ].parentid && ! qsn_thenotes[ qsn_thenotes[ id ].parentid ] ) continue ;
			if( qsn_thenotes[ id ].common.duplicate ) {
				qsn_thenotes[ id ].common.duplicate = null ;
				qsn_thenotes[ id ].common.ghost = null ;
				if ( pages_isaligned() ) {
					qsn_thenotes[ id ].common.col = pages_duplicateinitcol( qsn_thenotes[ id ].common.col ) ;
					qsn_thenotes[ id ].common.row = -1 ;
					if ( qsn_thenotes[ id ].common.duplicaterichinfos ) qsn_thenotes[ id ].common.richinfos = q_cloneObject( qsn_thenotes[ id ].common.duplicaterichinfos ) ;
				} else {
					qsn_thenotes[ id ].common.col = null ;
					qsn_thenotes[ id ].common.row = null ;
					if ( qsn_thenotes[ id ].common.duplicaterichinfos ) delete qsn_thenotes[ id ].common.duplicaterichinfos ;
				}
			}
			qsn_globalupgradejson( id ) ;
			qsn_thenotes[ id ].user = q_cloneObject( qsn_thenotes[ id ].spacedefaults , qsn_thenotes[ id ].user ) ;
			if ( qsn_thenotes[ id ].common.notekind == "corplinks" ) {
				//qsn_thenotes[ id ] = null ;
				delete qsn_thenotes[ id ] ; //vh sinon une boucle sur qsn_thenotes doit tester que chaque élément est non nul.
				continue ;
			}
			var nc = qsn_thenotes[ id ].common ;
			var sc = qsn_thenotes[ id ].spacedefaults.common ;
			var uc = qsn_thenotes[ id ].user.common ;
			if ( ! pageformat ) {
				qsn_thenotes[ id ].common.col = null ;
				qsn_thenotes[ id ].common.row = null ;
			}
			if ( ( sc.align == "true" ) || ( sc.align == "false" ) ) {
				sc.align = uc.align = null ;
				sc.col = uc.col = null ;
				sc.row = uc.row = null ;
				qdyn_snload( "qsn_initnote" , [ id ] , qsn_thenotes[ id ].common.notekind ) ;
			} else if ( nc.col != undefined && ! qsn_thenotes[ id ].pagesparent ) align_list.push( [ id , nc.row , nc.col ] ) ;
			else if ( qsn_thenotes[ id ].pagesparent && ! pageformat ) {
				qdyn_snload( "qsn_initpageschildnote" , [ id ] , qsn_thenotes[ qsn_thenotes[ id ].parentid ].common.notekind ) ;
			} else if ( qsn_thenotes[ id ].pagesparent && pageformat ) continue ;
			else if ( ! nc.ghost ) qdyn_snload( "qsn_initnote" , [ id ] , qsn_thenotes[ id ].common.notekind ) ;
			else {
				if ( ( nc.ghost != "ghost" ) && ( ( ! qsn_thenotes[ nc.ghost ] ) || ( ghostviewed.indexOf( " " + nc.ghost + " " ) != - 1 ) ) ) {
					nc.ghost = null ;
					nc.col = null ;
					nc.row = null ;
					sc.left = uc.left = "50px" ;
					sc.top = uc.top = "50px" ;
					qdyn_snload( "qsn_initnote" , [ id ] , qsn_thenotes[ id ].common.notekind ) ;
				} else {
					if ( ( nc.ghost != "ghost" ) && ( nc.ghost == id ) ) {
						nc.ghost = "ghost" ;
						sc.left = uc.left = "-10000px" ;
						sc.zindex = uc.zindex = "0" ;					
					} else if ( nc.ghost != "ghost" ) ghostviewed += nc.ghost + " " ;
					align_list.push( [ id , nc.row , nc.col ] ) ;
				}
			}
		} catch( err ) { } ;
	}
	align_maketable( align_list , "init" ) ;
	if ( pages_mode() != "edit" ) qlub_fixmarginbody() ;
	initfooter() ;
}

function initfooter() {
	if ( pages_isaligned() ) return ;
	if ( ge( "q_author_stuff" ).getAttribute( "initfooter" ) == "false" ) return ;
	qsn_initfooter_setheight() ;
}

function initfooter_setheight() {
	qsn_initfooter_setheight() ;
}

function artemapage_place_notes( ) {
	var m = std_margin ;
	var x = m ;
	for ( var i=0; i<=artemapage_cmax; i++ ) {
		var y = m ;
		for ( var j=0; j<=artemapage_rmax[ i ]; j++ ) {
			var id = artemapage_pos[ twodigs( i ) + "_" + twodigs( j ) ] ;
			if ( ! id ) continue ;
			var n = qsn_thenotes[ id ] ;
			if ( ! n ) continue ;
			var d = getelement( id ) ;
			if ( ( n.spacedefaults.common.align ) && ( n.spacedefaults.common.align == "true" ) ) {
				d.style.left = x + "px" ;
				d.style.top = y + "px" ;
				n.spacedefaults.common.left = x + "px" ;
				n.spacedefaults.common.top = y + "px" ;
			}
			y += artema_measureheight( d ) + m ;
		}
		x += parseInt( mhp_notewidth , 10 ) + m ;
	}
	artema_prepared = true ;
}

function pages_mode() {
	return q_pagemode() || "edit" ;
}

/*
function -
function PAGE NAME
*/

function artema_changepagename() {
	var currname = q_currsvcname() ;
	var newname = getelement( "artema_editname_pagenameentry" ).value ;
	if ( newname == "" ) alert ( artema_message[ "pagenameempty" ] ) ;
	else if ( newname != currname ) {
		q_currsvcjson().shortname = newname ;
		writecurrsvcname() ;
		qorp_inittabs() ;
		document.mainform.mission.value = "pagenamechanged" ;
		q_ajaxsubmitwithservice( "subscribe@" + q_lang , { newpagename : newname , pageid : currsvcid } , null ) ;
	}
}

function artema_editpagename( ) {
	// nom de la page
	ge( "artema_editname_pagenameentry" ).value = q_currsvcname() ;
	showblock( "q_fullscreenmask" ) ;
	var d = getelement( "artema_editname_block" ) ;
	d.style.display = "block" ;
	d.style.zIndex = zindexmax + 1 ;
	applymove( d, 80, 0, 450 ) ;
}

/*
function -
function A CLASSER
*/

function artemapage_mouseovermodebutton( x, v ) {
	x.className = "modebuttonoff" ;
	if ( x.id == "viewmodebutton" ) x.innerHTML = artema_message[ v? "switchtopublic" : "adminmode" ] ;
	else x.innerHTML = artema_message[ v? "switchtoadmin" : "publicmode" ] ;
}

var artema_services = { "pages" : "#artemapage" , "disqs" : "#artemadisq" } ;

function artemapage_selectpage( x, t ) { // t = settings_kind
	if ( x == currsvcid ) return ;
	if ( x == "" ) return artemapage_newpage( artema_services[ t ] + "@" + q_lang , true , artema_message [ t ] ) ;
	if ( /disq/.test( x ) ) return opencalledservice( x , artema_disqfilename ) ; //openservice( x ) ; 
	openservice( x ) ;
}

function artemapage_newpage_promptdone( newname , oldname , serviceid , isinteractive , servicename ) {
	if ( newname == null ) return false ;
	if ( oldname != newname ) {
		var taken = false ;
		for ( var i=0; i<recent_services.length; i++ ) {
			if ( recent_services[ i ].shortname == newname ) {
				taken = true ;
				break ;
			}
		}
		if ( taken ) {
			qprompt( artema_message [ "taken" ].replace ( /%s/ , newname ) , "artemapage_newpage_promptdone" , { "default" : newname , "args" : [ newname , serviceid , isinteractive , servicename ] } ) ;
			return ;
		}
	}
	document.mainform.mission.value = "newpage" ;
	q_ajaxsubmit ( { pagekind: serviceid , pagename: newname , shortname: servicename } , artemapage_newpage_callback ) ;
}

function artemapage_newpage( serviceid , isinteractive , servicename ) {
	var d = new Date() ;
	var defaultpagename = servicename + " " + d.getDate() + "/" + (1 + d.getMonth()) + "/" + ( '' + d.getFullYear() ).substring(2) ;
	qprompt( artema_message [ "newnameprompt" ].replace ( /%s/ , servicename ) , "artemapage_newpage_promptdone" , { "default" : defaultpagename , "args" : [ null , serviceid , isinteractive , servicename ] } ) ;
	return false ;
}

function artemapage_newpage_callback ( r ) {
	if ( r.newpageerror ) return ;
	var x = r.newserviceid ;
	if ( /disq/.test( x ) ) return opencalledservice( x , artema_disqfilename ) ; //openservice( x ) ; 
	openservice( x ) ;
}

function artema_imgloaded( id ) {
	var i = indexOfItem( id , artema_imgnotloaded ) ;
	if ( i != -1 ) artema_imgnotloaded.splice( i , 1 ) ;
	if ( ( artema_prepared ) && ( artema_imgnotloaded.length == 0 ) ) artemapage_place_notes() ;
}

function artema_measureheight( div ) {
	var imgs = div.getElementsByTagName( "img" ) ;
	var h = div.offsetHeight ;
	if ( ( imgs.length == 0 ) || ( artema_prepared ) )return h ;
	for ( var i = 0 ; i < imgs.length ; i++ ) {
		if ( /blank.gif/.test( imgs[ i ].src ) ) continue ;
		artema_imgnotloaded.push( imgs[ i ].src ) ;
		q_waitimgloaded( imgs[ i ].src , artema_imgloaded , [ imgs[ i ].src ] ) ;
	}
	return h ;
}

function page_showalignoptions( x ) {
	var s = settings_getnote() ;
	switch_tab( "qlub_adminleftcol" , x , true ) ;
}

function page_align_notes() {
	var s = settings_getnote() ;
	if ( ! s || ! s.spacedefaults.format || ! s.spacedefaults.format.pageformat ) page_showalignoptions( ge( "pages_formattab" ) ) ;
	else {
//		pages_savesetting( { pageformat : s.spacedefaults.format.pageformat } ) ;
		align_notes( { pageformat : s.spacedefaults.format.pageformat } ) ;
	}
}

function align_notes( xformat ) {
	xalign_notes( true , [] , xformat ) ;
}
var pages_savedscroll ;
function xalign_notes( bconfirmalign , realignids , xformat , skipsave , callback ) {
	pages_savedscroll = getscroll() ;
	var align_list = xalign_preparenotes( ( xformat ) ? [] : realignids || [] , xformat ) ;
	// if ( xformat ) renderBorder() ;
	if ( bconfirmalign && xformat ) renderBorder() ;
	xalign_maketable( align_list , "align" , ( xformat ) ? [] : realignids || [] ) ;
	window.scrollTo( pages_savedscroll[ 0 ] , pages_savedscroll[ 1 ] ) ;
	if ( ! callback ) hideblock( [ "qlub_mep" , "q_fullscreenmask" ] ) ;// vh : callback introduite pour le qwiz. Le hideblock faisait clignoter alors voilà la raison de ce test un peu adhoc comme façon de tester... 
	bconfirmalign = false ;
	if ( ! bconfirmalign || confirm( artema_message[ "confirmalign" ] ) ) {
		ge( "q_author_stuff" ).style.height = "auto" ;
		if ( ! skipsave ) pages_confirm_align( callback ) ; 
	} else {
		pages_cancel_align() ;
		if ( bconfirmalign && xformat && xformat.colsmargin != undefined  && xformat.colsmargin != null ) showblock( [ "qlub_mep" , "q_fullscreenmask" ] ) ;
		window.scrollTo( pages_savedscroll[ 0 ] , pages_savedscroll[ 1 ] ) ;
	}
	return ;
}

function encode_col( id , fittocolumn ) {
//	var l = qsn_trueleft( id ) - table_margin ;
//	var w = qsn_truewidth( id ) ;
	var d = pages_richnoteoffsets( id ) ;
	var l = d.offsetLeft - table_margin_left ;
	var w = d.offsetWidth ;
	var json = qsn_thenotes[ id ] ;
	var winfos = qsn_widthinfos( json ) ;
	if ( d.isrichnote ) {
		winfos.wfixed = true ;
//		var parentLeft = d.offsetLeft - ( ( json.common.richinfos && json.common.richinfos.offsetLeft ) ? json.common.richinfos.offsetLeft : 0 ) ;
//		var parentTop = d.offsetTop - ( ( json.common.richinfos && json.common.richinfos.offsetTop ) ? json.common.richinfos.offsetTop : 0 ) ;
		pages_alignmodified = pages_alignmodified || ! json.common.richinfos || d.offsetTop != json.common.richinfos.offsetTop || d.offsetHeight != json.common.richinfos.offsetHeight || d.offsetLeft != json.common.richinfos.offsetLeft ;
		json.common.richinfos = d ;
//		json.common.richinfos.parentLeft = ( parentLeft > 0 ) ? parseInt( json.spacedefaults.common.left , 10 ) : qsn_trueleft( id ) - d.offsetLeft ;
		json.common.richinfos.parentLeft = qsn_trueleft( id ) - d.offsetLeft ;
		json.common.richinfos.parentTop = qsn_truetop( id ) - d.offsetTop ;
	} else if ( json.common && json.common.richinfos ) json.common.richinfos = null ;//tentative de réparation suite à un bug de suppression des décors
	if ( ge( "ghost_" + id ) && d.isrichnote ) ge( "ghost_" + id ).style.height = d.offsetHeight + "px" ;
	var r = l + w ;
	var mindist = 32000 ;
	var c1 , c2 , x1 , x2 , xdef , bestside ;
	var n = col_def.length ;
	for ( var i in col_def ) {
		xdef = col_def[ i ] ;
		if ( Math.abs( l - xdef ) < mindist ) {
			mindist = Math.abs( l - xdef ) ;
			c1 = i ;
			bestside = 1 ;
		}
		if ( Math.abs( r - xdef ) < mindist ) {
			mindist = Math.abs( r - xdef ) ;
			c2 = i ;
			bestside = 2 ;
		}
	}
	if ( bestside == 1 ) {
		c1 = Math.min( n - 2 , c1 ) ;
		x1 = col_def[ c1 ] ;
		mindist = 32000 ;
		for ( var i = c1 + 1 ; i < n ; i++ ) {
			xdef = col_def[ i ] ;
			if ( Math.abs( x1 + w - xdef ) >= mindist ) continue ;
			mindist = Math.abs( x1 + w - xdef ) ;
			c2 = i ;
		}
	}
	if ( bestside == 2 ) {
		c2 = Math.max( 1 , c2 ) ;
		x2 = col_def[ c2 ] ;
		mindist = 32000 ;
		for ( var i = c2 - 1 ; i >= 0 ; i-- ) {
			xdef = col_def[ i ] ;
			if ( Math.abs( x2 - w - xdef ) >= mindist ) continue ;
			mindist = Math.abs( x2 - w - xdef ) ;
			c1 = i ;
		}
	}
	var col = format_col( c1 , c2 - 1 ) ;
	// var wcol = parseInt( json.spacedefaults.common.width , 10 ) ;
	var wcol = w ;
//	maxcolwidth = align_maxwidth( json , col ) ;
	maxcolwidth = width_def[ col ] ;
	if ( fittocolumn == "ifcolchange" ) fittocolumn = ( ! json.common.col || json.common.col != col || maxcolwidth < w ) ;
	if ( winfos.wfixed || ( ( wcol > maxcolwidth ) && ! fittocolumn ) ) {
		if ( wcol <= maxcolwidth ) return col ;
		if ( ( c2 == n - 1 ) && ( c1 == 0 ) ) return col ;
		if ( ( c2 == n - 1 ) && ( c1 > 0 ) ) return format_col( c1-1 , c2 -1 ) ;
		if ( ( c1 == 0 ) && ( c2 < n - 1 ) ) return format_col( c1 , c2 ) ;
		var v1 = Math.abs( l - col_def[ c1 - 1 ] ) + Math.abs( r - col_def[ c2 ] ) ;
		var v2 = Math.abs( l - col_def[ c1 ] ) + Math.abs( r - col_def[ c2 +1 ] ) ;
		if ( v1 < v2 ) return format_col( c1-1 , c2 -1 ) ;
		return format_col( c1 , c2 ) ;
	}
	if ( fittocolumn ) {
		if ( ( maxcolwidth < w ) && ( maxcolwidth < pages_minwidth( id ) ) ) {
			if ( ( c2 == n - 1 ) && ( c1 > 0 ) ) col = format_col( c1-1 , c2 -1 ) ;
			else if ( ( c1 == 0 ) && ( c2 < n - 1 ) ) col = format_col( c1 , c2 ) ;
			else {
				var v1 = Math.abs( l - col_def[ c1 - 1 ] ) + Math.abs( r - col_def[ c2 ] ) ;
				var v2 = Math.abs( l - col_def[ c1 ] ) + Math.abs( r - col_def[ c2 +1 ] ) ;
				if ( v1 < v2 ) col = format_col( c1-1 , c2 -1 ) ;
				else col = format_col( c1 , c2 ) ;
			}
		}
		json.spacedefaults.common.width = json.user.common.width = align_maxwidth( json , col ) + "px" ;
		pages_alignmodified = true ;
	}
	return col ;
}

function pages_minwidth( div ) {
	div = ge( div ) ;
	if ( ! div.style || ! div.style.width ) return parseInt( div.minWidth || "0" , 10 ) ;
	var savedwidth = div.style.width ;
	q_changedwidth( div , 1 ) ; //div.style.width = "1px" ;
	var minwidth = div.offsetWidth ;
	div.style.width = savedwidth ;
	if ( div.minWidth && ( parseInt( div.minWidth , 10 ) > minwidth ) ) minwidth = parseInt( div.minWidth , 10 ) ;
	return minwidth ;
}

function format_col( c1 , c2 ) {
	if ( c1 == c2 ) return ( "" + c1 ) ;
	var s = [] ;
	for ( var j = c1 ; j <= c2 ; j++ ) s.push( "" + j ) ;
	return s.join( "-" ) ;
}

function align_sorttop( m1 , m2 ) {
	var v1 = m1[ 1 ] ;
	var v2 = m2[ 1 ] ;
	var id1 = m1[ 0 ] ;
	var id2 = m2[ 0 ] ;
	if ( v1 == v2 ) {
		if (/note_/.test(id1) && /note_/.test(id2) ) {
			if (/note_([0-9]*)/.exec(id1)[1] < /note_([0-9]*)/.exec(id2)[1]) return 1;
		}
		return -1 ;
	}
	if ( v1 > v2 ) return 1 ;
	return -1 ;
}

var pages_savedalign , pages_savedghost , pages_newnotes , pages_changednotes ;
var pages_notekindsep = "pagesep" ;

function align_maxwidth( r , col , xholder ) {
	var holder = xholder || window ;
	var xcol = ( col == undefined || col == null ) ? r.common.col : col ;
	if ( holder == window && pages_isrichnote( r.common.noteid ) ) return holder.width_def[ xcol ] ;
	var notekind = r.common.notekind ;
	var id = r.common.noteid ;
	if ( holder != window ) id = qsn_template( id ) ; // on récupère l'id du template
	var h = qsn_handler( notekind , "qsn_deltawidth" ) ;
	if ( h ) return ( holder.width_def[ xcol ] - h( id ) ) ;
	return ( holder.width_def[ xcol ] - qsn_deltawidth( id ) ) ;
}

function align_preparenotes( xformat ) {
	xalign_preparenotes( [] , xformat ) ;
}

function xalign_preparenotes( realignids , xformat ) {
	var align_list = [] ;
	var curnotes = qsn_noteidssortedlist() ;
	var id , col , row , r , rghost , ghostid , w , maxcolwidth , tmpid ;
	pages_alignmodified = false ;
	pages_savedalign = q_cloneObject( qsn_thenotes ) ;
	if ( xformat ) pages_savesetting( xformat ) ;
//	pages_savesetting( { fittocolumn : getchecked( "pages_fittocolumn" ) } ) ;
	pages_savedghost = [] ;
	pages_newnotes = [] ;
	pages_changednotes = [] ;
	var fittocolumn = false ;
	s = settings_getnote() ;
	if ( ( s ) && ( s.spacedefaults.format.fittocolumn ) ) fittocolumn = s.spacedefaults.format.fittocolumn ;
	for ( var i=0; i<curnotes.length; i++ ) {
		id = curnotes[ i ] ;
		r = qsn_thenotes[ id ] ;
		if ( r.common.notekind == "settings" || r.common.notekind == "missing" || isremoved( ge( id ) ) ) continue ;
		if ( r.parentid && ! r.pagesparent ) continue ;
		if ( r.pagesparent && indexOfItem( id , realignids ) == -1 ) continue ;
		if ( r.pagesparent && indexOfItem( id , realignids ) != -1 ) {
			if ( /^note_/.test( id ) ) pages_changednotes.push( id ) ;
			else pages_newnotes.push( id ) ;
			continue ;
		}
		if ( ( r.common.ghost ) && ( r.common.ghost == "ghost" ) ) { // à virer lorsqu'il n'y aura plus de ghost
			pages_savedghost.push( id ) ;
			continue ;
		}
//		pages_savedalign[ id ] = q_cloneObject( qsn_thenotes[ id ] ) ;
		if ( r.common.col == undefined || r.common.col == null || xformat || indexOfItem( id , realignids ) != -1 ) {
			r.common.ghost = null ;
			row = pages_richnoteoffsets( id ).offsetTop ; //qsn_truetop( id ) ;
			if ( r.common.notekind == pages_notekindsep ) col = format_col( 0 , col_def.length -2 ) ;
			else {
				if ( r.common.col == undefined || r.common.col == null || xformat ) col = encode_col( id , true ) ;
				else col = encode_col( id , false ) ;
			}
			if ( r.common.col == undefined || r.common.col == null || xformat ) {
				r.spacedefaults.common.left = r.user.common.left = ( ( r.common.richinfos && r.common.richinfos.parentLeft ) ? r.common.richinfos.parentLeft : 0 ) + "px" ;
				r.spacedefaults.common.top = r.user.common.top = ( ( r.common.richinfos && r.common.richinfos.parentTop ) ? r.common.richinfos.parentTop : 0 ) + "px" ;
			}
			r.common.row = row ;
			r.common.col = col ;
			align_list.push( [ id , row , col ] ) ;
			if ( /^note_/.test( id ) ) pages_changednotes.push( id ) ;
			else pages_newnotes.push( id ) ;
		} else {
			row = pages_richnoteoffsets( id ).offsetTop ; //qsn_truetop( id ) ;
			if ( row != r.common.row ) {
				r.common.row = row ;
				pages_changednotes.push( id ) ;
			}
			align_list.push( [ id , row , r.common.col ] ) ;
		}
	}
	return align_list ;
}

function align_indexofcol( tr , col ) { // tr = [ { col : "1" ou "1-2" ou etc } ] , col = "1" ou "1-2"
	var re = new RegExp( col.replace( /-/g , "|" ) ) ;
	for ( var i = 0 ; i < tr.length ; i++ ) if ( re.test( tr[ i ].col ) ) return i ;
	return -1 ;
}

function align_indexofnextcol( tr , col , ncols ) { // tr = [ { col : "1" ou "1-2" ou etc } ] , col = "1" ou "1-2"
	var k = parseInt( col.split( "-" )[ 0 ] , 10 ) ;
	var j ;
	for ( var i = k ; i < ncols ; i++ ) {
		j = align_indexofcol( tr , ( "" + i ) ) ;
		if ( j != -1 ) return j ;
	}
	return ncols ;
}

function align_samecolpattern( currtrkind , col ) { // renvoie -1 ou la rangée
	var colsplit = col.split( "-" ) ;
	for ( var i in colsplit ) if ( ( currtrkind[ colsplit[ i ] ] ) && currtrkind[ colsplit[ i ] ].col != col || currtrkind[ colsplit[ i ] ].sep ) return -1 ; // ajouté ( currtrkind[ colsplit[ i ] ] ) && E 080805
	return currtrkind[ colsplit[ 0 ] ].row ;
}

function align_candidaterow( currtrkind , col ) { // renvoie la première rangée compatible
	var colsplit = col.split( "-" ) ;
	var candidaterow = -2 ;
	for ( var i in colsplit ) if ( candidaterow < currtrkind[ colsplit[ i ] ].row ) candidaterow = currtrkind[ colsplit[ i ] ].row ;
	return ( candidaterow + 1 ) ;
}

var pages_lastaligntable , pages_alignmodified ;

function align_maketable( align_list , mode ) { //[ [ noteid , row , col ] ]
	xalign_maketable( align_list , mode , [] ) ;
	if ( align_list.length != 0 ) return ;
	qsn_noteidslist = qsn_noteidssortedlist() ;
	for( var i = 0 ; i < qsn_noteidslist.length ; i++ ) {
		var id = qsn_noteidslist[ i ] ;
		var r = qsn_thenotes[ id ] ;
		if ( r.pagesparent ) continue ;
		if ( ! r.parentid ) continue ;
		rm( id ) ;
		if ( mode == "init" ) qdyn_snload( "qsn_initnote" , [ id ] , r.common.notekind ) ;
		else qdyn_snload( "qsn_safeaddnote" , [ id ] , r.common.notekind ) ;
	}
}

function align_compatiblecol( col ) { //force un format de col compatible
	var n = col_def.length - 1 ;
	var colsplit = col.split( "-" ) ;
	var m = colsplit.length ;
	if ( colsplit[ m - 1 ] < n ) return col ;
	var newcolsplit = [] ;
	for ( var i = 0 ; i < m ; i++ ) {
		var ncol = parseInt( colsplit[ i ] , 10 ) - 1 ;
		if ( ncol >= 0 ) newcolsplit.push( "" + ncol ) ;
	}
	return align_compatiblecol( newcolsplit.join( "-" ) ) ;
}

function xalign_maketable( align_list , mode , realignids ) { //[ [ noteid , row , col ] ]
	if ( align_list.length == 0 ) return [] ;
	align_list.sort( align_sorttop ) ;
	var n = col_def.length - 1 ;
	var w_def = [] ;
	for ( var i = 0 ; i < n ; i++ ) w_def.push( col_def[ i + 1 ] - col_def[ i ] ) ;
	var table , tr , td , col , colsplit , indexofcol , trtmp, tdtmp , tableelem , trelem , tdelem , prevrow ;
	var ghostids = [] ;
	var table = [[]] ;
	var tr = table[ 0 ] ;
	var currtrkind = {} ;
	var trkind ;
	for ( var k = 0 ; k < n ; k++ ) currtrkind[ "" + k ] = { col : "" + k , row : -1 } ;
	var k , ks , i , candidaterow , r ; 
	for ( var j = 0 ; j < align_list.length ; j++ ) {
		r = qsn_thenotes[ align_list[ j ][ 0 ] ] ;
		if ( ( qsn_thenotes[ align_list[ j ][ 0 ] ].common.ghost ) && ( qsn_thenotes[ align_list[ j ][ 0 ] ].common.ghost != "ghost" ) ) {
			ghostids.push( align_list[ j ][ 0 ] ) ;
			continue ;
		}
//		if ( ( mode == "align" ) && ( qsn_thenotes[ align_list[ j ][ 0 ] ].common.ghost ) && ( qsn_thenotes[ align_list[ j ][ 0 ] ].common.ghost == "ghost" ) ) continue ;
		col = align_compatiblecol( align_list[ j ][ 2 ] ) ;
		
// si on a le même pattern de colonne, on ajoute l'élément dans la colonne courante
		candidaterow = align_samecolpattern( currtrkind , col ) ;
//		candidaterow = -1 ;
		if ( candidaterow != -1 && r.common.notekind != pages_notekindsep ) {
			trtmp = table[ candidaterow ] ;
			tdtmp = trtmp[ align_indexofcol( trtmp , col ) ] ;
//			if ( currtrkind[ ks ].row != table.length - 1 ) tdtmp.td.rowspan = table.length - currtrkind[ ks ].row ;
			tdtmp.td.div.push( align_list[ j ][ 0 ] ) ;
			continue ;
		}

// on a un pattern de colonne différent, on ajoute ou compléte une rangée et on comble éventuellement les rangées du dessus

		candidaterow = align_candidaterow( currtrkind , col ) ;
		colsplit = col.split( "-" ) ;

// on comble les rangées
		for ( var i = 0 ; i < colsplit.length ;  i++ ) {
			ks = colsplit[ i ] ;
			trkind = currtrkind[ ks ] ;
			if ( trkind.row == candidaterow - 1 ) {
				if ( candidaterow == 0 ) continue ;
				trtmp = table[ trkind.row ] ;
				tdtmp = trtmp[ align_indexofcol( trtmp , ks ) ] ;
				tdtmp.td.stretch = true ;				
				continue ;//repérer la colonne et marquer élastique
			}
			if ( trkind.row == -1 ) {
				trtmp = table[ 0 ] ;
				trtmp.splice( Math.min( align_indexofnextcol( trtmp , ks , n ) , trtmp.length ) , 0 , { col : ks , td : { colspan : 1 , rowspan : candidaterow , div : [] } } ) ;
				continue ;
			}
			if ( align_samecolpattern( currtrkind, trkind.col ) != -1 ) {
				trtmp = table[ trkind.row ] ;
				tdtmp = trtmp[ align_indexofcol( trtmp , ks ) ] ;
				tdtmp.td.rowspan = candidaterow - trkind.row ;
				i = parseInt( trkind.col.replace( /.*([0-9])$/ , "$1" ) , 10 ) ;
				tdtmp.td.stretch = true ;				
				continue ;//marquer élastique
			}
			trtmp = table[ trkind.row + 1 ] ;
			trtmp.splice( Math.min( align_indexofnextcol( trtmp , ks , n ) , trtmp.length ) , 0 , { col : ks , td : { colspan : 1 , rowspan : candidaterow - trkind.row -1 , div : [] , stretch : true } } ) ;//marquer élastique
		}

// on change le currtrkind
		for ( var i in colsplit ) {
			currtrkind[ colsplit[ i ] ].row = candidaterow ;
			currtrkind[ colsplit[ i ] ].col = col ;
			currtrkind[ colsplit[ i ] ].sep = ( r.common.notekind == pages_notekindsep ) ;
		}
// on complète ou on crée une rangée
		if ( candidaterow ==  table.length ) {
			table.push( [ { col : col , td : { colspan : colsplit.length , rowspan : 1 , div : [ align_list[ j ][ 0 ] ] } } ] ) ;
			continue ;
		}
		trtmp = table[ candidaterow ] ;
		trtmp.splice( Math.min( align_indexofnextcol( trtmp , col , n ) , trtmp.length ) , 0 , { col : col , td : { colspan : colsplit.length , rowspan : 1 , div : [ align_list[ j ][ 0 ] ] } } ) ;
	}
	candidaterow = table.length ;
	for ( var k = 0 ; k < n ; k++ ) {
		ks = "" + k ;
		trkind = currtrkind[ ks ] ;
//alert( col + " ; " + trkind.row + " ; " + candidaterow ) ;
		if ( trkind.row == candidaterow - 1 ) {
			if ( candidaterow == 0 ) continue ;
			trtmp = table[ trkind.row ] ;
			tdtmp = trtmp[ align_indexofcol( trtmp , ks ) ] ;
			tdtmp.td.stretch = true ;				
			continue ;
		}
		if ( trkind.row == -1 ) {
			trtmp = table[ 0 ] ;
			trtmp.splice( Math.min( align_indexofnextcol( trtmp , ks , n ) , trtmp.length ) , 0 , { col : ks , td : { colspan : 1 , rowspan : candidaterow , div : [] } } ) ;
			continue ;
		}
		if ( align_samecolpattern( currtrkind, trkind.col ) != -1 ) {
			trtmp = table[ trkind.row ] ;
			tdtmp = trtmp[ align_indexofcol( trtmp , ks ) ] ;
			tdtmp.td.rowspan = candidaterow - trkind.row ;
			k = parseInt( trkind.col.replace( /.*([0-9])$/ , "$1" ) , 10 ) ;
			tdtmp.td.stretch = true ;
			continue ;
		}
		trtmp = table[ trkind.row + 1 ] ;
		trtmp.splice( Math.min( align_indexofnextcol( trtmp , ks , n ) , trtmp.length ) , 0 , { col : ks , td : { colspan : 1 , rowspan : candidaterow - trkind.row -1 , div : [] , stretch : true } } ) ;
	}
	if ( realignids.length != 0 && pages_lastaligntable ) {
		var b = xcompareObject( pages_lastaligntable , table , true ) ;
		var pagesparent = false ;
		for ( var i in realignids ) {
			r = qsn_thenotes[ realignids[ i ] ] ;
			if ( r.common.notekind == pages_notekindsep ) b = false ;
			if ( r.pagesparent ) {
				pagesparent = true ;
				continue ;
			}
			if ( pagesparent || ! b ) {
				if ( pagesparent || pages_isrichnote( realignids[ i ] ) ) {
					r.spacedefaults.common.left = r.user.common.left = r.common.richinfos.parentLeft + "px" ;
					r.spacedefaults.common.top = r.user.common.top = r.common.richinfos.parentTop + "px" ;
				} else {
					r.spacedefaults.common.left = r.user.common.left = "0px" ;
					r.spacedefaults.common.top = r.user.common.top = "0px" ;
				}
			}
		}
		if ( b && ! pages_alignmodified ) return table ;
	}
	pages_lastaligntable = q_cloneObject( table ) ;
	tableelem = ge( "q_table" ) ;
	var s = settings_getnote() ;
	var show_q_table = pages_mode() == "edit" && s && s.common.alignversion == 1 ;
	var tablebordercolor = rgbcontrastcolor150( getpagebackgroundcolor( ) ) ;
	if ( show_q_table ) tableelem.style.border = "solid 1px " + tablebordercolor ;
	else tableelem.style.border = "solid 0px" ;
	tableelem.border = "0" ;
	tableelem.width = "" + ( pages_maxwidthpage() - ( table_margin_right + table_margin_left ) ) ;
	var tablelength = tableelem.rows.length ;
	var divelem , snelem , divspacer , div , id ;
	for ( var i = 0 ; i < tablelength ; i++ ) tableelem.deleteRow( 0 ) ;
	for ( var i = 0 ; i < table.length ; i++ ) {
		tr = table[ i ] ;
		trelem = tableelem.insertRow( -1 ) ;
		for ( var j = 0 ; j < tr.length ; j++ ) {
			td = tr[ j ] ;
			div = td.td.div ;
			tdelem = trelem.insertCell( -1 ) ;
			//tdelem.style.padding = ( div.length == 0 ) ? ( pages_vmargin + "px " + pages_notesmargin + "px" ) : "0px 0px" ;
			tdelem.style.padding = tdelem.style.margin = "0px" ;
			tdelem.colSpan = td.td.colspan ;
			tdelem.rowSpan = td.td.rowspan ;
//			tdelem.style.border = "solid 1px" ;
			tdelem.vAlign = "top" ;
			tdelem.width = width_def[ td.col ] + 2 * pages_notesmargin + 2 ;
//			tdelem.width = width_def[ td.col ] ;
			tdelem.height = ( td.td.stretch ) ? "" : "1" ;
			tdelem.className = "q_table" ;
			if ( show_q_table ) tdelem.style.border = "solid 1px " + tablebordercolor ;
			else tdelem.style.border = "solid 0px" ;
//			tdelem.align = "center" ;
//			div = tr[ j ].td.div ;
			var firstdivissep = false ;
			if ( div.length == 0 ) tdelem.innerHTML = " " ;
			for ( var k = 0 ; k < div.length ; k++ ) {
				if ( ( k > 0 ) && ( qsn_thenotes[ div[ k ] ].common.notekind != pages_notekindsep ) && ( qsn_thenotes[ div[ k - 1 ] ].common.notekind != pages_notekindsep ) ) {
					divspacer = document.createElement( "DIV" ) ;
					divspacer.className = "q_divspacer" ;
					if ( show_q_table ) {
						//divspacer.style.borderTop = divspacer.style.borderBottom = "solid " + getpagebackgroundcolor( ) + " " + ( pages_vmargin - 1 ) + "px" ;
						divspacer.style.borderTop = divspacer.style.borderBottom = "solid " + getpagebackgroundcolor( ) + " 0px" ;
						divspacer.style.backgroundColor = rgbcontrastcolor150( getpagebackgroundcolor( ) ) ;
						divspacer.style.height = "2" + "px" ;
					}
					tdelem.appendChild( divspacer ) ;
				}
				var id = div[ k ] ;
				if ( qsn_thenotes[ id ].common.notekind != pages_notekindsep ) ; //tdelem.style.padding = pages_vmargin + "px " + pages_notesmargin + "px" ;
				else if ( k == 0 ) firstdivissep = true ;
				divelem = document.createElement( "DIV" ) ;
				divelem.id = "ghost_" + id ;
				divelem.style.position = "relative" ;
				divelem.style.margin = ( qsn_thenotes[ id ].common.notekind == pages_notekindsep ) ? "0px" : pages_vmargin + "px " + pages_notesmargin + "px" ;
				divelem.style.width = Math.max( 0 , width_def[ td.col ] ) + "px" ;
				divelem.className = "maincontainerdiv" ;
				divelem = tdelem.appendChild( divelem ) ;
				if ( qsn_thenotes[ id ].common.notekind == pages_notekindsep && pages_mode() != "edit") continue ;
				qsn_thenotes[ id ].common.appendtarget = divelem ;
				if ( qsn_thenotes[ id ].common.richinfos ) divelem.style.height = qsn_thenotes[ id ].common.richinfos.offsetHeight + "px" ;
				rm( id ) ;
				if ( mode == "init" ) qdyn_snload( "qsn_relativeinitnote" , [ id ] , qsn_thenotes[ id ].common.notekind ) ;
				else qdyn_snload( "qsn_relativeaddnote" , [ id ] , qsn_thenotes[ id ].common.notekind ) ;
			}
		}
	}
	trelem = tableelem.insertRow( -1 ) ;
	for ( var i = 0 ; i < n ; i++ ) {
		tdelem = trelem.insertCell( -1 ) ;
		tdelem.width = width_def[ "" + i ] + 2*pages_notesmargin + 2 ;
		if ( show_q_table ) tdelem.style.border = "solid 1px " + tablebordercolor ;
		divspacer = document.createElement( "DIV" ) ;
		divspacer.className = "q_divspacer" ;
		divspacer.style.width = Math.max( 0 , width_def[ "" + i ] ) + "px" ;
		divspacer.innerHTML =" " ;
		tdelem.appendChild( divspacer ) ;
	}
//	return table ;
//	if ( mode == "align" ) return table ;
	for ( var j = 0 ; j < ghostids.length ; j++ ) {
		var id = ghostids[ j ] ;
		if ( ( qsn_thenotes[ id ].common.notekind == pages_notekindsep ) && ( ( document.mainform.pagemode.value != "edit" ) ) ) continue ;
		if ( ! qsn_thenotes[ id ].parentid ) qsn_thenotes[ id ].common.appendtarget = ge( "ghost_" + qsn_thenotes[ id ].common.ghost ) ;
		if ( mode == "init" ) qdyn_snload( "qsn_inghostinitnote" , [ id ] , qsn_thenotes[ id ].common.notekind ) ;
		else qdyn_snload( "qsn_inghostaddnote" , [ id ] , qsn_thenotes[ id ].common.notekind ) ;
	}

	qsn_noteidslist = qsn_noteidssortedlist() ;
	for( var i = 0 ; i < qsn_noteidslist.length ; i++ ) {
		var id = qsn_noteidslist[ i ] ;
		var r = qsn_thenotes[ id ] ;
		if ( ! r.pagesparent ) continue ;
		rm( id ) ;
		if ( ! r.parentid ) continue ;
		if ( ! qsn_thenotes[ r.parentid ] ) continue ;
		if ( mode == "init" ) qdyn_snload( "qsn_initpageschildnote" , [ id ] , qsn_thenotes[ r.parentid ].common.notekind ) ;
		else qdyn_snload( "qsn_safeaddnote" , [ id ] , r.common.notekind ) ;
	}
	for( var i = 0 ; i < qsn_noteidslist.length ; i++ ) {
		var id = qsn_noteidslist[ i ] ;
		var r = qsn_thenotes[ id ] ;
		if ( r.pagesparent ) continue ;
		if ( ! r.parentid ) continue ;
		rm( id ) ;
		if ( ! qsn_thenotes[ r.parentid ] ) continue ;
		if ( mode == "init" ) qdyn_snload( "qsn_initnote" , [ id ] , r.common.notekind ) ;
		else qdyn_snload( "qsn_safeaddnote" , [ id ] , r.common.notekind ) ;
	}
	return table ;
}

function qsn_initpageschildnote( id ) {
	qdyn_snload( "qsn_safeaddnote" , [ id ] , qsn_thenotes[ id ].common.notekind ) ;
}

var pages_secondcontainerindex ;
function pages_secondcontainerzIndex( x ) {
	var zindex ;
	if ( pages_secondcontainerindex ) {
		zindex = x.childNodes[ pages_secondcontainerindex ].style.zIndex ;
		x.className = "" ;
		x.style.zIndex = zindex ;
		return zindex ;
	}
	var z = x.childNodes ;
	var j = 0 ;
	for ( var i = 0 ; i < z.length ; i++ ) {
		if ( ( z[ i ].style ) && ( z[ i ].style.zIndex ) ) {
			if ( j == 0 ) j = 1 ;
			else {
				pages_secondcontainerindex = i ;
				zindex = z[ i ].style.zIndex ;
//				x.className = "" ;
//				x.style.zIndex = zindex ;
				return zindex ;
			}
		}
	}
}

function qsn_relativeinitnote( id ) {
	qsn_initnote( id ) ;
	var div = ge( id ) ;
	div.style.position = "relative" ;
//	div.parentNode.style.width = div.offsetWidth + "px" ; //en prévision d'options d'alignement
	qsn_relativefiximg( id ) ;
}

function qsn_relativeaddnote( id ) {
	var div = qsn_safeaddnote( id ) ;
	if ( typeof( div ) == "boolean" ) return ;
	div.style.position = "relative" ;
//	div.parentNode.style.width = snelem.offsetWidth + "px" ; //en prévision d'options d'alignement
	qsn_relativefiximg( id ) ;
}

function qsn_inghostinitnote( id ) {
	qsn_initnote( id ) ;
	var div = ge( id ) ;
	if ( isie6() || isie78() ) div.parentNode.style.zIndex = div.style.zIndex ;
}

function qsn_inghostaddnote( id ) {
	var div = qsn_safeaddnote( id ) ;
	if ( typeof( div ) == "boolean" ) return ;
	if ( isie6() || isie78() ) div.parentNode.style.zIndex = div.style.zIndex ;
}

function hideshowcombos( t, v ) {
	var d = getelement( qsn_edittarget.id ) ;
	var c = getelement( "combos" ) ;
	if ( typeof document.selection != 'undefined' ) { // IE
		var range = document.selection.createRange() ;
		if ( range.text.length == 0 ) return hideblock ( c ) ;
	} else if ( typeof t.selectionStart != 'undefined' ) { // Gecko
		var s = t.value.substring( t.selectionStart, t.selectionEnd ) ;
		if ( s.length == 0 ) return hideblock ( c ) ;
	}
	c.style.left = parseInt( d.style.left , 10 ) + parseInt ( mhp_notewidth , 10 ) + 10 + "px" ;
	c.style.top = parseInt( d.style.top , 10 ) + "px" ;
	c.style.zIndex = 9999 ;
	showblock( c ) ;
}
// spécial artema

function initsky() { // plus de messages pour affichage des titres longs
}
function quietmsg( x ) {
}

/*
function -
function PUBLISH
*/
var pages_publishbuttomelem ;

function pages_initpublishbutton( x ) {
	if ( x ) pages_publishbuttomelem = x ;
	var xx = x || pages_publishbuttomelem ;
	var todate = qlub_pageisuptodate( currsvcid ) ;
	q_innerHTML( gebcn( xx , "divtxt" ) , artema_message[ ( ( todate ) ? "" : "not" ) + "todatepublishbuttonname" ] ) ;
	if ( ! todate ) q_alertnewincurrsvc() ;
	else q_alertnewincurrsvc( false ) ;
}

function pages_publishoverbutton( x ) {
	if ( qlub_pageisuptodate( currsvcid ) ) return ;
	x.className = x.className + "_over";
	gebcn( x , "divtxt" ).style.top = "3px" ;
}

function pages_publishoutbutton( x ) {
	if ( qlub_pageisuptodate( currsvcid ) ) return ;
	x.className = x.className.replace(/_over/, "");
	gebcn( x , "divtxt" ).style.top = "2px" ;
}

function pages_publishdone( xs ) {
	hideblock( "q_fullscreenmask" ) ;
	qsn_applynoterefresh( xs ) ;
	if ( xs.publishdone ) alert( artema_message[ ( pages_isweb ) ? "pagepublishedforweb" : "pagepublishedformembers" ] ) ;
}

function pages_restorepage(){
	var svc = currsvcid ;
	if ( ! confirm ( artema_message[ "restoreconfirm" ] ) ) return ;
	document.mainform.mission.value = "qlub_restore" ;
	q_ajaxsubmitwithservice( "#0#artemapage@" + q_lang , { "svc" : svc  } , pages_restorepage_done ) ;
}

function pages_restorepage_done( x ) {
	if ( x.restore ) {
		openservice( currsvcid ) ;
		//alert( artema_message[ "restoreok" ] ) ;
	}
	else alert( artema_message[ "restorefailed" ] ) ;
}

function artemapage_publishlinksdone( x ) {
	showblock( "q_fullscreenmask" ) ;
	document.mainform.mission.value = "ajaxpublishpage" ;
	q_ajaxsubmit( { upindex : document.mainform.upindex.value } , pages_publishdone ) ;
//	if ( q_submit() ) showblock( "q_fullscreenmask" ) ;
}

function artemapage_publishpage( ) {
	var pageslist = getelement( "leftcol_links_pages" ).value.replace( /(\r|\n){2,}/g , "\n" ).split("\n") ;
	var disqslist = getelement( "leftcol_links_disqs" ).value.replace( /(\r|\n){2,}/g , "\n" ).split("\n") ;
	var pagelinks = [] ;
	var disqlinks = [] ;
	var pageregexp = new RegExp( ".*" + artema_pagesvcname + ".*" ) ;
	var disqregexp = new RegExp( ".*" + artema_disqsvcname + ".*" ) ;
	if ( ( pageslist.length > 0 ) || ( disqslist.length > 0 ) ) {
		var s = {} ;
		var rs ;
		for ( var i=0; i<recent_services.length; i++) {
			rs = recent_services[ i ] ;
			if ( ( pageregexp.test( rs.id ) ) || ( disqregexp.test( rs.id ) ) ) s[ rs.shortname ] = rs.id ;
		}
		for ( var i=0; i<pageslist.length; i++) {
			if ( s[ pageslist[ i ] ] != undefined ) pagelinks.push( s[ pageslist[ i ] ] ) ;
			else if ( ( pageslist[ i ] != "" ) && ( !confirm( artema_message [ "badlink" ].replace( /%s/ , pageslist[ i ] ) ) ) ) return ;
		}
		for ( var i=0; i<disqslist.length; i++) {
			if ( s[ disqslist[ i ] ] != undefined ) disqlinks.push( s[ disqslist[ i ] ] ) ;
			else if ( ( disqslist[ i ] != "" ) && ( !confirm( artema_message [ "badlink" ].replace( /%s/ , disqslist[ i ] ) ) ) ) return ;
		}
	}
	qsn_thenotes[ artema_corplinksid ].spacedefaults.view = { linkedpages : pagelinks , linkeddisqs : disqlinks } ;
	qsn_spacedefaultsnotechanged( artema_corplinksid , artemapage_publishlinksdone ) ;
}

function common_renderhtml( id ) {
	var div = getelement ( id ) ;
	id = div.id ;
	showblock( div ) ;
	var r = qsn_thenotes[ id ] ;
	if ( members && members[ r.common.ownerid ] ) r.common.savedmember = { username : members[ r.common.ownerid ].username , firstname : members[ r.common.ownerid ].firstname } ;
	var sc = r.spacedefaults.common ;
	if ( ! sc.left ) return false ;
	var uc = r.user.common ;
	var w = uc.width || sc.width || "200px" ;
	if ( w == "NaNpx" ) w = "200px" ;
	div.style[ "width" ] = w ;
	div.style[ "left" ] = uc.left || sc.left || "50px" ;
	div.style[ "top" ] = uc.top || sc.top || "50px" ;
	var zindex = ( uc.zindex != undefined ) ? uc.zindex : ( ( sc.zindex != undefined ) ? sc.zindex : "0" ) ;
	if ( zindex ) {
		var newindex = eval ( zindex ) ;
		div.style[ "zIndex" ]  = newindex ;
		qsn_updatezindexmax( id , newindex ) ;
	} else {
		qsn_adduserrefreshid( id ) ;
		qsn_puttofront( id ) ;
	}
	applymoveslist( [ id ] ) ;
}

function qsn_puttofront( id ) {
	try {	var currZ = eval ( qsn_thenotes[ id ].user.common.zindex ) ;
		if ( ( currZ ) && ( currZ == zindexmax ) ) return false ;
		qsn_thenotes[ id ].user.common.zindex = "" + ( ++zindexmax ) ;
	} catch ( err ) {
		if ( qsn_thenotes[ id ] ) qsn_thenotes[ id ].user.common.zindex = "" + ( ++zindexmax ) ;
		else zindexmax++ ;
	}
	var x = ge( id ) ;
	x.style[ "zIndex" ] = "" + zindexmax ;
	if ( qsn_thenotes[ id ].common.ghost || qsn_thenotes[ id ].common.col ) {
		if ( isie6() || isie78() ) {
			x.parentNode.style[ "zIndex" ] = "" + zindexmax ;
			hideshowblock( id , id ) ;
		}
	}
}

function qsn_updateuserrefresh( id ) {
	var l = [] ;
	for ( var i = 0 ; i < qsn_userrefreshid.length ; i++ ) if ( qsn_thenotes[ qsn_userrefreshid[ i ] ] ) l.push( { common : { noteid : qsn_userrefreshid[ i ] } , user : q_cloneObject( qsn_thenotes[ qsn_userrefreshid[ i ] ].spacedefaults ) } ) ;
	qsn_userrefreshid = [] ;
	return l ;
}

function qsn_applynoterefresh( xs ) {
	if ( qsn_currstate == "tm" ) return ;
	if ( xs.newid ) {
		var newids , oldids ; 
		if ( typeof xs.newid == "string" ) {
			newids = [ xs.newid ] ;
			oldids = [ xs.oldid ] ;
		} else {
			newids = xs.newid ;
			oldids = xs.oldid ;
		}
		var oldid , newid ;
		for ( var i = 0 ; i < newids.length ; i++ ) {
			oldid = oldids[ i ] ;
			newid = newids[ i ] ;
			if ( newid != oldid ) {
				q_idalias [ oldid ] = newid ;
				qsn_thenotes[ newid ] = q_cloneObject( qsn_thenotes[ oldid ] ) ;
				qsn_thenotes[ newid ].common.noteid = newid ;
				qsn_thenotes[ oldid ] = null ;
				if ( qsn_thenotes[ newid ].common.notekind == "settings" ) settings_noteid = newid ;
				else {
					if ( ge( oldid ) ) ge( oldid ).setAttribute( "id" , newid ) ;
					if ( ge( "ghost_" + oldid ) ) ge( "ghost_" + oldid ).setAttribute( "id" , "ghost_" + newid ) ;
				}
				for ( var noteid in qsn_thenotes ) if ( qsn_thenotes[ noteid ] && qsn_thenotes[ noteid ].parentid && qsn_thenotes[ noteid ].parentid == oldid ) {
					qsn_thenotes[ noteid ].parentid = newid ;
					qsn_notechanged( noteid , "notechanged" ) ;
				}
				var h = qsn_handler( qsn_thenotes[ newid ].common.notekind , "qsn_applynewnoterefresh" )
				if ( h ) h( newid , oldid ) ;
				if ( qsn_thenotes[ newid ].common.duplicateid ) {
					delete qsn_thenotes[ newid ].common.duplicateid ;
					if ( qsn_thenotes[ newid ].common.duplicatesvcid ) delete qsn_thenotes[ newid ].common.duplicatesvcid ;
					if ( qsn_thenotes[ newid ].common.duplicatetmpid ) delete qsn_thenotes[ newid ].common.duplicatetmpid ;
					rm( newid ) ;
					qsn_safeaddnote( newid ) ;
				}
			} else debugmail( "qsn_applynoterefresh called with xs.newid == xs.oldid in pages.js") ;
		}
	}
	if ( qsn_currstate != "view" ) return ;
	if ( xs.upindex ) document.mainform.upindex.value = xs.upindex ;
	if ( window.spacetabs && spacetabs.spaces && window.currspacetabindex != undefined )  {
		var svcs = spacetabs.spaces[ currspacetabindex ].services ;
		for ( var i = 0 ; i < svcs.length ; i++ ) if ( svcs[ i ][ 0 ] == currsvcid ) {
			svcs[ i ][ 1 ].space.high = xs.upindex ;
			if ( xs.publishdone ) q_svcfromid( currsvcid ).publicationupindex = xs.upindex ;
		}
	}
	pages_initpublishbutton() ;

	if ( xs.notes ) {
		var idslist = qsn_noteidssortedlist() ;
		for( var i = 0 ; i < idslist.length ; i++ ) if ( getelement ( idslist[ i ] ) ) rm ( getelement ( idslist[ i ] ) ) ;
		qsn_thenotes = q_cloneObject( xs.notes ) ;
		qsn_noteidslist = qsn_noteidssortedlist() ;
		qsnartema_init() ;
	}

	if ( window.notepad_update ) notepad_update() ;
}

function pages_prepareDrag( elem ) {
	var id = elem.id ;
	var imgs = elem.getElementsByTagName( "IMG" ) ;
	var savedwidth , img ;
	if ( pages_isaligned() ) {
		var richid = pages_richparentid( id ) ;
		var d = pages_richnoteoffsets( richid ) ;
		ge( richid ).style.position = "absolute" ;
		ge( richid ).parentNode.style.height = d.offsetHeight + "px" ;
	}
/*
	for ( var i = 0 ; i < imgs.length ; i++ ) {
		img = imgs[ i ] ;
		savedwidth = img.offsetWidth ;
		if ( img.offsetHeight ) img.ratio = img.offsetWidth / img.offsetHeight ;
		img.style.width = "" ;
		if ( img.offsetWidth != savedwidth ) img.style.width = savedwidth + "px" ;
	}
*/
/*
	if ( ! qsn_edittarget && pages_isaligned() ) {
		ge( "q_table").style.borderColor = rgbcontrastcolor150( getpagebackgroundcolor( ) ) ;
		ge( "q_table").border = "1" ;
	}
*/
	var r = qsn_thenotes[ id ] ;
	if ( r.pagesparent || pages_isrichnote( id ) ) {
		var richid = pages_richparentid( id ) ;
		var d = pages_richnoteoffsets( richid ) ;
		var richparentelem = ge( "pages_richparentelem" ) ;
		var richelem = ge( "pages_richelem" ) ;
		if ( r.pagesparent ) {
			richparentelem.style[ "zIndex" ] = "" + ( zindexmax + 1 ) ;
			richparentelem.style.top = qsn_truetop( r.parentid ) - 2 + "px" ;
			richparentelem.style.left = qsn_trueleft( r.parentid ) - 2 + "px" ;
			richparentelem.style.width = ge( r.parentid ).offsetWidth + "px" ;
			richparentelem.style.height = ge( r.parentid ).offsetHeight + "px" ;
		}
		richelem.style[ "zIndex" ] = "" + ( zindexmax + 1 ) ;
		richelem.style.top = d.offsetTop - 2 + "px" ;
		richelem.style.left = d.offsetLeft - 2 + "px" ;
		richelem.style.width = d.offsetWidth + "px" ;
		richelem.style.height = d.offsetHeight + "px" ;
		showblock( richelem ) ;
		visibleblock( richparentelem , r.pagesparent ) ;
		elem.parentid = richid ;
	}
}

function pages_prepareMove( elem , clientX0 , isGrow ) {
	var id = elem.id ;
	var trueGrow = ( clientX0 > ( qsn_trueleft( id ) + elem.offsetWidth + qdr_leftcolwidth + ( window.qdr_authorstuffoffsetleft || 0 ) - qdr_resizewidth ) ) ;
	return { isgrow : trueGrow } ;
	if ( ! trueGrow ) return { isgrow : trueGrow } ;
	if ( qsn_thenotes[ elem.id ].common.row == undefined ) return { isgrow : trueGrow } ;
	if ( qsn_thenotes[ elem.id ].common.ghost ) return { isgrow : trueGrow } ;
	var tmpid = qsn_thenotes[ id ].common.notekind + "_" + maxnoteid++ ;
	elem.id = tmpid ;
	qsn_thenotes[ tmpid ] = q_cloneObject( qsn_thenotes[ id ] ) ;
	qsn_thenotes[ tmpid ].common.noteid = tmpid ;
	qsn_thenotes[ tmpid ].common.ghost = id ;
// gérer s'il y a des enfants !!!
	qsn_thenotes[ id ].common.ghost = "ghost" ;
	qsn_thenotes[ id ].spacedefaults.common.left = "-2000px" ;
	qsn_thenotes[ id ].common.appendtarget = getContainer( elem ).parentNode ;
	var div = qsn_addnote( id ) ;
	div.style.position = "relative" ;
	elem.style.position = "absolute" ;
	return { isgrow : trueGrow } ;
}

function pages_dragLimits( elem ) {
	// xmax correspond au xmax sans tenir compte de la largeur de elem
	if ( ! elem ) return { xmin : pages_notesmargin , xmax : pages_maxsnX() } ;
	var id = elem.id ;
	var r = qsn_thenotes[ id ] ;
	if ( r.common.row == undefined && ! r.pagesparent && ! pages_isrichnote( id ) ) return { xmin : pages_notesmargin , xmax : pages_maxsnX() } ;
	var d = pages_richnoteoffsets( id ) ;
	var pseudowidth = d.offsetWidth ;
	var xorigin = 0 ;
	if ( d.isrichnote ) xorigin = d.offsetLeft - qsn_trueleft( id ) ;// note décorée, il faut prendre en compte le décalage lié aux décors
	if ( r.pagesparent ) xorigin = ge( r.parentid ).offsetLeft ;// décor, il faut prendre en compte l'offset du parent
	if ( pages_isaligned() ) {// en mode aligné la largeur max est la largeur de la colonne complète jusqu'au bout de la page
		var pagemaxX = width_def[ format_col( ( ( r.pagesparent ) ? qsn_thenotes[ r.parentid ] : r ).common.col.split( "-" )[ 0 ] , "" + ( col_def.length - 2 ) ) ] ;
		var pageminX = pagemaxX - width_def[ format_col( "0" , "" + ( col_def.length - 2 ) ) ] ;//largeur max - largeur de la colonne max occupant la largeur totale de la table
	} else {
		var pageminX = pages_notesmargin ;
		var pagemaxX = pages_maxsnX() ; // en mode non aligné la largeur max est la largeur de la page
	}
	return { xmin : pageminX - xorigin , ymin : parseInt( qsn_top( id , true ) , 10 ) - d.offsetTop , xmax : pagemaxX - pseudowidth - xorigin + elem.offsetWidth , xwmax : pagemaxX - xorigin + ( ( elem.style.marginLeft ) ? parseInt( elem.style.marginLeft , 10 ) : 0 ) } ;
	// elem.style.marginLeft à cause des notes transparentes qui ajoutent un décalage temporaire
	// xmax + elem.offsetWidth : car le move prend en compte offsetWidth
}

function xqsn_beginDrag( elem , e , moveHandler , upHandler ) {
	if ( isremoved( elem ) ) return ;
	if ( qsn_currstate == "edit" && elem != qsn_edittarget ) return ;
	if ( ( ( ( new Date() ).getTime() - latestclick.time ) < 700 ) && ( Math.abs ( q_clientX( e ) - latestclick.x ) < 2 ) && ( Math.abs ( q_clientY( e ) - latestclick.y ) < 2 ) && ( elem == latestclick.target ) && ( ! ( /(edit|new)/.test ( qsn_currstate ) ) ) ) return false ;
	pages_prepareDrag( elem ) ;
	qsn_hasmoved = false ;
	var dragLimits = pages_dragLimits( elem ) ;
	beginDrag( elem , e , moveHandler || qsn_moveHandler , upHandler || qsn_upHandler , dragLimits , ( dragLimits.xwmax ) ? pages_prepareMove : null ) ;
}

function xqsn_beginDragOnly( elem , e , moveHandler , upHandler ) {
	if ( isremoved( elem ) ) return ;
	if ( qsn_currstate == "edit" && elem != qsn_edittarget ) return ;
	if ( ( ( ( new Date() ).getTime() - latestclick.time ) < 700 ) && ( Math.abs ( q_clientX( e ) - latestclick.x ) < 2 ) && ( Math.abs ( q_clientY( e ) - latestclick.y ) < 2 ) && ( elem == latestclick.target ) && ( ! ( /(edit|new)/.test ( qsn_currstate ) ) ) ) return false ;
	pages_prepareDrag( elem ) ;
	qsn_hasmoved = false ;
	beginDrag( elem , e , moveHandler || qsn_moveOnlyHandler , upHandler || qsn_upOnlyHandler , pages_dragLimits( elem ) ) ;
}

function qsn_xupHandler( elem , ex , ey , ew , isGrow , isMove , sameplane , xylimits ) {
	var b = qsn_upsetjson( elem , ex , ey , ew , isGrow , isMove , sameplane , xylimits ) ;
	// var theid = ( elem.cassName && /container/.test( elem.cassName ) ) ? elem.id : getContainer( elem ).id ;
	var theid = getContainer( elem ).id ;
	var r = qsn_thenotes[ theid ] ;
	if ( isGrow && elem.growingupdone ) elem.growingupdone() ;
	if ( isMove && elem.movingupdone ) elem.movingupdone() ;
	if ( elem.dragupdone ) elem.dragupdone() ;
	if ( b ) qsn_saveupHandler( theid , ( r.common.ownerid == memberid ) , r.user.common.reduced ) ;
	if ( pages_isaligned() ) {
	//	ge( "q_table").style.borderColor = "transparent" ;
		ge( "q_table").border = "0" ;
	}
	hideblock( [ "pages_richparentelem" , "pages_richelem" ] ) ;
}

function pages_calcpageheight() {
	return qsn_calcpageheight() ;
}

function pages_updatepageheight() {
	var currh = pages_getpageheight() ;
	var maxh = pages_calcpageheight() ;
	if ( maxh != currh ) xpages_savesetting( null , { spacedefaults : { pageheight : maxh } } ) ;
	ge( "q_author_stuff" ).style.height = maxh + "px" ;
}

function pages_getpageheight() {
	var s = settings_getnote() ;
	if ( ! s ) return -1 ;
	if ( ! s.spacedefaults ) return -1 ;
	if ( ! s.spacedefaults.pageheight ) return -1 ;
	return s.spacedefaults.pageheight ;
}

function settings_savenote( h ) {
	// handler de mise à jour de s
	var s = settings_getorcreatenote() ; // ou on peut mettre settings_getnote() avec un test derrière + alert
	if ( h ) h( s ) ;
	var action = ( ! ( /note_/.test( s.common.noteid ) ) ) ? "newnote" : "notechanged" ;
	qsn_notechanged( s.common.noteid , action ) ;
}

function settings_getorcreatenote() {
	var id ;
	var s = settings_getnote() ;
	if ( s ) id = s.common.noteid ;
	else {
		var jsonnewnote = qsn_fulljson_template( "settings" ) ;
		id = qsn_makenewfulljson( "settings" , jsonnewnote ) ;
		qsn_isnewnote = false ;
	}
	if ( ! s ) settings_noteid = id ;
	return qsn_thenotes[ id ] ;
}

function pages_savepageheight( h ) {
	var s = settings_getorcreatenote() ;
	s.spacedefaults.pageheight = h ;
	settings_savenote() ;
}

function qsn_saveupHandler( id , isowner , isreduce ) {
	var r = qsn_thenotes[ id ] ;
	if ( r.user.common.left ) r.spacedefaults.common.left = r.user.common.left ;
	if ( r.user.common.top ) r.spacedefaults.common.top = r.user.common.top ;
	if ( r.user.common.width ) r.spacedefaults.common.width = r.user.common.width ;
	if ( r.user.common.zindex ) r.spacedefaults.common.zindex = r.user.common.zindex ;
	if ( qsn_edittarget != null ) return ;
	if ( pages_isaligned() ) {
		var richparentid = pages_richparentid( id ) ;
		xalign_notes( false , ( richparentid == id ) ? [ id ] : [ id , richparentid ] ) ;
		if ( ! r.pagesparent ) {
			var elem = ge( id ) ;
			elem.parentNode.style.height = ( qsn_thenotes[ id ].common.richinfos ) ? qsn_thenotes[ id ].common.richinfos.offsetHeight + "px" : "" ;
			if ( isie78() ) {
				var imgs = elem.getElementsByTagName( "IMG" ) ;
				for ( var i = 0 ; i < imgs.length ; i++ ) imgs[ i ].style.width = imgs[ i ].offsetWidth + "px" ;
			}
			elem.style.position = "relative" ;
/*
			if ( isie6() ) {
				var imgs = elem.getElementsByTagName( "IMG" ) ;
				for ( var i = 0 ; i < imgs.length ; i++ ) if ( imgs[ i ].ratio ) {
					imgs[ i ].style.width = imgs[ i ].offsetWidth + "px" ;
					imgs[ i ].style.height = Math.round( imgs[ i ].offsetWidth * imgs[ i ].ratio ) + "px" ;
				}
			}
*/
		}
	} else {
		pages_updatepageheight() ;
		pages_savedghost = [] ;
		pages_newnotes = [] ;
		pages_changednotes = [ id ] ;
		pages_confirm_align() ;
	}
}

function qsn_suppressnote( x , wantdefault ){
	if ( typeof x == "string" ) x = getelement( x ) ;
	var div = getContainer( x ) ;
	var id = div.id ;
	var notekind = qsn_thenotes[ id ].common.notekind ;
	var h = qsn_handler( notekind , "qsn_suppressnote" , wantdefault ) ;
	if ( h ) return h( id ) ;

// DEFAULT BEHAVIOR
	if ( ! q_readytosubmit() ) return false ;
	if ( ! qsn_allowsuppress( id ) ) return false ;

	var noteslist = [ id ] ;
	var children = [ ] ; // array des ids
	for ( var noteid in qsn_thenotes ) try { if ( qsn_thenotes[ noteid ].parentid == id ) children.push( noteid ) } catch( err ) { } ;
	var cid, ind ;
	for ( var i = 0 ; i < children.length ; i++ ) {
		cid = children[ i ] ;
		noteslist.push( cid ) ;
		qsn_thenotes[ cid ] = null ;
		ind = indexOfItem( cid , qsn_userrefreshid ) ;
		if ( ind != -1 ) qsn_userrefreshid.splice ( ind , 1 ) ;
		rm ( ge( cid ) ) ;
	}
//	var pagesparent = qsn_thenotes [ id ].pagesparent ;
	var parentid = qsn_thenotes [ id ].parentid ;
	var richparentid = pages_richparentid( id ) ;
	qsn_thenotes[ id ] = null ;
	ind = indexOfItem( id , qsn_userrefreshid ) ;
	if ( ind != -1 ) qsn_userrefreshid.splice ( ind , 1 ) ;
	rm ( div ) ;
	var changednotes = [] ;
	if ( parentid ) {
		qsn_childremoved ( parentid ) ;
		var d = pages_richnoteoffsets( parentid ) ;
		if ( d.isrichnote ) {
			if ( ! qsn_thenotes[ parentid ].common.richinfos ) qsn_thenotes[ parentid ].common.richinfos = {} ;
			qsn_thenotes[ parentid ].common.richinfos.offsetTop = d.offsetTop ;
			qsn_thenotes[ parentid ].common.richinfos.offsetLeft = d.offsetLeft ;
			qsn_thenotes[ parentid ].common.richinfos.offsetWidth = d.offsetWidth ;
			qsn_thenotes[ parentid ].common.richinfos.offsetHeight = d.offsetHeight ;
		} else qsn_thenotes[ parentid ].common.richinfos = null ;
		changednotes = [ qsn_thenotes[ parentid ] ] ;
	}
	var json = {} ;
	json.changednotes = changednotes ;
	json.removednotes = noteslist ;
	if ( qsn_userrefreshid.length ) json.userrefresh = qsn_updateuserrefresh() ;
 	json.upindex = document.mainform.upindex.value ;
	document.mainform.mission.value = "alignnotes" ;
	q_ajaxsubmit( json , qsn_handlerefreshnotes ) ;
	qsn_noteidslist = qsn_noteidssortedlist() ;
	if ( pages_isaligned() ) xalign_notes( false , ( richparentid == id ) ? [] : [ richparentid ] ) ;
	else {
		pages_updatepageheight() ;
		pages_savedghost = [] ;
		pages_newnotes = [] ;
		pages_changednotes = [] ;
		pages_confirm_align() ;
	}
	return true ;
}

function pages_notechanged( ids , richparentid ) {
	// ids tableau d'ids, le premier est la note parent
	if ( pages_isaligned() ) {
		xalign_notes( false , ( richparentid ) ? ids.concat( [ richparentid ] ) : ids ) ;
	} else {
		pages_updatepageheight() ;
		pages_savedghost = [] ;
		pages_newnotes = ids ;
		pages_changednotes = [] ;
		pages_confirm_align() ;
	}
}

function pages_isrichnote( id ) {
	var div = ge( id ) ;
	var children = getElementsByClassName( div , "container" ) ;
	var cdiv , cid ;
	for ( var i = 0 ; i < children.length ; i++ ) {
		cid = children[ i ].id ;
		if ( cid && qsn_thenotes[ cid ] && qsn_thenotes[ cid ].parentid == id && qsn_thenotes[ cid ].pagesparent ) return true ;
	}
	return false ;
}

function pages_richparentid( id ) {
	var r = qsn_thenotes[ id ] ;
	if ( r.parentid && r.pagesparent ) return pages_richparentid( r.parentid ) ;
	return id ;
}

function pages_richnoteoffsets( id ) {
	var div = ge( id ) ;
	var children = getElementsByClassName( div , "container" ) ;
	var deltawidth = ( div.transparentOffsetWidth ) ? div.transparentOffsetWidth : 0 ;
	var l = qsn_trueleft( id ) + deltawidth/2 ;
	var t = qsn_truetop( id ) + deltawidth/2 ;
	var r = l + div.offsetWidth - deltawidth ;
	var b = t + div.offsetHeight - deltawidth ;
	var isrichnote = false ;
	var cdiv , cid, offsets ;
	for ( var i = 0 ; i < children.length ; i++ ) {
		cdiv = children[ i ] ;
		cid = cdiv.id ;
		if ( ! cid || ! qsn_thenotes[ cid ] ) continue ;
		if ( qsn_thenotes[ cid ].parentid != id ) continue ;
		isrichnote = true ;
		offsets = pages_richnoteoffsets( cid ) ;
		l = Math.min( l , offsets.offsetLeft ) ;
		t = Math.min( t , offsets.offsetTop ) ;
		r = Math.max( r , offsets.offsetLeft + offsets.offsetWidth ) ;
		b = Math.max( b , offsets.offsetTop + offsets.offsetHeight ) ;
	}
	return { "offsetLeft" : l , "offsetTop" : t , "offsetWidth" : r-l , "offsetHeight" : b-t , "isrichnote" : isrichnote } ;
}

function pages_richnote( x ) {
	showblock("q_drawers");
	var id = getContainer( x ).id ;
	pages_loadsnchildchooser( id , qsn_richnotes( id ) ) ;
}

function pages_newchildnote( snkind , parentid ) {
	var r = eval ( snkind + "_json_template" ) ;
	var savedr = q_cloneObject( r ) ;
	r.parentid = parentid ;
	r.pagesparent = true ;
	if ( ! r.common ) r.common = {} ;
	r.common.left = 0 - q_windowscrollX() ;
	r.common.top = 0 - q_windowscrollY() ;
	qsn_newnote( snkind ) ;
	eval ( snkind + "_json_template = savedr" ) ;
//	qsn_thenotes[ qsn_edittarget.id ].parentid = parentid ;
//	qsn_thenotes[ qsn_edittarget.id ].pagesparent = true ;
}

function pages_opensnchildchooser( parentid , snchooserlist ) {
	loaded_snchooserlist = snchooserlist ;
	try {
		qlub_openleftdrawer( "qlub_snchooser", 550 ) ;
		ge( "qlub_snchooser" ).setAttribute( "newnotehandler" , "pages_newchildnote" ) ;
		ge( "qlub_snchooser" ).setAttribute( "newnotehandlerparams" , [ parentid ] ) ;
	} catch( err ) {
		qlub_openleftdrawer( "artema_snchooser", 550 ) ;
		ge( "artema_snchooser" ).setAttribute( "newnotehandler" , "pages_newchildnote" ) ;
		ge( "artema_snchooser" ).setAttribute( "newnotehandlerparams" , [ parentid ] ) ;
	}
	snchooser_showsnpage( 1 , snchooserlist ) ;
	// xsnchooser_showsnpage( 1 , snchooserlist , "pages_newchildnote" , [ parentid ] );
}

function pages_loadsnchildchooser( parentid , chooserlist ) {
	q_include( [ q_elems[ "snchooser" ] ] , "pages_opensnchildchooser" , [ parentid , chooserlist || sn_chooserlist ] ) ;
}

/*
function -
function LEFTCOL LINKS
*/

// qlub_openemailalert now in bundle/qlub/scripts/common.js

function artema_openpageslinks( ) {
	q_include( [ q_elems[ "pageslinks" ] ] , "artema_editpagelinks" , [ ] ) ;
}

function artema_opencustomizepage( ) {
	q_include( [ q_elems[ "customizepage" ] ] , "artema_revealcustomizepage" , [ ] ) ;
}

function pages_remove_done( x ) {
	openspace( document.mainform.q_space.value ) ;
	return false ;
}

function pages_remove( callback ) {
	if ( ! q_readytosubmit() ) return false ;
	if ( ! confirm( artema_message[ "pageremove" ] ) ) {
		return false ;
	}
	document.mainform.mission.value = "pageremove" ;
	q_ajaxsubmitwithservice( "subscribe@" + q_lang , { pageid : currsvcid } , ( callback ) ? callback : pages_remove_done ) ;
	return false ;
}

/*
function -
function SLIDER MISE EN PAGE
*/

var minwidthcol = 60 ;

function pages_StopmoveHandler( elem , ex , ey , ew , isGrow ) {
	var sliders = getElementsByClassName( ge( "border" ) , "pages_stop" ) ;
	for ( var i = 0 ; i < sliders.length ; i++ ) if ( elem == sliders[ i ] ) var sliderid = i ;
	
	var maxleft = ( sliderid == sliders.length-1 ) ? ( pages_maxwidthpage() - table_margin - minwidthcol ) : ( sliders[ sliderid + 1 ].offsetLeft - minwidthcol ) ;
	var minleft = ( sliderid == 0 ) ? ( table_margin + minwidthcol ) : ( sliders[ sliderid - 1 ].offsetLeft + minwidthcol ) ;
	if ( ex > maxleft ) elem.style.left = maxleft + "px" ;
	else if ( ex < minleft ) elem.style.left = minleft + "px" ;
	else elem.style.left = ex + "px" ;
	var format = settings_getnote().spacedefaults.format ;
	format.pageformat = pages_makeformat( ) ;
	pages_applyformat( format , true , true ) ;
}

function pages_StopupHandler( elem , ex , ey , ew , isGrow ) {
	elem.style.cursor = "e-resize" ;
	var format = settings_getnote().spacedefaults.format ;
	format.pageformat = pages_makeformat( ) ;
	pages_applyformat( format , true ) ;
}

function pages_beginStopDrag( elem , ee ) {
	return beginDrag( elem , ee , pages_StopmoveHandler , pages_StopupHandler ) ;
}

function pages_makeformat( ) {
	var w = pages_maxwidthpage() - 2*table_margin ;
	var sliders = getElementsByClassName( ge( "border" ) , "pages_stop" ) ;
	var cols = [ 0 ] ;
	for ( var i = 0 ; i < sliders.length ; i++ ) {
		var slider = sliders[ i ] ;
		cols.push( (slider.offsetLeft - slider.offsetStop) / w ) ;
	}
	cols.push( 1 ) ;
	var format = [] ;
	for ( var i = 1 ; i < cols.length ; i++ ) format.push( cols[ i ] - cols[ i - 1 ] ) ;
	return format ;
}

/*
function -
function MISE EN PAGE
*/

var col_def = [] ;
var width_def = {} ;
var table_margin_left = 18 ; 
var table_margin_right = 18 ;
var table_margin = 18 ;
var pages_notesmargin = pages_defaultcolsmargin = 5 ; //pages_hmargin
var pages_vmargin = pages_defaultrowsmargin = 5 ;
var pages_bottomsecuremargin = 25 ; //marge basse de sécurité

function pages_maxwidthpage() {
	var w = 990 ;
	if ( ! window.pages_adsdimensions ) return w ;
	var x = pages_adsdimensions() ;
	if ( ! x.inpage ) return w ;
	return w - x.width - x.paddingleft - x.paddingright ;
}

function pages_maxsnX() {
	if ( col_def.length > 0 ) return pages_maxwidthpage() - table_margin_right - pages_notesmargin ;
	return pages_maxwidthpage() - pages_notesmargin ;
}

function pages_maxsnwidth() {
	if ( col_def.length > 0 ) return pages_maxwidthpage() - ( table_margin_right + table_margin_left ) - 2 * pages_notesmargin ;
	return pages_maxwidthpage() - 2*pages_notesmargin ;
}

function pages_init_pageformat( r ) {
	var y = ge( "pages_pageformat3" ) ;
	if ( ! r || ! r.spacedefaults.format || ! r.spacedefaults.format.pageformat ) {
		y.ncolumns = "3" ;
		q_innerHTML( "pages_pageformat3_ncols" , y.ncolumns ) ;
		hideblock( "pages_obsoformatbutton" ) ;
		return ;
	}
	var format = r.spacedefaults.format ;
	visibleblock( "pages_obsoformatbutton" , ! r.common.alignversion ) ;
//	if ( ! r.pageformat ) r.pageformat = "2" ;
//	if ( r.fittocolumn == undefined ) r.fittocolumn = true ;
//	if ( r.pagewidth == undefined ) r.pagewidth = pages_maxwidthpage() ;
	pages_setcol_def() ;
	if ( pages_getalignversion() ) renderBorder() ;
	if ( format.pageformat ) {
		// var z = ( format.pageformat.length == 1 ) ? y : ge( "pages_pageformat" + format.pageformat ) ; // devient inutile ?
		if ( format.pageformat.length == 1 ) y.ncolumns = format.pageformat ;
		else if ( format.lastncolformat != undefined ) y.ncolumns = format.lastncolformat ;
		else y.ncolumns = "3" ;
		// z.style.backgroundPosition = "bottom" ;
		// z.className = z.className + " locked" ;
	} else y.ncolumns = format.lastncolformat || "3" ;
	q_innerHTML( "pages_pageformat3_ncols" , y.ncolumns ) ;
//	if ( format.fittocolumn ) setchecked( ge( "pages_fittocolumn" ) , format.fittocolumn ) ;
//	q_innerHTML( "pages_pagewidth" , artema_message[ "pagewidthlink" ].replace( "%s" , "" + r.pagewidth ) ) ;
}

function renderBorder() {
//	return ;
	try {	
		var d = ge( "border" ) ;
		if ( ! d ) return ;
		d.style.position = "relative" ;
		d.style.left = "-1px" ;
		d.style.top = "-1px" ;
		if ( ge( "quomodo_elem" ) && ge( "quomodo_elem" ).parentNode ) hideblock( ge("quomodo_elem").parentNode ) ;
		d.innerHTML = "" ;
		var div ;
		
		var s = settings_getnote() ;
		var format = s.spacedefaults.format ;
	} catch( err ) {
	timemsg( "renderBorder 0 " + ( err.message || err.description || "" ) )
	}
		var topborder = -16 ;
		var add_halfwidth = 6 ;
	try {	div = document.createElement( "DIV" ) ;
		div.style.position = "absolute" ;
		div.style.top = topborder + "px" ;
		div.style.left = table_margin_left - add_halfwidth + "px" ; 
		div.style.fontSize = "20px" ;
		div.style.color =  rgbcontrastcolor150( getpagebackgroundcolor( ) ) ;
		div.innerHTML = '<img src="/images/add14.png" class="notforie6" alt="add" /><img src="/images/blank.gif" class="onlyforie6" alt="add"  style="_filter :progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'/images/add14.png\',sizingMethod=\'image\');" />' ;
		div.className = "pages_addcol" ;
		div.offsetStop = table_margin_left - 10 ;
		div.style.cursor = "pointer" ;
	} catch( err ) {
	timemsg( "renderBorder 1 " + ( err.message || err.description || "" ) )
	}
	try{	visibleblock( div , ! ( format && pages_formatgetncols( format ) > 7 ) ) ;
		// div.onmousedown = function ( ) { pages_addcol( this ) ; } ;
		div.onclick = function ( ) { pages_addcol( this ) ; } ;
		d.appendChild( div ) ;

		for ( var i =1 ; i < col_def.length-1 ; i++ ) {
			div = document.createElement( "DIV" ) ;
			div.style.position = "absolute" ;
			div.style.top = ( topborder - 2 ) + "px" ;
			div.style.left = table_margin_left + col_def[ i ] - 9 + "px" ; //- 9 = demi largeur du taquet
			div.style.fontSize = "18px" ;
			div.style.color =  rgbcontrastcolor150( getpagebackgroundcolor( ) ) ;
			div.innerHTML = '▼ <span class="pages_delete" style="display:none;cursor:pointer;" onclick="pages_deletecol( this ) ;"><img src="/images/delete14.png" class="notforie6" alt="delete" /><img src="/images/blank.gif" class="onlyforie6" alt="delete"  style="_filter :progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'/images/delete14.png\',sizingMethod=\'image\');" /></span>' ;
			div.className = "pages_stop" ;
			div.title = artema_message[ "dragstop" ] ;
			div.offsetStop = table_margin_left - 10 ;
			div.style.cursor = "e-resize" ;
			div.onmousedown = function ( event ) { pages_beginStopDrag( this , event ) } ;
			div.onmouseover = function ( ) { showblock( gebcn( this , 'pages_delete' ) ); } ;
			div.onmouseout = function ( ) { hideblock( gebcn( this , 'pages_delete' ) ); } ;
			
			d.appendChild( div ) ;
		}
	} catch( err ) {
	timemsg( "renderBorder 2 " + ( err.message || err.description || "" ) )
	}

	try {	div = document.createElement( "DIV" ) ;
		div.style.position = "absolute" ;
		div.style.top = topborder + "px" ;
		div.style.left = pages_maxwidthpage() - table_margin_right - add_halfwidth + "px" ; 
		div.style.fontSize = "20px" ;
		div.style.color =  rgbcontrastcolor150( getpagebackgroundcolor( ) ) ;
		div.innerHTML = '<img src="/images/add14.png" class="notforie6" alt="add" /><img src="/images/blank.gif" class="onlyforie6" alt="add"  style="_filter :progid:DXImageTransform.Microsoft.AlphaImageLoader(src=\'/images/add14.png\',sizingMethod=\'image\');" />' ;
		div.className = "pages_addcol" ;
		div.offsetStop = table_margin_left - 10 ;
		div.style.cursor = "pointer" ;
		visibleblock( div , ! ( format && pages_formatgetncols( format ) > 7 ) ) ;
		// div.onmousedown = function ( ) { pages_addcol( this ) ; } ;
		div.onclick = function ( ) { pages_addcol( this ) ; } ;
		d.appendChild( div ) ;
	} catch( err ) {
	timemsg( "renderBorder 3 " + ( err.message || err.description || "" ) )
	}
}

function pages_addcol( x ) {
	try {
		var s = settings_getnote() ;
		var format = s.spacedefaults.format ;
		
		var w = pages_maxwidthpage() - 2*table_margin ;
		var sliders = getElementsByClassName( "border" , "pages_stop" ) ;
		var cols = [ 0 ] ;
		var adds = getElementsByClassName ( "border" , "pages_addcol" ) ;
		if ( x == adds[ 0 ] ) cols.push( 0 ) ;
	} catch( err ) { timemsg("pages_addcol 1 " + err.message ) }

	try {
		for ( var i = 0 ; i < sliders.length ; i++ ) {
			var slider = sliders[ i ] ;
			cols.push( (slider.offsetLeft - slider.offsetStop) / w ) ;
		}
	} catch( err ) { timemsg("pages_addcol 2 " + err.message ) }

	try {
		if ( x == adds[ 1 ] ) cols.push( 1 ) ;
		cols.push( 1 ) ;
		//on décale au fur et a mesure pour que les notes ne rentre pas ds la nouvelle colonne
		var steps = 10 ;
		if ( x == adds[ 0 ] ) {
			cols[ 1 ] = steps / w ;
			pages_checkothercols( 0 , cols , w , steps , format ) ;
		} else {
			cols[ cols.length - 2 ] = 1 - steps / w ;
			pages_checkothercols( 1 , cols , w , steps , format ) ;
		}
	} catch( err ) { timemsg("pages_addcol 3 " + err.message ) }
}

function pages_checkothercols( leftorright , cols , w , steps , format ) {
	var newformat = [] ;
	var relaunch = false ;
	if ( leftorright == 0 ) {
	try {
		for ( var i = 1 ; i < cols.length ; i++ ) {
			if ( i > 1 ) if ( cols[ i ] - cols[ i - 1 ] < minwidthcol / w ) cols[ i ] = cols[ i - 1 ] + minwidthcol / w ; 
			newformat.push( cols[ i ] - cols[ i - 1 ] ) ;
		}
		if ( cols[ 1 ] < minwidthcol / w ) {
			cols[ 1 ] = Math.min( cols[ 1 ] + steps / w , minwidthcol / w )  ;
			relaunch = true ;
		}
	} catch( err ) { timemsg("pages_checkothercols 1 " + err.message ) }

	} else {
	try{
		for ( var i = cols.length - 2 ; i >= 0 ; i-- ) {
			if ( i < cols.length - 2 ) if ( cols[ i + 1 ] - cols[ i ] < minwidthcol / w ) cols[ i ] = cols[ i + 1 ] - minwidthcol / w ;
			newformat.push( cols[ i + 1 ] - cols[ i ] ) ;
		}
		newformat.reverse() ;
		if ( cols[ cols.length - 2 ] > 1 - minwidthcol / w ) {
			cols[ cols.length - 2 ] = Math.max( cols[ cols.length - 2 ] - steps / w , 1 - minwidthcol / w )  ;
			relaunch = true ;
		}
	} catch( err ) { timemsg("pages_checkothercols 2 " + err.message ) }

	}

	try {
		format.pageformat = newformat ; 
		format.ncols = newformat.length ;
		if ( relaunch ) {
			pages_applyformat( format , true , true ) ; // skipsave
			setTimeout( function() { pages_checkothercols( leftorright , cols , w , steps , format ) ; } , 200 ) ;
		} else {
			pages_applyformat( format , true ) ;
		}
		renderBorder() ;
	} catch( err ) { timemsg("pages_checkothercols 3 " + err.message ) }
}

function pages_deletecol( x ) {
	if ( ! x || ! x.parentNode ) return ;
	rm( x.parentNode ) ;
	var format = settings_getnote().spacedefaults.format ;
	format.pageformat = pages_makeformat( ) ;
	format.ncols = format.pageformat.length ;
	pages_applyformat( format , true ) ;
}

function pages_resetformat_cleanuppage() {
	if ( ge( "quomodo_elem" ) && ge( "quomodo_elem" ).parentNode ) showblock( ge( "quomodo_elem" ).parentNode ) ;
	ge( "border" ).innerHTML = "" ;
}

function pages_resetformat() {
	pages_resetformat_cleanuppage() ;
	pages_savedghost = [] ;
	pages_newnotes = [] ;
	pages_changednotes = [] ;
	var align_list = [] ;
	qsn_noteidslist = qsn_noteidssortedlist() ;
	var id , col , row , r , rghost , ghostid , w , maxcolwidth , tmpid ;
	for ( var i=0; i<qsn_noteidslist.length; i++ ) {
		id = qsn_noteidslist[ i ] ;
		r = qsn_thenotes[ id ] ;
		if ( r.common.notekind == "settings" || r.common.notekind == "missing" || r.parentid || isremoved( ge( id ) ) ) continue ;
		if ( r.common.ghost && r.common.ghost == "ghost" ) {
			delete qsn_thenotes[ id ] ;
			pages_savedghost.push( id ) ;
		} else {
			r.common.row = r.common.col = r.common.richinfos = r.common.ghost = null ;
			r.spacedefaults.common.left = r.user.common.left = Math.max( qsn_trueleft( id ) , 0 ) + "px" ;
			r.spacedefaults.common.top = r.user.common.top = Math.max( qsn_truetop( id ) , 0 ) + "px" ;
			qsn_thenotes[ id ] = q_cloneObject( r ) ;
			pages_changednotes.push( id ) ;
		}
	}
	xpages_savesetting( { pageformat : null } , { spacedefaults : { pageheight : pages_calcpageheight() } } ) ;
	var tableelem = ge( "q_table" ) ;
	var tablelength = tableelem.rows.length ;
	for ( var i = 0 ; i < tablelength ; i++ ) tableelem.deleteRow( 0 ) ;
	col_def = [] ;
	width_def = {} ;
	qsnartema_init() ;
	pages_confirm_align() ;
}

function pages_isaligned() {
	return ( pages_getpageformat() && pages_getalignversion() ) ;
}

function pages_getalignversion() {
	var s = settings_getnote() ;
	if ( ! s ) return null ;
	return s.common.alignversion ;
}

function pages_getpageformat() {
	var s = settings_getnote() ;
	if ( ! s ) return null ;
	rformat = s.spacedefaults.format ;
	if ( ! rformat ) return null ;
	return rformat.pageformat ;
}

function pages_savesetting( xformat ) {
	xpages_savesetting( xformat ) ;
}

function xpages_savesetting( xformat , json ) {
	var id ;
	var s = settings_getnote() ;
	if ( s ) id = s.common.noteid ;
	else {
		var jsonnewnote = qsn_fulljson_template( "settings" ) ;
		id = qsn_makenewfulljson( "settings" , jsonnewnote ) ;
		qsn_isnewnote = false ;
	}
	var r = qsn_thenotes[ id ] ;
	if ( json ) r = xq_cloneObject( json , false , r ) ;
	var format = r.spacedefaults.format ;
	for ( key in xformat ) {
		format[ key ] = xformat[ key ] ;
		if ( ( key == "pageformat" ) && ( xformat[ key ] && xformat[ key ].length == 1 ) ) format.lastncolformat = xformat[ key ] ;
	}
	if ( xformat ) qsn_thenotes[ id ].common.alignversion = 1 ;
	if ( ! s ) settings_noteid = id ;
}

/*
function pages_setwidth() {
	qprompt( [ artema_message[ "pagewidthtitle" ] , artema_message[ "pagewidthprompt" ] ] , "pages_setwidth_promptdone" , { "default" : "" + qsvc_settings.pagewidth , args : [] } ) ;
}

function pages_setwidth_promptdone( r ) {
	if ( ! r ) return alert( artema_message[ "pagewidthbadvalue" ] ) ;
	var w = parseInt( r , 10 ) ;
	if ( ( ! w ) || ( w < 800 ) || ( w > 2048 ) ) return alert( artema_message[ "pagewidthbadvalue" ] ) ;
	pages_savesetting( "pagewidth" , w ) ;
	q_innerHTML( "pages_pagewidth" , artema_message[ "pagewidthlink" ].replace( "%s" , "" + qsvc_settings.pagewidth ) ) ;
	pages_setcol_def() ;
}
*/

function pages_selectfit( x ) {
	var b = ! getchecked( x ) ;
	setchecked( x, b ) ;
//	pages_savesetting( { "fittocolumn" : b } ) ;
//	align_notes( { "fittocolumn" : b } ) ;
}

var pages_formattowidths = { "12" : [ 1/3 , 2/3 ] , "21" : [ 2/3 , 1/3 ] , "121" : [ 1/4 , 1/2 , 1/4 ] } ;

function pages_ntowidths( n ) {
	n = parseInt( n , 10 ) ;
	var x = [] ;
	for ( var i = 0 ; i < n ; i++ ) x.push( 1 / n ) ;
	return x ;
}

function pages_formatgetncols( format ) {
	if ( ! format.pageformat ) return -1 ;
	if ( format.ncols ) return format.ncols ;
	if ( typeof format.pageformat == "object" ) return format.pageformat.length ;
	if ( pages_formattowidths[ format.pageformat ] ) return pages_formattowidths[ format.pageformat ].length ;
	return parseInt( format.pageformat , 10 ) ;
}

function pages_applyformat( format , sskipconfirm , sskipsave , callback ) {
	if ( ! format ) {
		var s = settings_getnote() ;
		if ( ! s || ! s.spacedefaults || ! s.spacedefaults.format ) return ;
		var format = s.spacedefaults.format ;
	}
	var wantconfirm = ! ( sskipconfirm || false ) ;
	var skipsave = sskipsave || false ;
	pages_setcol_def( format ) ;
//	if ( wantconfirm ) renderBorder() ; //-> passé dans xalign_notes sinon settings_getnote n'existe pas nécessairement
	xalign_notes( wantconfirm , [] , format , skipsave , callback ) ;
	visibleblock( getElementsByClassName( "border" , "pages_addcol" ) , pages_formatgetncols( format ) < 8 ) ; 
}

function pages_setcol_def( xformat , xholder ) {
	var holder = xholder || window ;
	var s = settings_getnote() ;
	var format = xformat || ( ( s ) ? s.spacedefaults.format : null ) ;
	if ( ! format ) return ;
	if ( ! format.pageformat ) return ;

	if ( format.colsmargin ) holder.pages_notesmargin = parseInt( format.colsmargin , 10 ) ;
	if ( format.rowsmargin ) holder.pages_vmargin = parseInt( format.rowsmargin , 10 ) ;

	if ( typeof format.pageformat == "object" ) var x = format.pageformat ;
	else var x = pages_formattowidths[ format.pageformat ] || pages_ntowidths( format.ncols || format.pageformat ) ; //JP
//	var w = pages_maxwidthpage() - 2*parseInt( gcs( "q_table" , "marginLeft" ) , 10 ) ; NE MARCHE PAS SOUS FF
	var w = pages_maxwidthpage() - 2*table_margin ;
	holder.col_def = [ 0 ] ;
	for ( var i = 0 ; i < x.length ; i++ ) holder.col_def.push( holder.col_def[ i ] + Math.round( w * x[ i ] ) ) ;
	holder.table_margin_left = table_margin - Math.round( ( holder.col_def[ x.length ] - w ) / 2 ) ;
	holder.table_margin_right = 2*table_margin - holder.table_margin_left ;
	if ( holder == window ) ge('q_table').style.marginLeft = holder.table_margin_left + "px" ;
	if ( holder == window ) ge('q_table').style.marginRight = holder.table_margin_right + "px" ;
//	col_def.push( w ) ;
	holder.width_def = {} ;
	var s , x0 ;
	for ( var i = 0 ; i < holder.col_def.length - 1 ; i++ ) {
		s = "" + i ;
		x0 = holder.col_def[ i ] ;
		for ( var j = i ; j < holder.col_def.length - 1 ; j++ ) {
			if ( i != j ) s += "-" + j ;
			holder.width_def[ s ] = holder.col_def[ j + 1 ] - x0 - 2 * holder.pages_notesmargin - 4 ; // pour le border de la table
		}
	}
}

function pages_confirm_align( callback ) {
	var json = {} ;
	var s = settings_getnote() ;
	if ( !  ( /note_/.test( s.common.noteid ) ) ) pages_newnotes.push( s.common.noteid ) ;
	else pages_changednotes.push( s.common.noteid ) ;
	var l = [] ;
	var lparentid = [] ;
	// il faut forcer les enfants à être après les parents sinon ça ne va pas marcher côté AS
	for ( var i = 0 ; i < pages_newnotes.length ; i++ ) {
		if ( qsn_thenotes[ pages_newnotes[ i ] ].parentid ) lparentid.push( qsn_thenotes[ pages_newnotes[ i ] ] ) ;
		else l.push( qsn_thenotes[ pages_newnotes[ i ] ] ) ;
	}
	json.newnotes = l.concat( lparentid ) ;
	var l = [] ;
	for ( var i = 0 ; i < pages_changednotes.length ; i++ ) l.push( qsn_thenotes[ pages_changednotes[ i ] ] ) ;
	json.changednotes = l ;
	json.removednotes = pages_savedghost ;
	for ( var i = 0 ; i < pages_savedghost.length ; i++ ) qsn_thenotes[ pages_savedghost[ i ] ] = null ;
	if ( qsn_userrefreshid.length ) json.userrefresh = qsn_updateuserrefresh() ;
 	json.upindex = document.mainform.upindex.value ;
	document.mainform.mission.value = "alignnotes" ;
	q_ajaxsubmit( json , callback || pages_confirm_aligndone ) ;
}

function pages_confirm_aligndone( x ) {
	qsn_applynoterefresh( x ) ;
//	hideblock( "q_fullscreenmask" ) ;
}

function pages_cancel_align() {
	qsn_thenotes = q_cloneObject( pages_savedalign ) ;
	qsn_noteidslist = qsn_noteidssortedlist() ;
	tableelem = ge( "q_table" ) ;
	width_def = [] ;
	col_def = [] ;
	var tablelength = tableelem.rows.length ;
	for ( var i = 0 ; i < tablelength ; i++ ) tableelem.deleteRow( 0 ) ;
	qsnartema_init() ;
}

/*
function -
function SMARTNOTE SETTINGS
*/

var settings_json_template = { version: 1 , spacedefaults : { format : {} } } ;
var settings_addnote_done = false ;
var settings_noteid ;
var settings_changedhandlers = [] ;

function settings_addchangedhandler( h ) { //h = string
	if ( indexOfItem( h , settings_changedhandlers ) == -1 ) settings_changedhandlers.push( h ) ;
	if ( settings_addnote_done ) settings_changedone( h ) ;
}

function settings_changedone( h ) {
	try { eval ( h ).apply ( this , [ settings_getnote() ] ) ; } catch(err) {}
}

function settings_changedall() {
	if ( ! settings_noteid ) return ;
	for ( var i = 0 ; i < settings_changedhandlers.length ; i++ ) {
		try { eval ( settings_changedhandlers[ i ] ).apply ( this , [ qsn_thenotes[ settings_noteid ] ] ) ; } catch(err) {}
	}
}

function settings_getnote() {
	if ( ! settings_noteid ) return null ;
	if ( qsn_thenotes[ settings_noteid ] ) return qsn_thenotes[ settings_noteid ] ;
	if ( qsn_thenotes[ q_idalias[ settings_noteid ] ] ) {
		settings_noteid = q_idalias[ settings_noteid ] ;
		return qsn_thenotes[ settings_noteid ] ;
	}
	return null ;
}

function settings_addnote( noteid ) {
	qsn_thenotes[ noteid ].user.common.zindex = "0" ;
	settings_renderhtml( noteid ) ;
	return true ;
}

function settings_renderhtml( noteid ) {
	settings_noteid = noteid ;
	var s = qsn_thenotes[ noteid ] ;
	if( s && s.spacedefaults && s.spacedefaults.format && s.spacedefaults.format.pageformat != null ) hideshowblock( "qlub_nomep" , "qlub_havemep" ) ;
	else hideshowblock( "qlub_havemep" , "qlub_nomep" ) ;
	pages_setcol_def() ;
	settings_addnote_done = true ;
	settings_changedall() ;
}

function settings_displaysettings() {
}

/*
function -
function RECOUVERTES
*/

function qsn_saveedit_invitenamedone( id , savecallback ) {
	if ( ! q_readytosubmit() ) return false ;
	qsn_currstate = "view" ;
	if ( ! qsn_isnewnote ) qsn_thenotes[ qsn_backupid( id ) ] = null ;
	rm ( qsn_edittarget ) ;
	qsn_edittarget = null ; 
	qsn_safeaddnote( id ) ;
	for  ( var i  in qsn_savedchildrenids ) qsn_safeaddnote( qsn_savedchildrenids[ i ] ) ;
	qsn_savedchildrenids = [] ;
	if ( pages_isaligned() ) {
		qsn_finishedit() ;
		var richparentid = pages_richparentid( id ) ;
		if ( ! qsn_isnewnote && ! qsn_thenotes[ id ].pagesparent ) ge( id ).parentNode.style.height = ( qsn_thenotes[ id ].common.richinfos ) ? qsn_thenotes[ id ].common.richinfos.offsetHeight + "px" : "" ;
		if ( qsn_isnewnote && richparentid == id ) xalign_notes( false ) ;
		else xalign_notes( false , ( richparentid == id ) ? [ id ] : [ id , richparentid ] , undefined , undefined , savecallback ) ;
	} else {
		pages_updatepageheight() ;
		pages_savedghost = [] ;
		pages_newnotes = ( qsn_isnewnote ) ? [ id ] : [] ;
		pages_changednotes = ( qsn_isnewnote ) ? [] : [ id ] ;
		pages_confirm_align() ;
		qsn_finishedit() ;
	}
}
	
var settings_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "settings_js_loaded" ) ;
var settings_css_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "settings_css_loaded" ) ;
eval( "settings_msgs_" + q_lang + "_js_loaded = true" ) ;
if ( window.qdyn_loaded ) qdyn_loaded ( "settings_msgs_" + q_lang + "_js_loaded" ) ;
eval( "settings_" + q_lang + "_html_loaded = true" ) ;
if ( window.qdyn_loaded ) qdyn_loaded ( "settings_" + q_lang + "_html_loaded" ) ;

var artema_message = {
"newgroup" : "nouveau groupe..." ,
"newsubgroup" : "nouveau sous-groupe..." ,
"newpage" : "Nouvelle page" ,
"newdisq" : "Nouvelle discussion" ,
"pages" : "page interactive" ,
"disqs" : "page de discussion" ,
"otherpages" : "Navigation" ,
"nootherpage" : "(Pas d'autre page)" ,
"otherdisqs" : "Discussions" ,
"nootherdisq" : "(Pas de discussion)" ,
"hrefpages" : "quomodo:ouvrir_la_page" ,
"hrefdisqs" : "quomodo:ouvrir_la_discussion" ,
"newnameprompt" : "Indiquez un nom pour la nouvelle %s :" ,
"taken" : "Le nom \"%s\" est déjà pris, vous pouvez en choisir un autre :" ,
"musteditinvitedmembers" : "Cliquez sur 'modifier la liste' pour ajouter ou supprimer un membre de cette liste de discussion." ,
"badlink" : "Liens visiteurs : la page \"%s\" n'existe pas, aucun lien ne sera créé.\n\nVoulez-vous continuer la publication ?" ,
"thedate" : "le " ,
"pagenameempty" : "La page doit avoir un nom !" ,
"myself" : "moi-même" ,
"titleinstall" : "Cliquez pour créer la smartnote dans la page" ,
"groupname" : "Groupe %" ,
"switchtopublic" : "passer en mode public" ,
"switchtoadmin" : "revenir en mode admin" ,
"publicmode" : "mode public" ,
"adminmode" : "mode admin" ,
"pageremove" : "Attention, vous avez décidé de supprimer cette page. Ni vous ni les autres membres de cet espace ne pourrez désormais y accéder.\n\nÊtes-vous certain de vouloir supprimer cette page ?",
"invalidefrommail" : "L'adresse e-mail de l'expéditeur n'est pas valide." ,
"emptyobjectmail" : "L'objet du message est vide. L'envoyer malgré tout ?" ,
"emptymessage" : "Le message est vide !" ,
"mailalertgroupsize" : "(%s1 membres sur %s2 ont un e-mail)" ,
"mailalertsent" : "L'alerte e-mail a bien été envoyée. Une note récapitulative va être créée sur la page." ,
"mailalertnotsent" : "L'alerte e-mail n'a pas été envoyée. Vérifiez que les membres ont fourni une adresse e-mail valide." ,
"newemailalert" : "Nouvelle alerte e-mail" ,
"currstateedit" : "Veuillez valider ou annuler les modifications en cours avant de changer de mode." ,
"pagewidthbadvalue" : "La valeur indiquée pour la largeur est non valide. Vous devez indiquer une valeur comprise entre 800 et 2048." ,
"pagewidthtitle" : "Largeur de la page" ,
"pagewidthprompt" : "Veuillez indiquer la largeur de page souhaitée (en pixels)." ,
"pagewidthlink" : "Largeur de la page (%s px)" ,
"pages_ncolstitle" : "Nombre de colonnes pour l'alignement" ,
"pages_ncolsprompt" : "Veuillez indiquer un nombre de colonnes compris entre 1 et 8." ,
"pages_ncolsbadentry" : "Le nombre de colonnes que vous avez indiqué n'est pas correct.\n\nIl faut indiquer un nombre de colonnes compris entre 1 et 8." ,
"confirmalign" : "Cet alignement vous convient-il ?" ,
"pagepublishedformembers" : "Votre page a bien été publiée pour les membres de votre site." ,
"pagepublishedforweb" : "Votre page a bien été publiée sur internet." ,
"todatepublishbuttonname" : "Page à jour" ,
"nottodatepublishbuttonname" : "Publier la page" ,
"dragstop" : "Déplacez le taquet pour redimensionner les colonnes",
"restoreok" : "La page est revenue telle qu'elle était lors de la dernière publication." ,
"restoreconfirm" : "Voulez-vous vraiment revenir à la dernière version publiée ? Vos dernières modifications seront alors définitivement perdues." ,
"restorefailed" : "Impossible de revenir à la dernière version publiée. La page n'avait probablement pas encore été publiée."
} ;

var artema_msgs_fr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "artema_msgs_fr_js_loaded" ) ;


var qorp_message = {
"newgroup" : "nouveau groupe..." ,
"newsubgroup" : "nouveau sous-groupe..." ,
"newpage" : "Nouvelle page" ,
"newdisq" : "Nouvelle discussion" ,
"editpage_tab" : "Édition" ,
"editpage_new" : "nouvelle page" ,
"editpage" : "page" ,
"disq_tab" : "Forum" ,
"disq_new" : "nouvelle discussion" ,
"disq" : "discussion" ,
"pages" : "page interactive" ,
"disqs" : "page de discussion" ,
"otherpages" : "Navigation" ,
"nootherpage" : "(Pas d'autre page)" ,
"otherdisqs" : "Discussions" ,
"nootherdisq" : "(Pas de discussion)" ,
"hrefpages" : "quomodo:ouvrir_la_page" ,
"hrefdisqs" : "quomodo:ouvrir_la_discussion" ,
"newnameprompt" : "Indiquez un nom pour la nouvelle %s :" ,
"taken" : "Le nom \"%s\" est déjà pris, vous pouvez en choisir un autre :" ,
"musteditinvitedmembers" : "Cliquez sur 'modifier la liste' pour ajouter ou supprimer un membre de cette liste de discussion." ,
"badlink" : "Liens visiteurs : la page \"%s\" n'existe pas, aucun lien ne sera créé.\n\nVoulez-vous continuer la publication ?" ,
"thedate" : "le " ,
"pagenameempty" : "La page doit avoir un nom !" ,
"myself" : "moi-même" ,
"titleinstall" : "Cliquez pour créer la smartnote dans la page" ,
"groupname" : "%" ,
"new" : "du nouveau !" ,
"newgrouplinks" : "nouvelle rubrique" ,
"webzinepage" : "Pages webzine" ,
"delete" : "supprimer" ,
"selectanimage" : "Veuillez choisir une image sur votre ordinateur:" ,
"uploadtitle" : "Modifier la photo de mon profil"
} ;

var tabs_message = {
"info_tab" : "le site" ,
"info_new" : "Nouvelle page" ,
"info_name" : "page" ,
"disq_tab" : "mes forums" ,
"disq_new" : "Nouveau forum" ,
"disq_name" : "forum" ,
"shareboard_tab" : "mes libres-échanges" ,
"shareboard_new" : "Nouveau libre-échange" ,
"shareboard_name" : "libre-échange"
} ;

var memberprofile_message = {
"username" : "Nom : " , 
"firstname" : "Prénom : " , 
"sex" : "Sexe : " ,
"gender" : "Sexe : " ,
"fgender" : "Féminin" ,
"mgender" : "Masculin" ,
"pict" : "Photo :",
"lang" : "Langue de l'affichage : " ,
"fr" : "Français" ,
"en" : "Anglais" ,
"langinfo" : "Déconnectez et reconnectez-vous pour mettre à jour la langue",
"adress" : "Adresse : " ,
"adressextra" : "<br/><div style='color : gray ; font-size : 10px ; margin-top : 0.5em ; padding-left : 0.5em ; border-left : solid 1px gray'>si vous appartenez à un organisme<br/>(Club, Comité, Ligue, Fédération)<br/>merci de l'indiquer ici.<br/>N'oubliez pas votre code postal !</div>" ,
"mobile" : "N° tél. portable : " ,
"email" : "Adresse e-mail : " ,
"birthdate" : "Date de naissance : " ,
"category" : "Catégorie : " ,
"licencenumber" : "Numéro de licence : " ,
"subscriptiondate" : "Date d'inscription : " ,
"emptyfirstname" : "Veuillez indiquer votre prénom." ,
"emptyusername" : "Veuillez indiquer votre nom de famille.",
"emptypict" : "Aucune photo"
} ;

var qlub_message = {
"notool" : "Outil non disponible" ,
"infopageisweb" : "Page publique" ,
"infopageisnotweb" : "Réservé aux membres" ,
"managemembers" : "Gestion des membres de l'espace" ,
"managegroups" : "Gestion des membres et des accès" ,
"qorpmanagegroups" : "Gestion des sous-groupes" ,
"managepages" : "Gestion des pages du site" ,
"website" : "Gestion de l'offre et des options" ,
"diflistmgr" : "Gestion des listes de diffusion" ,
"sitemap" : "Gestion des pages et des menus" ,
"uploads" : "Gestion des fichiers du site" ,
"events" : "Gestion du calendrier du club" ,
"infoclub" : "Personnalisation de la bannière" ,
"custompages" : "Gestion de l'apparence du site" ,
"sponsors" : "Gestion des emplacements de publicité",
"invalidcolor" : "La couleur n'est pas conforme au modèle rgb(r, v, b).\n\nVeuillez choisir une autre couleur en cliquant sur l'image svp." ,
"confirmchangepagecolor" : "Ce tiroir va être fermé et les couleurs du site vont être modifiées.\n\nEst-ce bien ce que vous voulez ?" ,
"newcolortheme" : "Nouveau thème" ,
"newcolorthemename" : "Vous pouvez donnez un nom au nouveau thème :" ,
"noname" : "(sans nom)" ,
"delete" : "supprimer" ,
"confirmdeletecustomtheme" : "Voulez-vous réellement supprimer ce thème ?" ,
"rgbcolor" : "Couleur RVB" ,
"newrgbcolor" : "Indiquez le code { rouge, vert, bleu } de la couleur :" ,
"youhavetosignin" : "Accès réservé aux membres. Si vous êtes membre, entrez vos identifiants en haut de cette page." ,
"restrictedpage_title" : "Accès réservé aux membres", 
"restrictedpage_message" : "L'accès à cette partie du site est reservé aux membres. Identifiez-vous ou créez un compte pour y accéder.",
"webzinepage" : "Le Club" ,
"missinghelp" : "Cette page d'aide n'est pas disponible actuellement. Veuillez nous excuser.",
"snnotavailable-comment-offer" : "light" ,
"snnotavailable-comment-name" : "smartnote commentaire" ,
"snnotavailable-poll-offer" : "light" ,
"snnotavailable-poll-name" : "smartnote sondage" ,
"snnotavailable-contact-offer" : "light" ,
"snnotavailable-contact-name" : "smartnote contact" ,
"snnotavailable-matchnext-offer" : "light" ,
"snnotavailable-matchnext-name" : "smartnote match" ,
"snnotavailable-video-offer" : "premium" ,
"snnotavailable-video-name" : "smartnote vidéo" ,
"snnotavailable-fv-offer" : "premium" ,
"snnotavailable-fv-name" : "smartnote vidéo" ,
"snnotavailable-slide-offer" : "premium" ,
"snnotavailable-slide-name" : "smartnote diaporama" ,
"snnotavailable-offer" : "premium" ,
"snnotavailable-name" : "(inconnu)" ,
"titleinstall" : "Cliquez pour créer la smartnote dans la page",
"changeofferok" : "Votre changement d'offre s'est bien déroulé. La page va être rechargée." ,
"fr" : "Français" ,
"en" : "Anglais" ,
"default" : "Langue par défaut" ,

"back" : "retour" ,
"Results" : "Résultats : " ,
"Results2" : "Résultats : %values sur " ,
"Resultpagename" : "Résultats de la recherche" ,

"login" : "Connection / Inscription",
"logintitle" : "Cliquez pour fermer le panneau de connexion",
"loginname" : "Identifiant : " ,
"loginpassword" : "Mot de passe : " ,
"loginbtn" : "Connexion au site",
"forgotten" : "oublié" ,
"forgottenv2" : "Identifiant / Mot de passe oublié ?" ,
"forgottenlink" : "Cliquez ici pour les recevoir par e-mail." ,
"click2identify" : "Connectez-vous à votre site :" ,
"subscribe2space" : "Vous n'êtes pas membre du site ?" ,
"subscribe2spacev2" : "Vous n'êtes pas encore membre du site ?",
"subscribe2spacelink" : "Inscrivez-vous au site",
"subscribe2quomodo" : "Vous voulez vous aussi créer un site Internet ?",
"subscribe2quomodolink" : "Créer un site Quomodo.", 
"accesspw" : "Code d'accès : ",
"accesspwmsg" : "Contactez l'administrateur du site pour obtenir le code d'accès membres." ,
"colorpicker_title" : "Sélecteur de couleurs" ,
"colorpicker_delete_title" : "Cliquez pour fermer le sélecteur" ,
"sponsors_contactform_title" : "Demande d'affichage de publicité", 

"members_title" : "Membres et accès",
"sitemap_title" : "Pages et menus", 
"infos_title" : "Coordonnées, Domaine et Référencement", 
"account_title" : "Offre, abonnements, et options", 
"events_title" : "Événements du club", 
"uploads_title" : "Fichiers chargés sur le site",
"diflist_title" : "Listes de diffusions e-mail",
"theme_title" : "Apparence générale du site", 
"sponsors_title" : "Affichage de la publicité", 

"members_desc" : "Administration des membres du site, du code d'accès, des groupes, des forums, et des libres-échanges.", 
"sitemap_desc" : "Gestion du plan du site : Nouvelles pages et rubriques, page d'accueil, pages privées, invisibles...",
"infos_desc" : "Gestion du nom de domaine, des infos de contact et de localisation utilisées pour le référencement.", 
"account_desc" : "Changement d'offre, commande de nom de domaine, d'espace disque, factures en cours...", 
"events_desc" : "Remplissage des matchs du club, des événéments de la vie du club, et des anniversaires.", 
"uploads_desc" : "Ajout / suppression des fichiers du site, classement par dossiers et options de tri.", 
"diflist_desc" : "Listes d'adresses e-mail utilisées pour les newsletters.",
"theme_desc" : "Couleurs principales du site, look et contenu de la bannière, style de la page, des menus...", 
"sponsors_desc" : "Personnalisation des zones de publicité à l'extérieur du site avec vos propres sponsors.",

"help_title" : "Rechercher sur l'aide de Quomodo",
"qwiz_title" : "Lancer l'assistant de création",
"invitemembers_title" : "Inviter des membres",
"stats_title" : "Voir les statistiques du site",
"news_title" : "Consulter les News Quomodo",
"gallery_title" : "Visiter l'annuaire des sites Quomodo",
"sendpressrelease_title" : "Envoyer un article de presse",
"sponsornewclub_title" : "Parrainer un ami chez Quomodo",
"contactsupport_title" : "Contacter le support technique",

"help_searchdesc" : "Rechercher :",
"help_desc" : "Une seule adresse : http://aide.quomodo.com !",
"qwiz_desc" : "Pour afficher l'assistant des premiers pas sur Quomodo.",
"invitemembers_desc" : "Pour qu'ils accèdent aux contenus privés du site.",
"stats_desc" : "Statistiques détaillées de votre site : visiteurs, pages consultées, liens référents...",
"news_desc" : "Pour se tenir au courant des dernières nouveautés.",
"gallery_desc" : "Pour découvrir des idées sympas pour réaliser votre propre site.",
"sendpressrelease_desc" : "Pour diffuser vos articles de presse sur l'espace presse Quomodo.",
"sponsornewclub_desc" : "Pour faire découvrir Quomodo à d'autres clubs ou à des amis.",
"contactsupport_desc" : "Pour envoyer un mail à l'equipe de Quomodo en cas de problème."
} ;

var qlub_sportsname = {
"Basketball" : "Basketball" ,
"Rugby" : "Rugby" ,
"Football" : "Football" ,
"Full Contact" : "Full Contact" ,
"Fléchettes" : "Fléchettes" ,
"Chlorophylle" : "Chlorophylle" ,
"Pomme" : "Pomme" ,
"Bonbonnière" : "Bonbonnière" ,
"Cosi" : "Cosi" ,
"Ciel" : "Ciel" ,
"Marine" : "Marine" ,
"Atlante" : "Atlante" ,
"Mandarine" : "Mandarine" ,
"Lila" : "Lilas" ,
"Paille" : "Paille" ,
"Sports de glace" : "Sports de glace"
} ;

var qlub_help_pages = { // site d'aide
	"intro" : "aide.quomodo.com/" ,
	"g_smartnotes" : "aide.quomodo.com/_5_page" ,
	"g_pagelayout" : "aide.quomodo.com/_23_page" ,
	"g_publication" : "aide.quomodo.com/_21_page" ,
	"g_alert" : "aide.quomodo.com/_9_page" ,
	"g_newsletter" : "aide.quomodo.com/_91_page" ,
	"m_forum" : "aide.quomodo.com/_30_page" ,
	"m_shareboard" : "aide.quomodo.com/_32_page" ,
	"a_members" : "aide.quomodo.com/_2_page" ,
	"a_groups" : "aide.quomodo.com/_2_page" ,
	"a_forums" : "aide.quomodo.com/_44_page" , 
	"a_shareboards" : "aide.quomodo.com/_44_page" ,
	"a_sitemap" : "aide.quomodo.com/_95_page" ,
	"a_website" : "aide.quomodo.com/_39_page" ,
	"a_banner" : "aide.quomodo.com/_48_page" ,
	"a_themes" : "aide.quomodo.com/_99_page" ,
	"a_events" : "aide.quomodo.com/_80_page", 
	"a_uploads" : "aide.quomodo.com/_100_page", 
	"a_wsg" : "aide.quomodo.com/_42_page" ,
	"a_pmtxt" : "aide.quomodo.com/_50_page" , 
	"a_image" : "aide.quomodo.com/_49_page" , 
	"a_poll" : "aide.quomodo.com/_43_page" , 
	"a_table" : "aide.quomodo.com/_47_page" , 
	"a_video" : "aide.quomodo.com/_51_page" ,
	"a_contact" : "aide.quomodo.com/les_smartnotes_la_smartnote_contact" 
} ;

var profile_message = { 
"none" : "(aucun)" ,
"idmissing" : "SVP veuillez d'abord fournir un identifiant Quomodo." ,
"pwmissing" : "SVP veuillez d'abord fournir un mot de passe." ,
"pwconfirmationfailed" : "Les deux mots de passe que vous avez indiqués sont différents, veuillez recommencer." ,
"wrongpassword" : "Mot de passe erroné" ,
"desc" : "(...)"
} ;

var qlub_msgs_fr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "qlub_msgs_fr_js_loaded" ) ;


/*
function CONFIG
*/

//var qdr_leftcolwidth = 0 ;
var qlub_reloadpage = false ; 

var svc_tabs = [ 
	{ id: "info" , svcid: "#artemapage@intl" , newaccess : "admin" , "newh" : "qlub_newinfo" } , 
	{ id: "disq" , svcid: "#artemadisq@intl" , newaccess : "admin" , "newh" : "qlub_newdisq" } , 
	{ id: "shareboard" , svcid: "#homepage@intl", newaccess : "admin" , "newh" : "qlub_newshareboard" } 
] ;
var tabsdict = { "#artemapage@intl" : "editpage" , "#artemadisq@intl" : "disq" , "#homepage@intl" : "shareboard" } ;

var members_descfields = [ "username", "firstname", { "key" : "gender" , "type" : "select" , values : [ "fgender" , "mgender" ] } , { key:"adress", "type":"textarea" }, "mobile", "email", "birthdate", "category", "licencenumber", { "key" : "lang" , "type" : "select" , values : [ "fr" , "en" ] , onchange : function() { if ( q_lang != this.value ) alert ( memberprofile_message [ "langinfo" ] ) ; } } ] ;
var members_defaultuserphoto = "/images/artema/anonymoususer.jpg" ;

var imgtabarrow_src = "/bundles/qlub/images/arrowtabs.png" ;

var sn_chooserlist = [
"nws" ,  "broll" , "matchnext" , "flash", 
"photoslider","photoboxes", "photoflow", "music" ,
"dropbox" , "contact" , "comment" , "vc",
"gm", "rss" , "files" , "bookmarks" ,

"btn", "mcn" , "silhouette" , "charmessage" , 
"clock" , "countdown" , "meteo" , "dn" ,
"flickr", "nl" , "hello_intl", "team" ] ;

var sn_snpalette = [ "wsg" , "pmtxt" , "pimg" , "poll" , "table" , "fv" ];
var sn_shareboardchooserlist = [
"pimg" , "dn", "countdown", "flash",
"clock", "hello_intl", "broll", "bnv_intl",
"pmessage", "ema" , "slide" , "upload_intl",
"cal", "dispo_intl", "todos", "bdcfamily",

"rep", "bd_intl", "kado", "kitty",
"spiral_intl", "photomaton", "todo", "table" ] ;

var decor_fulllist = sn_snpalette.concat( sn_chooserlist );
if ( ! isrealserver() ) {
	sn_chooserlist = sn_chooserlist.concat( [ "eventnext" , "vol" , "calendar" , "letter"  , "ffbb" , "slide" , "eqr" ] ) ;
	sn_shareboardchooserlist = sn_shareboardchooserlist.concat( [ "rss" , "eqr" , "letter", "mcn", "bnq_intl" , "flickr", "amazon" , "gm" ] ) ;
}
var headertabsbuttontype = "old" ;

var qlubpagewidth = 1024 ;

var qlubdir = "/bundles/qlub/" ;
var pagesdir = "/services/artemapage@" + q_lang + "/" ;
//var scriptsdir = pagesdir + "scripts/" ;
// var qlub_excludedoptions = ["domain", "email24", "hotline"];
var qlub_excludedoptions = ["domain"];

/*
function CONFIG - q_elems
*/

q_elems[ "adminmenu" ] = { id : "qlub_admintools" , urls : [ qlubdir + "qlub_admintools_" + q_lang + ".html" ] , target : "qlub_admintools_elem" } ;
q_elems[ "annu" ] = { id : "qlub_annugroup" , urls : [ qlubdir + "scripts/qlub_dyn_elems.js" , qlubdir + "qlub_annugroup_" + q_lang + ".html" ] , dynh : "qlub_dynloadannugroup" } ;
q_elems[ "header" ] = { id : "qlub_header" , urls : [ qlubdir + "qlub_header_" + q_lang + ".html" ] , target : "topheader" } ;
q_elems[ "publicleftcol" ] = null ;
q_elems[ "adminleftcol" ] = { id : "q_elem_adminleftcol" , urls : [ qlubdir + "qlub_adminleftcol_" + q_lang + ".html" ] , target : "defaultleftcol" } ;
q_elems[ "disqleftcol" ] = { id : "q_elem_disqleftcol" , urls : [ qlubdir + "qlub_disqleftcol_" + q_lang + ".html" ] , target : "defaultleftcol" } ;
q_elems[ "shareboardleftcol" ] = { id : "q_elem_shareboardleftcol" , urls : [ qlubdir + "qlub_shareboardleftcol_" + q_lang + ".html" , "/services/qorg/scripts/notepad.js" , "/services/qorg/scripts/notepad_msgs_" + q_lang + ".js" ] , target : "defaultleftcol" } ;

q_elems[ "snchooser" ] = { id : "qlub_snchooser" , urls : [ qlubdir + "scripts/qlub_dyn_elems.js" , qlubdir + "qlub_snchooser_" + q_lang + ".html" ] , target : "q_drawers" } ;

// Membres, groupes...
q_elems[ "sitemgr" ] = { 
	id : "qlub_sitemgr" , 
	urls : [ 
		qlubdir + "scripts/qlub_sitemgr.js" , 
		qlubdir + "scripts/qlub_sitemgr_msgs_" + q_lang + ".js", 
		qlubdir + "qlub_sitemgr_" + q_lang + ".html" 
	] , 
	target : "qlub_admindrawer_mainpane" 
} ; // target : "q_fullscreenmask" } ;

// Perso thème
q_elems[ "thmmgr" ] = { 
	id : "qlub_thmmgr" , 
	urls : [ 
		qlubdir + "style/qlub_thmmgr.css",
		qlubdir + "qlub_thmmgr_" + q_lang + ".html", 
		qlubdir + "scripts/qlub_thmmgr_msgs_" + q_lang + ".js" ,
		qlubdir + "scripts/qlub_thmmgr.js"
	] , 
	target : "qlub_admindrawer_mainpane" } ;

var qlub_thmmgr_tabs = {
	name : "qlub_thmmgr_tabs",
	header : "qlub_thmmgr_tabnamestable",
	panes : "qlub_thmmgr_tabpanes",
	msg : "qlub_thmmgr_message", 
	items : [
		{ name : "colors", pane : "qlub_thmmgr_colorstable", selected : true }, 
		{ name : "bannercontent", pane : "qlub_thmmgr_bannercontent" }, 
		{ name : "bannerstyle", pane : "qlub_thmmgr_bannerstyle" },
		{ name : "page", pane : "qlub_thmmgr_page" },
		{ name : "menu", pane : "qlub_thmmgr_menu" },
		{ name : "themes", pane : "qlub_thmmgr_themestr" }
	],
	selected : "colors"
};

var qlub_thmmgrC_advancedelems = [
	{key : "cfs_caption", qkey : "cfs", qvalue: "c2"}, 
	{key : "cfp_caption", qkey : "cfp", qvalue: "rgb(255,255,255)", what :[
		{name : 'auto'}, 
		{name : 'c1'}, 
		{name : 'c2'}, 
		{name : 'rgb(255,255,255)', msg  : "white"}, 
		{name : 'rgb(0,0,0)', msg  : "black"}, 
		{name : 'other'}]
	}, 
	{key : "cb_caption", qkey : "cb", qvalue: "c1"}, 
	{key : "ctb_caption", qkey : "ctb", qvalue: "autobanner"}, 
	{key : "cm_caption", qkey : "cm", qvalue: "c1"}, 
	{key : "cmo_caption", qkey : "cmo", qvalue: "automenuover" , what :[
		{name : 'auto'}, 
		{name : 'other'}]
	}, 
	{key : "ctm_caption", qkey : "ctm", qvalue: "automenu"}
];

// Gestion des sponsors
q_elems[ "sponsorsmgr" ] = { 
	id : "qlub_sponsorsmgr" , 
	urls : [ 
		qlubdir + "style/qlub_sponsorsmgr.css" ,
		qlubdir + "qlub_sponsorsmgr_" + q_lang + ".html" ,
		qlubdir + "scripts/qlub_sponsorsmgr_msgs_" + q_lang + ".js" , 
		qlubdir + "scripts/qlub_sponsorsmgr.js"
	] , 
	target : "qlub_admindrawer_mainpane" 
} ;

// Rubriques et menus
q_elems[ "editsitemap" ] = { 
	id : "qlub_editsitemap" ,
	urls : [
		qlubdir + "qlub_editsitemap_" + q_lang + ".html" ,
		qlubdir + "scripts/qlub_sitemgr.js" ,
		qlubdir + "scripts/qlub_sitemgr_msgs_" + q_lang + ".js" ,
		qlubdir + "scripts/qlub_editsitemap.js" ,
		qlubdir + "scripts/qlub_editsitemap_msgs_" + q_lang + ".js"
	] ,
	target : "qlub_admindrawer_mainpane"
} ;

// Gestion de l'offre et des options
q_elems[ "accountmgr" ] = {
	id : "qlub_accountmgr" ,
	urls : [
		qlubdir + "style/qlub_accountmgr.css" ,
		qlubdir + "qlub_accountmgr_" + q_lang + ".html" ,
		qlubdir + "scripts/productinfo_" + q_lang  + ".js" ,
		qlubdir + "scripts/qlub_accountmgr_msgs_" + q_lang + ".js" ,
		qlubdir + "scripts/qlub_accountmgr.js"
	] ,
	target : "qlub_admindrawer_mainpane"
} ;

// Gestion des infos du site
q_elems[ "infosmgr" ] = {
	id : "qlub_infosmgr" ,
	urls : [
		qlubdir + "style/qlub_infosmgr.css" ,
		qlubdir + "qlub_infosmgr_" + q_lang + ".html" ,
		qlubdir + "scripts/qlub_infosmgr_msgs_" + q_lang + ".js" ,
		qlubdir + "scripts/qlub_infosmgr.js"
	] ,
	target : "qlub_admindrawer_mainpane"
} ;

// Gestion des fichiers
q_elems[ "manageuploads" ] = {
	id : "qlub_manageuploads" ,
	urls : [
		qlubdir + "style/qlub_uploadsmgr.css",
		qlubdir + "qlub_manageuploads_" + q_lang + ".html" ,
		qlubdir + "scripts/qlub_uploadsmgr_msgs_" + q_lang + ".js",
		qlubdir + "scripts/qlub_uploadsmgr.js"
	] ,
	target : "qlub_admindrawer_mainpane"
} ;

// Listes de diffusion
q_elems[ "diflistmgr" ] = {
	id : "qlub_diflistmgr" ,
	urls : [
		qlubdir + "style/diflistmgr.css",
		qlubdir + "qlub_diflistmgr_" + q_lang + ".html" ,
		qlubdir + "scripts/qlub_diflistmgr_msgs_" + q_lang + ".js",
		qlubdir + "scripts/qlub_diflistmgr.js"
	] ,
	target : "qlub_admindrawer_mainpane"
} ;

//Calendrier du club
q_elems[ "eventsmgr" ] = {
	id : "qlub_eventsmgr" ,
	urls : [
		qlubdir + "scripts/qlub_eventsmgr.js",
		qlubdir + "scripts/qlub_eventsmgr_msgs_" + q_lang + ".js",
		qlubdir + "qlub_eventsmgr_" + q_lang + ".html"
	] ,
	target : "qlub_admindrawer_mainpane"
} ;

//Colors Block
q_elems[ "colorsblock" ] = { 
	id : "qlub_colorsblock" , 
	urls : [ 
		qlubdir + "style/qlub_colorsblock.css" ,
		qlubdir + "scripts/qlub_colorsblock.js" , 
		qlubdir + "scripts/qlub_colorsblock_msgs_" + q_lang + ".js", 
		qlubdir + "qlub_colorsblock_" + q_lang + ".html"
	]
} ;

//Alerte e-mail
q_elems[ "emailalert" ] = {
	id : "qlub_emailalert" , 
	urls : [ 
		qlubdir + "scripts/qlub_ema.js" , 
		qlubdir + "scripts/qlub_ema_msgs_" + q_lang + ".js", 
		qlubdir + "qlub_ema_" + q_lang + ".html" 
	] ,
	target : "q_drawers" 
} ;

//Newsletter
q_elems[ "nl" ] = { 
	id : "qlub_nl" , 
	urls : [ 
		qlubdir + "scripts/qlub_nl.js" , 
		qlubdir + "scripts/qlub_nl_msgs_" + q_lang + ".js", 
		qlubdir + "qlub_nl_" + q_lang + ".html" 
	] , 
	target : "q_drawers" 
} ;

//Mise en page
q_elems[ "mep" ] = { 
	id : "qlub_mep" , 
	urls : [ 
		qlubdir + "scripts/qlub_mep.js" , 
		qlubdir + "scripts/qlub_mep_msgs_" + q_lang + ".js", 
		qlubdir + "qlub_mep_" + q_lang + ".html" 
	] , 
	target : "q_drawers" 
} ;

q_elems[ "siteloader" ] = { id : "siteloader" , urls : [ "/services/qorg/siteloader_" + q_lang + ".html" , "/services/qorg/scripts/siteloader.js" ] , target : "q_fullscreenmask" } ;


/*
function CONFIG - qlub_tools
*/

var qlub_tools = { 
	pages : { 
		fn : qlub_opensitemgr, 
		option : [ "pages" ] , 
		iconclass: "sprite_globe", 
		title: qlub_message[ "managepages" ] },
	newinfo : { 
		fn : qlub_opennewpageinfo , 
		iconclass: "sprite_menu", 
		title: qlub_message[ "sitemap" ] },
	newdisq : { 
		fn : qlub_opennewsvc , 
		option : [ "disq" , [ "disqpages", "members", "groups" , "shareboardpages" ] ] , 
		iconclass: "sprite_members", 
		title: qlub_message[ "managegroups" ] },
	newshareboard : { 
		fn : qlub_opennewsvc , 
		option : [ "shareboard" , [ "shareboardpages" , "members", "groups" , "disqpages" ] ] , 
		iconclass: "sprite_members", 
		title: qlub_message[ "managegroups" ] },

	members: { 
		fn : qlub_opensitemgr, 
		option : [ "members" ], 
		iconclass: "sprite_members", 
		title: qlub_message[ "members_title" ],
		desc: qlub_message[ "members_desc" ], 
		help : "a_members" },
	sitemap : { 
		fn : qlub_opensitemappage, 
		iconclass: "sprite_menu", 
		title: qlub_message[ "sitemap_title" ], 
		desc: qlub_message[ "sitemap_desc" ], 
		help : "a_sitemap" },
	infos : { 
		fn : qlub_openinfosmgrpage, 
		iconclass: "sprite_infos", 
		title: qlub_message[ "infos_title" ], 
		desc: qlub_message[ "infos_desc" ], 
		help : "a_website" },
	website : { 
		displaycond : function() { return ! q_spaceparam( "memberlegacy" ) ; },
		fn : qlub_openaccountmgrpage,
		iconclass: "sprite_accounts", 
		title: qlub_message[ "account_title" ],  
		desc: qlub_message[ "account_desc" ], 
		help : "a_website" },
	events : { 
		fn : qlub_openeventsmgr, 
		iconclass: "sprite_events", 
		title: qlub_message[ "events_title" ], 
		desc: qlub_message[ "events_desc" ],
		help : "a_events",
		option : [] },
	uploads : { 
		fn : qlub_openmanageuploadspage, 
		iconclass: "sprite_uploads", 
		title: qlub_message[ "uploads_title" ],
		desc: qlub_message[ "uploads_desc" ], 
		help : "a_uploads" },
	diflistmgr : { 
		fn : qlub_opendiflistmgr, 
		iconclass: "sprite_diflist", 
		title: qlub_message[ "diflist_title" ],  
		desc: qlub_message[ "diflist_desc" ] },
	custom : { 
		fn : qlub_openthmmgr, 
		iconclass: "sprite_palette", 
		title: qlub_message[ "theme_title" ], 
		desc: qlub_message[ "theme_desc" ], 
		help: "a_themes" },
	sponsors : { 
		fn : qlub_opensponsorsmgr, 
		iconclass: "sprite_sponsors", 
		title: qlub_message[ "sponsors_title" ], 
		desc: qlub_message[ "sponsors_desc" ], 
		help: "a_themes" },
		
	help : { 
		fn : function(){ qlub_openhelp( 'intro' );}, 
		iconclass: "sprite_help", 
		title: qlub_message[ "help_title" ], 
		desc: qlub_message[ "help_desc" ],
		htmldesc : 	"<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\“ width=\"100%\" class=\"qlub_helpmenu_search\"><tr><td>" + qlub_message["help_searchdesc"]  + "</td><td><input type=\"text\" id=\"qlub_helpmenu_searchtext\" onclick=\"q_stopPropagation( event );\" /></td><td><a class=\"button\" target=\"_blank\" href=\"http://aide.quomodo.com/search?privatedomain=aide&amp;lang=fr&amp;searchentriesperpage=10&amp;searchstartnumber=0&amp;mission=search\" onclick=\"window.open( this.href  + '&amp;searchtext=' + encodeURI( ge('qlub_helpmenu_searchtext').value ) ); q_stopPropagation( event ); return false;\" style=\"font-size:10px;ç\">OK</a></td></tr></table>"
		 },
	qwiz : { 
		fn : qlub_openqwiz, 
		iconclass: "sprite_qwiz", 
		adminonly: true,		
		title: qlub_message[ "qwiz_title" ], 
		desc: qlub_message[ "qwiz_desc" ] },
	invitemembers : { 
		fn : qlub_openmemberinvite, 
		iconclass: "sprite_members", 
		adminonly: true,
		title: qlub_message[ "invitemembers_title" ], 
		desc: qlub_message[ "invitemembers_desc" ] },
	contactsupport : { 
		fn : qlub_opencontactsupport, 
		iconclass: "sprite_support", 
		title: qlub_message[ "contactsupport_title" ], 
		desc: qlub_message[ "contactsupport_desc" ] },
	sendpressrelease : { 
		fn : qlub_opensendpressrelease, 
		iconclass: "sprite_pressrelease", 
		adminonly: true,
		title: qlub_message[ "sendpressrelease_title" ], 
		desc: qlub_message[ "sendpressrelease_desc" ] },
	sponsornewclub : { 
		fn : qlub_opensponsornewclub, 
		iconclass: "sprite_partners", 
		title: qlub_message[ "sponsornewclub_title" ], 
		desc: qlub_message[ "sponsornewclub_desc" ] },
	stats : { 
		fn : function(){ if ( window.clubhost ) window.open( "http://"  + clubhost + "/stats/" ); }, 
		displaycond : function(){ return ( window.clubhost ) ? true : false; },
		iconclass: "sprite_stats", 
		adminonly: true,
		title: qlub_message[ "stats_title" ], 
		desc: qlub_message[ "stats_desc" ] },
	news : { 
		fn : function(){ window.open( 'http://club.quomodo.com/news' ) ; }, 
		iconclass: "sprite_news", 
		title: qlub_message[ "news_title" ], 
		desc: qlub_message[ "news_desc" ] },
	gallery : { 
		fn : function(){ window.open( 'http://www.quomodo.com/annuaire_galerie-galerie_des_sites_quomodo' ) ;  }, 
		iconclass: "sprite_gallery", 
		title: qlub_message[ "gallery_title" ], 
		desc: qlub_message[ "gallery_desc" ] }
};

var qlub_editsitemap_tabindex = -1 ;

/*
function CONFIG - qlub_sitemgr
*/

var qlub_sitemgr_params = {
	members : {
		makenew : true ,
		actions  : [
			[ "infos", function() { qlub_editmember_infos( this.parentNode.parentNode ) ; return false ; } ] ,
			[ "groups", function() { qlub_editmember_groups( this.parentNode.parentNode ) ; return false ; } ] ,
			[ "unsubscribe", function() { qlub_unsubscribe( this.parentNode.parentNode ) ; return false ; } ]
		]
	} ,
	groups : {
		makenew : true ,
		actions  : [
			[ "rename", function() { qlub_renamegroup( this.parentNode.parentNode ) ; return false ; } ] ,
			[ "members", function() { qlub_editgroup_members( this.parentNode.parentNode ) ; return false ; } ] ,
			[ "accesstopages", function() { qlub_editgroup_pages( this.parentNode.parentNode ) ; return false ; } ] ,
			[ "suppress", function() { qlub_deletegroup( this.parentNode.parentNode ) ; return false ; } ]
		]
	} ,
	infopages : {
		makenew : true ,
		actions  : [
			[ "rename", function() { qlub_renamepage( this.parentNode.parentNode , 'infopages' ) ; return false ; } ] ,
			[ "suppress", function() { qlub_suppresspage( this.parentNode.parentNode , 'infopages' ) ; return false ; } ] ,
			[ "openpage", function() { qlub_openpage( this.parentNode.parentNode ) ; return false ; } ]
		]
	} ,
	disqpages : {
		makenew : true ,
		actions  : [
			[ "rename", function() { qlub_renamepage( this.parentNode.parentNode , 'disqpages' ) ; return false ; } ] ,
			[ "groupsaccess", function() { qlub_editpage_groups( this.parentNode.parentNode , 'disqpages' ) ; return false ; } ] ,
			[ "suppress", function() { qlub_suppresspage( this.parentNode.parentNode , 'disqpages' ) ; return false ; } ] ,
			[ "openpage", function() { qlub_openpage( this.parentNode.parentNode ) ; return false ; } ]
		]
	} ,
	shareboardpages : {
		makenew : true ,
		actions  : [
			[ "rename", function() { qlub_renamepage( this.parentNode.parentNode , 'shareboardpages' ) ; return false ; } ] ,
			[ "groupsaccess", function() { qlub_editpage_groups( this.parentNode.parentNode , 'shareboardpages' ) ; return false ; } ] ,
			[ "suppress", function() { qlub_suppresspage( this.parentNode.parentNode , 'shareboardpages' ) ; return false ; } ] ,
			[ "openpage", function() { qlub_openpage( this.parentNode.parentNode ) ; return false ; } ]
		]
	}
} ;

/*
function CONFIG - qlub_customize
*/
 
var qlub_iconsref = {
	1 : { icon : "basketball", file : "1_basket" } ,
	2 : { icon : "rugby", file : "2_rugby" } ,
	3 : { icon : "football", file : "4_football" } ,
	4 : { icon : "boxing", file : "3_boxe" } ,
	5 : { icon : "target", file : "cible" } ,
	6 : { icon : "dog", file : "animaux" } ,
	7 : { icon : "chrono", file : "920_chrono" } ,
	8 : { icon : "love", file : "coeur" } ,
	9 : { icon : "billard", file : "9_billard" } ,
	10 : { icon : "pingpong", file : "914_pingpong" } ,
	11 : { icon : "", file : "boussole" } ,
	12 : { icon : "motorbike", file : "916_moto" } ,
	13 : { icon : "theater", file : "masques" } ,
	14 : { icon : "photo", file : "photo" } ,
	15 : { icon : "bike", file : "915_velo" } ,
	16 : { icon : "usfootball", file : "5_football_us" } ,
	17 : { icon : "baseball", file : "6_baseball" } ,
	18 : { icon : "bowling", file : "7_bowling" } ,
	19 : { icon : "", file : "8_bowling2" } ,
	20 : { icon : "", file : "910_billard2" } ,
	21 : { icon : "", file : "911_crosse" } ,
	22 : { icon : "", file : "912_palet" } ,
	23 : { icon : "gym", file : "913_gym" } ,
	24 : { icon : "car", file : "917_voiture" } ,
	25 : { icon : "", file : "918_compteur" } ,
	26 : { icon : "", file : "919_chaussures" } ,
	27 : { icon : "", file : "casier" } ,
	28 : { icon : "", file : "casier2" } ,
	29 : { icon : "", file : "casier3" } ,
	30 : { icon : "", file : "damiers" } ,
	31 : { icon : "blueflag", file : "drapeau_bleu" } ,
	32 : { icon : "yellowflag", file : "drapeau_jaune" } ,
	33 : { icon : "blackflag", file : "drapeau_noir" } ,
	34 : { icon : "redflag", file : "drapeau_rouge" } ,
	35 : { icon : "greenflag", file : "drapeau_vert" } ,
	36 : { icon : "star", file : "etoile" } ,
	37 : { icon : "cup", file : "prix" } ,
	38 : { icon : "", file : "prix2" } ,
	39 : { icon : "", file : "prix3" } ,
	40 : { icon : "", file : "prix4" } 
} ;

/*
function CONFIG - qlub_eventsmgr
*/

var clubopenselects = null ;
var clubevents = null ;

var events_types = [ "match", "birthday","general" ] ;

var events_prototypes = {
"match" : {
	"kind" : "event" ,
	"properties" : [
		{ "date": { "mandatory": "true" , "mode" : "full" } } ,
		"time" ,
		{ "localteam": { "mandatory": "true" } } ,
		{ "vsteam": { "mandatory": "true" } } ,
		"competition" ,
		"step" ,
		"home" ,
		"location" ,
		"homescore" ,
		"vsscore" , 
		{ "comment": { "textarea":"true" } }  ]
	} ,
"general" : {
	"kind" : "event" ,
	"properties" : [
		{ "date": { "mandatory": "true" } } ,
		{ "icon": { "mandatory": "true" } } ,
		{ "title": { "mandatory": "true" } },
		{ "category": { "mandatory": "true" } },
		{"description" : { "textarea":"true" }} ,
		"image"  ]
	} ,
"birthday" : {
	"kind" : "event" ,
	"properties" : [
		{ "day": { "mandatory": "true" } } ,
		{ "member": { "mandatory": "true" } } ]
	} ,
"home" : {
	"kind" : "closedselect" ,
	"properties" : [ [ "0" , "homeY" ] , [ "1" , "homeN" ] ] } ,
"localteam" : {
	"kind" : "openselect" ,
	"properties" : [
		{ "name": { "mandatory": "true" } } ,
		"gender" ,
		"nb" ]
	} ,
"gender" : {
	"kind" : "closedselect" , "properties" : [ [ "0" , "genderM" ] , [ "1" , "genderF" ] , [ "2" , "genderMF" ] ] } ,
"date" : {
	"kind" : "calendar" 
	} ,
"day" : {
	"kind" : "dayselector" 
	} ,
"location" : {
	"kind" : "openselect" ,
	"properties" : [
		{ "name": { "mandatory": "true" } } ,
		"city" ]
	} ,
"category" : {
	"kind" : "openselect" ,
	"properties" : [ { "name": { "mandatory": "true" } } ]
	} ,
"image" : {
	"kind" : "choosefile" , 
	"properties" : [ {} ] 
	},
"icon" : {
	"kind" : "icon" , 
	"properties" : [  ] 
	}
} ;


/*
function -
function INIT BUNDLE
*/

function init_bundle() {
	q_include( q_elems[ "header" ] , "finish_init_bundle" , [] ) ;
}

function finish_init_bundle() {
	defaultfinish_init_bundle( "view", qlub_getsvctype( ) ) ;
}

function qlub_getsvctype( ) {
	if ( ( window.currsvcid ) && ( /artemapage/.test( currsvcid ) ) ) return "page" ;
	else if ( ( window.currsvcid ) && ( /artemadisq/.test( currsvcid ) ) ) return "disq" ;
	else if ( ( window.currsvcid ) && ( /homepage/.test( currsvcid ) ) ) return "shareboard" ;
	return null ;
}

function defaultfinish_init_bundle( mode, svctype ) {
	if ( svctype == "page" ) mode = document.mainform.pagemode.value ;
	qlub_initspacestabs( mode ) ;
	initbanner() ;
	qorp_inittabs() ;
	switch ( svctype ) {
		case ( "page" ) :
			if ( mode == "view" ) init_bundlepageview() ;
			else init_bundlepageedit() ;
			break ;
		case ( "disq" ) :
			init_bundledisq() ;
			break ;
		case ( "shareboard" ) :
			init_bundleshareboard() ;
			break ;
	}
	writetitleandname() ;
	qlub_init_ads() ;
	if ( window.init_svcsvc ) init_svcsvc() ;
}

/*
function -
function INIT
*/

function init_bundlepageedit( ) {
	qlub_loadadmintools( "edit" ) ;
	showblock( "qlub_opencloseleftcolbuttons" ) ;
	q_innerHTML( "q_drawerleftcoltitle", tabs_message[ "info_name" ] ) ;
}

function finish_init_editpage() {
	if ( pages_isweb ) hideshowblock( [ "qlubleftcolpublishbuttonwait" , "qlubleftcolpublishbuttonnoweb" ] , "qlubleftcolpublishbuttonweb" ) ;
	else hideshowblock( [ "qlubleftcolpublishbuttonwait" , "qlubleftcolpublishbuttonweb" ] , "qlubleftcolpublishbuttonnoweb" ) ;
	pages_initpublishbutton( ge( ( pages_isweb ) ? "qlubleftcolpublishbuttonweb" : "qlubleftcolpublishbuttonnoweb" ) ) ;
	var r = settings_getnote() ;
	if ( r && r.currqwizpage ) qlub_openqwiz( r.currqwizpage ) ;
	else {
		var c, n = 0 ;
		for ( var x in qsn_thenotes ) {
			c = qsn_thenotes[ x ].common ;
			if ( ( c.notekind != "settings" ) && ( c.ownerid != "quomodo" ) ) n++ ;
		}
		if ( n == 0 ) qlub_openqwiz( "qwiz_newpage" ) ;
	}
}

function q_alertnewincurrsvc( hidealert ) {
	var elems = ge( "qlubleftcolpublishuptodate" ) ;
	if ( ! elems ) elems = getElementsByClassName( "qlubleftcolpublish" , "qlubleftcolpublishuptodate" ) ;
	elems.push( ge( "qlubleftcolrestorebutton" ) ) ;
	visibleblock( elems , ( hidealert != false ) ) ;
}

function init_bundlepageview( ) {
	if ( members[ memberid ].userlevel == "admin" ) {
		if ( ! window.q_makeweb ) qlub_loadadmintools( "view" ) ;
	} else init_memberadminbar() ;
	hideblock(  "q_drawerleftcol" ) ;
	if ( ge("qlub_opencloseleftcolbuttons") ) ge("qlub_opencloseleftcolbuttons").className = "openleftcol";
	var div = ge( "currservicename" ) ;
	if ( div ) { div.style.cursor = "default" ; div.onclick = null ; } ;
//	qlub_resizeleftcol( 50 ) ;
}

function qlub_fixmarginbody() {
	if ( ge( "qfooter" ) ) return ;// si on est passé à la nouvelle structure, il n'y a rien à faire
	//safari gére correctement le margin auto. On laisse tel quel
	if ( issafari() ) return ;
	var width = q_windowInnerWidth() ;
	if ( isfirefox() && width < 1002 ) {
		var m = - Math.min( 6 , Math.floor( ( 1003 - width ) / 2 ) ) + "px" ;
		gebcn( "topheader" , "qlub_header_content" ).style.marginLeft = m ;
		ge( "qlub_header_nav_content" ).style.marginLeft = m ;
//		ge('topheader').style.marginLeft = - Math.min( 6 , Math.floor( ( 1003 - width ) / 2 ) ) + "px" ;
//		window.document.body.style.marginLeft = "" ;
		return ;
	}
	if( isie78() && width < 1002 ) {
		ge('topheader').style.marginLeft = "0px" ;
		return ;
	}
	if( isie6() && width < 1022 ) {
		// ge('topheader').style.marginLeft = "0px" ;
		// window.document.body.style.marginLeft = "0px" ;
		var x = 1021 - width ;
		var pad = 0 ;
		pad = 1+ ( ( x / 4 ) | 0 ) ;
		if ( pad > 5 ) pad = 5 ;
		gebcn( "topheader" , "qlub_header_content" ).style.paddingLeft = pad + "px" ;
		ge( "qlub_header_nav_content" ).style.paddingLeft = ( pad + 6 ) + "px" ;
		return ;
	}
	if( isie6() ) {
		window.document.body.style.marginLeft = "auto" ;
		gebcn( document.body , "qlub_header_content" ).style.paddingLeft = "0px" ;
		ge( "qlub_header_nav_content" ).style.paddingLeft = "6px" ;
	}
	if ( width%2 == 1 ) {
		if (isfirefox()) {
			gebcn( document.body , "qlub_header_content" ).style.marginLeft = "" ;
			ge( "qlub_header_nav_content" ).style.marginLeft = "" ;
		}
//		if (isfirefox()) ge('topheader').style.marginLeft = "-1px" ; 
		else ge('topheader').style.marginLeft = "1px" ;  //ie6 et ie7
	}
	else ge('topheader').style.marginLeft = "0px" ; 
}

var qdr_authorstuffoffsetleft = 0 ;
function qlub_translate_qauthorstuff( x ) {
	qdr_authorstuffoffsetleft = x - 6 ;
	var curr_maxwidthpage = pages_maxwidthpage() ;
	window.pages_maxwidthpage = function () { return curr_maxwidthpage - x ; } ;
//	var m = ( /viewmode/.test( document.body.className ) ) ? x : ( 194 + x ) ; //vh suite passage nouvelle architecture de page : c'est maindiv qui à la margin_left pour la colonne de gauche
	var m = x ;
//	gebcn( ge( "maindiv" ), "q_author_stuff" ).style.marginLeft = m + "px" ;
	ge( "maindiv" ).style.paddingLeft = m + "px" ;
}

/*
function -
function INIT DISQ
*/

function initdisq( wantselftab ) {
	if ( window.init_bundle ) init_bundle() ;
	q_include( q_elems[ "disqleftcol" ] , "disq_init" , [ ] ) ;
	relaunchupdates() ;
}

function init_bundledisq( ) {
	if ( members[ memberid ].userlevel == "admin" ) qlub_loadadmintools( "disq" ) ;
	else init_memberadminbar( "sprite_chat_24" ) ;
	showblock( "qlub_opencloseleftcolbuttons" ) ;
//	ge( "qlub_header" ).style.maxWidth = "1024px" ;
	q_innerHTML( "q_drawerleftcoltitle", tabs_message[ "disq_name" ] ) ;
}

function initshareboard( ) {
	if ( window.init_bundle ) init_bundle() ;
	q_include( q_elems[ "shareboardleftcol" ] , "initshareboard_done" , [ ] ) ;
	qsn_init() ;
	relaunchupdates() ;
}

function initshareboard_done( ) {
	//listing des membres du libre echange
	var l = getelement( "shareboard_activemembers_elem" ) ;
	l.innerHTML = "" ;	
	var sortedm = q_sortedmemberids() ;
	var img ;
	for ( var j = 0 ; j < sortedm.length ; j++ ) {
		m = sortedm[ j ] ;
		if ( m != "quomodo" && ( q_spacetype() == "qlub" || indexOfItem( m , authorizedmembers ) != -1 ) ) {
			var li = document.createElement( "li" ) ;
			li.style.marginLeft = "-20px" ;
			q_innerHTML( li , q_username( m ) ) ;
			l.appendChild( li ) ;
		}		
	}	
	if ( members[ memberid ].userlevel == "admin" ) qlub_loadadmintools( "shareboard" ) ;
	else init_memberadminbar( "sprite_note_24" ) ;
}

function init_bundleshareboard( ) {
	if ( members[ memberid ].userlevel == "admin" ) qlub_loadadmintools( "shareboard" ) ;
	showblock( "qlub_opencloseleftcolbuttons" ) ;
	q_innerHTML( "q_drawerleftcoltitle", tabs_message[ "shareboard_name" ] ) ;
}

/*
function -
function ADMIN BAR
*/

var qlub_adminmenu_tools = [ "members", "sitemap", "infos", "website", "events", "uploads", "diflistmgr", "custom", "sponsors" ]; 
var qlub_helpmenu_tools = [ "help", "qwiz", "invitemembers", "stats", "news", "gallery", "sendpressrelease", "sponsornewclub", "contactsupport" ]; 

function init_memberadminbar( iconclass ) {
	hideshowblock( "qlub_adminbar_adminbutton" , "qlub_memberinfoweb" ) ;
	ge( "qlub_memberinfoweb" ).style.width = "150px" ;
	ge( "qlub_memberinfowebimg" ).className = ( iconclass ) ? ( iconclass + "_48" ) : ( "adminmenu " + ( window.pages_isweb ? "sprite_globe_32" : "sprite_tools_member_32") ) ;
	q_innerHTML( "qlub_memberinfowebtext" , qlub_message[ "infopageis" + ( window.pages_isweb ? "" : "not" ) + "web" ] ) ;

	qlub_createadminbarmenu( "helpmenu" );
	showblock( "qlub_adminbar_helpbutton" );
}

function qlub_loadadmintools( mode ) {
	qlub_revealadmintools( mode ) ;
}

function qlub_revealadmintools( mode ) {
	if ( q_spacetype() == "fede" ) visibleblock( "qlub_adminmenu_editdisqmembers" , /artemadisq/.test( currsvcid ) ) ;

	qlub_createadminbarmenu( "adminmenu" );
	qlub_createadminbarmenu( "helpmenu" );
	qlub_displayswitchbuttons( mode, qlub_getsvctype() ) ;
	showblock( ["qlub_adminbar_adminbutton", "qlub_adminbar_helpbutton", "qlub_adminbar_switchbuttons"]);
}

function qlub_createadminbarmenu( menu, displaymode ){
	var tools = eval( "qlub_" + menu + "_tools" );

	var div = ge( "qlub_" + menu );
	q_innerHTML( div, ""); 
	var table = create_table( div , { style : { position : "relative"} } ) ;
	var tr = table.insertRow( -1 ); 
	create_td( tr, { className : "menupane_il png",  width : "9"} );
	var thetd = create_td( tr, { className : "menupane_ii pngscale"} );
	create_td( tr, { className : "menupane_ir png",  width : "9"} );
	tr = table.insertRow( -1 ); 
	create_td( tr, { className : "menupane_bl",  width : "9"} );
	create_td( tr, { className : "menupane_bi pngscale"} );
	create_td( tr, { className : "menupane_br png",  width : "9"} );
	
	var thewidth = ( displaymode && displaymode == "small" ) ? "300" : "340";
	var adminmenutable = create_table( thetd, { className : "qlub_adminmenu_table", cellPadding : "5", width : thewidth, style : { position : "relative" } } ) ;
	var index = 0;
	for ( var i  in  tools ){
		if ( ! qlub_tools[ tools[ i ] ] ) continue;
		if ( qlub_tools[ tools[ i ] ].adminonly && members[ memberid ].userlevel != "admin" ) continue ; 
		if ( qlub_tools[ tools[ i ] ].displaycond &&  ! qlub_tools[ tools[ i ] ].displaycond.apply( this ) ) continue;
		var tool = qlub_tools[ tools[ i ] ] ;
				
		var tr = adminmenutable.insertRow( -1 );
		tr.className = ( index%2 == 0 ) ? "qlub_adminmenu_tr clubbackgroundcolor6" : "qlub_adminmenu_tr";
		tr.target = tools[ i ] ;
		tr.menu = menu;
		tr.index = index;
		index++; 
		tr.onmouseover = function(){ 
			this.className = "qlub_adminmenu_tr clubbackgroundcolor2"; 
			gebcn( this, "qlub_adminmenu_title" ).style.color  = "#FFF";
			if ( gebcn( this, "qlub_adminmenu_desc") ) gebcn( this, "qlub_adminmenu_desc").style.color = "#CCC";
		};
		tr.onmouseout = function(){
			this.className = ( (this.index)%2 == 0 ) ? "qlub_adminmenu_tr clubbackgroundcolor6" : "qlub_adminmenu_tr"; 
			gebcn( this, "qlub_adminmenu_title" ).style.color  = "#333";
			if ( gebcn( this, "qlub_adminmenu_desc") ) gebcn( this, "qlub_adminmenu_desc").style.color = "#666";
		};
		if ( tool.htmldesc ) tr.onclick = null;
		else tr.onclick = function(){ 
			if ( this.menu == "adminmenu" ) qlub_open_admindrawer( this.target ); 
			else qlub_tools[ this.target ].fn.apply( this , ( qlub_tools[ this.target ].option ) ? qlub_tools[ this.target ].option : [] ) ;
		};
		var td = create_td( tr, { className : "clubbordercolor1",  width : ( ( displaymode && displaymode == "small" ) ? "20" : "40" ) } ) ;
		td.appendChild( create_elem( "DIV", { className : "qlub_adminmenu_icon adminmenu " + tool.iconclass + ( ( displaymode && displaymode == "small" ) ? "_16" : "_32" ) + ( ( tool.disabled ) ? "_disabled"  : "" ) } ) ) ;
		td = create_td( tr, { className : "clubbordercolor1"} );
		td.appendChild( create_elem( "DIV", { className : "qlub_adminmenu_title", innerHTML : ( tool.menuname || tool.title ) , style : { fontWeight : ( displaymode && displaymode == "small" ) ? "normal" : "bold" } } ) );
		if ( ! displaymode || displaymode != "small" ) td.appendChild( create_elem( "DIV", { className : "qlub_adminmenu_desc", innerHTML : ( tool.htmldesc || tool.desc || "" ) } ) );
	}
}

function qlub_displayswitchbuttons( mode, svctype ){
	if ( svctype == "page" ) visibleblock( "qlub_adminbar_switchbuttons_web", pages_isweb );
	else hideblock( "qlub_adminbar_switchbuttons_web" );
	switch( mode ) {
		case "edit" :
			var div = ge("qlub_adminbar_switchbuttons_admin");
			if ( div ) {
				div.onmouseover = div.onmouseout = div.onclick = null;
				q_mouseoverbutton( div ) ;
			}
			showblock( "qlub_adminmenu_switchbuttons" ) ;
			break ;
		case "view" :
			var div = ge("qlub_adminbar_switchbuttons_members");
			if ( div ) {
				div.onmouseover = div.onmouseout = div.onclick = null;
				q_mouseoverbutton( div ) ;
			}
			showblock( "qlub_adminmenu_switchbuttons" ) ;
			break ;
		default :
			hideblock( "qlub_adminmenu_switchbuttons" ) ;
			break ;
	}
	
}

function qlub_openwebpage(){
	if ( window.clubhost ) var club_url = clubhost ;
	else var club_url = window.location.host + "/" + window.clubprivatedomain ;
	club_url = "http://" + club_url ;
	window.open( club_url + "/" + q_currsvcjson().weblink );
}

function qlub_setpict ( memberid ) {
	var pict = gebcn ( ge( "qlub_adminbar" ), "qlub_headeruserphoto" ) ;
	if ( pict && members && members[ memberid ] && members[ memberid ].pict ) pict.innerHTML = '<img src="' + escapeattribute( q_spaceabsoluteurl( memberid , members[ memberid ].pict ) ) +  '" width="34" height="34" />' ;
}

function qlub_writeprivatedomain(){
	if ( ! ge( "qlub_adminbar_url" ) ) return hideblock( "qlub_adminbar_urltd" ) ;
	if ( ! window.clubhost && ! window.clubprivatedomain ) return hideblock( "qlub_adminbar_urltd" ) ;
	var club_url ;
	if ( window.clubhost )  var club_url = "http://" + clubhost.replace( /:.*$/ , "" ) ;// replace bug plistopened
	else var club_url = "http://" + window.location.host + "/" + window.clubprivatedomain.replace( /:.*$/ , "" ) ;// replace bug plistopened
	ge( "qlub_adminbar_url" ).innerHTML= club_url;	
	ge( "qlub_adminbar_url" ).href= club_url;
}

/*
function -
function HEADER & TABSMENU
*/

function writetitleandname( ) {
	if ( q_isstaticpage() ) {
		if ( getelement( "welcome_username" ) ) rm( getelement( "welcome_username" ) ) ;
	} else {
		var un = q_username( memberid ) ;
		document.title = un + " " + common_message[ "on" ] + " " + rights_record["currspaceright"].name ;
		var d = getelement( "welcome_username" ) ;
		if ( d != undefined ) d.innerHTML = un + " " ; // d.innerHTML.replace( /%/ , un ) ;
	}
	// nom du club et de la page
//	var s = spacetabs.spaces ;
//	ge( "clubname" ).innerHTML =  ( s[ 0 ].id != "self" ) ? s[ 0 ].name : s[ 1 ].name ;
	logouthref() ;
	writecurrsvcname() ;
//	var img = getElementByClassName( ge( "qlub_header" ), "qlub_headeruserphoto" ) ;
	// ccc
	qlub_setpict ( memberid ) ;
	qlub_writeprivatedomain();
}

function display_banner( url , logoclassName ) {
	if ( window.club_hideaffiliation ) return ;
	var a = create_elem( "A" , { href : url, target: "_blank" } ) ;
	var div = a.appendChild( create_elem( "DIV" , { "className" : logoclassName } ) ) ;
	div.style.top = "2px" ;
	ge( "qlub_headerbanner_content" ).appendChild( a ) ;
}

function initbanner() {
	var a = window.club_affiliation ;
	switch( a ) {
		//Do not touch comments
		// --!new case here!--
		case "ufolep" :
			display_banner( "http://www.ufolep.org" , "ufolep_bannerlink png" ) ;
			break ;
		case "ffsg" :
			display_banner( "http://www.ffsg.org" , "ffsg_bannerlink png" ) ;
			break ;
		case "ffbb" :
			display_banner( "http://www.basketfrance.com" , "ffbb_bannerlink png" ) ;
			sn_chooserlist.push("ffbb");
			break ;
		case "fffcda" :
			display_banner( "http://www.fffcda.com" , "fffcda_bannerlink png" ) ;
			break ;
		case "fftri" :
			display_banner( "http://www.fftri.com/" , "fftri_bannerlink png" ) ;
			break ;
		case "ffsavate" :
			display_banner( "http://www.ffsavate.com/" , "ffsavate_bannerlink png" ) ;
			break ;
		case "cfkb" :
			display_banner( "http://www.cfkb-da.com/" , "cfkb_bannerlink png" ) ;
			break ;
		default :
			break ;
	}
}

function qlub_initspacestabs( mode ) {
	if ( ! document.mainform ) return false ;
	if ( ! document.mainform.q_space ) return false ;
	if ( ! document.mainform.q_space.value ) return false ;
	if ( ( spacetabs ) && ( spacetabs.spaces.length ) ) spacetabs.spaces.splice( 0 , 1 ) ;
	q_tabs_wantnewspace = false ;
	q_tabs_initspacetabs() ;
	
	spacetabalert() ;
	launchupdatesintabs() ;
}

function qlub_pageisuptodate( svcid ) {
	var svc = q_svcfromid( svcid ) ;
	var uptodate = false ;
	var svcs = spacetabs.spaces[ currspacetabindex ].services ;
	for ( var i = 0 ; i < svcs.length ; i++ ) if ( svcs[ i ][ 0 ] == svcid ) {
		uptodate = ! ( ( svc.publicationupindex == undefined ) || ( svcs[ i ][ 1 ].space.high > parseInt( svc.publicationupindex , 10 ) ) || parseInt( svcs[ i ][ 1 ].space.high , 10 ) < 2 ) ;
		break ;
	}
	return uptodate ;
}

function qlub_updatesitemap() {
	var svc ;
	var oldpages = [] ;
	var webpages=[];
	if( window.q_makeweb ){//#1496
		for ( var j=0; j <q_makeweb_data.webpages.length; j++ ){
			webpages.push( q_makeweb_data.webpages[j].id ) ;
		}
	}
	for ( var i = sitemap.length - 1 ; i >= 0 ; i-- ) {
		var tabmap = sitemap[ i ] ;
		for ( var j = tabmap.links.length - 1 ; j >= 0  ; j-- ) {
			if ( q_svcfromid( tabmap.links[ j ] ) ) {
				oldpages.push( tabmap.links[ j ] ) ;
				if ( window.q_makeweb && webpages.indexOf( tabmap.links[ j ] ) ==-1 ) sitemap[ i ].links.splice( j , 1 ) ;
			} else sitemap[ i ].links.splice( j , 1 ) ;
		}
		// if ( ! sitemap[ i ].links.length ) sitemap.splice( i , 1 ) ;
	}
	if ( sitemap.length == 0 ) sitemap.push( { name : qlub_message[ "webzinepage" ] , links : [] } ) ;// initialisation 1er menu
	var m1 = sitemap[ 0 ].links ;
	for ( var i = 0 ; i < recent_services.length ; i++ ) {
		svc = recent_services[ i ] ;
		if ( ( svc.id.replace( /^#[0-9]+/ , "" ) == "#artemapage@intl" ) && ( indexOfItem( svc.id , oldpages ) == -1 ) && ( ! window.q_makeweb || webpages.indexOf( svc.id ) !=-1 ) ) m1.push( svc.id ) ; //#1504
	}
}

function qlub_menupaneposition_maxwidth() {
	return 954 ;
}

function qlub_initmenupaneposition() {
	var target = ge( "qlub_menuonlybar" ) ;
	var n = target.cells.length ;
	var menupanewidth = 300 ;
	var td , menupane ;
	for ( var i = 2 ; i < n ; i++ ) {
		td = target.cells[ i ] ;
		menupane = gebcn( td , "qlub_menupane" ) ;
		if ( ! menupane ) continue ;
		td.getElementsByTagName( "DIV" )[ 0 ].style.zIndex = "0" ;
		if ( ( td.offsetLeft + menupanewidth ) > qlub_menupaneposition_maxwidth() ) menupane.style.right = "-17px" ;
	} 
}

function qlub_rmtabs() {
	var target = ge( "qlub_menuonlybar" ) ;
	var n = target.cells.length - 4 ;
	for ( var i=2; i<n; i++ ) target.deleteCell( 2 ) ;
}

function qorp_inittabs() {
	// menus
	qlub_updatesitemap() ;
	qorp_doinittabs() ;
}

function webmenulink( tabname, shortname ) {//ATTENTION recopié dans makeweb/fullmenuname
	var s = q_urlcompliant( tabname + "-" + shortname ) ;
	if ( s.length < 241 ) return s ;
	return s.substring( 0, 240 ) ;
}

function construct_weblinknames() {
	var checkweblinknames = [] ;
	var allweblinknames = [] ;
	var allweblinkids = [] ;
	for ( var i=0; i<sitemap.length; i++ ) {
		var tabname=sitemap[ i ].name ;
		var links = sitemap[ i ].links ;
		for ( var j=0; j <links.length; j++ ) {
			var svc = q_svcfromid( links[ j ] ) ;
			svc[ "rubricindex" ] = i ;
			weblinkname = webmenulink( tabname, svc.shortname ) ;
			if ( indexOfItem( weblinkname , checkweblinknames ) != -1 ) {//#1566 indexOf bug sur IE6
				for ( var n=0; n <9999; n++ ) {
					if ( indexOfItem( weblinkname + n , checkweblinknames ) == -1 ) {//#1566 indexOf bug sur IE6
						weblinkname = weblinkname + n ;
						break;
					}
				}				
			}
			allweblinknames.push( { webname : weblinkname , pagename : svc.shortname , tabname : tabname , pagelang : q_lang } ) ;// intégrer ici la langue de la page
			checkweblinknames.push( weblinkname ) ;
			allweblinkids.push( svc.id ) ;
			svc["weblink"] = weblinkname ;//pour q_addtosvclink
		}
	}
	if ( window.q_makeweb ){//#1566
		window.q_makeweb_data[ "allweblinkids" ] = allweblinkids ;//pour créer les symlinks dans AS (makeweb/makestaticmenu)
		window.q_makeweb_data[ "allweblinknames" ] = allweblinknames ;
	}
}

function qlub_cleanHeaderNodes() { //#1504
	var artema = ge( 'artema_header' ) ;
	rm( artema ) ; 
	var headertable = ge( 'web_headertable_elem' ) ;
	if ( headertable ) {
		var table = create_elem( "TABLE" , { cellSpacing : "0", cellPadding : "0", border: "0" , className: "qlub_pagecolor", width: "100%", minWidth: "500px", innerHTML: "<tbody><tr><td align=\"left\" valign=\"middle\" height=\"36\" style=\"padding-left:22px\"><h1 id=\"currservicename\" style=\"font-weight:normal;padding:0;margin:0;\"></h1></td><td align=\"right\" valign=\"middle\" width=\"1%\" height=\"36\"><div id=\"qlub_login_div\"></div></td></tr></tbody>" , style : { position : "absolute" , left : "0px" } } ) ;
		var newheadertable = headertable.parentNode.insertBefore( table , headertable ) ;
		headertable.parentNode.removeChild( headertable ) ;
		newheadertable.setAttribute( "id" , "web_headertable_elem" ) ;
	}
	qlub_client_cleanHeaderNodes() ;
}

function qlub_client_cleanHeaderNodes() { } //a redéfnir dans les clients

function qorp_doinittabs() {
	// menus
	qlub_rmtabs() ;
	construct_weblinknames() ;//#1566
	if ( window.q_makeweb ) {//#1496
		rm( "qlub_adminbar" ) ;
		//document.body.style.paddingTop = "0px" ;
		document.body.className = document.body.className + " webmode" ;
		qlub_cleanHeaderNodes( ) ;//#1504
		//on vire les td contenant qlub_disqmenugroup et qlub_shareboardmenugroup
		var temp = ge( "qlub_disqmenugroup" ) ;
		if ( temp ) temp=temp.parentNode ;
		if ( temp ) temp.parentNode.removeChild( temp );
		var temp = ge( "qlub_shareboardmenugroup" ) ;
		if ( temp ) temp=temp.parentNode ;
		if ( temp ) temp.parentNode.removeChild( temp );
	}

	var menubariconsize = window.club_menubariconsize || 24;
	var discicons = getElementsByClassName("qlub_disqmenugroup", "qlub_disqmenuicon");
	for ( var i in discicons ) discicons[ i ].className = "qlub_disqmenuicon adminmenu sprite_chat_" + menubariconsize ;
	var shareboardicons = getElementsByClassName("qlub_shareboardmenugroup", "qlub_shareboardmenuicon");
	for ( var i in shareboardicons ) shareboardicons[ i ].className = "qlub_shareboardmenuicon adminmenu sprite_note_" + menubariconsize ;

	if ( window.client_makemenus ) client_makemenus();
	else qlub_makemenus();
}
	
function qlub_makemenus(){	
	for ( var i=0; i<svc_tabs.length; i++ ) {
		tab = svc_tabs[ i ] ;
		if ( ( tab.access ) && ( tab.access != members[ memberid ].userlevel ) ) continue ;
		switch ( tab.id ) {
			case ( "info" ) : // menus pages infos
				var jj = 0 ;
				for ( var j=0; j <sitemap.length; j++ ) {
					var nsvc = qlub_makemenutab( i , j , jj ) ;
					jj++ ;
					if (  j >0 && nsvc && qlub_makemenuseparator( jj - 1 ) ) jj++ ; // on met un séparateur s'il y en a un de prévu et si on affiche l'onglet
					//if (  j < ( sitemap.length - 1 )  && nsvc && qlub_makemenuseparator( jj )) jj++ ; // on met un séparateur s'il y en a un de prévu et s'il on affiche l'onglet
				}
				break ;
			case ( "disq" ) :
				if ( ! window.q_makeweb ) visibleblock( "qlub_disqmenugroup" , ( qlub_createtabmenu( i, "qlub_disqmenugroup" ) != 0 ) ) ;
				break ;
			case ( "shareboard" ) :
				if ( ! window.q_makeweb ) visibleblock( "qlub_shareboardmenugroup" , ( qlub_createtabmenu( i, "qlub_shareboardmenugroup" ) != 0 ) ) ;
				break ;
		}
	}

	//initialisation taille du menu
	var trmenu = ge( "qlub_menubar" ) ;
	var tabs = getElementsByClassName( trmenu , "qlub_menutab" ) ;

	var x = trmenu.cells[ trmenu.cells.length - 1 ] ;
	var wref = qlub_maxmenuwidth() ;
	if ( ( x.offsetWidth + x.offsetLeft ) <= wref ) return qlub_initmenupaneposition() ;
	hideblock( [ "qlub_disqmenulink" , "qlub_shareboardmenulink" ] ) ;
	if ( ( x.offsetWidth + x.offsetLeft ) <= wref ) return qlub_initmenupaneposition() ;
	for ( var j = 0 ; j < 5 ; j++ ) {
		for ( var i = 0 ; i < tabs.length ; i++ ) tabs[ i ].style.fontSize = ( 13 - j ) + "px" ;
		if ( ( x.offsetWidth + x.offsetLeft ) <= wref ) return qlub_initmenupaneposition() ;
	}
	qlub_initmenupaneposition() ;
}

function qlub_maxmenuwidth() {
	var maxwidth = 1002 ;
	return ( document.mainform.pagemode.value == "edit" ) ? Math.min( q_windowInnerWidth() - ge( "qlub_header_nav" ).offsetLeft + 6 , maxwidth ) : maxwidth ; // + 6 car lorsque la fenêtre est réduite, il y a un décalage de 6 px
}

function qlub_svcnothidden( svcid , hiddenlinks ) {
	if ( hiddenlinks == undefined ) return true ;
	if ( document.mainform.pagemode.value == "edit" && members[ memberid ].userlevel == "admin" ) return true ;
	for ( var i = 0 ; i < hiddenlinks.length ; i++ ) if ( svcid == hiddenlinks[ i ] ) return false ;
	return true ;
}

function qlub_makemenuseparator( indexi ) { // i est dans une boucle
	var d = ge( "qlub_tabseparatortemplate" ) ;
	if ( ! d ) return false ;
	d = d.cloneNode ( true ) ;
	var target = ge( "qlub_menuonlybar" ) ;
	var c = target.insertCell( indexi + 2 ) ;
	c.width = "1" ;
	//c.height = "38" ;
	c.align = "left" ;
	c.vAlign = "top" ;
	d = c.appendChild( d ) ;
	d.removeAttribute( "id" ) ;
	showblock( d ) ;
	return true ;
}

function qlub_makemenutab( itab , isitemap , indexi ) { // i est dans une boucle
	var tabmap = sitemap[ isitemap ] ;
	var tab = svc_tabs[ itab ] ;
	var target = ge( "qlub_menuonlybar" ) ;
	var c = target.insertCell( indexi + 2 ) ;
	c.width = "1%" ;
	//c.height = "38" ;
	c.align = "left" ;
	c.vAlign = "top" ;
	c.className = "qlub_tdmenutab" ;
	var d = ge( "qlub_tabtemplate" ).cloneNode ( true ) ;
	d = c.appendChild( d ) ;
	d.removeAttribute( "id" ) ;
	var menuelem = gebcn( d , "qlub_menutab" ) ;
	if ( menuelem ) {
		menuelem.innerHTML = tabmap.name ;
		var menumode = "v-201003" ;
	} else {
		menuelem = gebcn( d , "qlub_menubutton" ) ;
		var tablemode = ( menuelem.tagName == "TABLE" ) ;
		if ( tablemode ) {
			var trout = gebcn( d , "qlub_menubuttonout" ) ;
			var trover = gebcn( d , "qlub_menubuttonover" ) ;
			trout.getElementsByTagName( "TD" )[ 1 ].innerHTML = trover.getElementsByTagName( "TD" )[ 1 ].innerHTML = tabmap.name ;
		} else d.getElementsByTagName( "TD" )[ 1 ].innerHTML = tabmap.name ;
	}
	
	var m = gebcn( d, "qlub_menupane_content" ) ;
	m.innerHTML = "" ;
	var svc , linkname ;
	var nsvc = 0 ;
	var iscurrtab = false ;
	for ( var i=0; i<tabmap.links.length; i++ ) {
		if ( ! tabmap.hiddenlinks || qlub_svcnothidden( tabmap.links[ i ] , tabmap.hiddenlinks ) ) {
			q_addtosvclink( m , q_svcfromid( tabmap.links[ i ] ) ) ;
			if ( tabmap.links[ i ] == currsvcid ) {
				if ( menumode || tablemode ) iscurrtab = true ;
				else {
					var marker = create_elem( "DIV", { className :  "png qlub_menubarmarker" } ) ;
					getElementByClassName( d, "qlub_menuspacer" ).appendChild ( marker ) ;
				}
			}
			nsvc++ ;
		}
	}
	if ( menumode && ! iscurrtab ) rm( getElementsByClassName( d , "qlub_menubarmarker" ) ) ;
	if ( tablemode && ! iscurrtab ) rm( getElementsByClassName( d , "qlub_menubarmarker" ) ) ;
	if ( ( document.mainform.pagemode.value == "edit" ) && ( ! tab.newaccess || tab.newaccess != "admin" || members[ memberid ].userlevel == "admin" ) ) {
		if ( tab.svcid ) {
			q_addnewsvclink( m , tab , tab.newh ) ;
			var theas = m.getElementsByTagName( "A" ) ;
			theas[ theas.length - 1 ].tabindex = isitemap ;
		}
		else if ( tab.href ) q_addtopagelink( m , tab , tab.newh ) ;
		nsvc++ ;
	}
	showblock( d ) ;
	if ( ! nsvc ) hideblock( c ) ;
	return nsvc ;
}

function q_addtosvclink( m , svc , h ) {
	linkname = svc.shortname ;
	var linksvcid = svc.id ;
	var l = create_elem( "LI", { className : "container qlub_menuitem_link"} );
	var s = create_elem( "A" , { innerHTML : linkname } ) ;
	var a = l.appendChild( s ) ;
	if ( window.q_makeweb ){  a.href = svc.weblink ;} //#1496
	l = m.appendChild( l ) ;
	l.id = svc.id ;//#1496 pour onclick déporté dans qlub_mainmenuonclick
	l.filename = svc.filename ;
}

function q_addnewsvclink( m , tab , h ) {
	var l = create_elem( "LI", { className : "container fo_tabsmenu_newlink qlub_menuitem_link" } );
	var img = l.appendChild( create_elem( "DIV" , { className : "adminmenu sprite_page_new_24", style : { cssFloat : "left" , styleFloat : "left" , paddingRight : "10px"} } ) ) ;
	var s = create_elem( "A" , { innerHTML : tabs_message[ tab.id + "_new" ] } ) ;
	var a = l.appendChild( s ) ;
	a.onclick = function () {
		toggledisplay( "fo_tabsmenu" ) ;
		var servicename = tabs_message[ tab.id + "_name"  ] ;
		qlub_editsitemap_tabindex = this.tabindex ;
		if ( h ) eval( h ).apply( this , [ tab.svcid.replace( /@intl/ , "@" + q_lang ) , [ common_message [ "newpageprompt" ].replace ( /%s/ , servicename ), common_message [ "newnameprompt" ].replace ( /%s/ , servicename ) ], defaultpagename( servicename ) ] ) ;
		else createnewpageservice( tab.svcid.replace( /@intl/ , "@" + q_lang ) , [  common_message [ "newpageprompt" ].replace ( /%s/ , servicename ), common_message [ "newnameprompt" ].replace ( /%s/ , servicename ) ] , defaultpagename( servicename ) ) ;
		return false ;
	} ;
	if ( m.childNodes.length == 0 ) l.style.borderWidth = "0" ;
	m.appendChild( l ) ;
}

function q_addtopagelink( m , pageref ) {
	var div = create_elem( "DIV", { className : "fo_tabsmenu_newlink" } ) ;
	var img = div.appendChild( create_elem( "DIV", { className  : "adminmenu sprite_page_new_24", style : { cssFloat : "left", styleFloat : "left" , paddingRight : "10px"}  } ) ) ;
	var a = div.appendChild( create_elem( "A", { href : "#", innerHTML : tabs_message[ pageref.id + "_new" ] , style : { lineHeight : "24px" } } ) ) ;
	var svcref = pageref.href.split( "/" ) ;
	a.onclick = function () { opencalledservice( svcref[ 0 ].replace( /@intl/ , "@" + q_lang ) , svcref[ 1 ] ) ; return false ; } ;
	if ( m.childNodes.length == 0 ) div.style.borderWidth = "0" ;
	m.appendChild( div ) ;
}

function qlub_createtabmenu( itab, targetid ) {
	var tab = svc_tabs[ itab ] ;
	var tabsvcid = tab.svcid ;
	if ( ! ( /^#[^#]+$/.test( tabsvcid ) ) ) return ;
	var targetelem = ge( targetid ) ;
	if ( ! targetelem ) return 0 ;
	var tabid = tab.id ;
	var m = create_elem( "DIV" , { className : "fo_tabsmenu_group" } ) ;
	m.index = itab ;
	var svc ;
	var nsvc = 0 ;
	for ( var i = 0 ; i < recent_services.length ; i++ ) {
		svc = recent_services[ i ] ;
		var goodtab = ( tabsdict[ svc.id.replace( /^#[0-9]+/ , "" )  + ( ( svc.filename ) ? ( "/" + svc.filename ) : "" ) ] == tabid ) ;
		if ( ( serviceaccess( svc ) != "denied" ) && goodtab ) {
			q_addtosvclink( m , svc , tab.svch ) ;
			nsvc++ ;
//			if ( q_tabs_newsinsvc( svc.id ) ) getelement( "alert_" + tabid ).style.visibility = "visible" ;
		}
	}
	if ( ( document.mainform.pagemode.value == "edit" ) && ( ( ! tab.newaccess ) || ( tab.newaccess == members[ memberid ].userlevel ) ) ) {
		if ( tab.svcid ) q_addnewsvclink( m , tab , tab.newh ) ;
		else if ( tab.href ) q_addtopagelink( m , tab , tab.newh ) ;
		nsvc++ ;
	}
	var targetmenu = gebcn( targetelem, "qlub_menupane_content" ) ;
	targetmenu.innerHTML = "" ;
	if ( nsvc != 0 ) targetmenu.appendChild( m ) ;
	else m = null ;
	return nsvc ;
}

function qorg_makemenutab( tab ) {
	var target = ge( "svctabs_elem" ) ;
	var c = target.insertCell( i ) ;
	c.style.position = "relative" ;
	var t = create_elem( "TABLE" , { "align" : "center" , "cellSpacing" : "0" , "cellPadding" : "0" ,"style" : { "position" : "relative" } } ) ;
	var tr = t.insertRow( 0 ) ;
	var td1 = tr.insertCell( 0 ) ;
	var div ;
	div = create_elem( "DIV" , { className : "tabsbuttonleft" , style : { backgroundPosition : "top left" } } ) ;
	var tabname = ( tab.nameh ) ?  eval( tab.nameh ).apply( this , [] ) : tabs_message[ tab.id + "_tab" ] ;
	div.appendChild( document.createTextNode( tabname ) ) ;
	div.appendChild( create_elem( "SPAN", { id : "alert_" + tab.id, className : "pagetabalert", innerHTML : "!", style : { paddingRight : "3px", visibility : "hidden"  } }) ) ;
	div = td1.appendChild( div ) ;
	div.className = "tabsbuttonleft pngbtn" ;

	c.onclick = function( ) { q_mouseoutbutton( this ) ; toggledisplay( "tabs_elems" ) ; q_updatetabmenu( this ) ; return false ; } ;
	c.onmouseover = function( ) { q_mouseoverbutton( this ) ; q_updatetabmenu( this ) ; } ;
	c.onmouseout = function( ) { q_mouseoutbutton( this ) ; } ;
	c.appendChild( t ) ;
	return c ;
}

function qlub_mouseoverbutton( x ) {
	var t = x.getElementsByTagName( "TABLE" )[ 0 ] ;
	if ( headertabsbuttontype == "old" ) autowbtn_mover( t , { "lineHeight" : "30px", "ie6" : { "marginTop" : "3px" } } ) ;
	else {
		var td = t.getElementsByTagName( "TD" ) ;
		var x0 = td[ 0 ].getElementsByTagName( "DIV" )[ 0 ] ;
		var x1 = td[ 1 ].getElementsByTagName( "DIV" )[ 0 ] ;
		q_mouseoverbutton( x0 , "left bottom" ) ;
		q_mouseoverbutton( x1 , "right bottom" ) ;
	}
}

function qlub_mouseoutbutton( x, pos ) {
	var t = x.getElementsByTagName( "TABLE" )[ 0 ] ;
	if ( headertabsbuttontype == "old" ) autowbtn_mout( t , { lineHeight : "24px" , "ie6" : { "marginTop" : "0px" }  } ) ;
	else {
		var td = t.getElementsByTagName( "TD" ) ;
		var x0 = td[ 0 ].getElementsByTagName( "DIV" )[ 0 ] ;
		var x1 = td[ 1 ].getElementsByTagName( "DIV" )[ 0 ] ;
		q_mouseoutbutton( x0 , "left top"  ) ;
		q_mouseoutbutton( x1 , "right top"  ) ;	
	}
}

function qorp_tabsleftori() {
	return 210 ;
}

function qlub_mainmenumouseover( ee ) {//#1496
	var target = getElementFromEvent( ee ) ;
	var container = getContainer ( target ) ;
	if ( target.className && ( /divimg/.test( target.className ) ) ) target = target.parentNode ;
	if ( container && container.className && ( /qlub_menutab/.test( container.className ) ) ) {
		qlub_mouseovermenutab( container ) ; 
	} else if ( target.id && target.id == "qlub_opencloseleftcolbuttons" ) { 
		if ( ! isfirefox() )  q_mouseoverbutton( target ) ;
	} else if ( container && container.className && ( /qlub_menuitem_link/.test( container.className ) ) ) { 
		qlub_mouseovermenupane( getContainer( container.parentNode ) ) ; 
		container.className = container.className.replace( /qlub_menuitem_link(over)?/ , "qlub_menuitem_linkover" ) ;
	} else if ( container && container.className && ( /qlub_menupane_link/.test( container.className ) ) ) { //ancienne façon de faire
		qlub_mouseovermenupane( getContainer( container.parentNode ) ) ;
		q_mouseoverbutton( container , "bottom left" ) ;
		container.getElementsByTagName( "A" )[ 0 ].style.color = ( window.club_menucolorpalette ) ? club_menucolorpalette[ 1 ] : club_sitecolorpalette[ 1 ] ;
	} else if ( container && container.className && ( /qlub_menubutton/.test( container.className ) ) ) { 
		qlub_mouseovermenubutton( container ) ; 
	} else if ( container && container.className && ( /qlub_menupane/.test( container.className ) ) ) { 
		qlub_mouseovermenupane( container ) ;
	}
}

function qlub_mainmenumouseout( ee ) {
	var target = getElementFromEvent( ee ) ;
	var container = getContainer ( target ) ;
	if ( target.className && ( /divimg/.test( target.className ) ) ) target = target.parentNode ;
	if ( container && container.className && ( /qlub_menutab/.test( container.className ) ) ) {
		qlub_mouseoutmenutab( container ) ; 
	} else if ( target.id && target.id == "qlub_opencloseleftcolbuttons" ) {
		if ( ! isfirefox() ) q_mouseoutbutton( target ) ;
	} else if ( container && container.className && ( /qlub_menuitem_link/.test( container.className ) ) ) { 
		qlub_mouseoutmenupane( getContainer( container.parentNode ) ) ; 
		container.className = container.className.replace( /qlub_menuitem_link(over)?/ , "qlub_menuitem_link" ) ;
	} else if ( container && container.className && ( /qlub_menupane_link/.test( container.className ) ) ) {//ancienne façon de faire
		qlub_mouseoutmenupane( getContainer( container.parentNode ) ) ;
		q_mouseoutbutton( container , "top left" ) ;
		container.getElementsByTagName( "A" )[ 0 ].style.color="#FFF" ;
	}else if ( container && container.className && ( /qlub_menubutton/.test( container.className ) ) ) { 
		qlub_mouseoutmenubutton( container ) ; 
	}else if ( container && container.className && ( /qlub_menupane/.test( container.className ) ) ) { 
		qlub_mouseoutmenupane( container ) ;
	}
}

function qlub_mouseovermenutab( x ) {
	var td = getContainer( x , "qlub_tdmenutab(over)?" ) ;
	td.className = td.className.replace( /qlub_tdmenutab\b/ , "qlub_tdmenutabover" );
	td.style.zIndex = "1" ;
	showblock( gebcn( td , "qlub_menupane" ) ) ;
}

function qlub_mouseoutmenutab( x ) {
	var td = getContainer( x , "qlub_tdmenutab(over)?" ) ;
	td.className = td.className.replace( /qlub_tdmenutabover/ , "qlub_tdmenutab" );
	td.style.zIndex = "0" ;
	hideblock( gebcn( td , "qlub_menupane" ) ) ;
}

function qlub_svclinkonclick( x ) { // à surdéfinir en mode web pour que ça ne fasse rien
	openservice( x.id , x.filename ) ; return false ; 
}

function qlub_mainmenuonclick( ee ) {
	var target = getElementFromEvent( ee ) ;
	var container = getContainer ( target ) ;
	if ( target.className && ( /divimg/.test( target.className ) ) ) target = target.parentNode ;
	if ( target.id && target.id == "qlub_opencloseleftcolbuttons" ) {
		if ( ! isfirefox() ) q_mouseoutbutton( target ) ;
		if ( target.className == "closeleftcol" ) qlub_closeleftcol() ;
		else qlub_openleftcol() ;
	} else if ( container && container.className && ( ( /qlub_menuitem_link/ ).test( container.className ) ) && ( ! ( /fo_tabsmenu_newlink/ ).test( container.className ) ) ) { 
		qlub_svclinkonclick(container);
	} else if ( container && container.className && ( ( /qlub_menupane_link/ ).test( container.className ) ) ) { 
		qlub_svclinkonclick(container);
	}
}

function qlub_mouseovermenubutton( x ) {
	if ( x.tagName == "TABLE" ) {
		var n = x.rows.length ;
		hideshowblock( x.rows[ n-2 ] , x.rows[ n-1 ] ) ;
	} else q_mouseoverbutton( x ) ;
//	x.parentNode.parentNode.style.zIndex = "1" ;
	x.parentNode.style.zIndex = "1" ;
	showblock( gebcn( x.parentNode, "qlub_menupane" ) ) ;
	x.style.color = "white" ;
}

function qlub_mouseoutmenubutton( x ) {
	if ( x.tagName == "TABLE" ) {
		var n = x.rows.length ;
		hideshowblock( x.rows[ n-1 ] , x.rows[ n-2 ] ) ;
	} else q_mouseoutbutton( x ) ;
//	x.parentNode.parentNode.style.zIndex = "0" ;
	x.parentNode.style.zIndex = "0" ;
	hideblock( gebcn( x.parentNode, "qlub_menupane" ) ) ;
	x.style.color = "" ;
}

function qlub_mouseovermenupane( x ) {
	x.style.display = "block" ;
	var b = gebcn( x.parentNode, "qlub_menutab" ) ;
	if ( b ) return qlub_mouseovermenutab( b ) ;
//ancienne façon de faire les menu
	var b = gebcn( x.parentNode, "qlub_menubutton" ) ;
	if ( b.tagName == "TABLE" ) {
		var n = b.rows.length ;
		hideshowblock( b.rows[ n-2 ] , b.rows[ n-1 ] ) ;
	} else q_mouseoverbutton( b ) ;
//	b.parentNode.parentNode.style.zIndex = "1" ;
	b.parentNode.style.zIndex = "1" ;
	b.style.color = "white" ;
}

function qlub_mouseoutmenupane( x ) {
	x.style.display = "none" ;
	var b = gebcn( x.parentNode, "qlub_menutab" ) ;
	if ( b ) return qlub_mouseoutmenutab( b ) ;
	var b = gebcn( x.parentNode, "qlub_menubutton" ) ;
	if ( b.tagName == "TABLE" ) {
		var n = b.rows.length ;
		hideshowblock( b.rows[ n-1 ] , b.rows[ n-2 ] ) ;
	} else q_mouseoutbutton( b ) ;
//	b.parentNode.parentNode.style.zIndex = "0" ;
	b.parentNode.style.zIndex = "0" ;
	b.style.color = "" ;
}


/*
function -
function LEFTCOL
*/

function qlub_openleftcol( ) {
//	showblock( [ "q_drawerleftcol", "q_leftcol_masktop" , "q_borderleft_mask" ] ) ;
	//ge("qlub_opencloseleftcolbuttons").className = "closeleftcol";
	qlub_anim_resizeleftcol( 0, 200 ) ;
}

function qlub_closeleftcol( ) {
	hideblock( [ "q_drawerleftcol", "q_leftcol_masktop" , "q_borderleft_mask" ] ) ;
	ge("qlub_opencloseleftcolbuttons").className = "openleftcol";
	qlub_anim_resizeleftcol( 200, 0 ) ;
}

function qlub_anim_resizeleftcol( actualwidth, targetwidth ) {
	var doanim = false ;
	if ( actualwidth > targetwidth ) {
		var x = actualwidth - 50 ;
		if ( x > targetwidth ) doanim = true ;
	} else {
		var x = actualwidth + 50 ;
		if ( x < targetwidth ) doanim = true ;
	}
	if ( doanim ) {
		qlub_resizeleftcol( x ) ;
		setTimeout( "qlub_anim_resizeleftcol( '" + x + "', '" + targetwidth + "' )" , 10 ) ;
	} else {
		if ( parseInt( targetwidth , 10 ) != 0 ) {
			showblock( [ "q_drawerleftcol", "q_leftcol_masktop" , "q_borderleft_mask" ] ) ;
			ge("qlub_opencloseleftcolbuttons").className = "closeleftcol";
		}
		qlub_resizeleftcol( targetwidth ) ;
	}
}

var qlub_ieleftcolleft = 200 ;
function qlub_resizeleftcol( x ) {
	x = parseInt( x, 10 ) ;
	qlub_ieleftcolleft = x ;
	if ( ge( "q_leftcol" ) ) ge( "q_leftcol" ).style.width = x + "px" ;
	if ( ge( "q_borderleft" ) ) ge( "q_borderleft" ).style.left = x - 10 + "px" ;
	ge( "adminpagediv" ).style.left = ( x - 6 ) + "px" ;
	if ( ge( "bodydiv" ) ) ge( "bodydiv" ).style.left = ( x - 6 ) + "px" ;
	qdr_leftcolwidth = -2 + x ;
}

function qlub_showleftcoltooltip( x, n ) {
	var t = getElementsByClassName( x.parentNode.parentNode.parentNode, 'qlub_leftcoltooltip' ) ;
	if ( t[ n ] ) showblock( t[ n ] ) ;
}

function qlub_hideleftcoltooltip( x, n ) {
	var t = getElementsByClassName( x.parentNode.parentNode.parentNode, 'qlub_leftcoltooltip' ) ;
	if ( t[ n ] ) hideblock( t[ n ] ) ;
}

function qlub_mouseoversnicon( x ) {
	x.className = x.className.replace(/icon48/, "icon48_over");
	x.style.textDecoration = "underline" ;
}

function qlub_mouseoutsnicon( x ) {
	x.className = x.className.replace(/icon48_over/, "icon48");
	x.style.textDecoration = "none" ;
}

function qlub_loadsnchooser( chooserlist ) {
	showblock("q_drawers");
	q_include( [ q_elems[ "snchooser" ] ] , "qlub_opensnchooser" , [ chooserlist || sn_chooserlist ] ) ;
}

/*
function -
function SITE MGR
*/

var qlub_newpageid = 0 ;

function qlub_newpagejson( newname , tab ) {
	var pageid = "newpage" + qlub_newpageid++ ;
	var svcref = tab.svcid.replace( /@intl/ , "@" + q_lang ) ;
	var serviceid = ( ( typeof svcref == "string" ) ? svcref : svcref.svcid ).split( "/" ) ;
	return { action : "newpage" , pagekind: serviceid[ 0 ] , pagename : newname , tabid : tab.id + "pages" , pageid : pageid } ;
}

function qlub_newpage_promptparams( tab ) {
	var servicename = tabs_message[ tab.id + "_name"  ] ;
	var s = ( tab.id == "info" ) ? qorp_message[ "newnameprompt" ] : common_message[ "newnameprompt" ] ;
	return { message : s.replace ( /%s/ , servicename ) , defaultanswer : defaultpagename( servicename ) } ;
}

function qlub_makenewpage( newname , rubricindex , pagedone_callback , pagedone_args ) { //rubricindex : optionnel = index de la rubrique dans le sitemap
// à la fin, on va dans la nouvelle page
	if ( window.qlub_maxpages ) {
		var n = 0 ;
		for ( var i = 0 ; i < sitemap.length ; i++ ) n += sitemap[ i ].links.length ;
		var upperoffer = qlub_upperoffer() ;
		if ( n >= qlub_maxpages ) return qlub_needupgrade( upperoffer , "page" ) ;
	}
	var tab ;
	for ( var i = 0 ; i<svc_tabs.length ; i++ ) if ( svc_tabs[ i ].id == "info" ) { tab = svc_tabs[ i ] ; break ; } ;
	if ( ! newname ) {
		var promptparams = qlub_newpage_promptparams( tab ) ;
		return qprompt_newpage( promptparams.message , promptparams.defaultanswer , qlub_makenewpage , [ rubricindex , pagedone_callback , pagedone_args ] ) ;
	}
	var r = qlub_newpagejson( newname , tab ) ;
	if ( rubricindex == undefined || rubricindex == null ) rubricindex = q_currsvcjson().rubricindex ;
	var newsitemap = q_cloneObject( sitemap ) ;
	newsitemap[ rubricindex ].links.push( r.pageid ) ;
	document.mainform.mission.value = "qlub_sitemapchanged" ;
	q_ajaxsubmitwithservice( "#0#artemapage@" + q_lang , { "sitemap" : newsitemap , "todolist" : [ r ] , "defaultweb" : ! window.qlub_newpageformembers , "sitelang" : {} , "deltalang" : {} } , qlub_makenewpage_done , [ pagedone_callback , pagedone_args ] ) ;
	showblock( "q_fullscreenmask" ) ;
}

function qlub_makenewpage_done( x , pagedone_callback , pagedone_args ) {
	var newsvc = x.allres[ 0 ] ;
	recent_services.push( { id : newsvc.newserviceid , shortname : newsvc.pagename , publicationupindex:"1"} ) ;
	if ( ! pagedone_callback ) return openservice( newsvc.newserviceid ) ;
	var args = [ newsvc.newserviceid ] ;
	if ( pagedone_args ) args = args.concat( pagedone_args ) ;
	pagedone_callback.apply( this , args ) ;
}

function qlub_newinfo() {
	qlub_makenewpage( null , qlub_editsitemap_tabindex ) ; // pour créer et aller directement dans la page créée sans passer par le menu administrateur
//	qlub_open_admindrawer( "newinfo" ) ;
}

function qlub_newdisq() {
	qlub_open_admindrawer( "newdisq" ) ;
}

function qlub_newshareboard() {
	qlub_open_admindrawer( "newshareboard" ) ;
}

function qlub_opennewpageinfo() {
	showblock("q_drawers");
	q_include( [ q_elems[ "editsitemap" ] ] , "qlub_opennewpageinfodone" , [ ] ) ;
}

function qlub_opennewpageinfodone() {
	qlub_revealeditsitemap() ;
	qlub_editsitemap_newpage();
 }

function qlub_opennewsvc( mode , tabs ) {
	showblock("q_drawers");
	var options = { title : qlub_message[ "managepages" ] , tabs : tabs } ;
	q_include( [ q_elems[ "sitemgr" ] ] , "qlub_newsvcreveal" , [ options , mode ] ) ;
}

function qlub_newsvcreveal( x , mode ) {
	qlub_sitemgr_reveal( x ) ;
	qlub_newpage( mode  ) ;
}

function qlub_opensitemgr( mode ) {
	showblock("q_drawers");
	var options ;
	switch ( mode ) {
		case "members" :
			options = { title : qlub_message[ "managegroups" ], tabs : [ "members", "groups", "disqpages", "shareboardpages" ] } ; // tabs : 4 maxi, le 1er du tableau est ouvert
			break ;
		case "pages" :
			options = { title : qlub_message[ "managepages" ], tabs : [ "infopages" ] } ;
			break ;
		case "newpage" :
			options = { title : qlub_message[ "managepages" ], tabs : [ "infopages" ] } ;
			break ;
	}
	q_include( [ q_elems[ "sitemgr" ] ] , "qlub_sitemgr_reveal" , [ options ] ) ;
}

function qlub_openannugroup( x ) {
	showblock("q_drawers");
	q_include( [ q_elems[ "annu" ] ] , "qlub_revealannugroup" , [ x ] ) ;
}


/*
function -
function NOM DES MEMBRES
*/

function qlub_nameofmember( m ) {
	var minfos = ( typeof m == "string" ) ? members[ m ] : m ;
	var name = "" ;
	if ( minfos.civility ) name += ( minfos.civility + " " ) ;
	if ( minfos.firstname ) name += ( minfos.firstname + " " ) ;
	name += minfos.username ;
	return name ;
}

/*
function -
function DRAWERS
*/

function qlub_hidetopdrawer( x ) {
	var d = getContainer (x ) ;
	hideblock( [ "q_drawers" , d , "q_fullscreenmask" ] ) ;
	d.style.left = "1000px" ;
}

function qlub_hideleftdrawer( x ) {
	var d = getContainer (x ) ;
	hideblock( [ d , "q_fullscreenmask" , "q_drawers" ] ) ;
	d.style.width = "0px" ;
}

/* 
fonction en double !
function qlub_opentopdrawer( x ) { // centre le tiroir dans le header
	showblock( "q_fullscreenmask" ) ;
	var d = getelement( x ) ;
	d.style.display = "block" ;
	d.style.zIndex = zindexmax + 1 ;
	var winwidth = q_windowInnerWidth( ) ;
	var paddingwidth = parseInt( d.style.paddingLeft ) + parseInt( d.style.paddingRight ) ;
	var headerwidth = winwidth - 410 ;
	if ( q_spacetype() == "qlub" ) var w = parseInt( d.style.width ) ;
	else var w = Math.round( 0.85 * ( headerwidth - paddingwidth ) ) ; // 85% de la largeur du bandeau
	var m = Math.round( ( headerwidth - ( w + paddingwidth ) ) / 2 ) ; // marge gauche
	if ( m < 0 ) m = 0 ;
	applymove( d, m, 0, w ) ;
	
	//var wrelatif = Math.round( 100 * ( ( w - paddingwidth ) / ( winwidth - 200 ) ) ) ; // taille relative
	//d.style.width = wrelatif + "%" ; // w + "px" ; //msize + "%" ;
	//var mrelatif = Math.round( 100 * ( m / ( winwidth - 200 ) ) ) ; // taille relative
	//d.style.left = mrelatif + "%" ; // m + "px" ;
}
*/

function qlub_opentopdrawer( x, drawerwidth ) { // drawerwidth % q_windowInnerWidth [0..1]
	showblock( "q_fullscreenmask" ) ;
	var d = getelement( x ) ;
	var ww = q_windowInnerWidth( ) ;
	if ( drawerwidth ) {
		var w = Math.max( Math.round( drawerwidth * ww ) , 900 ) ;
		d.style.width = w + "px" ;
	} else if ( d.style.width == "" ) {
		d.style.visible = "hidden" ;
		d.style.display = "block" ;
		var w = d.offsetWidth ;
		d.style.visible = "visible" ;
		d.style.display = "none" ;
	} else var w = parseInt( d.style.width , 10 ) ;
	var pl = ( d.style.paddingLeft == "" ) ? 0 : parseInt( d.style.paddingLeft , 10 ) ;
	var pr = ( d.style.paddingRight == "" ) ? 0 : parseInt( d.style.paddingRight , 10 ) ;
	var l = Math.round( ( ww - 200 - pl - pr - w ) /2 ) - 100 ;
	d.style.display = "block" ;
	d.style.zIndex = q_incrementfsmindex() ;
	d.style.left = l + "px" ;
	d.style.top = "-500px" ;
	applymove( d, l, 0, w ) ;
}

function qlub_openleftdrawer( x, width ) {	
	showblock( [ "q_fullscreenmask" , "q_drawers" ] ) ;
	var d = ge( x ) ;
	showblock( d ) ;
//	d.style.zIndex = zindexmax + 1 ;
	d.style.top = 90 - ge( "q_drawers" ).offsetTop + "px" ;
	d.style.width = ( width - 200 ) + "px" ;
	d.style.zIndex = q_incrementfsmindex() ;
	applymove( d, 0, parseInt( d.style.top ), width ) ;
}

/*
function -
function ADMIN DRAWER
*/

function qlub_open_admindrawer( x ) {
	window.fsmpresent = ( ge("q_fullscreenmask").style.display != "none" ) ;
	showblock("q_drawers") ;
	q_elems[ "admindrawer" ] = { id : "qlub_admindrawer" , urls : [ qlubdir + "qlub_admindrawer_" + q_lang + ".html" ] , target : "q_drawers" } ;
	q_include( [ q_elems[ "admindrawer" ] ] , "qlub_reveal_admindrawer" , [ x ] ) ;
}

function qlub_reveal_admindrawer( x ) {
	qlub_opentopdrawer( "qlub_admindrawer", 0.8 ) ;
	
	var div = ge( "qlub_admindrawer_maindiv" );
	q_innerHTML( div, ""); 
	
	var table = create_table( div, { id : "qlub_admindrawerswitchicons",  cellSpacing : "6" } );
	var tools = qlub_adminmenu_tools ;
	for ( var i  in  tools ){
		if ( ! qlub_tools[ tools[ i ] ] ) continue;
		if ( qlub_tools[ tools[ i ] ].adminonly && members[ memberid ].userlevel != "admin" ) continue ; 
		if ( qlub_tools[ tools[ i ] ].displaycond &&  ! qlub_tools[ tools[ i ] ].displaycond.apply( this ) ) continue;
		if ( qlub_tools[ tools[ i ] ].hideindrawer ) continue;
		var tool = qlub_tools[ tools[ i ] ] ;
				
		var tr = table.insertRow( -1 );
		var td = create_td( tr ) ;
		var tddiv = create_elem( "DIV", { className : "qlub_admindrawericon36 qlub_ad_" + tools[ i ] , title : ( tool.title || "" ) } ) ;
		tddiv.target = tools[ i ] ;
		tddiv.onmouseover = function(){ q_mouseoverbutton( this );} ;
		tddiv.onmouseout = function(){q_mouseoutbutton( this );} ;
		tddiv.onclick = function(){ qlub_switch_admindrawer( this );} ;
		
		tddiv.appendChild( create_elem( "DIV", { className : "drawericon adminmenu " + tool.iconclass + "_32" + ( ( tool.disabled ) ? "_disabled"  : "" ) } ) );
		td.appendChild( tddiv ) ;
	}
	qlub_switch_admindrawer( x ) ;
}

function qlub_admindrawer_showwait( s1 , reload , s2 ) {
	var div = ge( "qlub_admindrawer_wait" ) ;
	div.olds1 = gebcn( div , "qlub_admindrawer_wait_msg" ).innerHTML ;
	div.olds2 = ge( "qlub_admindrawer_wait_reload_msg" ).innerHTML ;
	div.olddisplay2 = gcs( "qlub_admindrawer_wait_reload_msg" , "display" ) ;
	if ( s1 != null && s1 != undefined ) q_innerHTML( gebcn( div , "qlub_admindrawer_wait_msg" ) , s1 ) ;
	if ( s2 != null && s2 != undefined ) q_innerHTML( ge( "qlub_admindrawer_wait_reload_msg" ) , s2 ) ;
	if ( reload != null && reload != undefined ) visibleblock( ge( "qlub_admindrawer_wait_reload_msg" ) , reload ) ;
	hideshowblock( "qlub_admindrawer_mainpane" , "qlub_admindrawer_wait" ) ;
}

function qlub_admindrawer_hidewait() {
	var div = ge( "qlub_admindrawer_wait" ) ;
	gebcn( div , "qlub_admindrawer_wait_msg" ).innerHTML = div.olds1 ;
	ge( "qlub_admindrawer_wait_reload_msg" ).innerHTML = div.olds2 ;
	ge( "qlub_admindrawer_wait_reload_msg" ).style.display = div.olddisplay2 ;
	hideshowblock( "qlub_admindrawer_wait" , "qlub_admindrawer_mainpane" ) ;
}

function qlub_switch_admindrawer( x ) {
	hideblock( getElementsByClassName( ge( "qlub_admindrawer_mainpane" ) , "container" ) ) ;
	hideshowblock( "qlub_admindrawer_mainpane" , "qlub_admindrawer_wait" ) ;
	if ( x.target ) x = x.target;
	else if ( x.tagName ) x = x.className.replace( /^.*qlub_ad_([^ ]+).*$/, "$1" ) ;
	if ( qlub_tools[ x ] ) {
		var xx = qlub_tools[ x ] ;
		xx.fn.apply( this , ( xx.option ) ? xx.option : [] ) ;
		if ( xx.title ) q_innerHTML( "qlub_admindrawertitle" , xx.title ) ;
		if ( xx.iconclass ) ge( "qlub_admindrawericon" ).className = "adminmenu " +  xx.iconclass + "_48";
		var h = ge( "qlub_admindrawerhelplink" ) ;
		if ( xx.help ) {
			showblock( h ) ;
			var a = h.getElementsByTagName( "A" )[ 0 ] ;
			a.href = "http://" + qlub_help_pages[ xx.help ] ;
			a.helpref = xx.help ;
		} else hideblock( h ) ;
	} else {
		q_innerHTML( "qlub_admindrawertitle" , qlub_message[ "notool" ] ) ;
		ge( "qlub_admindrawericon" ).className = "png";
		ge( "qlub_admindrawericon" ).style.background = "transparent url(/images/configtools48.png) top left no-repeat" ;
		qlub_finishreveal_admindrawer( ) ;
	}
	// icônes latérales
	var di, d = getElementsByClassName( "qlub_admindrawer", "qlub_admindrawericon36" ) ;
	var reg = new RegExp( x ) ;
	for ( i=0; i<d.length; i++ ) {
		di = d[ i ] ;
		if ( reg.test( di.className ) ) {
			q_mouseoverbutton( di ) ;
			di.onmouseover = di.onmouseout = null;
			di.onclick = function( ) { return false ; } ;
			di.style.cursor = "default" ;
		} else {
			q_mouseoutbutton( di ) ;
			di.onmouseover = function( ) {
				q_mouseoverbutton( this ) ;
				if ( this.target && qlub_tools[ this.target ] ) q_innerHTML( "qlub_admindrawer_footer", qlub_tools[ this.target ].desc);
				else q_innerHTML( "qlub_admindrawer_footer",  this.title ) ;
			} ;
			di.onmouseout = function( ) {
				q_mouseoutbutton( this ) ;
				ge( "qlub_admindrawer_footer" ).innerHTML = "" ;
			} ;
			di.onclick = function( ) {
				ge( "qlub_admindrawer_footer" ).innerHTML = "" ;
				qlub_switch_admindrawer( this ) ;
				return false ;
			} ;
			di.style.cursor = "pointer" ;
		}
	}
}

function qlub_finishreveal_admindrawer( ) {
	hideshowblock( "qlub_admindrawer_wait" , "qlub_admindrawer_mainpane" ) ;
//	var h = ge( "qlub_admindrawer" ).offsetHeight - 15 ; // height bottom
//	ge( "qlub_admindrawer_rightborder" ).style.height = ge( "qlub_admindrawer_leftborder" ).style.height = h + "px" ;
}

function qlub_close_admindrawer( x ) {
	hideblock( [getElementsByClassName( ge( "qlub_admindrawer_mainpane" ) , "container" ) , "qlub_admindrawer" ]) ;
	visibleblock( [ "q_drawers" ] , window.fsmpresent ) ; // #1562 NL
	if ( x ) var d = getContainer ( x ) ;
	else d = ge( "qlub_admindrawer" ) ;
	hideblock( d ) ;
	visibleblock( [ "q_fullscreenmask" ] , window.fsmpresent ) ; // #1562 NL
	window.fsmpresent = false ;
	if ( qlub_reloadpage ) openservice( currsvcid ) ;
}

function qlub_freeze_admindrawer( v ) {
	visibleblock( [ "qlub_admindrawerbackbutton", "qlub_admindrawerswitchicons" ] , ! v ) ;
}

/*
function -
function   TABS
*/

// Pour faire fonctionner les tabs, il faut passer un objet contenant : 
//
//  - container : id du contenant de tout le système d'onglets (on créé tout le système from scratch à l'intérieur)
//  ( ou ) 
// - header :  id du tableau contentant les onglets (pour remplissage du header only)
//
// - name : le nom de la objet contenant la description des tabs
// - panes (facultatif) : id du tableau contenant les contenus (pour application du css)
// - msg (facultatif) : le nom de l'objet contenant les traductions de chaque onglet
// - selected (facultatif) : le nom de l'onglet activé par défaut
// - items : la description de chaque tab
//	* name : nom de l'onglet
// 	* pane (facultatif): id de l'élément contenant le contenu (pour affichage/masquage)
// 	* msg (facultatif): message à afficher dans l'onglet
//	* active (facultatif) : "true" ou "false" pour desactiver un onglet
//	* selected (facultatif): autre façon de nommer l'onglet par défaut
//	* onDisplay (facultatif) : fonction à lancer lors de l'affichage de l'onglet (facultatif)

function qlub_admindrawer_tab_init( tabs ){
	if ( ! tabs ) return;
	if ( ! tabs.selected ) {
		for ( var i in tabs.items ) if ( tabs.items[ i ].selected && tabs.items[ i ].selected == "true" ) tabs.selected =  tabs.items[ i ].name;
		if ( ! tabs.selected ) tabs.selected = tabs.items[ 0 ].name;
	}
	if ( ! tabs.container && ! tabs.header ) return;
	qlub_admindrawer_tab_initTabs( tabs );
	qlub_admindrawer_tab_initPanes( tabs );
	
	qlub_admindrawer_tab_switch( ge( tabs.name + "_" + tabs.selected ) );
}

function qlub_admindrawer_tab_initTabs( tabs ){
	if ( ! tabs.header && tabs.container && ge( tabs.container ) ){
		tabs.header = create_table( ge( tabs.container ), { id : tabs.name + "_ namestable", width : "100%",  className : "qlub_admindrawer_tab_namestable clubcolor2" } ); 
	} else if ( tabs.header && ge( tabs.header ) ){
		create_attributes( ge( tabs.header ), { cellSpacing : "0", cellPadding : "0", border : "0", width : "100%", className : "qlub_admindrawer_tab_namestable clubcolor2" } ) ; 
	}
	var tabstable = ge( tabs.header );
	var thetrs = tabstable.getElementsByTagName( "TR" );
	for ( var i = 0 ; i < thetrs.length ; i++ ) tabstable.deleteRow( thetrs[ i ] );
	var therow = tabstable.insertRow( -1 );
	create_td( therow, { className : "qlub_admindrawer_tab_inter", innerHTML : " "} );
	
	var n = 0;
	for ( var i in tabs.items ) {
		if ( tabs.items[ i ].active && tabs.items[ i ].active == "false" ) continue;
		n++;
	}
	
	for ( var i in tabs.items ) {
		if ( tabs.items[ i ].active && tabs.items[ i ].active == "false" ) continue;
		var msg = "";
		if ( tabs.items[ i ].msg ) msg =  tabs.items[ i ].msg;
		else if ( tabs.msg && ( typeof tabs.msg ) == "function" ) msg = tabs.msg.apply( this , [ tabs.items[ i ] ] ) ;
		else if ( tabs.msg && eval( tabs.msg ) ) {
			msg =  eval( tabs.msg )[ tabs.items[ i ].name ] || tabs.items[ i ].name;
		} else msg = tabs.items[ i ].name;
		var thetd = create_td( therow, { className : "qlub_admindrawer_tab_td", width : + Math.round( ( 100 / n ) - 1 ) + "%", innerHTML : msg , vAlign : "middle", align : "center"} );
		
		thetd.target = tabs.items[ i ].name ;
		thetd.tabs = tabs.name;
		thetd.id = tabs.name + "_" + tabs.items[ i ].name;
		thetd.selected = ( tabs.items[ i ].name == tabs.selected ) ? "true" : "false";
		thetd.onmouseover = function(){qlub_admindrawer_tab_mouseover( this, 'over' );};
		thetd.onmouseout = function(){ qlub_admindrawer_tab_mouseover( this, 'out' ); };
		thetd.onclick = function(){ qlub_admindrawer_tab_switch( this ); };
		thetd.className = "qlub_admindrawer_tab_td " + ( ( thetd.selected == "true" ) ? "qlub_admindrawer_tab_on" : "qlub_admindrawer_tab_off clubbackgroundcolor6");
		create_td( therow, { className : "qlub_admindrawer_tab_inter", innerHTML : " "} );	
	}
}

function qlub_admindrawer_tab_initPanes( tabs ){ 
	if ( ! tabs.panes && tabs.container && ge( tabs.container ) ){
		tabs.panes = create_table( ge( tabs.container ), { id : tabs.name + "_ panestable", width : "100%",  className : "qlub_admindrawer_tab_panestable" } );
		for ( var i in tabs.items ) {
			if ( tabs.items[ i ].pane && ge( tabs.items[ i ].pane ) ) {
				var t = tabs.panes ;
				var r = t.insertRow( -1 );
				r.id = tabs.name + "_pane_" + tabs.items[ i ].name;
				var d = create_td( r ); 
				d.appendChild( ge( tabs.items[ i ].pane ) );
			}
		}
	} else if ( tabs.panes ) create_attributes( ge( tabs.panes ), { cellSpacing : "0", cellPadding : "0", border : "0", width : "100%", className : "qlub_admindrawer_tab_panestable" } ) ; 

	for ( var i in tabs.items ) {
		if ( tabs.items[ i ].active && tabs.items[ i ].active == "false" ) hideblock( tabs.items[ i ].pane );
		visibleblock( tabs.items[ i ].pane, ( tabs.selected == tabs.items[ i ].name || ( tabs.items[ i ].selected && tabs.items[ i ].selected == "true" ) ) );
	}
}

function qlub_admindrawer_tab_mouseover( x, v ) {
	if ( x.selected == "true" ) return ;
	x.className = "qlub_admindrawer_tab_td qlub_admindrawer_tab_off ";
	x.className += ( v == "over" ) ? "clubbackgroundcolor3 clubcolor7" : "clubbackgroundcolor6 clubcolor2";
}

function qlub_admindrawer_tab_switch( x , tabs ) {
	if ( typeof( x ) == "string" && ! ge( x ) ) {
		if ( ! tabs ) return;
		tabs = eval( tabs )  ;
		
		var tabfound = false;
		for ( var i in tabs.items ) if ( x == tabs.items[ i ].name ) tabfound = tabs.items[ i ];
		if ( ! tabfound ) return;
		
		var thetab= x;
	} else {
		x = ge( x );
		thetab = x.target; 
		tabs = eval( x.tabs );
	}
	
	var thetd = ge( tabs.name + "_" + thetab ) ;
	if ( thetd.className.match( "qlub_admindrawer_tab_on" ) ) return ;
	
	for ( var i in tabs.items ) {
		if ( tabs.items[ i ].active && tabs.items[ i ].active == "false" ) continue;
		thetd = ge( tabs.name + "_" + tabs.items[ i ].name) ;
		
		if ( thetab == tabs.items[ i ].name ) {
			tabs.selected = tabs.items[ i ].name;
			tabs.items[ i ].selected = "true";			
			thetd.selected = "true";
			thetd.className = "qlub_admindrawer_tab_td qlub_admindrawer_tab_on" ;
			showblock( tabs.items[ i ].pane ) ;
			if ( tabs.items[ i ].onDisplay ) tabs.items[ i ].onDisplay.apply( this , [ tabs.items[ i ] ] ) ;
		} else {
			tabs.items[ i ].selected = "false";
			thetd.selected = "false";
			if ( thetd.className.match( "qlub_admindrawer_tab_on" ) ) thetd.className = "qlub_admindrawer_tab_td qlub_admindrawer_tab_off clubbackgroundcolor6 clubcolor2" ;
			hideblock( tabs.items[ i ].pane ) ;
		}
	}
}

/*
function -
function ACCOUNT MANAGER
*/

function qlub_openaccountmgrpage( ) {
	q_include( [ q_elems[ "accountmgr" ] ] , "qlub_revealaccountmgrpage" , [ ] ) ;
}

function qlub_revealaccountmgrpage_done( x ) {
	dbqorp = x ;
	qlub_finishreveal_admindrawer( ) ;
	accountmgr_prepare() ;
}

function qlub_revealaccountmgrpage( ) {
	showblock( "qlub_accountmgr" ) ;
	document.mainform.mission.value = "get_dbqorp" ;
	q_ajaxsubmitwithservice( "subscribe@" + q_lang , "" , qlub_revealaccountmgrpage_done ) ;
}

function qlub_entereditmodeaccountmgrpage( ) {
	hideshowblock( [ "qlub_admindrawerbackbutton", "qlub_admindrawerswitchicons" ] , "qlub_accountmgr_mainbuttons" ) ;
}

function qlub_canceleditmodeaccountmgrpage( ) {
	hideshowblock( "qlub_accountmgr_mainbuttons" , [ "qlub_admindrawerbackbutton", "qlub_admindrawerswitchicons" ] ) ;
	qlub_refreshwebpane() ;
}

/*
function -
function UPLOADS
*/

function qlub_openmanageuploadspage( ) {
	q_include( [ q_elems[ "manageuploads" ] ] , "qlub_revealmanageuploadspage" , [ ] ) ;
}

function qlub_revealmanageuploadspage ( ) {
	showblock( "qlub_manageuploads" ) ;
	uploads_prepare( );
}

/*
function -
function DIFFUSION LIST
*/

function qlub_opendiflistmgr( ) {
	q_include( [ q_elems[ "diflistmgr" ] ] , "qlub_diflistmgr_prepare" , [ ] ) ;
}

/*
function -
function EDIT SITE MAP
*/

function qlub_opensitemappage( ) {
	q_include( [ q_elems[ "editsitemap" ] ] , "qlub_revealeditsitemap" , [ ] ) ;
}

function qlub_revealeditsitemap_done( x ) {
	dbqorp = x ;
	qlub_finishreveal_admindrawer( ) ;
	if ( window.qlub_editsitemap_xprepare ) qlub_editsitemap_xprepare() ;
	else qlub_editsitemap_prepare() ;
}

function qlub_revealeditsitemap( ) {
	showblock( "qlub_editsitemap" ) ;
	document.mainform.mission.value = "get_dbqorp" ;
//	qlub_finishreveal_admindrawer( ) ;
	hideblock( "qlub_sitemap_buttons" ) ;
	q_ajaxsubmitwithservice( "subscribe@" + q_lang , "" , qlub_revealeditsitemap_done ) ;
}

function qlub_renamecurrpage( newname ) {
	if ( q_svcfromid( currsvcid ).shortname == newname ) return ;
	document.mainform.mission.value = "qlub_sitemapchanged" ;
	q_ajaxsubmitwithservice( "#0#artemapage@" + q_lang , {"sitemap" : sitemap, "todolist" : [ { action : "changepagename" , newpagename : newname , pageid : currsvcid } ] } , function() { openservice( currsvcid ) ; } ) ;
}


/*
function -
function INFOS DU SITE
*/

function qlub_openinfosmgrpage( ){
	q_include( [ q_elems[ "infosmgr" ] ] , "infosmgr_revealinfosmgrpage" , [ ] ) ;
}

/*
function -
function EVENTS LOAD / MGR
*/

/*
Chargement des events dans le tiroir :
	qlub_open_admindrawer( 'events' ) appelle qlub_openeventsmgr( ) qui :
		charge les éléments de eventsmgr (html, js)
		puis appelle qlub_loadevents( ) qui charge les xml clubevents et clubopenselects
		puis qlub_loadevents( ) appelle qlub_eventsmgr_prepare( ) qui affiche le tiroir avec l'initialisation par défaut (tous les events)
	
Chargement silencieux des events pour une note :
	qlub_silentloadeventsmgr( callback, args ) :
		charge les éléments de eventsmgr (html, js) mais ne construit pas le html
		puis appelle qlub_loadevents( ) qui charge les xml clubevents et clubopenselects
		puis qlub_loadevents( ) appelle appelle callback( args )
	typiquement : callback est une fonction de la note et args vaut [ noteid ]

Ouverture du tiroir des events depuis une note :
	on définit qlub_tools.events.option = [ "smartnotematch", r.matchs ]
		définit la méthode utilisée pour l'initialisation de qlub_eventsmgr_prepare( )
		ajoute éventuellement les arguments nécessaires
	on appelle ensuite 	qlub_open_admindrawer( 'events' ) ;
*/

function qlub_openeventsmgr( ) {
	q_include( [ q_elems[ "eventsmgr" ] ] , "qlub_loadevents" , [ "qlub_eventsmgr_prepare" ] ) ;
}

function qlub_silentloadeventsmgr( callback, args ) {
	qdyn_load ( "qlub_loadevents" , [ callback, args ] , q_elems[ "eventsmgr" ].urls ) ;
}

function qlub_loadevents( callback, args ) {
	if ( ! clubopenselects || ! clubevents ) {
		document.mainform.mission.value = "getxmlwithxpath" ;
		q_xmlajaxsubmitwithservice( "common@" + q_lang , { servicename: "" , xmlname: "events" , xpath: "//events" , defaultxml : "<?xml version=\"1.0\" encoding=\"UTF-8\"?><root><events nextid=\"0\"/></root>" } , qlub_loadevents_callback, [ callback, args ] ) ;
	} else qlub_loadevents_callback3( callback, args ) ;
}

function qlub_loadevents_callback( x, callback, args ) {
	clubevents = x ;
	document.mainform.mission.value = "getxmlwithxpath" ;
	q_xmlajaxsubmitwithservice( "common@" + q_lang , { servicename: "", xmlname: "events" , xpath: "//openselects" , defaultxml : "<?xml version=\"1.0\" encoding=\"UTF-8\"?><root><openselects/></root>" } , qlub_loadevents_callback2, [ callback, args ] ) ;
}

function qlub_loadevents_callback2( x, callback, args ) {
	clubopenselects = x ;
	qlub_loadevents_callback3( callback, args ) ;
}

function qlub_loadevents_callback3( callback, args ) {
	if ( ! args ) args = [ ] ; // IE
	eval( callback ).apply( null, args ) ;
}

/*
function -
function THEME MANAGER
*/

function qlub_openthmmgr( ) {
	q_include( [ q_elems[ "thmmgr" ] ] , "qlub_thmmgr_prepare" , [ ] ) ;
}

/*
function -
function SPONSORS MANAGER
*/

function qlub_opensponsorsmgr( ) {
	q_include( [ q_elems[ "sponsorsmgr" ] ] , "sponsorsmgr_prepare" , [ ] ) ;
}

/*
function -
function NOTE MHP
*/

if ( window.qsn_addnotestyle ) qsn_addnotestyle( "mhp" , "default" , { customheader : true , notewidth : "320px" , resizeable : true , headtemplates : ['#0033cb', 'qlub', '#EEE'] , colortemplates : [ [ '#f1793a',  '#FFF', '#FFF #FFF #AAA #FFF'], [ '#002176', '#FFF', '#FFF #FFF #AAA #FFF' ] , [ '#fff',  '#000', '#DDD #DDD #AAA #DDD' ] , [ '#0033cb',  '#FFF', '#FFF #FFF #AAA #FFF' ] ] , textred : "#d60000" } ) ;

/*
function -
function E-MAIL ALERTS
*/

function qlub_openemailalert( ) {
	q_include( [ q_elems[ "emailalert" ] ] , "qlub_newemailalert" , [ ] ) ;
}

/*
function -
function NEWSLETTER
*/

function qlub_nlopenpane( ) {
	q_include( [ q_elems[ "nl" ] ] , "qlub_nlprepare" , [ ] ) ;
}

/*
function -
function COLORS BLOCK
*/

function qlub_colorsblockopen( c , h , args , declinecolors) {
	q_fsm_reveal( { src : q_elems[ "colorsblock" ] , title : qlub_message[ "colorpicker_title" ] , delete_title : qlub_message[ "colorpicker_delete_title" ] , reveal_callback : "qlub_colorsblockreveal" , reveal_args : [ c , h , args, declinecolors ] } ) ;
}

/*
function -
function MISE EN PAGE
*/

function qlub_mepopenpane( ) {
	q_include( [ q_elems[ "mep" ] ] , "qlub_mepprepare" , [ ] ) ;
}

/*
function -
function ALIGN
*/

/* deja déclaré ds pages.js et obsolète maintenant
function page_showalignoptions( x ) {
	var r = settings_getnote() ;
	if ( ! r ) pages_init_pageformat( r ) ;
	switch_tab( "qlub_adminleftcol" , x , true ) ;
}
*/

/*
function -
function HELP
*/

function qlub_openhelp( x ) {
	var h = qlub_help_pages[ x ] ;
	if ( h == undefined ) h = "aide.quomodo.com/" ; // return alert ( qlub_message[ "missinghelp" ] ) ;
	h = h.replace( /^http:\/\// , "" ) ;
	var w = window.open("http://" + h, "quomodo_help") ;
	w.focus( ) ;
	return false ;
}

function qlub_openfirststeps() {
	q_include( q_elems[ "siteloader" ] , "siteloader_load" , [ "/services/firststeps@fr/" ] ) ;
}

function qlub_openqwiz( pp , params ) {
	var page = pp || "index" ;
	if ( params ) q_include( q_elems[ "siteloader" ] , "siteloader_load" , [ "/services/qwiz@fr/" + page , params ] ) ;
	else q_include( q_elems[ "siteloader" ] , "siteloader_load" , [ "/services/qwiz@fr/" + page ] ) ;
}

function qlub_openvideopres() {
	var params = {} ;
	params.flv = "http://aide.quomodo.com/uploads/804/premier_contact.flv" ;
	params.startimage = "/services/club@fr/videos/video_1stimage.jpg" ;
	params.title = "Premier contact avec\nvotre espace Club" ; 
	params.width = "600" ;
	params.height = "400" ;
	q_include( q_elems[ "siteloader" ] , "siteloader_load" , [ "/services/flashplayer@" + q_lang + "/index.html" , params ] ) ;
}

function qlub_openwebsite() {
	var url = document.location.href.replace( /\/admin/ , "" ) ;
	if ( /\/invites$/.test( url ) ) url = url.replace( /\/invites$/ , "" ) + q_logouturl ;
	window.open( url ) ;
}

function qlub_openmemberinvite( ) {
	q_include( [ q_elems[ "emailalert" ] ] , "qlub_ema_getemails" , [ "qlub_ema_getaccesspw" ] ) ;
}

function qlub_opencontactsupport( ) {
	q_include( [ q_elems[ "emailalert" ] ] , "qlub_ema_contactsupport" , [ ] ) ;
}

function qlub_opensendpressrelease(){ 
	q_include( [ q_elems[ "emailalert" ] ] , "qlub_ema_sendpressrelease" , [ ] ) ;
}

function qlub_opensponsornewclub(){ 
	q_include( [ q_elems[ "emailalert" ] ] , "qlub_ema_getemails" , [ "qlub_ema_sponsornewclub" ] ) ;
}

function qlub_opensharepage(){ 
	q_include( [ q_elems[ "emailalert" ] ] , "qlub_ema_getemails" , [ "qlub_ema_sharepage" ] ) ;
}

/*
function -
function UPGRADE OFFER
*/

function qlub_needupgrade( needoffer , what ) {
	var curoffer = rights_record[ 'currspaceright' ].client ;
	if ( needoffer == "premium" ) { // on a besoin de connaitre le nb de personne pr le tarif
		document.mainform.mission.value = "getmemberscount" ; 
		q_ajaxsubmitwithservice( "common@" + q_lang ,  "" , qlub_needupgrade_callback , [ { needoffer : needoffer , curoffer : curoffer ,what : what } ] ) ;
	} else {
		q_include( q_elems[ "siteloader" ] , "siteloader_load" , [ "/services/switchoffer@fr/" , { needoffer : needoffer , curoffer : curoffer , what : what , creationdate : q_spaceparam( "creationdate" , "" ) } ] ) ;
	}
	try { debugmail( "ouverture du panneau de changement d'offre de " + curoffer + " vers " + needoffer + " - fonctionnalité: " + what ) ; }
	catch( err ) { }
}

function qlub_needupgrade_callback ( x , y ) {
	var curoffer = rights_record[ 'currspaceright' ].client ;
	q_include( q_elems[ "siteloader" ] , "siteloader_load" , [ "/services/switchoffer@fr/" , { needoffer : y.needoffer , curoffer : curoffer , what : y.what , memberscount : x.memberscount , creationdate : q_spaceparam( "creationdate" , "" ) } ] ) ;
}

function qlub_switchoffer( newoffer ) {
	document.mainform.mission.value = "switchoffer" ; 
	q_ajaxsubmitwithservice( "common@" + q_lang , { privatedomain : clubprivatedomain.replace( /:.*$/ , "" ) , newoffer : newoffer } , qlub_switchoffer_callback ) ;// replace bug plistopened
}

function qlub_switchoffer_callback( x ) {
	if ( x.ok ) {
		alert(qlub_message["changeofferok"]);
		openservice( currsvcid );
	}
	else ( qlub_message["changeoffererror"] );
}

function qlub_compareoffers( o1, o2 ) {
	o1 = o1.toLowerCase() ;
	o2 = o2.toLowerCase() ;
	if ( o1 == o2 ) return 0 ;
	if ( indexOfItem( o1, [ "free", "light", "premium" ] ) < indexOfItem( o2, [ "free", "light", "premium" ] ) ) return -1 ;
	return 1 ;
}

function qlub_upperoffer() {
	var o = qlub_currentoffer() ;
	var alloffers = [ "free", "light", "premium" ] ;
	for ( var i in alloffers ) if ( qlub_compareoffers( alloffers[ i ] , o ) > 0 ) return alloffers[ i ] ;
	return null ;
}

function qlub_currentoffer( ) {
	var c = q_spaceclient( ) ;
	if ( /free/.test( c ) ) return "free" ;
	if ( /light/.test( c ) ) return "light" ;
	if ( /qlubads/.test( c ) ) return "qlubads" ;
	if ( /qlubpay/.test( c ) ) return "qlubpay" ;
	return "premium" ;
}

function qlub_notes2offer( notes ) { // which offer for the array of notes
	if ( indexOfItem( "fv", notes ) != -1 ) return "premium" ;
	if ( indexOfItem( "video", notes ) != -1 ) return "premium" ;
	if ( indexOfItem( "slide", notes ) != -1 ) return "premium" ;
	
	if ( indexOfItem( "poll", notes ) != -1 ) return "light" ;
	if ( indexOfItem( "contact", notes ) != -1 ) return "light" ;
	if ( indexOfItem( "comment", notes ) != -1 ) return "light" ;
	
	return "free" ;
}

/*
function -
function LOGIN PANEL
*/

function club_verify_login ( ee ) {
	if ( ! isie6() && ! isie78() ) return ;
	var e = ee || window.event ;
	if ( q_keycode ( e ) == 13 ) { jsvalidateauth( handleauthresultopenhomepageorservice ); return false; }
}

function club_get_logintable() {
	var s ='<form id="js_authenticate" name="js_authenticate" class="zero" method="post" action="http://localhost/err_nocgi.html" enctype="multipart/form-data" accept-charset="utf-8" onsubmit="jsvalidateauth( handleauthresultopenhomepageorservice ) ; return false ;"><input type="submit" style="position: absolute ; left: -4000px; top: -4000px;display:none;" value="submit"/><div id="club_logindiv" style="padding:5px 20px;"><table cellspacing="0" cellpadding="3" border="0" width="620"><tr><td colspan="5" id="club_logintable_prompt" style="padding-bottom:10px;"/></tr><tr><td colspan="2" style="padding-right:5px;height:30px;" class="club_login_bold clubcolor2">%click2identify</td><td rowspan="4" width="1" style="border-left:solid 1px #CCC;"/><td colspan="2" style="padding-left:5px;" class="club_login_bold clubcolor2">%subscribe2spacev2</td></tr><tr><td width="120" align="right" valign="middle" class="club_login_inputtitle">%loginname</td><td align="left"><input name="canuserid" id="edituserid" type="text" maxlength="100" class="club_login_input" onkeyup="filterinputfm( this ) ; return true" onkeypress="club_verify_login( event );" onmousedown="q_stopPropagation( event )" tabindex="1"/></td><td width="120" align="right" valign="middle" class="club_login_inputtitle">%accesspw</td><td align="left"><input name="canaccesspw" id="editaccesspw" type="text" maxlength="100" class="club_login_input" onmousedown="q_stopPropagation( event )" tabindex="3"/></td></tr><tr><td align="right" valign="middle" class="club_login_inputtitle">%loginpassword</td><td align="left"><input name="canpassword" id="editpassword" type="password" maxlength="100" class="club_login_input" onkeypress="club_verify_login( event );" onmousedown="q_stopPropagation( event )" tabindex="2"/></td><td colspan="2" valign="top" align="center"><div style="font-size:11px;font-style:italic;width:200px;">%accesspwmsg</div></td></tr><tr><td colspan="2" align="center" valign="top" style="padding:10px;"><div class="club_login_btn" onclick="jsvalidateauth( handleauthresultopenhomepageorservice) ; return false" title="%click2identify" onmousedown="q_stopPropagation( event )">%loginbtn</div><div style="padding-top:2px;"><a href="#" onclick="launchforgottenpw(); return false" style="color:blue;">%forgottenv2</a><br/></div></td><td colspan="2" align="center" valign="top" style="padding:10px;"><div class="club_login_btn" onclick="window.location=\'default_index.html?step=subscribe&amp;backurl=index&amp;accesspw=\' + ge(\'editaccesspw\').value; return false" title="%subscribe2spacelink" onmousedown="q_stopPropagation( event )">%subscribe2spacelink</div></td></tr><tr><td colspan="6" style="height:1px; border-top:solid 1px #CCC;"/></tr><tr><td colspan="2" align="left" class="club_login_bold clubcolor2">%subscribe2quomodo</td><td></td><td colspan="2" align="center"><div class="club_login_btn" onclick="window.open(\'http://www.quomodo.com/inscription-sport?refererpage=loginblock\'); return false" title="%subscribe2quomodolink" onmousedown="q_stopPropagation( event )">%subscribe2quomodolink</div></td></tr></table></div></form>' ;
	s = s.replace( /%back/g , qlub_message[ "back" ] );
	s = s.replace( /%logintitle/g , qlub_message[ "logintitle" ] );
	s = s.replace( /%loginname/g , qlub_message[ "loginname" ] );
	s = s.replace( /%loginpassword/g , qlub_message[ "loginpassword" ] );
	s = s.replace( /%loginbtn/g , qlub_message[ "loginbtn" ] );
	s = s.replace( /%login/g , qlub_message[ "login" ] );
	s = s.replace( /%forgottenlink/g , qlub_message[ "forgottenlink" ] );
	s = s.replace( /%forgottenv2/g , qlub_message[ "forgottenv2" ] );
	s = s.replace( /%click2identify/g , qlub_message[ "click2identify" ] );
	s = s.replace( /%subscribe2spacelink/g , qlub_message[ "subscribe2spacelink" ] );
	s = s.replace( /%subscribe2spacev2/g , qlub_message[ "subscribe2spacev2" ] );
	s = s.replace( /%subscribe2quomodolink/g , qlub_message[ "subscribe2quomodolink" ] );
	s = s.replace( /%subscribe2quomodo/g , qlub_message[ "subscribe2quomodo" ] );
	s = s.replace( /%accesspwmsg/g , qlub_message[ "accesspwmsg" ] );
	s = s.replace( /%accesspw/g , qlub_message[ "accesspw" ] );
	return s ;
}

function club_login_blockreveal( div , json , p ){
	var d = ge( "club_logintable_prompt" ) ;
	if ( common_message.loginmsg ) d.innerHTML += ( ( d.innerHTML ) ? "<br /><br />" : "" ) + common_message.loginmsg ;
	visibleblock( d , d.innerHTML ) ;
	focusandselect( 'edituserid' ) ;
}
function club_login_block( p ){
	q_fsm_reveal( { src : club_get_logintable() , revealid : "club_logindiv" , title : ( p && p.title || qlub_message[ "login" ] ) , delete_title : qlub_message[ "logintitle" ] , reveal_callback : club_login_blockreveal , reveal_args : [ p ] } ) ;
}

function club_closelogin_block(){
	rm( "club_logintable" ) ;
	hideblock( "q_fullscreenmask" ) ;
}

/*
function -
function SEARCH STUFF
*/
// --> dans un fichier search.js dans /Documents/scripts
var search_submitted = false ;
var search_data = { maxhits : 20 } ;

function launchsearchinspace(){
	search_data.text = ge( "searchtext" ).value;
	document.mainform.mission.value = "searchinspace" ;
	q_ajaxsubmitwithservice( "common@" + q_lang , search_data , search_callback ) ;
}


var search_results = null ;
function search_callback( x ) {
	search_results = x ;
	window.open("/bundles/qlub/qlub_search_fr.html") ;
	return ;
	ge( "searchout_number" ).innerHTML = x.hits ;
	var div = ge( "searchout" ) ;
	if ( x.hits ) {
		table.style.display = "table" ;
		var n = table.rows.length ;
		for ( var i = 1 ; i < n ; i++ ) table.deleteRow( 1 ) ;
		for( var i = 0 ; i < x.hits ; i++ ) {
			var r = table.insertRow( i +1 ) ;
			var a = create_elem( "A" , { "href" : x.listf[ i ] } ) ;
			a.innerHTML = x.listf[ i ] ;
			r.insertCell( 0 ).appendChild( a ) ;
			var c = r.insertCell( 1 ) ;
			c.className = "search_pertinence" ;
			c.align = "right" ;
			c.innerHTML = x.listp[ i ] ;
			var c = r.insertCell( 2 ) ;
			c.className = "search_size" ;
			c.align = "center" ;
			c.innerHTML = x.sizes[ i ] ;
		}
	} else table.style.display = "none" ; 
}

function qlub_getprivatedomain(){
	return clubprivatedomain.replace( /:.*$/ , "" ) ;// replace bug plistopened
}
 
function qlub_search_submit( xform , xinput ){
	var theform = xform || "searchform" ;
	var theinput = xinput || "searchtext" ;
	if ( search_submitted ) return false ;
	search_submitted = true ;
	document[ theform ].privatedomain.value = qlub_getprivatedomain() ;
	var d = new Date() ;
	window.location.href="search?searchtext=" + encodeURIComponent( ge( theinput ).value ) + "&privatedomain=" + qlub_getprivatedomain() + "&lang=" + document[ theform ].lang.value +  "&searchentriesperpage=" + document[ theform ].searchentriesperpage.value + "&searchstartnumber=" + document[ theform ].searchstartnumber.value + "&mission=" + document[ theform ].mission.value + "&time=" + d.getTime() ;
}

/*
function -
function ADS

qlub_ads_checkadd [ à recouvrir ] : renvoie le statut du site - site = "top", "bottom", "right". Le statut peut être false, true ou une string
qlub_init_adshandler [ à recouvrir ] : renvoie un json qui donne pour chaque clé la function à appeler

qlub_init_siteads : on lui passe site et option. Fabrique une clé site + "_" + option si option est défini et n'est pas un boolean 
*/

function qlub_ads_checkadd( site ) {
	if ( q_pagemode() == "makeweb" ) return false ;
	var spaceads = q_spaceparam( "ads" ) ;
	if ( ! spaceads || ! spaceads.active || spaceads.active == "false" ) return false ;
	return true ;
}
function qlub_init_adshandler() {
	return { "top" : qlub_init_topads , "right" : qlub_init_rightads , "bottom" : qlub_init_bottomads } ;
}

function qlub_init_siteads( site , option ) {
	var spaceads = q_spaceparam( "ads" ) ;
	var h = qlub_init_adshandler() ;
	var key = site + ( ( option && ( typeof option ) != "boolean" ) ? ( "_" + option ) : "" ) ;
	h[ key ].apply( this , [ spaceads && spaceads[ site ] ] ) ;
}
function qlub_ads_checkandinitadd( site ) {
	var b = qlub_ads_checkadd( site ) ;
//try { console.log( site + " ; " + b ) ; } catch ( err ) {} ;
	if ( b == false ) return ;
	qlub_init_siteads( site , b ) ;
}
function qlub_ads_addtop() {
	qlub_ads_checkandinitadd( "top" ) ;
}
function qlub_ads_addbottom() {
	qlub_ads_checkandinitadd( "bottom" ) ;
}
function qlub_ads_addright() {
	qlub_ads_checkandinitadd( "right" ) ;
}
function qlub_init_ads() {
	var spaceads = q_spaceparam( "ads" ) ;
	if ( ! spaceads || ! spaceads.active || spaceads.active == "false" ) return rm( [ "qlub_topads" , "qlub_bottomads" , "qlub_ads_addright_elem" ] ) ;
}

function qlub_ads_slotdim( slot , dim ) {
	var d = ( slot.type == "textlink" ) ? -2 : 0 ;
	return parseInt( slot[ dim ] , 10 ) + d ;
}
function qlub_ads_autoad() {
	q_fsm_reveal( { src : { id : "qlub_sponsor_form" , urls : [ qlubdir + "scripts/qlub_sponsors_contactform.js" , qlubdir + "scripts/qlub_sponsors_contactform_msgs_" + q_lang + ".js" , qlubdir + "qlub_sponsors_contactform_" + q_lang + ".html" ] } , title : qlub_message[ "sponsors_contactform_title" ] , reveal_callback : "qlub_sponsors_contactform_reveal" } ) ;
}

function qlub_ads_slotHTML( slot , options ) {
	if ( slot.type == "none" ) return "" ;
	var s = '<div class="qlub_ads_slot qlub_ads_' + slot.type + '" style="' + ( ( options && options.style ) ? ( options.style + ';' ) : '' ) + 'width:' + qlub_ads_slotdim( slot , "width" ) + 'px ; height:' + qlub_ads_slotdim( slot , "height" ) + 'px ;">' ;
	switch ( slot.type ) {
		case ( "autoad" ) :
			s += '<a href="#" onclick="qlub_ads_autoad() ; return false" >' ;
			s += '<img class="qlub_ads_img" src="/bundles/qlub/images/ads/autoad_' + slot.width + 'x' + slot.height + '.jpg" style="width:' + slot.width + 'px ; height:' + slot.height + 'px" />' ;
			s += '</a>' ;
			break ;
		case ( "quomodo" ) :
			s += '<a href="http://www.quomodo.com" target="_blank">' ;
			s += '<img class="qlub_ads_img" src="/bundles/qlub/images/ads/quomodo_' + slot.width + 'x' + slot.height + '.png" style="width:' + slot.width + 'px ; height:' + slot.height + 'px" />' ;
			s += '</a>' ;
			break ;
		case ( "imglink" ) :
			var thelink = slot.link.replace( /^http:\/*/, "");
			if ( thelink ) s += '<a href="http://' + escapeattribute( thelink ) + '" target="_blank" >' ;
			s += '<img class="qlub_ads_img" src="' + escapeattribute( q_spaceabsoluteurl( memberid , slot.img ) ) + '" style="width:' + slot.width + 'px ; height:' + slot.height + 'px" />' ;
			if ( thelink ) s += '</a>' ;
			break ;
		case ( "textlink" ) :
			var thelink = slot.link.replace( /^http:\/*/, "");
			s += '<div class="qlub_ads_textlinkcontents">' ;
			s += ( thelink ? '<a class="qlub_ads_texttitle" href="' + escapeattribute( thelink ) + '" target="_blank" >' : '<span class="qlub_ads_texttitle">' ) + escapeHTML( slot.title ) + ( thelink ? '</a>' : '</span>' ) ;
			if ( slot.desc ) s += '<div class="qlub_ads_textdesc">' + escapeHTML( slot.desc ) + '</div>' ;
			s += '</div>' ;
			break ;
	}
	s += '</div>' ;
	return s ;
}

function qlub_init_topads( siteads ) {
	if ( ! siteads ) return ;
	var s = '<table><tr>' ;
	for ( var i in siteads.slots ) s += '<td align="center">' + qlub_ads_slotHTML( siteads.slots[ i ] ) + '</td>' ;
	s += '</tr></table>' ;
	document.write( s ) ;
}

function qlub_init_bottomads( siteads ) {
	if ( ! siteads ) return ;
	var s = '<table><tr>' ;
	for ( var i in siteads.slots ) s += '<td align="center" style="padding-bottom : 8px">' + qlub_ads_slotHTML( siteads.slots[ i ] ) + '</td>' ;
	s += '</tr></table>' ;
	document.write( s ) ;
}

function qlub_init_rightads( siteads ) {
	if ( ! siteads ) return ;
	// 100616 vh : fix de la hauteur qui était à 600px au lieu de 120*6 + 5*8 = 760
	var elem = ge( "qlub_ads_addright_elem" ) ;
	if ( elem && gebtn( elem , "DIV" ) ) gebtn( elem , "DIV" ).style.height = "760px" ;
	var s = "" ;
	for ( var i in siteads.slots ) {
		s+= qlub_ads_slotHTML( siteads.slots[ i ] , { style : "margin-bottom: 8px" } ) ;
	}
	//ge( "qlub_ads_addright_elem" ).innerHTML = s ;
	document.write( s ) ;
}


function relaunchupdates() {
	return false ;
}
function spacetabalert() {
	return false ;
}
function qsn_beginDrag( elem , ee , wantdefault ) {
	return false ;
}
function qsn_beginDragOnly( elem , ee , wantdefault ) {
	return false ;
}
/*
function beginDrag( elem , ee , movecallBack , upcallBack , thelimits , preparecallBack ) {
	return false ;
}
*/
function qsn_mouseover( elem , ee , wantdefault ) {
	return false ;
}
function qsn_mouseout( elem , ee , wantdefault ) {
	return false ;
}
function qsn_notechanged( id , action , callBack ) { // id = qsn_edittarget.id
	if ( /_static/.test ( qsn_thenotes[ id ].common.notekind ) ) return ;
	if ( q_isstaticpage() ) return ;
	if ( callBack === undefined ) callBack = qsn_applynoterefresh ;
	var r = { json : qsn_thenotes[ id ] } ;
	if ( qsn_userrefreshid.length ) r.userrefresh = qsn_updateuserrefresh( id ) ;
 	r.upindex = document.mainform.upindex.value ;
	document.mainform.mission.value = ( action == "notechanged" ) ? "viewnotechanged" : action ;
	q_ajaxsubmit( r , callBack ) ;
}


//q_elems[ "header" ] = { id : "artema_header" , urls : [ qlubdir + "qlub_publicheader_" + q_lang + ".html" ] , target : "topheader" } ;
var web_js_loaded = true ;

function settings_getnote() {
	for( var x in qsn_thenotes) {
		if ( ! qsn_thenotes[ x ] ) continue ;
		if ( qsn_thenotes[ x ].common.notekind != "settings" ) continue ;
		return qsn_thenotes[ x ] ;
	}
	return null ;
}

function initcustomstyle() {
	var params = q_geturlparams() ;
	if ( ! params.privatedomain ) return ;
	var custombaseurl = ( ( isrealserver() ) ? "http://club.quomodo.com/" : "http://club2.quomodo.com/" ) + params.privatedomain + "/custom/" ;
	loadcss( custombaseurl + "style/qlub0.css" ) ;
	loadscript( custombaseurl + "scripts/qlub0.js" ) ;
}

function initweb() {
//	ge( "topheader" ).innerHTML = "" ;
//	q_include( q_elems[ "header" ] , "finish_initweb" , [] ) ;
	initfooter() ;
	finish_initweb() ;
	if ( ge( "qlub_free_pub" ) && ! /webmode/.test( document.body.className ) ) ge( "q_author_stuff" ).style.marginTop = "280px" ;
	web_fixoldbrowsers() ;
	qlub_fixmarginbody() ;
	setTimeout( increment_web_counter , 2000 ) ;
	templatesiteprepare() ;
	if ( window.launchanims ) launchanims() ;
}

function finish_initweb() {
	qlub_loadlogin() ;
	writetitleandname() ;
	web_qsninit() ;
}

function web_qsninit() {
	var id , h ;
	for( var i = 0 ; i < qsn_noteidslist.length ; i++ ) {
		id = qsn_noteidslist[ i ] ;
		if ( ! ge( id ) ) continue ;
		qsn_doupgradejson( id ) ;
		h = false ;
		try { h = qsn_handler( qsn_thenotes[ id ].common.notekind , "qsn_initforweb" , false ) ; } catch( err ) {} ;
		if ( ! h ) continue ;
		try { h( id ) ; } catch( err ) {} ;
	}
}

function writetitleandname( ) {
	var s = spacetabs.spaces ;
	q_innerHTML( ge( "clubname" ) , ( s[ 0 ].id != "self" ) ? s[ 0 ].name : s[ 1 ].name ) ;
	writecurrsvcname() ;
}

function qlub_loadlogin( ) {
	if ( ! ge( "qlub_login_div" ) ) return ;
	if ( window.custom_loadlogin ) return custom_loadlogin();
	ge( "qlub_login_div" ).parentNode.width = "" ;
	if ( ! ge( "qlub_login" ) ) {
		var login = { id : "qlub_login" , urls : ["/bundles/qlub/qlub_login_" + q_lang + ".html" ] , target : "qlub_login_div" } ;
		q_include( [ login ] , "qlub_loadlogin_reveal" , [ ] ) ;
	} else qlub_loadlogin_reveal() ;
}

function qlub_loadlogin_reveal( ) {
	if ( window.qlub_login_nosubscribe ) {
		rm( "qlub_login_notsubscribed" ) ;
		return ;
	}
	try { ge( 'searchtext' ).value = searchres_json.searchtext || "" } catch( err ) { } ;
	try { ge( "qlub_login_notsubscribed" ).href = "default_index.html?step=subscribe&backurl=" + window.location.pathname ;} catch( err ) { } ;
	//focusandselect( "searchtext" ) ;
}

function q_spacebaseurl( ownerid ) {
	var re = new RegExp( "[^/]*$" ) ;
	return window.location.href.replace( re , "" ) ;
}

function openservice( svc , filename1 ) {
	if ( /#artemapage/.test( svc ) ) {
		if ( window.web_svctopages ) {
			for ( var i in web_svctopages ) if ( svc == web_svctopages[ i ].id ) return window.location.href = web_svctopages[ i ].name ;
			//alert( qlub_message[ "youhavetosignin" ] ) ;
			club_login_block( { title : qlub_message["restrictedpage_title"], message : qlub_message[ "restrictedpage_message" ] } ) ;
		} else window.location.href = svc.replace( /#([0-9]+)#artemapage@intl/ , "_$1_page" ) ;
	}
	else {
		//alert( qlub_message[ "youhavetosignin" ] ) ;
		club_login_block( { title : qlub_message["restrictedpage_title"], message : qlub_message[ "restrictedpage_message" ] } ) ;
	}
	return false ;
}

function wsg_windowopen( elem ) {
	var x = decodeURI( elem.href ) ;
	window.open( q_spacebaseurl( memberid ) + x.replace( /^.*uploads\// , "uploads/" ) ) ; 
}

function wsg_openfile( elem ) {
	return q_openfile( elem ) ;
}

function mhp_upload( f ) {
	var url = q_spacebaseurl( memberid ) + f.replace( /&apos;/g , "'" ) ;
	window.open( url ) ;
}

function handlenewuser ( x ) {
	if ( document.mainform.sessionid.value != "" ) return ;
	var sid = x [ "q_newsessionid" ] ;
	if ( x.authresult ) {
		document.mainform.sessionid.value = sid ;
		return ;
	}
	if ( ! sid ) return ;
	document.mainform.sessionid.value = sid ;
	document.mainform[ "q_space" ].value = ( x[ "q_newspace" ] ) ? x[ "q_newspace" ] : ( ( document.mainform[ "q_space" ].value ) ? document.mainform[ "q_space" ].value : sid ) ;
	if ( document.cookie ) {
		if ( ( ! getcookie( "uid" ) ) || ( getcookie( "uid" ) != "member" ) ) {
			setcookie( "uid", sid, 15 ) ;
			setcookie( "known", true, 60000 ) ;
		}
	}
}

function web_fixoldbrowsers() {
	if ( ! isie55() ) return ;
	var links = document.body.getElementsByTagName("A") ;
	var a ;
	for ( var i = 0 ; i < links.length ; i++ ) {
		a = links[ i ] ;
		if ( ! a.href ) continue ;
		if ( ! ( /_page($|\?)/.test( a.href ) ) ) continue ;
		a.href = a.href.replace( /_page($|\?)/ , "_page.html$1" ) ;
	}
}

function increment_web_counter() {
	if ( ! window.clubprivatedomain ) return ;
	count_ajaxsubmit( { mission : "increment" , privatedomain : clubprivatedomain , page : currsvcid.replace( /[^0-9]/g , "" ) } ) ;
}

function count_ajaxsubmit ( q_data , callBackFunction , params ) {
	var req = null;
	if ( window.XMLHttpRequest ) {
 		req = new XMLHttpRequest() ;
		if ( req.overrideMimeType )  { req.overrideMimeType( 'text/xml' ) ; }
	} else if ( window.ActiveXObject ) {
		try { req = new ActiveXObject ( "Msxml2.XMLHTTP" ) ; } 
		catch (e )  {
			try { req = new ActiveXObject ( "Microsoft.XMLHTTP" ) ; } 
			catch (e )  {}
		}
	}
	req.open ( "POST" , "/cgi-bin/cgicounter" , true ) ;
	req.setRequestHeader ( "Content-type", "application/x-www-form-urlencoded" ) ; 
	req.onreadystatechange = function() {
		if ( req.readyState != 4) return ;
		if ( req.status == undefined ) return badrequest() ;
		if ( req.status == 200) req = null ;
	} ;
	req.send ( reqAddData ( "data" , q_toplist ( q_data ) ) ) ;
}

function templatesiteprepare() {
	if ( ! window.opener || window.opener.closed || ! window.opener.opentemplatesite ) return ;
	var templatesitehref = window.opener.opentemplatesite( window ) ;
	var re = new RegExp ( "^" + templatesitehref , "i" ) ;
	if ( ! ( re.test( window.location.href ) ) ) return ;
	window.qlub_editsitemap_newpagefromsite = function () {
		var mainw = window.opener ;
		if ( ! mainw || mainw.closed ) return ;
		for ( var i = 0 ; i<mainw.svc_tabs.length ; i++ ) if ( mainw.svc_tabs[ i ].id == "info" ) { tab = mainw.svc_tabs[ i ] ; break ; } ;
		var servicename = mainw.tabs_message[ tab.id + "_name"  ] ;
		var s = mainw.qorp_message[ "newnameprompt" ] ; qprompt_newpage( s.replace ( /%s/ , servicename ) , mainw.defaultpagename( servicename ) , "qlub_editsitemap_newpagefromsite_promptdone" , [ tab , { q_space : document.mainform.q_space.value , currsvcid : currsvcid } ] ) ;
	} ;
	window.qlub_editsitemap_newpagefromsite_promptdone = function ( newname , tab , templatedata ) {
//		rm( gebcn( ge( "qlub_header" ) , "importerpane" ) ) ;
		var mainw = window.opener ;
		if ( ! mainw || mainw.closed ) return ;
		var div = gebcn( ge( "qlub_header" ) , "qlub_header_content" ) ;
		mainw.qlub_editsitemap_newpage_promptdone( newname , tab , templatedata ) ;
	} ;
}

//#1625
function qlub_webclickinmenu( elem , ee ) {
	window.location.href = gebtn ( elem , "A" ).href ;
}

rights_record[ 'spaceright' ] = {"ultimateself":{"homepage":"homepage@intl", "tmhorizon":"1900", "maxmb":"1000", "price":"2.50", "maxspaces":"15", "maxpages":"30", "maxsn":"1000000", "services":{"gallery@intl":{"filename":"gallery.html"}, "#artemadisq@intl":{"filename":"index_homepage.html"}, "#familyplanning@intl":{"filename":"index.html"}, "#homepage@intl":{"filename":"index.html"}, "homepage@intl":{"filename":"index.html"}, "#pm@intl":{"filename":"index.html"}}, "maxboards":"10"}, "qorp":{"homepage":"#artemapage@intl", "tmhorizon":"1900", "maxmb":"1000", "price":"0", "maxspaces":"15", "promo":{"fr":"", "id":"qorp0", "en":"Profit 2 months free"}, "maxpages":"30", "maxsn":"1000000", "services":{"#artemapage@intl":{"filename":"index.html"}, "#artemadisq@intl":{"filename":"index.html"}, "#homepage@intl":{"filename":"index_qorp.html"}}, "maxboards":"10"}, "q2bpm":{"homepage":"q2bpm@intl", "tmhorizon":"1900", "maxmb":"1000", "price":"0", "maxspaces":"15", "maxpages":"30", "maxsn":"1000000", "services":{}, "maxboards":"10"}, "qlub":{"homepage":"#artemapage@intl", "tmhorizon":"1900", "maxmb":"1000", "price":"0", "maxspaces":"15", "maxpages":"30", "maxsn":"1000000", "services":{"#artemapage@intl":{"filename":"index_qlub.html"}, "#artemadisq@intl":{"filename":"index_qlub.html"}, "#homepage@intl":{"filename":"index_qlub.html"}}, "maxboards":"10"}, "rugby":{"homepage":"#clubpage@intl", "tmhorizon":"1900", "maxmb":"1000", "price":"0", "maxspaces":"15", "maxpages":"30", "maxsn":"1000000", "services":{"#clubpage@intl":{"filename":"index.html"}, "#artemadisq@intl":{"filename":"called@index_clubpage.html"}, "#pm@intl":{"filename":"index.html"}, "homepage@intl":{"filename":"index_clubpage.html"}}, "maxboards":"10"}, "family":{"homepage":"homepage@intl", "tmhorizon":"1900", "maxmb":"1000", "price":"4.00", "maxspaces":"15", "promo":{"fr":"Bénéficiez de 2 mois gratuits", "id":"family0", "en":"Profit 2 months free"}, "maxpages":"30", "maxsn":"1000000", "services":{"#artemadisq@intl":{"filename":"index_qmdfamily.html"}, "#homepage@intl":{"filename":"fopage_free.html"}, "#pm@intl":{"filename":"index_qmdfamily.html"}, "homepage@intl":{"filename":"qmdfamily.html"}, "#schooltt@intl":{"filename":"index_qmdfamily.html"}}, "maxboards":"30"}, "liberty":{"homepage":"homepage@intl", "tmhorizon":"30", "maxmb":"100", "price":"0", "maxspaces":"1", "maxpages":"30", "maxsn":"0", "services":{"gallery@intl":{"filename":"gallery.html"}, "#artemadisq@intl":{"filename":"index_homepage.html"}, "#homepage@intl":{"filename":"index.html"}, "#pm@intl":{"filename":"index.html"}, "homepage@intl":{"filename":"index.html"}}, "maxboards":"10"}, "liberty_ended":{"homepage":"homepage@intl", "tmhorizon":"30", "maxmb":"100", "price":"0", "maxspaces":"1", "maxpages":"30", "maxsn":"0", "services":{"gallery@intl":{"filename":"gallery.html"}, "#artemadisq@intl":{"filename":"index_homepage.html"}, "#homepage@intl":{"filename":"index.html"}, "#pm@intl":{"filename":"index.html"}, "homepage@intl":{"filename":"index.html"}}, "maxboards":"10"}, "libertyself":{"homepage":"homepage@intl", "tmhorizon":"30", "maxmb":"100", "price":"0", "maxspaces":"1", "maxpages":"30", "maxsn":"0", "services":{"gallery@intl":{"filename":"gallery.html"}, "#artemadisq@intl":{"filename":"index_homepage.html"}, "#homepage@intl":{"filename":"index.html"}, "#pm@intl":{"filename":"index.html"}, "homepage@intl":{"filename":"index.html"}}, "maxboards":"10"}, "ultimate":{"homepage":"homepage@intl", "tmhorizon":"1900", "maxmb":"1000", "price":"2.50", "maxspaces":"15", "promo":{"fr":"Bénéficiez de 2 mois gratuits", "id":"ultimate0", "en":"Profit 2 months free"}, "maxpages":"30", "maxsn":"1000000", "services":{"gallery@intl":{"filename":"gallery.html"}, "#artemadisq@intl":{"filename":"index_homepage.html"}, "#familyplanning@intl":{"filename":"index.html"}, "#homepage@intl":{"filename":"index.html"}, "homepage@intl":{"filename":"index.html"}, "#pm@intl":{"filename":"index.html"}}, "maxboards":"10"}, "family_ended":{"homepage":"homepage@intl", "tmhorizon":"1900", "maxmb":"1000", "price":"0", "maxspaces":"15", "maxpages":"30", "maxsn":"1000000", "services":{"homepage@intl":{"filename":"qmdfamily_ended.html"}}, "maxboards":"10"}} ;
var rights_spacerights_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( 'rights_spacerights_js_loaded' ) ;

rights_record[ 'currencyinfo' ] = {"eur":"1", "usd":"0.767934"} ;
rights_record[ 'prices' ] = {"0":"0", "sad_1":"0.95", "1":"0.65", "sp_4":"4.00", "sn_1":"0.65", "sp_1":"0", "sp_2":"2.50", "sp_3":"3.00"} ;
var rights_currencyinfo_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( 'rights_currencyinfo_js_loaded' ) ;

var broll_message = {
"defaultimagesourceurl" : "Coller ici l'adresse de l'image qui peut être fixe (graphique, photo...) ou animée (webcam...)." ,
"newnoteprompt" : "cliquez ici pour écrire votre message, puis cliquez sur ok" ,
"notextscroll" : "( pas de texte )" ,
"newreplyprompt" : "cliquez ici pour rédiger une nouvelle réponse" ,
"pclocalnotvalidate" : "Vous n'avez pas validé le choix de votre image.\n\nCelle-ci ne va pas être enregistrée." ,
"bagimgextension" : "Le fichier image que vous avez choisi n'a pas la bonne extension.\n\nVeuillez choisir un autre fichier." ,
"fermer" : "fermer" ,
"validateimage" : "Veuillez valider l'image" ,
"inviteusername" : "Veuillez indiquer un nom pour signer votre message." ,
"plug" : "Texte déroulant_Mettez vos messages en valeur en les faisant défiler.",
"selectanimage" : "Veuillez choisir une image sur votre ordinateur:" ,
"uploadtitlenew" : "Affichez une image dans la note" ,
"uploadtitleedit" : "Changez l'image à afficher" ,
"tabscroll" : "Défilement " ,
"broll_direction" : "Direction" ,
"broll_direction0" : "vers le haut" ,
"broll_direction1" : "vers la droite" ,
"broll_direction2" : "vers le bas" ,
"broll_direction3" : "vers la gauche" ,
"broll_speed" : "Vitesse" ,
"broll_speed0" : "lent" ,
"broll_speed1" : "normal" ,
"broll_speed2" : "rapide" ,
"broll_speed3" : "très rapide" ,
"desc" : "(...)"
} ;

var sky = ["Partagez des images et des messages dans un espace Quomodo !" ,
"Chaque membre peut supprimer une note ou une réponse" ,
"Chaque membre peut répondre à un message" ,
"Chaque membre peut modifier les messages ou les réponses qu\'il a rédigées" ];

var broll_msgs_fr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "broll_msgs_fr_js_loaded" ) ;


var broll_templates_prepared = false ;
var broll_leftcol_prepared = false ;
//var broll_json_template = { version: 3 , text : "" , noteheight : "2" , textsize : "2" , textfont : "1" , textbold : "0" , textcenter : "0" , textitalic : "0" , textred : "0", color : "1"  } ;
var broll_json_template = { version: 4 , text : "" , textheight : "200" , textsize : "13" , textfont : "0" , textstyles: { bold : "false" , uppercase : "false" , italic : "false" , align:"0"} , color : "rgb(100%,100%,100%)" , textmargin: 2 , textcolor : -1 , showsignature: "false" , direction : "0" , speed : "1", header : { display : "true" , color: "c1", text : "" , icon : "pushpin" } } ;

var broll_colordesc = { "qmc1" : "color" , "qmc2_qmc1" : "header.color" , "qmc4" : [ "textcolor" , "color" ] , "qmc3" : broll_qmc3 } ;
var broll_textdesc = { "textstyles" : {"slider": "textsize" , "font" : "textfont" , "bold" : "textstyles.bold" , "italic" : "textstyles.italic", "align" : "textstyles.align" , "uppercase" : "textstyles.uppercase" } , "qtxt2" : { "margin" : "textmargin" , "padding": "textmargin" } } ;

var broll_leftcol_description = [
{ what : "bandeau" , tabname : "tabheader" , visible : false , elems : [    
	{ handler : "qsn_addheaderhideshow" , params : { notekind:"broll" , title:"" , jsonpath : "header.display" } } ,
	{ handler : "qsn_addheadercolor" , params : { notekind:"broll" , jsonpath : "header.color" } } ,
	{ handler : "qsn_addheadericons" , params : { notekind:"broll" , jsonpath : "header.icon" } }
	] } ,
{ what : "scrolling" , tabname : "tabscroll" , visible : true , elems : [ 
	{ handler : "qsn_addtableimages" , prepareparams:"broll_preparescrolldirection" , params : { jsonpath:"direction" , ncols:4 , title:"broll_direction" } } ,
	{ handler : "qsn_addtableimages" , prepareparams:"broll_preparescrollspeed" , params : { jsonpath:"speed" , ncols:4 , title:"broll_speed" } }
	] } ,
{ what : "notecolor" , tabname : "tabcolor" , visible : false , elems : [ 
	{ handler : "qsn_addqlubcolorblock" , params : { jsonpath : "color" , others : true ,  transparent:true , title:false , menuseparator: false , modifynote : "qsn_setcolors"  } } 
	] } ,
{ what : "textcolor" , tabname : "tabtextcolor" , visible : false , elems : [ 
	{ handler : "qsn_addoldqlubcolorblock" , params : { jsonpath : "textcolor" , others : true ,  transparent:false , title:false , menuseparator: false , modifynote : "qsn_setcolors"  } } 
	] } ,
{ what : "tabstyles" , tabname : "tabtext" , visible : false , elems :
	[ { handler : "qsn_addtextsizeslider" , params : { jsonpath : "textsize" } } ,
	{ handler : "qsn_addfontfamilies", params : { jsonpath : "textfont" , ncols : 2  } } ,
	{ handler : "qsn_addtextoptions" , params : { jsonpath : "textstyles" , ncols : 2 , title: "textstyleoptions" ,  opts : [ "bold" , "italic" , "uppercase" ] } } ,
	{ handler : "qsn_addtextaligns"   , params : { jsonpath : "textstyles.align" , ncols : 2 } } 
	] } ,
{ what : "textmargin" , tabname : "qsn_tabmargin" , visible : false , elems : [ 
	{ handler : "qsn_addmargins" , params : { jsonpath : "textmargin" , ncols : 1 } } 
	] } ,
{ what : "signature" , tabname : "tabsignature" , visible : false , elems : [ 
	{ handler : "qsn_addsignature" , params : { jsonpath:"showsignature"  } } 
	] } 
] ;

var broll_timers =[] ;
var broll_scroll_suspended = false ;
var broll_scroll_clock = 16 ;
var broll_max_speed = 3 ;
var broll_nominal_speed = 1/50/13 ; // en vitesse normal verticale, 1 pixel en 50ms pour une taille de 13px

function broll_qmc3( r ) {
	if ( ! r.header.icon ) return null ;
	return "/services/wsg/images/icons/" + r.header.icon + ".png" ;
}

function broll_upgradejson( r ) {
	if ( ! r.version ) r.version = 1 ;
	if ( r.version == broll_json_template.version ) return r ;
	if ( r.version < 2 ) r = broll_upgradejsontov2( r ) ;
	if ( r.version < 3 ) r = broll_upgradejsontov3( r ) ;
	if ( r.version < 4 ) r = broll_upgradejsontov4( r ) ;
	r.version = broll_json_template.version ;
	return r ;
}
function broll_upgradejsontov2( r ) {
	return r ;
}
function broll_upgradejsontov3( r ) {
	r.color = "1" ;
	return r ;
}

function broll_upgradejsontov4( r ) {
	r[ "textstyles" ] = { bold : String( r.textbold!=0 ) , uppercase : "false" , italic : String( r.textitalic!=0 ) , align: ( r.textcenter == "1" ) ? "2" : "0" } ;
	delete r.textbold ;
	delete r.textcenter ;
	delete r.textitalic ;
	r.textcolor = -1 ;
	r.showsignature = "false" ;
	r.direction = "0" ;
	r.speed = "0" ;
	r.textmargin = 2 ;
	r.textsize = [ 9 , 11 , 14 ][ parseInt( r.textsize, 10 ) - 1 ] ;
	if ( r.noteheight == "1" ) r.textheight = "85" ;
	else if ( r.noteheight == "2" ) r.textheight = "175" ;
	else if ( r.noteheight == "3" ) r.textheight = "265" ;
	delete r.noteheight ;
	r.header = { display : "false" , color: "0", text : "" , icon : "pushpin" } ;
	return r ; 
}

function broll_template( id ) {
	if ( broll_templates_prepared ) return qsn_template( id , true ) ;
	var div = qsn_installcontainer( "view" , "broll" , ge( "broll_notecontent" ).innerHTML ) ;
	div.style.borderWidth = "0px" ;
	var div = qsn_installcontainer( "edit" , "broll" , ge( "broll_notecontent_edit" ).innerHTML ) ;
	broll_templates_prepared = true ;
	return qsn_template( id , true ) ;
}

function broll_toolbarversion() {
	return 1 ;
}

function broll_pauseall() {
	broll_scroll_suspended = true ;
	return ;
	for ( var id in broll_timers ) {
		broll_cleartimer( id ) ;
		broll_clearlauncher( id ) ;
	}
}

function broll_resumeall() {
	broll_scroll_suspended = false ;
	for ( var id in broll_timers ) if ( ge( id ) ) broll_launch( id ) ;
}

function broll_cleartimer( id ) {
	if ( ! id ) return ;
	if( ! broll_timers[ id ] ) return false ;
	if ( broll_timers[ id ].timer ) clearInterval( broll_timers[ id ].timer ) ;
	broll_timers[ id ].timer = null ;
}

function broll_clearlauncher( id ) {
	if( ! broll_timers[ id ] ) return false ;
	if ( broll_timers[ id ].launcher ) clearTimeout( broll_timers[ id ].launcher ) ;
	broll_timers[ id ].launcher = null ;
}

function broll_fakedisplay( id ) {
	var div = ge( id ) ;
	if ( ! div || ! id || ! qsn_thenotes[ id ] ) return ;
	var r = qsn_thenotes[ id ] ;
	var elem = gebcn( div , "text" ) ;
	switch( r.direction ) {
	case "0" : 
	case "2" : 
		var helem = elem.offsetHeight ;
		var hparent = elem.parentNode.offsetHeight ;
		elem.style.top = Math.round( ( hparent - helem ) / 2 ) + "px" ;
		break ;
	case "1" :
	case "3" :
		var welem = parseInt( elem.w , 10 ) ;
		var wparent = elem.parentNode.offsetWidth ;
		elem.style.left = Math.round( ( wparent - welem ) / 2 ) + "px" ;
		break ;
	}
}

function broll_launch ( id ) { 
	broll_init_note ( id ) ;
	if ( q_pagemode() == "makeweb" ) return broll_fakedisplay( id ) ;
	var d = new Date() ;
	ge( id ).lasttime = d.getTime() ;
	if ( ! broll_timers[ id ].timer ) broll_timers[ id ].timer = setTimeout ( function() { broll_run ( ge( id ) ) ; } , broll_scroll_clock ) ; 
}

function broll_init_note (noteid) {
	if ( broll_timers[noteid] ) broll_cleartimer( noteid ) ;
	else broll_timers[noteid] = { timer: null, launcher: null , accelere: 0, sens: 1 } ;
}

function broll_addnote ( noteid ) {
	broll_init_note (noteid) ;
	var template = qsn_template( noteid ) ; ;
	var div = qsn_clonetemplate( noteid , template ) ;
	qsn_renderhtml ( noteid ) ;
	div.style.opacity = "0.9999" ;
	q_addwindowblurhandlers( "broll_pauseall" ) ;
	q_addwindowfocushandlers( "broll_resumeall" ) ;
	return div ;
}

function broll_preparescroll( noteid ) {
	var elem = gebcn( noteid , "text" ) ;
	var r = qsn_thenotes[ noteid ] ;
	elem.parentNode.h = elem.parentNode.offsetHeight + "px" ;
	elem.style.whiteSpace = "nowrap" ;
	var table = gebcn( noteid , "broll_measuretext" ) ;
	var td = table.getElementsByTagName( "TD" )[ 0 ] ;
	q_innerHTML( td , elem.innerHTML ) ;
	showblock( table ) ;
	elem.w = td.offsetWidth ;
	hideblock( table ) ;
	if ( r.direction == "1" ||  r.direction == "3" ) {
		elem.style.whiteSpace = "nowrap" ;
		elem.parentNode.style.height = Math.round( parseInt( r.textsize , 10 ) * 1.2 ) + "px" ;
		elem.parentNode.style.lineHeight = Math.round( parseInt( r.textsize , 10 ) * 1.2 )  + "px" ;
	} else {
		elem.style.whiteSpace = "normal" ;
		elem.parentNode.style.height =  elem.parentNode.h ;
	}
	if ( r.direction == 0 ) elem.style.top = ( elem.parentNode.offsetHeight - elem.offsetHeight ) + "px" ;
	if ( r.direction == 3 ) elem.style.left = ( elem.parentNode.offsetWidth - 4 ) + "px" ;
	var div = ge( noteid ) ;
	div.speed = broll_pixelspeed( r ) ;
}

function broll_renderhtml( noteid ) {
	var div = ge ( noteid ) ;
	var r = qsn_thenotes[ noteid ] ;
	qsn_container_renderhtml( div , r ) ;
	//on cache l'image de redimensionnement 
	if ( ! document || ! document.mainform || ! document.mainform.pagemode || document.mainform.pagemode.value != "edit" ) hideblock ( gebcn( div , "broll_downarrow" ) ) ;
	broll_rendertext( div , r ) ;
//	broll_rendertextcolor( div , r ) ;
	qsn_settextproperties( noteid ) ;
	qsn_setcolors( noteid ) ;
	
	if ( qsn_currstate != "edit" ) {
		broll_preparescroll( noteid ) ;
		broll_launch ( noteid ) ;
		gebcn( div , "defile_container" ).onmouseover = function() { getContainer( this ).paused = true ;} ;
		gebcn( div , "defile_container" ).onmouseout = function() { var div = getContainer( this ) ; div.paused = false ; div.lasttime = new Date().getTime() ; broll_run( div ); } ;
		if ( r.direction != 1 && r.direction != 3 ) gebcn( div , "defile_container" ).style.height = r.textheight + "px" ;
		else hideblock( gebcn( div , "broll_downarrow" ) ) ;
		var text = gebcn( div , "defile_container" ) ;
	} 
	else {
		var text = gebcn( div , "text" ) ;
		if ( r.direction != 1 && r.direction != 3 ) gebcn( div , "text" ).style.height = r.textheight + "px" ;
		else hideblock( gebcn( div , "broll_downarrow" ) ) ;
	}
}

/*
function broll_settextcolor( x, c ) {
	var id = qsn_edittarget.id ;
	broll_rendertextcolor( qsn_edittarget , qsn_thenotes[ id ] ) ;
	qsn_settextcolor( x, c , true ) ;
}

function broll_rendertextcolor( div , r ) {
	var elem = gebcn( div , "text" ) ;
	if ( r.textcolor != "-1" ) elem.className = elem.className.replace( /(qmc1 [^ ]+)__text_contrast150/ , "$1 qmc4 text_self" ).replace( /qmc1 text_contrast150/ , "qmc4 text_self" ) ;
}
*/

function broll_pixelspeed( r ) {
	var v = parseInt( r.speed , 10 ) + 1 ;
	var d = ( parseInt( r.direction , 10 ) % 2 ) + 1 ; // vaut 1 si défilement vertical, 2 si horizontal
	var s = parseInt( r.textsize , 10 ) ;
	if ( s < 10 ) s = 10 ;
	return d * v * ( ( d == 1 ) ? 13 : s ) * broll_nominal_speed ;
}

function broll_run( div ) {
	if ( broll_scroll_suspended ) return ;
	if ( isremoved( div ) ) return broll_cleartimer( div && div.id ) ;
	var id = div.id ;
	if ( ! id || ! qsn_thenotes[ id ] ) return ;
	if ( div.paused ) return ;
	var r = qsn_thenotes[ id ] ;
	if ( ! r ) return broll_cleartimer( id ) ;
	if ( qsn_currstate != "edit" && ! q_fsmpresent() ) {
		var value = r.direction ;
		var div = ge( id ) ;
		var elem = gebcn( div , "text" ) ;
		var v = parseInt( r.speed , 10 ) + 1 ;
		//vh : pour éviter de saccader, on déplace toujours de 1px. On se cale donc sur la vitesse la plus rapide pour le timer (broll_scroll_clock) et on saute des tours en fonction de la vitesse.
		var d = new Date() ;
		var now = d.getTime() ;
		var timeinterval = ( div.lasttime ) ? ( now - div.lasttime ) : broll_scroll_clock ;
		var pixelgap = Math.round( div.speed * timeinterval ) ;
		if ( pixelgap != 0 ) {
			div.lasttime = now ;
			switch( value ) {
				case "0" : 
					broll_vmove( elem , -pixelgap ) ; 
					break ;
				case "1" :
					broll_hmove( elem , pixelgap ) ; 
					break ;
				case "2" :
					broll_vmove( elem , pixelgap ) ; 
					break ;
				case "3" :
					broll_hmove( elem , - pixelgap ) ; 
					break ;
			}
		}
	}
	setTimeout ( function() { broll_run ( div ) ; } , broll_scroll_clock ) ;
}

function broll_hmove( elem , value ){
	if ( qsn_currstate == "edit" ) return ; 
	var x = elem.offsetLeft + value ;
	var welem = parseInt( elem.w , 10 ) ;
	var wparent = elem.parentNode.offsetWidth ;
	if ( value > 0 ) {
		if ( x > wparent ) x = - welem - 5 ;
	} else {
		if ( x + welem < 0 ) x = wparent + 5 ;
	}
	elem.style.left = x + "px" ;
}

function broll_vmove( elem , value ){
	if ( qsn_currstate == "edit" ) return ; 
	var y = elem.offsetTop + value ;
	var helem = elem.offsetHeight ;
	var hparent = elem.parentNode.offsetHeight ;
	if ( value > 0 ) {
		if ( y > hparent ) y = - helem - 5 ;
	} else {
		if ( y + helem < 0 ) y = hparent + 5 ;
	}
	elem.style.top = y + "px" ;
}

function broll_suppressnote(id) {
	broll_cleartimer( id ) ;
	broll_timers[id].timer = true; // pour tromper mouseout
	return qsn_suppressnote( ge( id ) , true ) ;
}

function broll_rendertext( div , r ) {
	var rtext = r.text || "" ;
	var txt = gebcn( div , "text" ) ;
	if ( qsn_currstate == "edit" ) {
		txt.value = rtext ;
		qsn_blurdefault( txt ) ;
		return;
	} else {
		rtext = rtext == "" ? broll_message["notextscroll"] : rtext ;
		txt.innerHTML = wiqi_text2HTML ( ( r.direction % 2 ) ? rtext.replace( /[\r\n]+/g , " " ) : rtext  ) ;
	}
}

function broll_setsettingdirection( elem , direction ) {
	var divs = elem.getElementsByTagName( "DIV" ) ;
	for ( var i = 0 ; i < divs.length ; i++ ) {
		var div = divs[ i ] ;
		var divtarget = div.getAttribute( "target" ) ;
		if ( divtarget == undefined ) continue ;
		if ( divtarget == direction ) {
			div.style.top = null ; 
			div.style.bottom = "0px" ; 
		} else {
			div.style.bottom = null ; 
			div.style.top = "0px" ; 
		}
	}
	var divm = ge ( "broll_direction_elem_message" ) ;
	divm.innerHTML = qsn_getmessage( "tabscroll" ) + qsn_getmessage( "broll_direction" + direction ) ;
}

function broll_modifynotedirection( id ) {
	var direction = qsn_thenotes[ id ].direction ;
	if ( direction != 1 && direction != 3 ) showblock( gebcn( qsn_edittarget , "broll_downarrow" ) ) ;
	else hideblock( gebcn( qsn_edittarget , "broll_downarrow" ) ) ;
}

function broll_setsettingspeed( elem , speed ) {
	var divs = elem.getElementsByTagName( "DIV" ) ;
	for ( var i = 0 ; i < divs.length ; i++ ) {
		var div = divs[ i ] ;
		var divtarget = div.getAttribute( "target" ) ;
		if ( divtarget == undefined ) continue ;
		if ( divtarget == speed ) {
			div.style.top = null ; 
			div.style.bottom = "0px" ; 
		} else {
			div.style.bottom = null ; 
			div.style.top = "0px" ; 
		}
	}
	var divm = ge ( "broll_speed_elem_message" ) ;
	divm.innerHTML = qsn_getmessage( "tabscroll" ) + qsn_getmessage( "broll_speed" + speed ) ;
}

function broll_displaysettings() {
	qsn_initdisplaysetting() ;
	return false ;
}

function broll_preparescrolldirection( js ) {
	js.title = "broll_direction" ;
	js.setsetting = "broll_setsettingdirection" ;
	js.modifynote = "broll_modifynotedirection" ;
	js.srcprefix = "/services/broll/images/scroll/" ;
	js.targets = [ 0 , 1 , 2 , 3 ] ;
	js.tdovertransparent = true ;
	js.msg = "N/A" ;
	js.button = true ;
}

function broll_preparescrollspeed( js ) {
	js.title = "broll_speed" ;
	js.setsetting = "broll_setsettingspeed" ;
	js.srcprefix = "/services/broll/images/speed/" ;
	js.targets = [ 0 , 1 , 2 ] ;
	js.tdovertransparent = true ;
	js.msg = "N/A" ;
	js.button = true ;
}

function broll_mouseover( elem , ee ) {
	broll_cleartimer( elem.id ) ;
	qsn_mouseover( elem , ee , true ) ;
}
function broll_mouseout( elem , ee ) {
	broll_launch ( elem.id ) ;
	qsn_mouseout( elem , ee , true ) ;
}

function broll_beginDrag_fromIframe(x, e ) {
	var div = parent.getContainer( x ) ;
	qsn_beginDrag (div, e);
}

function broll_applynewnoterefresh( newid , oldid ) {
	broll_cleartimer( oldid ) ;
	broll_clearlauncher( oldid ) ;
	broll_launch( newid ) ;
}

function broll_saveedit () {
	var id = qsn_edittarget.id ;
	var r = qsn_thenotes[ id ] ;
	var x = gebcn( qsn_edittarget, "broll_textarea" ) ;
	r.text = ( x.value == broll_message["newnoteprompt"]  || x.value == "" ) ? "" : x.value ; 
	r.text = r.text.replace( /\r\n/g , "\n" ) ;
	qsn_container_saveedit() ;
	qsn_saveedit( true ) ;
}

function broll_entereditmode( id ) {
	if ( ! qsn_isnewnote ) broll_cleartimer( id ) ;
	qsn_entereditmode( id , true ) ;
}

/*
function -
function réglage hauteur
*/

function broll_VmoveHandler( elem , ex , ey , ew , isGrow ) {
	elem.style.cursor = "s-resize" ;
	var h = elem.originalheight + ey - elem.originaltop ;
	if ( h < 15 ) h = 15 ;
	elem.ta.style.height = h + "px" ;
}

function broll_VupHandler( elem , ex , ey , ew , isGrow ) {
	var r = qsn_thenotes[ getContainer( elem ).id ] ;
	r.textheight = elem.ta.offsetHeight ;
	if ( qsn_currstate != "edit" ) qsn_notechanged( getContainer( elem ).id ) ;
}

function broll_beginVDrag( elem , ee ) {
	if ( qsn_currstate != "edit" ) elem.ta = gebcn( getContainer( elem ), "defile_container" ) ;
	else elem.ta = gebcn( getContainer( elem ), "text" ) ;
	elem.originalheight = elem.ta.offsetHeight ;
	elem.originaltop = elem.offsetTop ;
	return beginDrag( elem , ee , broll_VmoveHandler , broll_VupHandler ) ;
}

function broll_initforweb( id ) {
	q_addwindowblurhandlers( "broll_pauseall" ) ;
	q_addwindowfocushandlers( "broll_resumeall" ) ;
	broll_preparescroll( id ) ; // sinon ça ne fait qu'un tour sous firefox et ie
	broll_launch( id ) ; // je ne comprends pas comment ça démarre sur aubervilliers sans cette ligne
	ge( id ).onmouseover = function() { this.paused = true ;} ;
	ge( id ).onmouseout = function() { this.paused = false ; this.lasttime = new Date().getTime() ; broll_run( this ) ; } ;
}

var broll_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "broll_js_loaded" ) ;


var clock_message = {
"plug" : "Clock_Affichez simplement l'heure de manière graphique sur votre page.",
"displayDate" : "Afficher la date" ,
"displayTime" : "Afficher l'heure" ,
"selectanimage" : "Veuillez choisir une image sur votre ordinateur:" ,
"uploadtitle" : "Nouvelle image de fond"
} ;

var clock_msgs_fr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "clock_msgs_fr_js_loaded" ) ;


//var clock_json_template = { version : 1, text : "", textfont : "-1" , textcolor : "1" , displaydate : "1" , displayseconds : "0" , img : { kind : "icon", src : "bckg/globe" } } ;
//ATTENTION lors de la mutualisation de la note penser à mettre dans l'upgradejson la conversion de textfont "-1" à "1" (ou son nouvel équivalent) par exemple.

var clock_json_template = { version : 1, text : "", textfont : "1" , textcolor : "1" , displaydate : "1" , displayseconds : "0" , img : { kind : "icon", src : "bckg/globe" } } ;

var clock_colordesc = { "qmc1" : "textcolor" } ;
var clock_timer = { timer : 0 , ids : [ ] } ;
var clock_prepared = false ;
/*
function -
function UPLOAD
*/

var clock_upload_request = { // AJOUTER TRANSPARENCE transparency : { no | asfile | forcetocolor }
	"callerid" : "" ,
	"uploadkind" : "image" ,
	"title" : "" ,
	"prompt" : "" ,
	"multiple" : false ,
	"extensions" : ["jpg" , "jpeg" , "png" , "gif" , "tiff" , "tif" , "pdf" ] ,
	"namingdata" : { "wantname" : true } ,
	"formats" : "screen halfscreen quarterscreen" ,
	"callback" : "" ,
	"reveal": { "anim" : true } ,	
	"resize" : false ,
	"resize_option" : { "ratio" : "image" }, 
	"transparency" : "asimage"
} ;

function clock_launch_upload( ) {
	var id = qsn_edittarget.id ;
	clock_upload_request.callback = "clock_upload_done" ;
	clock_upload_request.callerid = id ;
	clock_upload_request.prompt = clock_message[ "selectanimage" ] ;
	clock_upload_request.title = clock_message[ "uploadtitle" ] ;
	qdyn_qorgload( "qu_reveal", [ clock_upload_request ], "qu" ) ;
}

function clock_upload_done( x ) {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	r.imgbk = null ;
	if ( x.files != undefined ) {
		r.img.formats = x.files[ 0 ].formats ;
		r.img.src = x.files[ 0 ].formats[ "screen" ] ;
		r.img.kind = "pc" ;
		clock_renderbckg( qsn_edittarget , r ) ;
	}
	return false ;
}

/*
function -
function RENDER
*/

function clock_renderhtml( id ) {
	var div = ge( id ) ;
	var r = qsn_thenotes[ id ] ;
	div.toresize = function () { return [ gebcn( div, "clock_bckgimage" ).getElementsByTagName( "IMG" )[ 0 ] ] ; } ;
	div.resized = function ( elem , w ) { clock_rendertextsize( elem ) ; } ;
	div.growingupdone = function () {
		var r = qsn_thenotes[ this.id ] ;
		if ( r.img.src &&  r.img.kind != "icon"  ) clock_renderbckg( this , r ) ;
	} ;
	clock_renderbckg( div, r ) ;
	clock_renderdisplaydate( div , r ) ;
	clock_rendertextfont( div , r ) ;
	qsn_setcolors( id ) ;
}

function clock_renderbckg( div , r ) {
	var img = gebcn( div, "clock_bckgimage" ).getElementsByTagName( "IMG" )[ 0 ] ;
	if ( ( ! r.img.src ) || ( r.img.kind == "icon" ) ) {
		var src = "/services/clock/images/" + ( r.img.src || "bckg/globe" ).replace( /\.png$/ , "" ) + ".png" ;
	} else var src = q_spaceabsoluteurl( r.common.ownerid , qsn_screenfilepath( r , parseInt( qsn_width( r.common.noteid ) , 10 ) ) ) ;
//	q_setimgsrc( img , src ) ;
	if ( isie6() ) img.className = img.className.replace( /\bpng\b/ , "" ) ;
	img.style.width = qsn_width( r.common.noteid ) ;
	q_hsetimgsrc( [ img , src ] , clock_renderdisplayseconds , [ div.id ] ) ;
}

function clock_renderdisplaydate( div , r ) {
	visibleblock( gebcn( div, "clock_date" ) , r.displaydate == "1" ) ;
}

function clock_renderdisplayseconds( noteid ) {
	var div = ge( noteid ) ;
	if ( ! div ) return ;
	clock_rendertextsize( div ) ;
	if ( qsn_currstate != "edit" ) clock_launchtimer( noteid ) ;
	else clock_refreshdateandtime( div ) ;
}

function clock_rendertextfont( div , r ) {
//	if ( r.textfont == undefined ) return ;//??
	if ( ! r.textfont || r.textfont == "-1" ) r.textfont = "1" ;//mauvaise initialisation du json_template
	var i = parseInt( r.textfont ) ;
	var textfonts = [ "Arial, Helvetica, sans-serif" , "Times, 'Times New Roman', serif" ,"'Courier New', Courier, monospace" ] ;
	gebcn( div , "clock_content" ).style.fontFamily = textfonts[ i - 1 ] ;
}

function clock_rendertextsize( div ) {
	var img = gebcn( div, "clock_bckgimage" ) ;
	var h = ( qsn_thenotes[ div.id ].displayseconds == "1" ) ? 5 : 3.5 ;
	var w = Math.floor( img.offsetWidth / h ) ;
	var ddate = gebcn( div, "clock_date" ) ;
	var dtime = gebcn( div, "clock_time" ) ;
	dtime.style.fontSize = w + "px" ;
//	dtime.style.marginTop = Math.floor( img.offsetHeight / 2  - w / 4 ) + "px" ;
	var x = ( qsn_thenotes[ div.id ].displayseconds == "1" ) ? 2 : 3 ;
	ddate.style.fontSize = Math.floor( w/x ) + "px" ;
//	ddate.style.marginTop = Math.floor( img.offsetHeight / 3 ) + "px" ;
	gebcn( div , "clock_table" ).style.height = img.offsetHeight + "px" ;
}

function clock_refreshdateandtime( div , thedate ) {// date, optionnel
	var t = thedate || new Date() ;
	var secInteger = t.getSeconds() ;
	var sec = twodigs ( secInteger ) ;
	var sep1 = ( secInteger % 2 ) ? ":" : " " ;
	var sDate = twodigs ( t.getDate() ) + "." + twodigs ( t.getMonth() + 1 ) + "." + t.getFullYear() ;
	var sTime = twodigs ( t.getHours() ) + sep1 + twodigs ( t.getMinutes() ) ;
	var id = div.id ;
	var r = qsn_thenotes[ id ] ;
	gebcn( div, "clock_date" ).innerHTML = sDate ;
	var spans = gebcn( div, "clock_time" ).getElementsByTagName("SPAN") ;
	if ( spans.length ) {
		spans[ 0 ].innerHTML = twodigs ( t.getHours() ) ;
		spans[ 2 ].innerHTML = twodigs ( t.getMinutes() ) ;
		spans[ 4 ].innerHTML = sec ;
		spans[ 1 ].style.visibility = ( secInteger % 2 ) ? "visible" : "hidden" ;
		spans[ 3 ].style.visibility = ( secInteger % 2 ) ? "visible" : "hidden" ;
		spans[ 3 ].style.display = ( r && r.displayseconds == "1" ) ? "inline" : "none" ;			
		spans[ 4 ].style.display = ( r && r.displayseconds == "1" ) ? "inline" : "none" ;	
	} else {
		gebcn( div, "clock_time" ).innerHTML = sTime + ( ( r && r.displayseconds == "1" ) ? sep1 + sec : "" ) ;
	}	
}

function clock_refresh(){
	if ( qsn_currstate != "edit" && ! q_fsmpresent() ) {
		var t = new Date() ;
/*
		var secInteger = t.getSeconds() ;
		var sec = twodigs ( secInteger ) ;
		var sep1 = ( secInteger % 2 ) ? ":" : " " ;
		var sDate = twodigs ( t.getDate() ) + "." + twodigs ( t.getMonth() + 1 ) + "." + t.getFullYear() ;
		var sTime = twodigs ( t.getHours() ) + sep1 + twodigs ( t.getMinutes() ) ;
*/
		var ids = clock_timer.ids ;
		var updateids = false ;
		for ( var i = 0 ; i < ids.length ; i++ ) {
			var id = ids[ i ] ;
			var div = ge( id ) ;
			if ( isremoved( div ) ) {
				updateids = true ; 
				continue ;
			}
			if ( div.id != id ) updateids = true ;
			id = div.id ;
			clock_refreshdateandtime( div , t ) ;
/*
			var r = qsn_thenotes[ id ] ;
			gebcn( div, "clock_date" ).innerHTML = sDate ;
			var spans = gebcn( div, "clock_time" ).getElementsByTagName("SPAN") ;
			if ( spans.length ) {
				spans[ 0 ].innerHTML = twodigs ( t.getHours() ) ;
				spans[ 2 ].innerHTML = twodigs ( t.getMinutes() ) ;
				spans[ 4 ].innerHTML = sec ;
				spans[ 1 ].style.visibility = ( secInteger % 2 ) ? "visible" : "hidden" ;
				spans[ 3 ].style.visibility = ( secInteger % 2 ) ? "visible" : "hidden" ;
				spans[ 3 ].style.display = ( r && r.displayseconds == "1" ) ? "inline" : "none" ;			
				spans[ 4 ].style.display = ( r && r.displayseconds == "1" ) ? "inline" : "none" ;	
			} else {
				gebcn( div, "clock_time" ).innerHTML = sTime + ( ( r && r.displayseconds == "1" ) ? sep1 + sec : "" ) ;
			}	
*/
		}
		if ( updateids ) {
			clock_timer.ids = [ ] ;
			for ( var id in qsn_thenotes ) if ( qsn_thenotes[ id ] && qsn_thenotes[ id ].common.notekind == "clock" ) clock_timer.ids.push( id ) ;
		}
	}
	if ( clock_timer.ids.length && q_pagemode() != "makeweb" ) clock_timer.timer = setTimeout( "clock_refresh()" , 1000 ) ;
	else clock_timer.timer = 0 ; 
}

/*
function -
function EDIT
*/

function clock_handleclick( x ) {
	var noteid = qsn_edittarget.id ;
	var r = qsn_thenotes[ noteid ] ;
	var t = x.id.replace( /clock_/ , "" ).split( "_" ) ;
	var key = t[ 0 ] ;
	if ( t.length == 2 ) r[ key ] = t[ 1 ] ;
	else r[ key ] = x.checked ? "1" : "0" ;
	eval ( "clock_render" + key + "( qsn_edittarget , r )" ) ;
}

function clock_settextcolor( x, c ) {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	r.textcolor = c ? c : x.style.backgroundColor ;
	qsn_setcolors( qsn_edittarget.id ) ;
}

function clock_setbckgicon( x ) {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	var icon = q_pngbgimagename( x ) ;
	r.img = { kind: "icon" , src: "bckg/" + icon } ;
	clock_renderbckg( qsn_edittarget , r ) ;
}

function clock_prevnexticons( x, v ) {
	var t = ge( "clock_iconstable" ).getElementsByTagName( "TABLE" )[ 0 ] ;
	var n = t.rows.length ;
	if ( ! t.pos ) t.pos = 0 ;
	t.pos += ( v * 3 ) ;
	if ( t.pos < 0 ) t.pos = 0 ;
	if ( t.pos > n - 1 ) t.pos = n - 1 ;
	var tr ;
	for ( var i=0; i < n; i++ ) {
		if ( ( i >= t.pos ) && ( i < t.pos + 3 ) ) showblock(  t.rows[ i ] ) ;
		else hideblock(  t.rows[ i ] ) ;
	}
	var b = x.parentNode.getElementsByTagName( "A" ) ;
	b[ 0 ].style.visibility = ( t.pos > 0 ) ? "visible" : "hidden" ;
	b[ 2 ].style.visibility = ( t.pos + 3 < n - 1 ) ? "visible" : "hidden" ;
}

function clock_displaysettings() {
	if ( ! clock_prepared )  {
		clock_prepared = true;
		xqsn_colorblock ( ge( "clock_colorblock" ) , true , false , false , false , clock_settextcolor ) ;
	}

	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	if ( ! r.textfont || r.textfont == "-1" ) r.textfont = "1" ;//mauvaise initialisation du json_template
	setchecked( "clock_textfont_" + r.textfont , true ) ;
	setchecked( "clock_displaydate_" + r.displaydate , true ) ;
	setchecked( "clock_displayseconds_" + r.displayseconds , true ) ;
}

function clock_launchtimer( id ) {
	var ids = clock_timer.ids ;
	for ( var i = 0 ; i < ids.length ; i++ ) if ( ids[ i ] == id ) return ;
	clock_timer.ids.push( id ) ;
	if ( clock_timer.timer == 0 )  clock_timer.timer = setTimeout( "clock_refresh()" , 0 ) ;
}

function clockmouseoverintable( ee ) {
	var elem = getElementFromEvent( ee ) ;
	if ( elem.tagName != "DIV" ) return ;
	q_mouseoverbutton( elem ) ;
}

function clockmouseoutintable( ee ) {
	var elem = getElementFromEvent( ee ) ;
	if ( elem.tagName != "DIV" ) return ;
	q_mouseoutbutton( elem ) ;
}

function clockclickintable( ee ) {
	var elem = getElementFromEvent( ee ) ;
	if ( elem.tagName != "DIV" ) return ;
	q_mouseoutbutton( elem ) ;
	clock_setbckgicon( elem ) ;
}

/*
function -
function DRAG
*/

/*

function clock_beginDrag( elem , e ) {
	xqsn_beginDrag( elem , e , clock_moveHandler , clock_upHandler ) ;
}

function clock_moveHandler( elem , ex , ey , ew , isGrow , xylimits ) {
	qsn_moveHandler( elem , ex , ey , ew , isGrow , xylimits ) ;
	if ( isGrow ) clock_rendertextsize( elem ) ;
}

function clock_upHandler( elem , ex , ey , ew , isGrow , isMove , xylimits ) {
	qsn_upHandler( elem , ex , ey , ew , isGrow , isMove , xylimits ) ;
	var r = qsn_thenotes[ elem.id ] ;
	if ( isGrow && r.img.src &&  r.img.kind != "icon"  ) clock_renderbckg( elem , r ) ;
}
*/

/*
function -
function SERVICE PAGES
*/

function clock_widthinfos( r ) {
	return { wfixed : true } ;
}

function clock_initforweb( id ) {
//	q_addwindowblurhandlers( "slide_pauseall" ) ;
//	q_addwindowfocushandlers( "slide_resumeall" ) ;
//	clock_launchtimer( ge( id ) ) ;
	clock_renderdisplayseconds( id ) ;
}

/*
function -
function TOOLBAR
*/

function clock_toolbarversion() {
	return 1 ;
}

var clock_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "clock_js_loaded" ) ;


var comment_message = {
"newnoteprompt" : "Cliquez ici pour rédiger le message d'invitation des commentaires." ,
"onecomment" : "Un commentaire sur ce sujet" ,
"severalcomments" : "Déjà %s commentaires sur ce sujet" ,
"nocomment" : "Il n'y a aucun commentaire sur ce sujet" ,
"showonecomment" : "Voir le premier commentaire" ,
"showcomments" : "Voir les %s commentaires" ,
"hidecomments" : "Revenir à la page" ,
"firstcomment" : "Soyez le premier à réagir !" ,
"commentsadministration" : "Administration des commentaires",
"deletecomment" : "supprimer" ,
"confirmdeletecomment" : "Voulez-vous vraiment supprimer ce message ?" ,
"shownewcomment" : "Ajouter un commentaire" ,
"hidenewcomment" : "Masquer le formulaire" ,
"nameinput" : "obligatoire" ,
"emailinput" : "obligatoire, ne sera pas affichée" ,
"commentinput" : "rédigez votre commentaire ici" ,
"website" : "Cliquez pour accéder au site de %s" ,
"missingname" : "Entrez votre nom svp." ,
"missingemail" : "Entrez votre adresse e-mail svp.\n\nElle ne sera pas affichée sur le site mais elle sera transmise à l'admin qui validera votre contribution." ,
"missingcomment" : "Entrez votre commentaire svp." ,
"order0" : "Affichage du plus ancien au plus récent" ,
"order1" : "Affichage du plus récent au plus ancien" ,
"invalidemailaddress" : "Cette adresse e-mail n'est pas valide. Veuillez entrer une adresse valide svp.\n\nVotre adresse ne sera pas affichée sur le site mais elle est requise pour la transmettre à l'admin qui validera votre contribution" ,
"snname" : "Note Commentaire" ,
"plug" : "Commentaire_Proposer à vos visteurs de s'exprimer sur un sujet, une photo, une actualité de votre site." ,
"desc" : "(...)" ,
"mailobject" : "[Quomodo] - Un commentaire sur la page %p" ,
"headericontitle" : "Icône" ,
"mailbody" : "Un internaute a laissé un commentaire sur la page %p (%a) de votre site %s. Voici les informations qu'il a fournies.\r\r--\rNom: %n\rAdresse e-mail: %e\rSite web: %w\rCommentaire: %c\r--\r\rEn tant qu'administrateur du site, vous pouvez si vous le souhaitez supprimer ce commentaire en vous connectant sur la page.\r\rL'équipe Quomodo\r\rPour toute question ou suggestion, rendez-vous sur l'aide de Quomodo:\rhttp://aide.quomodo.com\rVous pouvez également nous contacter en envoyant un mail à:\rcontact@quomodo.com\r" ,
"none" : "sans" ,
"gray" : "gris" ,
"color" : "couleur" ,
"pagetitle" : "Commentaires de la page %s" ,
"messageregistered" : "Votre commentaire a bien été enregistré.\nSi vous rechargez dans la page dans quelques instants, vous le verrez apparaître."
} ;

var comment_msgs_fr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "comment_msgs_fr_js_loaded" ) ;

var comment_templates_prepared = false ;
var comment_leftcol_prepared = false ;

var comment_json_template = { version : 3 ,  icon : "0" , color : "rgb(100%,100%,100%)" , text : "" , textsize : "12" , textfont : "0" , textstyles: { bold : "false" , center : "true" , italic : "false" } , inverseorder : true , olddisplay : false } ;

var comment_oldjson_template = {
"1" : { version : 1 ,  icon : "2" , color : "6" , text : "" , textsize : "2" , textfont : "1" , textbold : "0" , textcenter : "0" , textitalic : "0"  , inverseorder : true } ,
"2" : { version : 2 ,  icon : "0" , color : "6" , text : "" , textsize : "12" , textfont : "0" , textstyles: { bold : "false" , center : "true" , italic : "false" } , inverseorder : true }
} ;

var comment_colordesc = { "qmc1" : "color" } ;
var comment_textdesc = { "textstyles" : {"slider": "textsize" , "font" : "textfont" , "bold" : "textstyles.bold" , "italic" : "textstyles.italic", "center" : "textstyles.center" }  } ;

var comment_leftcol_description = [
{ what : "notecolor" , tabname : "tabcolor" , visible : true , elems : [ 
	{ handler : "qsn_addqlubcolorblock" , params : { jsonpath : "color" , others : true ,  transparent:true , title:false , menuseparator: false , modifynote : "qsn_setcolors"  } } 
	] } ,
{ what : "tabstyles" , tabname : "tabtext" , visible : false , elems :[ 
	{ handler : "qsn_addtextsizeslider" , params : { jsonpath : "textsize" } } ,
	{ handler : "qsn_addfontfamilies", params : { jsonpath : "textfont" , ncols : 2  } } ,
	{ handler : "qsn_addtextoptions" , params : { jsonpath : "textstyles" , ncols : 2 , title: "textstyleoptions" ,  opts : [ "bold" , "italic" , "center" ] } } 
	] } ,
{ what : "icone" , tabname : "headericontitle" , visible : false , elems : [ 
	{ handler : "comment_addicon" , params : {  jsonpath : "icon"  } } 
	] }
] ;	


function comment_upgradejson( r ) {
	if ( ! r.version ) r.version = 1 ;
	if ( r.version == comment_json_template.version ) return r ;
	if ( r.version < 2 ) r = comment_upgradejsontov2( r ) ;
	if ( r.version < 3 ) r = comment_upgradejsontov3( r ) ;
	r.version = comment_json_template.version ;
	return r ;
}

function comment_upgradejsontov2( r ) {
	r[ "textstyles" ] = { bold : String( r.textbold!=0 ) , center : String( r.textitalic!=0 ) , italic : String( r.textitalic!=0 ) } ;
	r.textsize = [ "10" , "12" , "15" ][ parseInt( r.textsize , 10 ) - 1 ] ;
	delete r.textbold ;
	delete r.textcenter ;
	delete r.textitalic ;
	if ( r.textsize == 1 ) r.textsize = "10" ;
	if ( r.textsize == 2 ) r.textsize = "12" ;
	if ( r.textsize == 3 ) r.textsize = "15" ;
	return r ; 
}

function comment_upgradejsontov3( r ) {
	r.olddisplay = true;
	return r ; 
}

function comment_template( id ) {
	if ( comment_templates_prepared ) return qsn_template( id , true ) ;
	var div = qsn_installcontainer( "view" , "comment" , ge( "comment_notecontent" ).innerHTML ) ;
	div.style.borderWidth = "0px" ;
	var div = qsn_installcontainer( "edit" , "comment" , ge( "comment_notecontent_edit" ).innerHTML ) ;
	comment_templates_prepared = true ;
	return qsn_template( id , true ) ;
}

/*
function -
function RENDER
*/

var comment_ASparams = [] ;
function comment_AStask() {
	AS.checkremoved_staticcomment_keepnotes( document.mainform[ "q_space" ].value , document.mainform.service.value , comment_ASparams ) ;
}

var comment_AStaskadded = false ;
function comment_addAStask( notedid ) {
	comment_ASparams.push( notedid ) ;
	if ( comment_AStaskadded ) return ;
	AStasks.push( comment_AStask ) ;
	comment_AStaskadded = true ;
}

function comment_renderhtml( xnoteid ) {
	var div = ge( xnoteid ) ;
	var noteid = div.id ; // au cas où l'id de la note a changé
	var r = qsn_thenotes[ noteid ] ;
	qsn_container_renderhtml( div , r ) ;
	var t = gebcn( div , "comment_text" ) ;
	if ( qsn_currstate == "edit" ) {
		t.value = r.text ;
		qsn_blurdefault ( t ) ;
	} else {
		q_innerHTML( t , r.text ) ;

		comment_rendercommentlinks( div, 0 ) ;
		comment_renderdipslay( div, r );
		
		if ( ! qsn_thenotes[ noteid ].common.duplicateid ) {
			if ( window.q_pagemode && q_pagemode() == "makeweb" ) {
				comment_addAStask( noteid ) ;
				var ASres = AS.comment_publishpage( document.mainform[ "q_space" ].value , document.mainform.service.value , noteid , comment_message[ "pagetitle" ].replace( /%s/ , q_currsvcname() ) , q_lang ) ;
				if ( ASres && ASres.pageurl ) comment_renderwebcommentlinks( div , ASres.pageurl , ASres.ncomments ) ;
			} else {
				document.mainform.mission.value = "countComments" ;
				q_ajaxsubmit( { noteid : noteid } , comment_countcomments_done ) ;
			}
		}
	}
	comment_rendericon( div , r ) ;
	qsn_settextproperties( noteid ) ;
	qsn_setcolors( noteid ) ;
}

function comment_renderdipslay( div, r ){
	visibleblock( gebcn( div, "commentaddbtn") , r.olddisplay == false ) ;
	visibleblock( gebcn( div, "comment_count") , r.olddisplay == false ) ;
	visibleblock( gebcn( div, "comment_oldlink") , r.olddisplay == true ) ;
}

function comment_countcomments_done( x ) {
	var noteid = x.noteid;
	var div = ge( noteid ) ;
	var r = qsn_thenotes[ noteid ] ;
	r.nbcomments = x.nbcomments ; 
	comment_rendercommentlinks( div,  r.nbcomments ) ;
}

function comment_rendericon( div, r ) {
	var d = gebcn( div, "comment_noteicon" ) ;
	d.parentNode.style.paddingRight = ( r.icon == "0" ) ?  "0px" : "10px";
	if ( r.icon == "0" ) d.className = d.className.replace(/\bicon[^ ]+\b/, " iconnoicon");
	else if ( r.icon == "1" ) d.className = d.className.replace(/\bicon[^ ]+\b/, " icongrey");
	else if ( r.icon == "2" ) d.className = d.className.replace(/\bicon[^ ]+\b/, " iconorange");
}

function comment_modifynoteicon( id ) {
	var r = qsn_thenotes[ id ] ;
	comment_rendericon( qsn_edittarget , r ) ;
}

/*
function -
function EDIT
*/

function comment_addicon( target , js ){
	var s = '<div class="qsn_iconstable" style="margin: 10px 0 0 -8px"><table  class="comment_headericon_elem" cellspacing="2" cellpadding="0" onclick="qsn_default_handleclick(this , event)" jsonpath="' + js.jsonpath + '" setsetting="q_handleradio" modifynote="comment_modifynoteicon"><tbody><tr><td width="48" valign="bottom"><img class="png" target="1" src="/services/comment/images/comment48grey.png" style="cursor: pointer"/></td><td width="48" valign="bottom"><img class="png" target="2" src="/services/comment/images/comment48orange.png" style="cursor: pointer"/></td><td align="left"><a target="0" name="comment_icon" class="radio off"><img src="/images/blank.gif" />' + comment_message[ "none" ] + '</a><br/><a target="1" name="comment_icon" class="radio off"><img src="/images/blank.gif" />' + comment_message[ "gray" ] + '</a><br/><a target="2" name="comment_icon" class="radio off"><img src="/images/blank.gif" />' + comment_message[ "color" ] + '</a></td></tr></tbody></table></div>' ;
	var div = qsn_addleftcolelem( target , s , "comment_headericon_elem" ) ;
}

function comment_saveedit( ) {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	r.text = gebcn( qsn_edittarget , "comment_text" ).value ;
	if ( r.text == comment_message[ "newnoteprompt" ] ) r.text = "" ;
	r.olddisplay = false;
	qsn_saveedit( true ) ;
}

function comment_displaysettings() {
	qsn_initdisplaysetting() ;
	return false ;
}

function comment_newcommentfocusdefault( x, v ) {
	focusdefault( x , comment_message[ v ] , "black" ) ;
}

function comment_newcommentblurdefault( x, v ) {
	blurdefault( x , comment_message[ v ] , "#999" , "black" ) ;
}

/*
function -
function UI
*/

function comment_hideshowcommentform( div ) {
	var d2 = gebcn( div, "comment_newcomment" ) ;
	comment_visiblecommentform( div , ! ( d2.style.display == "block" || d2.style.display == "table" ) ) ;
}

function comment_visiblecommentform( div , b ) {
	var d1 = gebcn( div, "comment_comments" ) ;
	var d2 = gebcn( div, "comment_newcomment" ) ;
	var d3 = gebcn( div, "comment_addnewcomment" ) ;
	var a = gebcn( div, "comment_link");
	
	if ( ! b ) {
		hideshowblock( d2 , d3 ) ;
		a.innerHTML = comment_message["shownewcomment"];
		d1.style.height = ( d1.fullHeight - ( ( d3 ) ? d3.offsetHeight : 0 ) ) + "px" ;
	} else {
		hideshowblock( d3 , d2 ) ;
		a.innerHTML = comment_message["hidenewcomment"];
		if ( ! d1.fullHeight ) d1.fullHeight = d1.offsetHeight + d2.offsetHeight ;
		else d1.style.height = d1.fullHeight - d2.offsetHeight + "px" ;
	}
}

function comment_renderwebcommentlinks( div, pageurl , ncomments ) {
	comment_xrenderwebcommentlinks( "commentaddbtn" , div , pageurl , ncomments ) ;
	comment_xrenderwebcommentlinks( "comment_oldlink" , div , pageurl , ncomments ) ;
	comment_rendercommentlinks( div, ncomments ) ;
}
function comment_xrenderwebcommentlinks( target , div , pageurl , ncomments ) {
	var l = gebcn( div , target ) ;
	if ( ! l ) return ;
	var a1 = gebtn( l, "A") ;
	if ( ! a1 ) return ;
	a1.href = pageurl ;
	l.setAttribute( "onclick" , "document.location = gebtn(this, 'A').href;" ) ;
}

function comment_rendercommentlinks( div, l1 ) {
	var thediv = gebcn( div, "comment_count");
	switch( l1 ) {
		case -1 :
		case 0 :
			thediv.innerHTML = comment_message[ "nocomment" ] ;
			break ;
		case 1 :
			thediv.innerHTML = comment_message[ "onecomment" ] ;
			break ;
		default :
			if ( parseInt( l1, 10 ) ) thediv.innerHTML = comment_message[ "severalcomments" ].replace( "%s", l1 ) ;
			else thediv.innerHTML = comment_message[ l1 ] ;
			break ;
	}
	var l = gebcn( div , "comment_oldlink" ) ;
	var a1 = gebtn( l , "A" );
	switch( l1 ) {
		case -1 :
		case 0 :
			a1.innerHTML = comment_message[ "firstcomment" ] ;
			break ;
		case 1 :
			a1.innerHTML = comment_message[ "showonecomment" ] ;
			break ;
		default :
			if ( parseInt( l1, 10 ) ) a1.innerHTML = comment_message[ "showcomments" ].replace( "%s", l1 ) ;
			else a1.innerHTML = comment_message[ l1 ] ;
			break ;
	}
}

function comment_mouseoverorderbutton( x, mode ) {
	var div = getContainer( x ) ;
	comment_xmouseoverorderbutton( x , qsn_thenotes[ div.getAttribute("target") ].inverseorder , mode ) ;
}

function comment_webmouseoverorderbutton( x, mode ) {
	comment_xmouseoverorderbutton( x , x.ascending , mode ) ;
}

function comment_xmouseoverorderbutton( x , b , mode ) {
	if ( b ) {
		if ( mode == "over" ) q_mouseoverbutton( x ) ;
		else q_mouseoutbutton( x ) ;
	} else {
		if ( mode == "over" ) q_mouseoutbutton( x ) ;
		else q_mouseoverbutton( x ) ;
	}
}

function comment_switchorder( x ) {
	var div = getContainer( x );
	var noteid = div.getAttribute( "target" );
	qsn_thenotes[ noteid ].inverseorder = ! qsn_thenotes[ noteid ].inverseorder ;
	comment_rendercomments( div ) ;
}

function comment_webswitchorder( x ) {
	var b = x.ascending ;
	x.ascending = ! b ;
	gebcn( document.body , "comment_commentsorderinfo" ).innerHTML = comment_message[ ( b ) ? "order1" : "order0" ] ;
	gebcn( document.body , "comment_commentsorder" ).style.backgroundPosition = ( b ) ? "top" : "bottom" ;
	var table = gebtn( gebcn( document.body , "comment_commentslist" ) , "table" ) ;
	var n = table.rows.length / 2 ;
	var tr ;
	for ( var i = n-2 ; i >= 0 ; i-- ) {
		tr = table.rows[ 2*i ] ;
		tr.parentNode.appendChild( tr ) ;
		tr = table.rows[ 2*i ] ; //attention (normalement c'est 2*i+1, mais comme c'est dynamique, le 2*i vient de partir)
		tr.parentNode.appendChild( tr ) ;
	}
}

/*
function -
function COMMENTS
*/

function comment_webinit( svcid ) {
	document.mainform.service.value = svcid.replace( /@.*/ , "@" +q_lang ) ;
	currsvcid = svcid.replace( /@.*/ , "@intl" ) ;
}

function comment_webaddcomment( noteid ) {
	showblock( "q_fullscreenmask" ) ;
	comment_xaddcomment( document.body , noteid , comment_webaddcommentdone ) ;
}
function comment_webaddcommentdone( x ) {
	alert( comment_message[ "messageregistered" ] ) ;
	hideblock( "q_fullscreenmask" ) ;
}

function comment_xaddcomment( div , noteid , callback ,args ) {
//div container : body ou note
	var d = gebcn( div, "comment_newcomment" ) ;
	var inp = getElementsByClassName( d, "comment_inputarea" ) ;
	var j = q_isadmin( memberid ) ? 3 : 0 ; // vérifie seulement la présence du commentaire en mode admin
	var ref = [ "name", "email", "website", "comment" ] ;
	for ( i = j ; i < 4 ; i++ ) {
		if ( i == 2 ) continue ;
		var v = inp[ i ].value ;
		if ( ( v == "" ) || ( v == comment_message[ ref[ i ] + "input" ] ) ) {
			alert ( comment_message[ "missing" + ref[ i ] ] ) ;
			hideblock( "q_fullscreenmask" ) ;
			return focusandselect( inp[ i ] ) ;
		}
		if ( i == 1 ) { // adresse mail
			if ( ! verbosevalidemail ( v.replace( /(^[ ]*)|([ ]*$)/g, "" ) , comment_message [ "invalidemailaddress" ] ) ) {
				hideblock( "q_fullscreenmask" ) ;
				return focusandselect ( inp[ i ] ) ;
			}
		}
	}
	var name = inp[ 0 ].value ;
	var email = inp[ 1 ].value.replace( /(^[ ]*)|([ ]*$)/g, "" ) ;
	var website = inp[ 2 ].value ;
	var comment = inp[ 3 ].value ;
	var date = q_date2isot( new Date() ) ;
	var isadmin = ( q_isadmin(window.memberid)  ) ? 1 : 0 ;
	var emaildata = { } ;
	emaildata[ "objectmail" ] = comment_message[ "mailobject" ].replace( "%p", q_currsvcname() ).replace( "%s", rights_record[ "currspaceright" ].name ) ;
	emaildata[ "bodymail" ] = comment_message[ "mailbody" ].replace( "%n", name ).replace( "%e", email ).replace( "%w", website ).replace( "%c", comment ).replace( "%p", q_currsvcname() ).replace( "%s", rights_record[ "currspaceright" ].name ).replace("%a", window.location.href) ;
	document.mainform.mission.value = "addComment" ;
	q_ajaxsubmit( { noteid : noteid , name : name, email : email , date:date, comment:comment, isadmin:isadmin, website:website , emaildata : emaildata } , callback , args ) ; 
}

function comment_addcomment( x ) {
	var div = getContainer( x );
	var noteid = div.getAttribute( "target");
	var r = qsn_thenotes[ noteid ] ;
	q_fsm_wait() ;
	comment_xaddcomment( div , noteid , comment_loggedaddcommentdone , [ r , div ] ) ;
}

function comment_loggedaddcommentdone( x , r , div ) {
	r.nbcomments = r.nbcomments + 1 ;
	comment_rendercomments( div  );
	q_fsm_delete() ;
	var commentnewcomment = gebcn( div , "comment_newcomment" ) ;
	var inp = getElementsByClassName( commentnewcomment, "comment_inputarea" ) ;
	inp[ 3 ].innerHTML = inp[ 3 ].value = "" ;
	comment_hideshowcommentform( div ) ;
}

function comment_deletecomment( x ) {
	var div = getContainer( x ) ;
	var noteid = div.getAttribute("target");
	if ( ! confirm( comment_message[ "confirmdeletecomment" ] ) ) return ;
	document.mainform.mission.value = "delComment" ;
	q_ajaxsubmit( { noteid : noteid , commentid : x.commentindex }, comment_deletecomment_callback , [ div, noteid ] ) ; 
}

function comment_deletecomment_callback( x , div, noteid ) {
	var r = qsn_thenotes[ noteid ] ;
	r.nbcomments = r.nbcomments - 1;
	comment_rendercomments( div ) ;	
}

function comment_displaycomments( x ) { 
	var noteid = getContainer( x ).id;
	var div = create_elem("DIV", { className : "comment_fullscreendiv container", align : "left", style : { backgroundColor : "white", fontSize : "12px", width : "600px" } } ) ;
	div.setAttribute( "target", noteid ) ;
	div.onmousedown = function( event ){ q_stopPropagation( event ); }
	
	div.appendChild( create_elem( "DIV", { className : "comment_commentsheader" , innerHTML : gebcn( noteid, "comment_commentsheader").innerHTML  } ) );
	div.appendChild( create_elem( "DIV", { className : "comment_comments" , innerHTML : gebcn( noteid, "comment_comments").innerHTML  } ) );
	div.appendChild( create_elem( "DIV", { className : "comment_addnewcomment" , innerHTML : gebcn( noteid, "comment_addnewcomment").innerHTML, style : { display : "none" } } ) );
	var commentnewcomment = div.appendChild( create_elem( "DIV", { className : "comment_newcomment" , innerHTML : gebcn( noteid, "comment_newcomment").innerHTML, style : { display : "none" } } ) );
//	gebcn(div, "sendbtn").setAttribute( "target", noteid );
	
	// On initialise le formulaire
	var inp = getElementsByClassName( commentnewcomment, "comment_inputarea" ) ;		
	if ( q_isadmin( memberid ) ) { // mode admin
		inp[ 0 ].value = q_username( memberid ) ;
		hideblock( inp[ 1 ].parentNode.parentNode ) ; // masque l'e-mail
		hideblock( inp[ 2 ].parentNode.parentNode ) ; // masque l'adresse web
	} else {
		comment_newcommentblurdefault( inp[ 0 ], "nameinput" ) ;
		comment_newcommentblurdefault( inp[ 1 ], "emailinput" ) ;
		if ( q_username( memberid ) != common_message[ "undefineduser" ] ) inp[ 0 ].value = q_username( memberid ) ;
	}
	comment_newcommentblurdefault( inp[ 3 ], "commentinput" ) ;	
	
	q_fsm_reveal( { src : div , title : comment_message["commentsadministration"] , reveal_callback : "comment_fsm_reveal"  } ) ;
}

function comment_fsm_reveal( div, json  ){ 
	comment_rendercomments( json.src ) ;
	comment_visiblecommentform( json.src , true ); 
 }

function comment_rendercomments( div ) {
	var noteid = div.getAttribute( "target" );
	document.mainform.mission.value = "getComment" ;
	q_ajaxsubmit( { noteid : noteid }, comment_rendercomments_callback, [ div, noteid ] ) ; 
}

function comment_rendercomments_callback( x, div, noteid ) {
	var r = qsn_thenotes[ noteid ] ;
	var commentslist = gebcn( div, "comment_commentslist");
	q_innerHTML( commentslist, "");
	
	var n = x.comments.length ;
	r.nbcomments = x.comments.length ; 
	
	var d2 = gebcn( div, "comment_commentsorderinfo");
	var d3 = gebcn( div, "comment_commentsorder");
	var d4 = gebcn( div, "comment_newcomment");
	
	var t = create_table( commentslist , { width : "100%" } );
	if ( n == 0 ) { 
		hideblock( [ d3, d2 ] ) ;
		//comment_hideshowcommentform( div ) ; // affiche le formulaire de commentaire
	} else if ( n == 1 ) {
		hideblock( [ d3, d2 ] ) ;
		comment_renderonecomment( div, t, 0, x.comments[ 0 ] ) ;
	} else {
		if ( r.inverseorder ) {
			d3.style.backgroundPosition = "top" ;
			d2.innerHTML = comment_message[ "order1" ] ;
			for ( var i = n-1; i >= 0; i-- ) comment_renderonecomment( div, t, i, x.comments[ i ] ) ;
		} else {
			d3.style.backgroundPosition = "bottom" ;
			d2.innerHTML = comment_message[ "order0" ] ;
			for ( var i = 0; i < n; i++ ) comment_renderonecomment( div, t, i, x.comments[ i ] ) ;
		}
		showblock( [ d3, d2 ] ) ;
	}
//	showblock( d4 );

	commentslist.appendChild( t );
}

function comment_renderonecomment( div, t, i, c ) {
	var tr, td, isdark, s, src ;
	var origcol = getrealcolor( gcs( gebtn(gebcn(div, "comment_commentsheader"), "TABLE" ) , "backgroundColor" ) );
	
	//var bcgcol = rgbcontrastcolor( origcol, 10 );
	var bcgcol = origcol;
	var bcgcol2 = rgbcontrastcolor( origcol, 80 );
	//var bcgcol2 = rgbcontrastcolor150( origcol ); // ne marche pas sur IE
	
	var textcol = ( rgb2brightness( bcgcol ) < 50 ) ? "#FFF" : "#000" ;
	var textcol2 = ( rgb2brightness( bcgcol2 ) < 50 ) ? "#FFF" : "#000" ;
	var cm = comment_message ;
	var path = "/services/comment/images/" ;
	t.style.cellPadding="0px";
	tr = t.insertRow( -1 ) ;
	
	// coin gauche et icône
	td = create_td( tr , { width: "1%", style : { backgroundColor: ( ( i % 2 != 0 ) ? bcgcol : bcgcol2 ) } } ) ;
	d = create_elem( "div", { className: "png comment_leftcorner" } ) ;	
	src = ( c.isadmin == 1 ) ? "star16.png" : "arrow16.png" ;
	d.appendChild( create_elem( "IMG", { className: "png", src : path + src } ) ) ;
	td.appendChild( d ) ;
	
	// numéro
	td = create_td( tr , { width: "1%", align: "left" } ) ;
	d = td.appendChild( create_elem( "DIV", { className: "comment_commentnumber", innerHTML : ( i + 1 ) + "." , style : { backgroundColor : ( ( i % 2 != 0 ) ? bcgcol : bcgcol2 ), color : ( ( i % 2 != 0 ) ? textcol : textcol2 ) } } ) );
	
	// nom
	td = create_td( tr , { width: "1%", align: "left" } ) ;
	d = td.appendChild( create_elem( "DIV", { className: "comment_commentauthor", innerHTML : c.name , style : { backgroundColor : ( ( i % 2 != 0 ) ? bcgcol : bcgcol2 ), color : ( ( i % 2 != 0 ) ? textcol : textcol2 ) } } ) );

	// coin droit
	td = create_td( tr , { width: "1%", style : { backgroundColor: ( ( i % 2 != 0 ) ? bcgcol : bcgcol2 ) } } ) ;
	td.appendChild( create_elem( "DIV", { className: "png comment_rightcorner" } ) ) ;
	
	// td intermédiaire IE6
	td = create_td( tr , { width: "1%" } ) ;
	// lien web
	td = create_td( tr , { width: "1%", align: "left" } ) ;
	if ( ( c.website != "" ) ) {
		s = create_elem( "A", { href : "http://" + c.website , target : "_blank" , title : cm[ "website" ].replace( "%s", c.name ) } ) ;
		d = create_elem( "IMG", { src : path + "globe16.png", alt : "" , border : "0" , style : { cursor : "pointer" } } ) ;
		s.appendChild( d ) ;
		td.appendChild( s ) ;
	}
	// lien supprimer
	td = create_td( tr , { align: "center", width : "93%" } ) ;
	if ( window.members && window.members[ memberid ] && window.members[ memberid ].userlevel == "admin" ) {
		d = create_elem( "A", { href: "quomodo:comment", innerHTML : cm[ "deletecomment" ], style : { fontSize : "11px", color : "red" } } ) ;
		d = td.appendChild( d ) ;
		d.commentindex = c.id ;
		d.onclick = function( ) { comment_deletecomment( this ); return false; } ;
	}
	
	// date
	td = create_td( tr , { width : "1%", align: "right" } ) ;
	td.appendChild( create_elem( "SPAN", { className: "comment_commentdate", innerHTML : q_isot2string( c.date.toString() ) } ) ) ;
	
	// texte
	tr = t.insertRow( -1 ) ;
	td = create_td( tr );
	td = create_td( tr , { colSpan: "7" } ) ;
	d = td.appendChild( create_elem( "DIV", { className: "comment_commentext", innerHTML : c.comment.replace( /(.)(\1{15})/g , "$1$2 " ), style : { backgroundColor : ( ( i % 2 != 0 ) ? bcgcol : bcgcol2 ) , color : ( ( i % 2 != 0 ) ? textcol : textcol2 ) } } ) ) ;
}

/*
function -
function UTILES
*/

function q_isadmin( x ) {
	if ( window.web_js_loaded ) return false ;
	if ( ! members[ x ] ) return false ;
	if ( members[ x ].userlevel == "admin" ) return true ;
	else return false ;
}

function comment_suppressnote( x ){
	var yes = qsn_suppressnote( x , true ) ;
	/*
	le xml n'est pas supprimé, sinon il y'a risque d'erreur en mode web (si l'admin en publie pas ses modofications)
	if( yes ) {
		document.mainform.mission.value = "deleteXML" ;
		q_ajaxsubmit( { noteid : x } ) ; 
	}
	*/
}

/*
function -
function TOOLBAR
*/

function comment_toolbarversion( id ) {
	return 1 ;
}

var comment_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "comment_js_loaded" ) ;


var contact_message = {
"newnoteprompt" : "Indiquez ici les instructions pour les visiteurs." ,
"notetitleprompt" : "Cliquez ici pour donner un titre au formulaire." ,
"labelprompt" : "(sans titre)" ,
"selectprompt" : "Cliquez ici pour ajouter vos options." ,
"addressprompt" : "(tous les admins)" ,
"input" : "texte sur une ligne" ,
"email" : "adresse e-mail" ,
"textarea" : "texte sur plusieurs lignes" ,
"select" : "liste de choix" ,
"checkboxes" : "cases à cocher" ,
"mandatory" : "champ obligatoire" ,
"optional" : "réponse facultative" ,
"expemail" : "utiliser comme expéditeur" ,
"expemailinfo" : "Le e-mail envoyé aux administrateurs aura cette adresse comme Expéditeur." ,
"expemailnotunique" : "Vous ne pouvez pas utiliser plusieurs adresses e-mail comme expéditeur.\n\nSi vous désirez demander plusieurs adresses e-mail, l'une d'elles seulement peut servir d'adresse d'expédition du message aux administrateurs." ,
"name_label" : "Nom :" ,
"firstname_label" : "Prénom :" ,
"email_label" : "Adresse e-mail :" ,
"deleteentry" : "Supprimer ce champ" ,
"confirmdeleteentry" : "Voulez-vous vraiment supprimer ce champ du formulaire ?" ,
"addentry" : "Ajouter un champ" ,
"editlabel" : "Cliquez pour modifier le titre du champ" ,
"missinglabel" : "Le champ %s n'a pas de titre. Veuillez lui donner un titre." ,
"missingemailaddress" : "Vous devez indiquer une adresse e-mail pour l'envoi des demandes de contact." ,
"invalidemailaddress" : "L'adresse e-mail d'envoi des demandes de contact ne semble pas valide. Veuillez indiquer une adresse valide (sans accent ni espace)." ,
"oneinvalidemailaddress" : "Envoi des demandes de contact : la %s adresse e-mail ne semble pas valide. Veuillez indiquer une adresse valide (sans accent ni espace)." ,
"tomuchemailaddress" : "Vous ne pouvez pas envoyer le message à plus de 3 adresses e-mail. Veuillez supprimer %s adresse(s)." , 
"emailad1" : "première" ,
"emailad2" : "deuxième" ,
"emailad3" : "troisième" ,
"missingoptions" : "Vous n'avez pas indiqué de choix pour le champ \"%s\". Vous devez proposer au moins un choix." ,
"missinganswer" : "Le champ \"%s\" est obligatoire pour pouvoir valider le formulaire." ,
"objectmail" : "[Quomodo] - Message de la page \"%p\" de votre site \"%s\"" ,
"bodyheader" : "Un internaute prend contact depuis la page \"%p\" de votre site :\r%pageurl" ,
"bodytitle" : "Titre du formulaire : " ,
"bodydesc" : "Présentation du formulaire : " , 
"bodyalertreplyok" : "\rPour contacter l'internaute, vous pouvez répondre directement à cet e-mail." ,
"bodyalertdonoreply" : "\rATTENTION ! Ne répondez pas directement à ce mail, votre réponse arriverait à club@quomodo.com et non pas à l'internaute !\rPour répondre à l'internaute, utilisez son adresse e-mail s'il l'a indiquée." ,
"bodyfooter" : "\r\rL'équipe Quomodo\r\rPour toute question ou suggestion, rendez-vous sur l'aide de Quomodo:\rhttp://aide.quomodo.com\rVous pouvez également nous contacter en envoyant un mail à:\rcontact@quomodo.com\r" ,
"mailsent" : "Votre demande de contact a été transmise aux administrateurs du site." ,
"mailnotsent" : "Un problème est survenu. La demande de contact n'a pas pu être envoyée." ,
"snname" : "Note Contact" ,
"plug" : "Contact_Définissez et proposez des formuaires de contact, d'inscription, de commande  à vos visiteurs." ,
"desc" : "(...)"
} ;

var contact_msgs_fr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "contact_msgs_fr_js_loaded" ) ;

var contact_templates_prepared = false ;
var contact_leftcol_prepared = false ;

//var contact_json_template = { version : 1 ,  text : "" , color : "3" , textsize : "2" , textfont : "1" , headerdisplay : "1" , header : { color: "0", text : "" } , signature : "0" , form: [ { type: "input", label: "", mandatory: true }, { type: "input", label: "", mandatory: false }, { type: "select", label: "", options: [ "option 1", "option 2", "option 3" ] } ], emails : [ ], common: { left : 20 , top : 0 , width : 450 } } ; 
var contact_json_template = { version : 2 ,  text : "" , color : "rgb(100%,100%,100%)" , header : { display: "true", color: "c1", text : "" } ,  textstyles: { size : "1" , font : "0" , bold : "false" , italic : "false" }, showsignature : "false" , form: [ ], emails : [ ], common: { left : 20 , top : 0 , width : 450 } } ; 

var contact_formtypes = [ "input", "textarea", "select", "checkboxes", "email" ] ;

var contact_colordesc = { "qmc1" : "color" , "qmc2_qmc1" : "header.color" , "qmc3" : contact_qmc3} ; 
var contact_textdesc = { "qtxt1" : { "size" : "textstyles.size" , "font" : "textstyles.font" ,  "bold" : "textstyles.bold" , "italic" : "textstyles.italic" }  };

var contact_leftcol_description = [ 
{ what : "notecolor" , tabname : "tabcolor" , visible : true , elems : [ 
	{ handler : "qsn_addqlubcolorblock" , params : { jsonpath : "color" , others : true ,  transparent:true , title:false , menuseparator: false , modifynote : "qsn_setcolors"  } }
	] } , 
{ what : "bandeau" , tabname : "tabheader" , visible : false , elems : [    
	{ handler : "qsn_addheaderhideshow" , params : { notekind:"contact" , title:"" , jsonpath : "header.display" } }, 
	{ handler : "qsn_addheadercolor" , params : { notekind:"contact" , jsonpath : "header.color" } }
	] } , 
{ what : "textstyles" , tabname : "tabtext" , visible : false , elems : [ 
	{ handler : "qsn_addfontfsizes"   , params : { jsonpath : "textstyles.size" , ncols : 2  } } , 
	{ handler : "qsn_addfontfamilies", params : { jsonpath : "textstyles.font" , ncols : 2  } } , 
	{ handler : "qsn_addtextoptions", params : { jsonpath : "textstyles" , ncols : 2 , opts : [ "bold" , "center" , "italic"  ] } }
	] } , 
{ what : "signature" , tabname : "tabsignature" , visible : false , elems : [ 
	{ handler : "qsn_addsignature" , params : { jsonpath : "showsignature" , ncols : 1} }
	] }
] ;


function contact_qmc3( r ) {
	return "/services/contact/images/contact48.png" ;
}

function contact_upgradejson( r ) {
	if ( ( r.version ) && ( r.version == contact_json_template.version ) ) return r ;
	if ( r.version<2 ) contact_upgradejsontov2( r ) ;
	r.version = contact_json_template.version;
	return r ;
}

function contact_upgradejsontov2(r) {
	r.textstyles = { size: String( Math.max( Math.min( 3 - parseInt( r.textsize , 10 ) , 2 ) , 0 ) ) , bold : "false" , italic : "false" } ;
	var oldfonts = [ 0 , 1 , 3 , 4 ] ;
	r.textstyles.font = oldfonts[ parseInt( r.textfont , 10 ) - 1 ] ;
	r.header.display = String( r.headerdisplay == 1 ) ;
	r[ "showsignature" ] = String( r.signature !=0 ) ;
	delete r.textsize ;
	delete r.textfont ;
	delete r.headerdisplay ;
	delete r.signature ;
	return r ;
}

/*
function -
function RENDER
*/

function contact_template( id ) {
	if ( contact_templates_prepared ) return qsn_template( id , true ) ;
	qsn_installcontainer( "view" , "contact" , ge( "contact_notecontent" ).innerHTML ) ;
	var div = qsn_installcontainer( "edit" , "contact" , ge( "contact_notecontent_edit" ).innerHTML ) ;
	contact_templates_prepared = true ;
	return qsn_template( id , true ) ;
}

function contact_renderhtml( noteid ) {
	var div = getelement( noteid ) ;
	div.minWidth = "200px" ;
	var r = qsn_thenotes[ noteid ] ;
	var t = gebcn( div , "contact_text" ) ;
	var ow = div.offsetWidth ;
	if ( qsn_currstate != "edit" ) {
		t.innerHTML = r.text.replace( /(\n|\r)/g , "<br />" ) ;
		contact_renderform_view( div, r ) ;
	} else {
		t.value = r.text ;
		contact_blurdefault ( t ) ;
		contact_renderform_edit( div, r ) ;
		contact_addressblurdefault( gebcn( div, "contact_forminputmail" ) ) ;
	}
	qsn_container_renderhtml( div , r ) ;
	qsn_settextproperties( noteid ) ;
	qsn_setcolors( noteid ) ;
}

function contact_renderform_edit( div, r ) {
	if ( ! r ) r = qsn_thenotes[ div.id ] ;
	var f = r.form ;
	// default form
	if ( f.length == 0 ) f = [ { type: "input", label: contact_message[ "name_label" ], mandatory: true }, { type: "input", label: contact_message[ "firstname_label" ], mandatory: true }, { type: "email", label: contact_message[ "email_label" ], mandatory: true, expemail: true } ] ;
	var t = gebcn( div, "contact_form" ) ;
	for ( var i=0; i < f.length; i ++ ) contact_addentry( t, -1, f[ i ] ) ;
	gebcn( div, "contact_forminputmail" ).value = r.emails.join( ", " ) ;
}

function contact_addentry( t, index, ff ) { 
	var tr = t.insertRow( index ) ;
	var td, d, e, ft ;
	// delete
	contact_appendtdwidthimage( tr, "delete16.png", contact_message[ "deleteentry" ] ).onclick = function() { contact_deleteentry( this ); return false; } ;
	// label
	td = tr.insertCell( -1 ) ;
	td.className = "contact_inputlabeltd" ;
	td.vAlign = "top" ;
	e = td.appendChild( create_elem( "INPUT", { className: "contact_formelem contact_forminput contact_inputlabel qmc1 bg_self__text_bw_bd_bw qtxt1 all", type: "text",  value: ff.label, title: contact_message[ "editlabel" ] } ) ) ;
	e.onmousedown = function( event ) { q_stopPropagation( event ) ; } ;
	e.onfocus = function() { contact_labelfocusdefault( this ) ; } ;
	e.onblur = function() { contact_labelblurdefault( this ) ; } ;
	contact_labelblurdefault( e ) ;
	// type
	td = tr.insertCell( -1 ) ;
	td.vAlign = "top" ;
	td.className = "contact_inputoptiontd" ;
	e = td.appendChild( create_elem( "SELECT", { className: "contact_forminput" } ) ) ;
	for ( var j=0; j<contact_formtypes.length; j++ ) {
		ft = contact_formtypes[ j ] ;
		e.options[ j ] = new Option ( contact_message[ ft ], ft ) ;
		if ( ff.type == ft ) e.options[ j ].selected = "selected" ;
	}
	e.onmousedown = function( event ) { q_stopPropagation( event ) ; } ;
	e.onchange = function() { contact_changecontacttype( this ) ; } ;
	// options select
	d = td.appendChild( create_elem( "DIV", { style: { display: ( ( ff.type == "select" ) || ( ff.type == "checkboxes" ) ? "block" : "none"), padding: "2px 0" } } ) ) ;
	e = d.appendChild( create_elem( "TEXTAREA", { className: "contact_forminput", style: { height: "70px" } } ) ) ;
	e.onmousedown = function( event ) { q_stopPropagation( event ) ; } ;
	e.onfocus = function() { contact_selectfocusdefault( this ) ; } ;
	e.onblur = function() { contact_selectblurdefault( this ) ; } ;
	if ( ff.options ) {
		for ( var j=0; j<ff.options.length; j++ ) {
			e.value += ff.options[ j ] + "\n" ;
		}
	}
	contact_selectblurdefault( e ) ;
	// option mandatory
	d = td.appendChild( create_elem( "DIV", { style: { display: ( ( ff.type == "select" ) || ( ff.type == "checkboxes" ) ? "none" : "block"), padding: "2px 0" } } ) ) ;
	e = d.appendChild( create_elem( "INPUT", { type: "checkbox" } ) ) ;
	e.checked = ff.mandatory ;
	e.onmousedown = function( event ) { q_stopPropagation( event ) ; } ;
	d.appendChild( create_elem( "SPAN", { innerHTML: contact_message[ "mandatory" ] } ) ) ;
	// option email
	d = td.appendChild( create_elem( "DIV", { style: { display: ( ( ff.type == "email" ) ? "block" : "none"), padding: "2px 0" } } ) ) ;
	e = d.appendChild( create_elem( "INPUT", { type: "checkbox" } ) ) ;
	e.checked = ff.expemail ;
	e.onmousedown = function( event ) { q_stopPropagation( event ) ; } ;
	d.appendChild( create_elem( "SPAN", { innerHTML: contact_message[ "expemail" ] } ) ) ;
	d.appendChild( create_elem( "P", { innerHTML: contact_message[ "expemailinfo" ], style: { fontSize: "11px", lineHeight: "12px", color: "#777", padding: "2px", margin: "0" } } ) ) ;
	// add button
	contact_appendtdwidthimage( tr, "add16.png", contact_message[ "addentry" ] ).onclick = function() { contact_newentry( this ); return false; } ;
	return tr ;
}

function contact_appendtdwidthimage( tr, src, title ) {
	var td = tr.insertCell( -1 ) ;
	td.width = "16" ;
	td.vAlign = "top" ;
	var img = create_elem( "IMG", { width: "16",  height: "16", className: "png", src:  "/services/contact/images/" + src, title: title, style : { cursor : "pointer" } } ) ;
	img = td.appendChild( img ) ;
	img.onmousedown = function( event ) { q_stopPropagation( event ) ; } ;
	return img ;
}

function contact_renderform_view( div, r ) {
	if ( ! r ) r = qsn_thenotes[ div.id ] ;
	var f = r.form ;
	var t = gebcn( div, "contact_form" ) ;
	var tr, td, ff, d, e, ft ;
	var displaymandatory = false ;
	for ( var i=0; i < f.length; i ++ ) {
		ff = f[ i ] ;
		tr = t.insertRow( -1 ) ;
		// label
		td = tr.insertCell( -1 ) ;
		td.width = "40%" ;
		td.vAlign = "top" ;
		e = td.appendChild( create_elem( "DIV", { className: "contact_formelem contact_formlabel qmc1 text_bw qtxt1 all", innerHTML: ff.label } ) ) ;
		td = tr.insertCell( -1 ) ;
		td.vAlign = "top" ;
		// type
		tr.className = tr.type = ff.type ;
		if ( ff.type == "select" ) {
			e = td.appendChild( create_elem( "SELECT", { className: "contact_formelem contact_forminput qtxt1 all" } ) ) ;
			for ( var j=0; j<ff.options.length; j++ ) {
				ft = ff.options[ j ] ;
				e.options[ j ] = new Option ( ft, ft ) ;
				if ( j == 0 ) e.options[ j ].selected = "selected" ;
			}
		} else if ( ff.type == "checkboxes" ) {
			for ( var j=0; j<ff.options.length; j++ ) {
				e = td.appendChild( create_elem( "INPUT", { type: "checkbox" } ) ) ;
				e.style[ "margin-right" ] = "6px" ;
				td.appendChild( create_elem( "SPAN", { className: "contact_formelem qtxt1 all", innerHTML: ff.options[ j ] } ) ) ;
				td.appendChild( create_elem( "BR" ) ) ;
			}
		} else if ( ff.type == "textarea" ) {
			e = td.appendChild( create_elem( "TEXTAREA", { className: "contact_formelem contact_forminput qmc1 bg_self__text_bw_bd_bw qtxt1 all", rows: "5" } ) ) ;
		} else if ( ( ff.type == "input" ) || ( ff.type == "email" ) ) {
			e = td.appendChild( create_elem( "INPUT", { className: "contact_formelem contact_forminput qmc1 bg_self__text_bw_bd_bw qtxt1 all", type: "text" } ) ) ;
		}
		e.onmousedown = function( event ) { q_stopPropagation( event ) ; } ;
		// options
		tr.mandatory = ff.mandatory ;
		td = tr.insertCell( -1 ) ;
		td.vAlign="top";
		td.align="center";
		td.appendChild( create_elem( "SPAN", { className: "contact_mandatorysign", innerHTML: ( ff.mandatory ? "*" : "" ) } ) ) ;
		if ( ff.mandatory ) displaymandatory = true ;
	}
	visibleblock( gebcn( div, "contact_showmandatory" ) , displaymandatory );
}

function contact_changecontacttype( x ) {
	var d = x.parentNode.getElementsByTagName( "DIV" ) ;
	var s = contact_formtypes[ x.selectedIndex ] ;
	if ( ( s == "select" ) || ( s == "checkboxes" ) ) hideshowblock( d[ 1 ], d[ 0 ] ) ;
	else hideshowblock( d[ 0 ], d[ 1 ] ) ;
	visibleblock( d[ 2 ], ( s == "email" ) ) ;
}

/*
function -
function EDIT
*/

function contact_saveedit( ) {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	
	// check emails
	var inputmail = gebcn( qsn_edittarget , "contact_forminputmail" ) ;
	var v = inputmail.value ;
	if ( v == contact_message[ "addressprompt" ] ) v = "" ;
/*
	if ( v == "" ) {
		alert ( contact_message [ "missingemailaddress" ] ) ;
		return focusandselect ( inputmail ) ;
	}
*/
	v = v.replace( /(^ *)|( *$)/g, "" ) ;
	v = v.replace( / *, */g, "," ) ;
	var a = v ? v.split( "," ) : [] ; // sinon on a : [ "" ] !!!
	var tomail = [ ] ;
	if ( a.length == 1 ) {
		if ( ! verbosevalidemail ( a[ 0 ] , contact_message [ "invalidemailaddress" ] ) ) {
			// alert ( contact_message [ "invalidemailaddress" ] ) ;
			return focusandselect ( inputmail ) ;
		} else tomail.push( a[ 0 ] ) ;
	} else {
		if ( a.length > 3 ) {
			alert ( contact_message [ "tomuchemailaddress" ].replace( "%s", ( a.length - 3 ) ) ) ;
			return focusandselect ( inputmail ) ;
		}
		for ( var i = 0; i < a.length; i++ ) {
			if ( ! verbosevalidemail ( a[ i ] , contact_message [ "oneinvalidemailaddress" ].replace( "%s", contact_message [ "emailad" + ( i+1 ) ] ) ) ) {
				// alert ( contact_message [ "oneinvalidemailaddress" ].replace( "%s", contact_message [ "emailad" + ( i+1 ) ] ) ) ;
				return focusandselect ( inputmail ) ;
			} else tomail.push( a[ i ] ) ;
		}
	}
	r.emails = tomail ;
		
	// check label and select options
	var t = gebcn( qsn_edittarget, "contact_form" ) ;
	var form = [ ] ;
	var tr, e, l, so ;
	var expemailcount = 0 ;
	for ( var i = 1; i < t.rows.length; i++ ) {
		var f = { type: "input", label: "?", options: [ ], mandatory: false } ;
		tr = t.rows[ i ] ;
		l = tr.cells[ 1 ].firstChild.value ;
		if ( l == contact_message[ "labelprompt" ] ) l = "" ;
		if ( l == "" ) {
			alert ( contact_message [ "missinglabel" ].replace( "%s", i ) ) ;
			return focusandselect ( tr.cells[ 1 ].firstChild ) ;
		} else f.label = l ;
		e = tr.cells[ 2 ].firstChild ;
		f.type = contact_formtypes[ e.selectedIndex ] ;
		if ( ( f.type == "select" ) || ( f.type == "checkboxes" ) ) {
			so = e.nextSibling.firstChild.value ;
			if ( so == contact_message[ "selectprompt" ] ) so = "" ;
			else {
				so = so.replace( /[\n\r]+/g , "\n" ) ;
				so = so.replace( /\n[ \t\n]*\n/g , "\n" ) ;
				so = so.replace( /((^\n)|(\n$))/g , "" ) ;
			}
			if ( so == "" ) {
				alert ( contact_message [ "missingoptions" ].replace( "%s", f.label ) ) ;
				return focusandselect ( e.nextSibling.firstChild.value ) ;
			} else f.options = so.split( "\n" ) ;
		} else if ( f.type == "email" ) {
			f.expemail = e.nextSibling.nextSibling.nextSibling.firstChild.checked ;
			if ( f.expemail == true ) {
				expemailcount++ ;
				if ( expemailcount > 1 ) {
					alert ( contact_message [ "expemailnotunique" ] ) ;
					return focusandselect ( e.nextSibling.firstChild.value ) ;
				}
			}
		}
		f.mandatory = ( ( f.type == "select" ) || ( f.type == "checkboxes" ) ) ? false : e.nextSibling.nextSibling.firstChild.checked ;
		form.push( f ) ;
	}
	r.form = form ;
	r.text = gebcn( qsn_edittarget , "contact_text" ).value.replace( /\r\n/g , "\r") ;
	if ( r.text == contact_message[ "newnoteprompt" ] ) r.text = "" ;
	qsn_container_saveedit() ;
	qsn_saveedit( true ) ;
}

function contact_displaysettings() {
	qsn_initdisplaysetting() ;
	return false ;
}

function contact_focusdefault( x ) {
	if ( x.value == contact_message[ "newnoteprompt" ] ) x.value = "" ;
}

function contact_blurdefault( x ) {
	x.value = x.value || contact_message[ "newnoteprompt" ] ;
}

function contact_labelfocusdefault( x ) {
	if ( x.value == contact_message[ "labelprompt" ] ) x.value = "" ;
}

function contact_labelblurdefault( x ) {
	x.value = x.value || contact_message[ "labelprompt" ] ;
}

function contact_selectfocusdefault( x ) {
	if ( x.value == contact_message[ "selectprompt" ] ) x.value = "" ;
}

function contact_selectblurdefault( x ) {
	x.value = x.value || contact_message[ "selectprompt" ] ;
}

function contact_addressfocusdefault( x ) {
	if ( x.value == contact_message[ "addressprompt" ] ) x.value = "" ;
}

function contact_addressblurdefault( x ) {
	x.value = x.value || contact_message[ "addressprompt" ] ;
}

function contact_newentry( x ) {
	var div = qsn_edittarget ;
	var r = qsn_thenotes[ div.id ] ;
	var t = gebcn( div, "contact_form" ) ;
	for ( var i=1; i<t.rows.length; i++ ) showblock( t.rows[ i ].cells[ 0 ].firstChild ) ; // suppress
	var tr = contact_addentry( t, x.parentNode.parentNode.rowIndex + 1, { type: "input", label: "", mandatory: false } ) ;
	var inp = gebcn( tr, "contact_inputlabel" ) ;
	inp.onfocus = function() { contact_labelfocusdefault( this ) ; } ;
	inp.onblur = function() { contact_labelblurdefault( this ) ; } ;
	qsn_settextproperties( [inp] ) ;
	qsn_setcolors( [inp] );
	focusandselect( inp ) ;
}

function contact_deleteentry( x ) {
	q_deleteRow( x.parentNode.parentNode ) ;
	// last entry ?
	var t = gebcn( qsn_edittarget, "contact_form" ) ;
	if ( t.rows.length == 2 ) hideblock( t.rows[ 1 ].cells[ 0 ].firstChild ) ;
}

/*
function -
function MAIL
*/

function contact_sendmessage( x ) {
	if ( ! q_readytosubmit() ) return false ;
	var div = getContainer( x ) ;
	var r = qsn_thenotes[ div.id ] ;

	var t = gebcn( div, "contact_form" ) ;
	var body = "" ;
	var expemail = null ;
	var f, tr, e, v ;
	for ( var i=0; i < r.form.length; i++ ) {
		f = r.form[ i ] ;
		body += f.label ;
		tr = t.rows[ i ] ;
		e = tr.cells[ 1 ].firstChild ;
		tr.type = tr.type || tr.className ;
		if ( tr.type == "select" ) {
			v = e.value ;
			body += " (" + contact_message[ "select" ] + ") :\n" ;
		} else {
			if ( tr.type == "textarea" ) v = isie6() ? e.innerHTML : e.value ;
			else if ( tr.type == "checkboxes" ) {
				var inputs = tr.cells[ 1 ].getElementsByTagName( "INPUT" ) ;
				var spans = tr.cells[ 1 ].getElementsByTagName( "SPAN" ) ;
				var texts = [ ] ;
				for ( var j = 0 ; j < inputs.length ; j++ ) if ( inputs[ j ].checked ) texts.push( spans[ j ].textContent || spans[ j ].innerText ) ;
				v = texts.join( "\n" ) ;
			} else v = e.value ;
			if ( f.mandatory ) {
				if ( v == "" ) {
					alert ( contact_message [ "missinganswer" ].replace( "%s", f.label ) ) ;
					return focusandselect ( e ) ;
				}
				body += " (" + contact_message[ "mandatory" ] + ") :\n" ;
			} else body += " :\n" ;
			if ( tr.type == "email" ) {
				if ( ( v != "" ) && ( ! verbosevalidemail( v ) ) ) {
					return focusandselect ( e ) ;
				}
				if ( f.expemail == true ) expemail = v ;
			}
		}
		body += v + "\n\n" ;
	}
	
	if ( window.clubhost ) var club_url = clubhost ;
	else var club_url = window.location.host + "/" + window.clubprivatedomain ;
	club_url = "http://" + club_url + "/" ;
	var pagename = "" ;
	if ( q_pagemode() == "web" ) {
		for ( var i in web_svctopages ) if ( currsvcid == web_svctopages[ i ].id ) pagename = web_svctopages[ i ].name ;
	} else pagename = q_currsvcjson().weblink ;

	var m = { } ;
	m[ "frommail" ] = expemail || "club@quomodo.com" ;
	m[ "objectmail" ] = contact_message[ "objectmail" ].replace( "%p", q_currsvcname() ).replace( "%s", rights_record[ "currspaceright" ].name ) ;
	m[ "bodymail" ] = contact_message[ "bodyheader" ].replace( "%p", q_currsvcname() ).replace( "%pageurl", club_url + pagename ) + ( expemail ? contact_message[ "bodyalertreplyok" ] : contact_message[ "bodyalertdonoreply" ] )+ "\n\n------\n" + contact_message[ "bodytitle" ] + "\n" + r.header.text + "\n\n" + contact_message[ "bodydesc" ] + "\n" + r.text + "\n\n------\n" + body + "------" + contact_message[ "bodyfooter" ] ;
	m[ "tomail" ] = r.emails.length ? r.emails : "admins" ;
	m[ "noteid" ] = div.id ;

	var nrows = t.rows.length ; 
	for ( var i = 0 ; i < nrows ; i++ ) t.deleteRow( -1 ) ; 
//	gebcn( div, "contact_form" ).innerHTML = "" ; bug IE
	contact_renderform_view( div, r ) ;
	qsn_settextproperties( div.id ) ;
	qsn_setcolors( div.id ) ;

	document.mainform.mission.value = "sendemailtoto" ;
	q_ajaxsubmitwithservice( "common@" + q_lang , m , contact_sendemessage_done , [ div.id ] ) ;
	
	return false ;
}

function contact_sendemessage_done( x , id ) {
	if ( x.mailsent == 0 ) return alert ( contact_message [ "mailnotsent" ] ) ;
/*
	var div = ge( id ) ;
	var t = gebcn( div, "contact_form" ) ;
	var e ;
	for ( var i=0; i <t.rows.length; i++ ) {
		e = t.rows[ i ].cells[ 1 ].firstChild ;
		if ( e.tagName == "INPUT" ) e.value = "" ;
		else if ( e.tagName == "TEXTAREA" ) e.innerHTML = e.value = "" ;
	}
*/
	alert ( contact_message [ "mailsent" ] ) ;
}


/*
function -
function MOUSEOVER/MOUSEOUT
*/

function contact_mouseover( elem , e ) {
	qsn_showlinks( elem, true ) ;
	if ( qsn_currstate != "view" ) return ;
	var cursor = ( q_clientX( e ) > ( elem.offsetLeft + elem.offsetWidth + qdr_leftcolwidth - qdr_resizewidth ) ) ? "e-resize" : "default" ;
	if ( elem.style.cursor != cursor ) elem.style.cursor = cursor ;
	if ( parseInt( qsn_thenotes[ elem.id ].color, 10 ) == -1 ) {
		elem.style.marginLeft = "-1px" ;
		elem.style.marginTop = "-1px" ;
		elem.style.borderWidth = "1px" ;
		elem.style.borderColor = "#333" ;
		elem.style.borderStyle = "dotted" ;
	}
}

function contact_mouseout( elem , e ) {
	qsn_showlinks( elem, false ) ;
	elem.style.cursor = "default" ;
	if ( parseInt( qsn_thenotes[ elem.id ].color, 10 ) == -1 ) {
		elem.style.marginLeft = "0px" ;
		elem.style.marginTop = "0px" ;
		elem.style.borderWidth = "0px" ;
	}
}

/*
function -
function TOOLBAR
*/

function contact_toolbarversion() {
	return 1 ;
}

/*
function -
function QWIZ
*/

function contact_mergeqwizdata( notejson, noteqwizkeys, qwiz_data ) {
	var v ;
	for ( var x in noteqwizkeys ) {
		v = noteqwizkeys[ x ] ;
		if ( x == "emails" ) {
			notejson[ "emails" ] = [ ] ;
			var m ;
			var n = 0 ;
			for ( var i=0; i<v.length; i++ ) {
				if ( n > 3 ) break ; // possibilité d'avoir 3 adresses valides dans un tableau de n adresses
				m = qwiz_data[ v[ i ] ] ;
				if ( ( m != "" ) && ( validemail ( m ) ) ) {
					notejson[ "emails" ].push( m ) ;
					n++ ;
				}
			}
		} else notejson[ x ] = qwiz_data[ v ] ;
	}
	return notejson ;
}

var contact_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "contact_js_loaded" ) ;


var countdown_message = {
"plug" : "Compte à rebours_Décomptez le temps qu'il reste avant un prochain événement.",
"defaultEvent" : "Nouvel Événement",
"defaultEventTitle" : "Réunion",
"dayDoesntExist" : "Ce jour n'existe pas",
"afterYear3000" : "Cette date est trop éloignée dans le temps !",
"lateDate" : "Cette date est déjà passée",
"validDate" : "Cette date est valide !",
"screen_WrittenOn" : "Le ",
"screen_WrittenAt" : " à ",
"screen_WrittenHour" : "h",
"remainingDays" : " jours",
"remainingDay" : " jour",
"remaining" : "Il reste :",
"elapsed" : "...passé depuis :",
"tip_displayLogo" : "afficher le logo",
"tip_hideLogo" : "masquer le logo",
"displayLogo" : "afficher le logo",
"hideLogo" : "masquer le logo"
} ;

var sky = ["La smartnote \"Compte à rebours\" montre un compte-à-rebours vers un événement défini par un utilisateur",
	"Permet de modifier l'événement choisi par les membres du groupe, son nom et ses date/heure d'échéance", 
	"Permet d'afficher ou de masquer le logo, pour avoir une note plus ou moins grande",
	"En haut : événement non accompli, en bas : arrivé à échéance, en bas à droite : taille réduite. Le changement des secondes n'est ici visible qu'à titre d'exemple, il ne s'agit pas d'un vrai compteur.",
	"Permet de supprimer la note"];

var countdown_msgs_fr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "countdown_msgs_fr_js_loaded" ) ;


/* countdown.js contains methods and properties specific to countdown notes */
var countdown_templates_prepared = false ;
var countdown_leftcol_prepared = false ;

var countdown_json_template = { version : 2, text : "", textsize : "1", textfont : "1", common : { width : 340 }, titreEvenement : "Réunion", anneeEvenement : 2007, moisEvenement : 0, jourEvenement : 1, heureEvenement : 0, minuteEvenement : 0, hasJustOpened : 1, logoIsHidden : 0, color : -1  } ;
/*Ranges for all variables in json : (the same as in the Date(); function)
dateEvenement : timestamp UTC
*/

var countdown_colordesc = { "qmc1" : "color" } ;

var countdown_leftcol_description = [
{ what : "notecolor" , tabname : "tabcolor" , visible : true , elems : [ 
	{ handler : "qsn_addqlubcolorblock" , params : { jsonpath : "color" , others : true ,  transparent:true , title:false , menuseparator: false , modifynote : "qsn_setcolors"  } } 
	] }
] ;

var countdown_searchitems = [ "titreEvenement" ] ;
var countdown_timer = null ;
var countdown_noteids = " " ;

function countdown_upgradejson( r ) {
	if ( ! r.version ) r.version = 1 ;
	if ( r.version == countdown_json_template.version ) return r ;
	if ( r.version < 2 ) r = countdown_upgradejsontov2( r ) ;
	if ( r.version < 3 ) r = countdown_upgradejsontov3( r ) ;
	r.version = countdown_json_template.version ;
	return r ;
}

function countdown_upgradejsontov2( r ) {
	r.color = -1 ;
	return r ;
}

function countdown_upgradejsontov3( r ) {
	r.anneeEvenement = null ; 
	r.moisEvenement = null ; 
	r.jourEvenement = null ; 
	r.heureEvenement = null ; 
	r.minuteEvenement = null ;  
	return r ;
}

function countdown_template( id ) {
	if ( countdown_templates_prepared ) return qsn_template( id , true ) ;
	var div = qsn_installcontainer( "view" , "countdown" , ge( "countdown_notecontent" ).innerHTML ) ;
	div.style.borderWidth = "0px" ;
	var div = qsn_installcontainer( "edit" , "countdown" , ge( "countdown_notecontent_edit" ).innerHTML ) ;
	countdown_templates_prepared = true ;
	return qsn_template( id , true ) ;
}

function countdown_toolbarversion() {
	return 1 ;
}

function countdown_addnote( id ) {
	if ( countdown_noteids.indexOf ( " " + id + " " ) == -1 ) countdown_noteids += id + " " ;
	var div = qsn_addnote ( id , true ) ;
	if ( ! div ) return false ;
	if ( ! countdown_timer ) {
		if ( q_pagemode() == "makeweb" ) countdown_refreshall () ;
		else countdown_timer = setInterval ( countdown_refreshall , 1000 ) ;
	}
	return div ;
}

function countdown_renderhtml( noteid ) {
	var r = qsn_thenotes[ noteid ] ;
	var div = getelement ( noteid ) ;
	qsn_container_renderhtml( div , r ) ;
	if ( qsn_currstate == "edit" ) {
		if (qsn_isnewnote) r.color = qsn_defaultcolor() ;
		qsn_setcolors( noteid ) ;
		return ;
	}
	countdown_renderevent( noteid ) ;
	//We update counter display the first time
	countdown_update (noteid);
	//Show or hide the logo, depending on previously saved preference
	countdown_renderlogo (noteid);
	// signature
	var sig = getElementByClassName( div , "signature" ) ;
	var notememberid = r.common.ownerid ;
	if ( notememberid == "quomodo" ) sig.innerHTML = " " ;
	else sig.innerHTML = qsn_username( r ) ;
	qsn_setcolors( noteid ) ;
}

function countdown_displaysettings() {
	qsn_initdisplaysetting() ;

	var json = qsn_thenotes[ qsn_edittarget.id ];
	if (json.hasJustOpened) {
		json.hasJustOpened = 0;
		var valeurTitre = countdown_message["defaultEvent"];
		var aujourdhui = new Date(); //Default Date is current date
		var valeurAnnee = aujourdhui.getFullYear();
		var valeurMois = aujourdhui.getMonth();
		var valeurJour = aujourdhui.getDate() - 1;
		var valeurHeure = aujourdhui.getHours();
		var valeurMinute = Math.floor(aujourdhui.getMinutes() / 5);
	} else {
		var valeurTitre = json.titreEvenement;
		var eventDate = json.timestampEvenement ;
		var localDate = new Date( eventDate ) ; 
		var valeurAnnee = localDate.getFullYear() ;
		var valeurMois = localDate.getMonth() ;
		var valeurJour = localDate.getDate() -1 ;
		var valeurHeure = localDate.getHours();
		var valeurMinute = Math.floor( localDate.getMinutes() / 5 );
	}

	gebcn( qsn_edittarget , 'countdown_edit_titre' ).value = valeurTitre ;
	//Generate Years list
	var containerAnnee = gebcn(qsn_edittarget,'countdown_edit_annee') ;
	var options = containerAnnee.getElementsByTagName("OPTION") ;
	var optioncount = options.length ;
	for ( var i = 0 ; i < optioncount ; i++ ) rm( containerAnnee.getElementsByTagName("OPTION")[ 0 ] ) ;
	var anneeEnCours = new Date().getFullYear();
	for (var i = anneeEnCours ; i < anneeEnCours + 5; i++ ) {
		if ( i ==  valeurAnnee ) containerAnnee.appendChild( create_option( { value : i  , name :  i , selected : true } ) ) ;
		else containerAnnee.appendChild( create_option( { value : i , name : i } ) ) ;
	}

	gebcn( qsn_edittarget , 'countdown_edit_mois' ).selectedIndex = valeurMois;
	gebcn( qsn_edittarget , 'countdown_edit_jour' ).selectedIndex = valeurJour;
	gebcn( qsn_edittarget , 'countdown_edit_heure' ).selectedIndex = valeurHeure;
	gebcn( qsn_edittarget , 'countdown_edit_minute' ).selectedIndex = valeurMinute;

	countdown_updateDateCheck(); //Check Date validity to update Date Check Badges
}

function countdown_saveedit() {
	var json = qsn_thenotes[ qsn_edittarget.id ] ;

	var annee = parseInt(gebcn(qsn_edittarget,'countdown_edit_annee').value, 10);
	var mois = parseInt(gebcn(qsn_edittarget,'countdown_edit_mois').value, 10);
	var jour = parseInt(gebcn(qsn_edittarget,'countdown_edit_jour').value, 10);
	var heure = parseInt(gebcn(qsn_edittarget,'countdown_edit_heure').value, 10);
	var minute = parseInt(gebcn(qsn_edittarget,'countdown_edit_minute').value, 10);	
	var titre = gebcn(qsn_edittarget,'countdown_edit_titre').value;

	var dateEvenement  = new Date(  annee , mois , jour , heure , minute , 0 );
	
	json.timestampEvenement = dateEvenement.getTime() ;
	json.titreEvenement = (titre) ? titre : countdown_message["defaultEventTitle"] ;

	qsn_saveedit( true ) ;
}

function countdown_checkDate () {
	//Get all the values that the user typed
	var annee = parseInt(gebcn(qsn_edittarget,'countdown_edit_annee').value, 10);
	var mois = parseInt(gebcn(qsn_edittarget,'countdown_edit_mois').value, 10);
	var jour = parseInt(gebcn(qsn_edittarget,'countdown_edit_jour').value, 10);
	var heure = parseInt(gebcn(qsn_edittarget,'countdown_edit_heure').value, 10);
	var minute = parseInt(gebcn(qsn_edittarget,'countdown_edit_minute').value, 10);

	//How many days are there in February for this month ?
	var daysInFebruary = ((annee % 4 == 0) && ( (!(annee % 100 == 0)) || (annee % 400 == 0))) ? 29 : 28;

	var daysInMonths = new Array();
	daysInMonths = ['31', daysInFebruary, '31', '30', '31', '30', '31', '31', '30', '31', '30', '31', '30', '31'];

	if (jour > daysInMonths[mois]) return countdown_message["dayDoesntExist"];
	if (annee > 3000) return countdown_message["afterYear3000"];
	var usersDate = new Date();
	usersDate.setFullYear(annee, mois, jour, heure, minute);
	usersDate = usersDate.getTime();
	var aujourdhui = new Date();
	aujourdhui = aujourdhui.getTime();

	if(usersDate < aujourdhui) return countdown_message["lateDate"];
	return countdown_message["validDate"];
}

function countdown_updateDateCheck () {

	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	var noteid = r.common.noteid ;
	var div = getelement( noteid );
	var resultatCheck = countdown_checkDate();

	if (resultatCheck == countdown_message["validDate"]) {
		gebcn(div, "CheckResultat" ).style.color = "" ; // "#30CE00";
		gebcn(div, "CheckResultat" ).style.backgroundColor = "";
	} else {
		gebcn(div, "CheckResultat" ).style.color = "#f00";
		gebcn(div, "CheckResultat" ).style.backgroundColor = "#fff";
	}
	gebcn(div, "CheckResultat" ).innerHTML = resultatCheck;
}

function countdown_refreshlist() {
	countdown_noteids = " " ;
	for ( var id in qsn_thenotes ) if ( qsn_thenotes [ id ] ) if ( qsn_thenotes [ id ].common.notekind == "countdown" ) if ( getelement ( id ) ) countdown_noteids += id + " " ;
	if ( countdown_noteids == " " ) clearInterval ( countdown_timer ) ; 
}

function countdown_refreshall () {
	if ( qsn_currstate == "edit" || q_fsmpresent() ) return ;
	var id ;
	var shouldrefresh = false ;
	var allNotes = countdown_noteids.split ( " " ) ;
	if ( allNotes.length == 2 ) {
		clearInterval ( countdown_timer ) ; 
		countdown_timer = null ;
		return ;
	}
	for ( var i = 1 ; i < (allNotes.length - 1) ; i++ ) {
		id = allNotes [ i ] ;
		if ( ! qsn_thenotes [ id ] || isremoved( ge( id ) ) ) shouldrefresh = true ;
		else if ( ( ! qsn_edittarget ) || ( id != qsn_edittarget.id ) ) countdown_update ( id ) ;
	}
	if ( shouldrefresh ) countdown_refreshlist() ; // next time it's OK
}

function countdown_renderevent ( noteid ) {
	var divNote = getelement ( noteid ) ;
	//Get the json
	var json = qsn_thenotes[ noteid ] ;

	//Get saved values in json
	var localDate = new Date(json.timestampEvenement) ;
	var titre = json.titreEvenement;
	var annee = localDate.getFullYear();
	var mois = localDate.getMonth() ;
	var jour = localDate.getDate() ;
	var heure = localDate.getHours() ;
	var minute = localDate.getMinutes() ;

	var divTitre = gebcn(divNote,'countdown_view_titreEvenement');
	var divDate = gebcn(divNote,'countdown_view_dateEvenement');

	divTitre.innerHTML = titre + "<br />";

	divDate.innerHTML = countdown_message["screen_WrittenOn"] + jour + "." + ( mois + 1 ) + "." + annee + countdown_message["screen_WrittenAt"] + twodigs( heure ) + countdown_message["screen_WrittenHour"] + twodigs( minute ) + "<br /><br />";
}

function countdown_update (noteid) {
	var divNote = getelement ( noteid ) ;
	//Get the json
	var json = qsn_thenotes[ noteid ] ;

	var divCompteur = gebcn(divNote,'countdown_view_compteur');
	var difDates = json.timestampEvenement - new Date().getTime();
	divCompteur.innerHTML = countdown_formatCounter(difDates, noteid);
	return;
}

function countdown_timestring ( t ) {
	var s = twodigs( t % 60 ) + "s" ;
	t = Math.floor ( t / 60 ) ;

	if ( t == 0 ) return s ;
	s = twodigs( t % 60 ) + "mn " + s ;
	t = Math.floor ( t / 60 ) ;

	if ( t == 0 ) return s ;
	s = twodigs( t % 24 )+ "h " + s ;
	t = Math.floor ( t / 24 ) ;

	if ( t == 0 ) return s ;
	s = "" + ( t ) + ( ( t > 1 ) ? countdown_message["remainingDays"] : countdown_message["remainingDay"] ) + " " + s ;
	return s ;
}


function oldcountdown_formatCounter (difDates, noteid) {
	var remainingSeconds = Math.floor(difDates / 1000);
	
	var petitMessage ;
	if (remainingSeconds <= 0) petitMessage = "<span style=\"font-size: 20px;color: #FF0000;\">" + countdown_message["elapsed"] + "</span><br /><span style=\"font-size: 15px;color: #FF0000;\">";
	else 	petitMessage = "<span style=\"font-size: 15px;color: #30CE00;\">" + countdown_message["remaining"] + "</span><br /><span style=\"font-size: 20px;color: #30CE00;\">";
	return petitMessage + countdown_timestring ( Math.abs(remainingSeconds) ) + "</span>" ;
}

function countdown_formatCounter (difDates, noteid) {
	var petitMessage = "<span>" + countdown_message["remaining"] + "</span><br /><span>";
//	if (c == -1) c = rgbcomplement( getpagebackgroundcolor() ) ;
//	else c =rgbcomplement ( c );
	
	var remainingSeconds = Math.floor(difDates / 1000);
	if (remainingSeconds <= 0) {
		petitMessage = "<span style=\"font-size: 15px;color: rgb(255,255,255);\">" + countdown_message["elapsed"] + "</span><br /><span style=\"font-size: 20px;color: rgb(255,255,255);\">";
		// fond à rouge mais on garde la couleur dans le json
		var oldc = qsn_thenotes [noteid].color ;
		qsn_thenotes [noteid].color = "rgb(255,0,0)";
		qsn_setnotecolors ( noteid,  [ "button", "text", "countdown_view_titreEvenement", "countdown_view_dateEvenement", "countdown_view_compteur"]  );
		qsn_thenotes [noteid].color = oldc ;
	}
	
/*
	var petitMessage ;
	if (remainingSeconds <= 0) petitMessage = "<span style=\"font-size: 20px;color: "+c+";\">" + countdown_message["elapsed"] + "</span><br /><span style=\"font-size: 15px;color: "+c+";\">";
	else 	petitMessage = "<span style=\"font-size: 15px;color: "+c+";\">" + countdown_message["remaining"] + "</span><br /><span style=\"font-size: 20px;color: "+c+";\">";
*/
	return petitMessage + countdown_timestring ( Math.abs(remainingSeconds) ) + "</span>" ;
}

function countdown_displayLogonote( elem ) {
	var r = qsn_thenotes[ elem.id ] ;
	r.logoIsHidden = 0 ;
	gebcn( elem , "displayLogo" ).className = gebcn( elem , "displayLogo" ).className.replace( /displayLogo/ , "hideLogo" ) ;
	countdown_renderlogo( elem.id ) ;
	qsn_notechanged ( elem.id , "notechanged" ) ;
}
function countdown_hideLogonote( elem ) {
	var r = qsn_thenotes[ elem.id ] ;
	r.logoIsHidden = 1 ;
	gebcn( elem , "hideLogo" ).className = gebcn( elem , "hideLogo" ).className.replace( /hideLogo/ , "displayLogo" ) ;
	countdown_renderlogo( elem.id ) ;
	qsn_notechanged ( elem.id , "notechanged" ) ;
}

function countdown_renderlogo ( noteid ) {
	var r = qsn_thenotes[ noteid ];
//	var w = parseInt( r.user ? r.user.common.width : ( r.spacedefault ? r.spacedefault.common.width : r.common.width ) ) ;
	var logohidden = ! eval( r.logoIsHidden ) ;
//	if ( ! logohidden ) w -= 120 ;
	
	var div = ge( noteid );
	var img = gebcn( div , "countdown_view_logo");
	
	visibleblock( img.parentNode , logohidden ) ;	

//	div.style.width = w + "px";
//	if ( gebcn( div , "toolbar" ) ) gebcn( div , "toolbar" ).style.left = ( w - 6 ) + "px" ;
}

/*
function -
function SERVICE PAGES
*/

function countdown_initforweb( id ) {
	if ( countdown_noteids.indexOf ( " " + id + " " ) == -1 ) countdown_noteids += id + " " ;
	if ( ! countdown_timer ) countdown_timer = setInterval ( countdown_refreshall , 1000 ) ;
}

function countdown_toolbaroptions( elem ) {
	return qsn_toolbaroptions( elem , true ).concat( [ eval( qsn_thenotes [ elem.id ].logoIsHidden ) ? "displayLogo" : "hideLogo" ] ) ;
}

/*
function -
function QWIZ
*/

function countdown_mergeqwizdata( notejson, noteqwizkeys, qwiz_data ) {
	var v ;
	for ( var x in noteqwizkeys ) {
		v = noteqwizkeys[ x ] ;
		if ( x == "timestampEvenement" ) {
			var dd = qwiz_data[ v ].split( "_" ) ;
			notejson[ x ] = new Date(  dd[ 0 ] , dd[ 1 ] , dd[ 2 ] , 12 , 0 , 0 ).getTime() ;
		} else notejson[ x ] = qwiz_data[ v ] ;
	}
	return notejson ;
}

var countdown_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "countdown_js_loaded" ) ;

var dropbox_message = {
"snname" : "Note Boite à Photos" ,
"plug" : "Boite à Photos_Laissez vos membres déposer des photos sur votre site, et créez des pages avec celles-ci." ,
"desc" : "(...)" ,
"newnoteprompt" : "Invitez ici les membres du site à déposer leurs photos dans cette note." ,
"login_title" : "Le dépôt de photos est réservé aux membres de l'espace." ,
"login_prompt" : "Si vous êtes membre du site, connectez-vous avec votre identifiant et votre mot de passe. Sinon inscrivez-vous pour devenir membre de ce site." ,
"objectmail" : "[Quomodo] - Dépôt de photos sur votre site \"%s\"" ,
"bodymail" : "%u a déposé de nouvelles photos sur la page %p du site.\r\rL'équipe Quomodo\r\rPour toute question ou suggestion, rendez-vous sur l'aide de Quomodo:\rhttp://aide.quomodo.com\rVous pouvez également nous contacter en envoyant un mail à:\rcontactclub@quomodo.com\r" ,
"mailsent" : "Votre dépôt a bien été enregistré et les administrateurs du site ont reçu un e-mail." ,
"mailnotsent" : "Un problème est survenu. Les administrateurs du site n'ont pas été avertis de votre dépôt."
} ;

var dropbox_msgs_fr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "dropbox_msgs_fr_js_loaded" ) ;

var dropbox_templates_prepared = false ;
var dropbox_leftcol_prepared = false ;

var dropbox_json_template = { version : 1 , text : "" , color : "rgb(100%,100%,100%)" , header : { display : "true" , color: "c1", text : "", icon : "pushpin" } , textstyles: { size : "1" , font : "0" , bold : "false" , italic : "false" , center : "false" } , uploads : [ ] } ;

var dropbox_colordesc = { "qmc1" : "color" , "qmc2_qmc1" : "header.color" , "qmc3" : dropbox_qmc3 } ; 
var dropbox_textdesc = { "qtxt1" : { "size" : "textstyles.size" , "font" : "textstyles.font" , "bold" : "textstyles.bold" , "center" : "textstyles.center" , "italic" : "textstyles.italic" } } ;

var dropbox_leftcol_description = [
	{ what : "notecolor" , tabname : "tabcolor" , visible : true , elems : [
		{ handler : "qsn_addqlubcolorblock" , params : { jsonpath: "color" , others: true , transparent: true , title: false , menuseparator: false , modifynote: "qsn_setcolors" } }
	] } ,
	{ what : "bandeau" , tabname : "tabheader" , visible : false , elems : [
		{ handler : "qsn_addheaderhideshow" , params : { notekind: "dropbox" , title:"" , jsonpath : "header.display" } } ,
		{ handler : "xqsn_addheadercolor" , params : { jsonpath : "header.color" } }
	] } ,
	{ what : "textstyles" , tabname : "tabtext" , visible : false , elems : [
		{ handler : " qsn_addfontfsizes" , params : { jsonpath : "textstyles.size" , ncols : 2 } } ,
		{ handler : " qsn_addfontfamilies" , params : { jsonpath : "textstyles.font" , ncols : 2 } } ,
		{ handler : "qsn_addtextoptions" , params : { jsonpath : "textstyles" , ncols : 2 , opts : [ "bold" , "center" , "italic" ] } }
	] }
] ;

function dropbox_qmc3( r ) {
	return "/services/dropbox/images/dropbox48.png" ;
}


/*
function -
function RENDER
*/

function dropbox_template( id ) {
	if ( dropbox_templates_prepared ) return qsn_template( id , true ) ;
	qsn_installcontainer( "view" , "dropbox" , ge( "dropbox_notecontent" ).innerHTML ) ;
	var div = qsn_installcontainer( "edit" , "dropbox" , ge( "dropbox_notecontent_edit" ).innerHTML ) ;
	dropbox_templates_prepared = true ;
	return qsn_template( id , true ) ;
}

function dropbox_renderhtml( noteid ) {
	var div = ge( noteid ) ;
	div.minWidth = "200px" ;
	var r = qsn_thenotes[ noteid ] ;

	if ( qsn_currstate != "edit" ) {
		if ( r.text != dropbox_message[ "newnoteprompt" ] ) gebcn( div , "dropbox_text" ).innerHTML = wiqi_text2HTML( r.text ) ;
	} else {
		var t = getElementByClassName( div , "dropbox_text" ) ;
		t.value = r.text ;
		qsn_blurdefault( t ) ;
	}
	qsn_container_renderhtml( div , r ) ;
	qsn_settextproperties( noteid ) ;
	qsn_setcolors( noteid ) ;
	if ( ! qsn_thenotes[ noteid ].common.duplicateid ) {
		if ( window.q_pagemode && q_pagemode() == "makeweb" ) dropbox_renderuploads( { noteid : noteid , drops : [ ] } ) ;
		else {
			document.mainform.mission.value = "dropbox_getdrops" ;
			q_ajaxsubmit( { noteid: noteid } , dropbox_renderuploads ) ;
		}
	}
}

function dropbox_renderuploads( x ) {
	var div = ge( x.noteid ) ;
	var r = qsn_thenotes[ div.id ] ;
	r.uploads = x.drops ;
	var n = 0 ;
	for ( var i=0; i<r.uploads.length; i++ ) n += r.uploads[ i ].ids.length ;
	var dropinfos = gebcn( div, "dropbox_infos" ) ;
	var dropviewlink = gebcn( div, "dropbox_viewlink" ) ;
	// En attendant que ces infos soients mises à jour automatiquement, on masque pour le moment les infos
	if ( window.q_pagemode && q_pagemode() == "makeweb" ) hideblock( dropinfos ) ;
	else {
		var s = dropinfos.getElementsByTagName( "SPAN" ) ;
		q_innerHTML( s[ 0 ] , "" + r.uploads.length ) ;
		q_innerHTML( s[ 1 ] , "" + n ) ;
		showblock( dropinfos ) ;
	}
	if ( q_pagemode() != "edit" || ! n || ! members || ! members[ memberid ] || members[ memberid ].userlevel != "admin" ) rm( dropviewlink ) ;
	else showblock( dropviewlink ) ;
}


/*
function -
function EDIT
*/

function dropbox_saveedit( ) {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	r.text = gebcn( qsn_edittarget , "dropbox_text" ).value ;
	if ( r.text == dropbox_message[ "newnoteprompt" ] ) r.text = "" ;
	
	qsn_container_saveedit() ;
	qsn_saveedit( true ) ;
}

function dropbox_displaysettings() {
	qsn_initdisplaysetting() ;
	return false ;
}


/*
function -
function TOOLBAR
*/

function dropbox_toolbarversion() {
	return 1 ;
}


/*
function -
function QWIZ
*/

function dropbox_qwiz( x ) {
	if ( ! window.web_js_loaded ) {
		var note = getContainer( x ) ;
		qlub_openqwiz( "qwiz_newpage" , { src : "dropbox" , dropboxid : note.id } ) ;
	} else {
		club_login_block( { title: dropbox_message[ "login_title" ], message : dropbox_message[ "login_prompt" ] } ) ;
	}
}

function dropbox_mergeqwizdata( notejson, noteqwizkeys, qwiz_data, noteid ) {
	var v ;
	for ( var x in noteqwizkeys ) {
		v = noteqwizkeys[ x ] ;
		if ( x == "uploaddesc" ) {
			var d = new Date() ;
			notejson.uploads.push( { desc: qwiz_data[ v ], date: q_date2isot( d ), from: "" , email: "" , ids: [ ] } ) ; // new upload
		} else if ( x == "uploadfrom" ) {
//			notejson.uploads[ notejson.uploads.length - 1 ].from = qwiz_data[ v ] ;
			notejson.uploads[ notejson.uploads.length - 1 ].from = q_displayedusername( ( members[ memberid ] ) ? { username : members[ memberid ].username , firstname : members[ memberid ].firstname } : null ) ;
		} else if ( x == "uploademail" ) {
//			notejson.uploads[ notejson.uploads.length - 1 ].email = qwiz_data[ v ] ;
			notejson.uploads[ notejson.uploads.length - 1 ].email = ( members[ memberid ] && members[ memberid ].email ) ? members[ memberid ].email : "" ;
		} else if ( x == "uploadids" ) {
			if ( qwiz_data[ v ] ) {
				var f ;
				for ( var i=0; i<qwiz_data[ v ].length; i++ ) {
					f = qwiz_data[ v ][ i ] ;
					notejson.uploads[ notejson.uploads.length - 1 ].ids.push( f.newuploadid ) ;
				}
			}
		} else notejson[ x ] = qwiz_data[ v ] ;
	}
	dropbox_registerdrop( noteid, notejson.uploads[ notejson.uploads.length - 1 ] ) ;
	return notejson ;
}

function dropbox_registerdrop( noteid, drop ) { // sauvegarde sndata + mail aux admins
	document.mainform.mission.value = "dropbox_adddrops" ;
	q_ajaxsubmit( { noteid: noteid , dropdate: drop.date, dropdesc: drop.desc, dropfrom: drop.from, email: drop.email, uploadids: drop.ids } ) ; 
	var body = "" ;
	var m = { frommail: "club@quomodo.com", tomail: "admins", noteid: noteid } ;
	m[ "objectmail" ] = dropbox_message[ "objectmail" ].replace( /%p/g , q_currsvcname() ).replace( /%s/g , rights_record[ "currspaceright" ].name ) ;
	m[ "bodymail" ] = dropbox_message[ "bodymail" ].replace( /%p/g , q_currsvcname() ).replace( /%u/g , q_username( memberid ) ) ;
	document.mainform.mission.value = "sendemailtoto" ;
	q_ajaxsubmitwithservice( "common@" + q_lang , m , dropbox_sendemessage_done , [ ] ) ;
}

function dropbox_sendemessage_done( x ) {
	alert ( dropbox_message [ ( x.mailsent == 0 ) ? "mailnotsent" : "mailsent" ] ) ;
}


/*
function -
function MANAGE UPLOADS
*/

function dropbox_openuploadmanager( x ) {
	var note = getContainer( x ) ;
	qlub_openqwiz( "manageuploads" , { noteid : note.id } ) ;
}

function dropbox_upadatefromuploadmanager( noteid, uploads ) {
	qsn_thenotes[ noteid ].uploads = q_cloneObject( uploads ) ;
	dropbox_renderhtml( noteid ) ;
	qsn_notechanged( noteid , "notechanged" ) ;
}


/*
function -
function WEB
*/

function dropbox_initforweb( id ) {
	rm( gebcn( id , "dropbox_viewlink" ) ) ;
}

var dropbox_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "dropbox_js_loaded" ) ;


var eqr_message = {
"defaultimagesourceurl" : "Coller ici l'adresse de l'image qui peut être fixe (graphique, photo...) ou animée (webcam...)." ,
"pclocalnotvalidate" : "Vous n'avez pas validé le choix de votre image.\n\nCelle-ci ne va pas être enregistrée." ,
"badimgextension" : "Le fichier image que vous avez choisi n'a pas la bonne extension.\n\nVeuillez choisir un autre fichier." ,
"fermer" : "fermer" ,
"validateimage" : "Veuillez valider l'image" ,
"plug" : "Equipe_L'annuaire de l'équipe, avec plein de fonctions très web." ,
"desc" : "(...)",
"title": "Titre",
"lastname": "Nom",
"forename": "Prénom",
"surname": "Surnom",
"birthday": "Anniversaire",
"birthday_type": "Né(e) le :",
"date": "jj/mm/aaaa",
"posteequipe": " ",
"numerojoueur": " ",
"poidsjoueur": "(en kg)",
"taillejoueur": "(en m)",
"specif_type": "Spécificités :",
"specifjoueur": " ",
"parcours_type": "Parcours :",
"parcoursjoueur": " ",
"poste_type": "Poste :",
"numero_type": "N° :",
"poids_type": "Poids :",
"taille_type": "Taille :",
"type": "Type",
"personname": "Nom",
"of": "sur",
"suppressmember": "Êtes-vous certain de vouloir supprimer ce membre?",
"selectanimage" : "Sélectionnez une image de l'équipe:" ,
"uploadtitlemembernew" : "Ajout d'une image du membre" ,
"uploadtitlememberedit" : "Changement de l'image du membre",
"uploadtitlenew" : "Ajout d'une image de l'équipe" ,
"uploadtitleedit" : "Changement de l'image de l'équipe",
"nomequipe" : "Nom de l'équipe",
"description" : "Description de l'équipe",
"nomember" : "Aucune fiche membre.",
"emptyItem" : "Veuillez renseigner le nom ou le prénom du membre."
} ;

var eqr_msgs_fr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "eqr_msgs_fr_js_loaded" ) ;


var eqr_json_template = { version: 1 , nomequipe: "Liste des membres", description: "", color: "", img: { kind: ""}};

var eqr_json_templatereply = { version: 1 , img: { kind: ""}, items: {name: {lastname: "", forename: ""}, surname: "", birthday: {type: "text", date: ""}, poste: {type: "text", posteequipe: ""}, numero: {type: "text", numerojoueur: ""}, poids: {type: "text", poidsjoueur: ""}, taille: {type: "text", taillejoueur: ""}, specif: {type: "text", specifjoueur: ""}, parcours: {type: "text", parcoursjoueur: ""} } } ;

// var eqr_globaldata = { "template": { mynotes: {}, notesload: {}} };

// var eqr_id="";
// 
var eqr_mynotes={};

var eqr_notesload={};

// var eqr_isimgequip=false;

// var eqr_displaycolor=true;

var eqr_magnetism=60;

var eqr_prepared = false;


function eqr_upgradejson( r ) {
	if ( ( r.version ) && ( r.version == eqr_json_template.version ) ) return r ;
	return r
}


function eqr_additem(itemid){
	var template = ( qsn_currstate=="edit" ) ? "eqr_replytemplate_edit" : "eqr_replytemplate" ;
	var parid=qsn_thenotes[ itemid ].parentid;
	var parentdiv = getelement(parid) ;
	if ( ! parentdiv ) return null ;

	parentdiv=getElementsByClassName(parentdiv,"eqr_preview")[0];
	
	for (var i=0; i<parentdiv.childNodes.length; i++) parentdiv.removeChild(parentdiv.childNodes[i]);
	
	var div=qsn_clonetemplate( itemid , template, parentdiv);

	qsn_renderhtml(itemid) ;
	if (!qsn_isnewnote){
		qsn_thenotes[parid].user["lastitem"]=itemid;
	}

	return div ;
}

function eqr_beginResize( elem , ee , movecallBack , upcallBack ) {
	if (pages_mode() != "edit") return false;
	if (members[memberid].userlevel != "admin") return false;
	if (qsn_edittarget) return false;
		
	var dragbutton=getElementsByClassName(elem,"eqr_dragbutton")[0];
	dragbutton.style.cursor="col-resize";
	var e = ee || window.event ;
	
	if ( ! window.qsn_currstate ) var qsn_currstate = "view" ;	
	if ( ( ( ( new Date() ).getTime() - latestclick.time ) < 700 ) && ( Math.abs ( q_clientX( e ) - latestclick.x ) < 2 ) && ( Math.abs ( q_clientY( e ) - latestclick.y ) < 2 ) && ( elem == latestclick.target ) && ( ! ( /(edit|new)/.test ( qsn_currstate ) ) ) ) return false ;
	latestclick.time = ( new Date() ).getTime() ;
	latestclick.x = q_clientX( e ) ; 
	latestclick.y = q_clientY( e ) ; 
	latestclick.target = elem ;

	var dw = q_clientX( e ) - elem.offsetWidth;
	var clientX0 = q_clientX( e ) ;
	var clientY0 = q_clientY( e ) ;

	function moveHandler( ee ) {
		var em = ee || window.event ;
		if ( qsn_currstate == "tm" ) return ;
		var ew = q_clientX( em ) - dw;
		movecallBack( elem, ew ) ;
		q_stopPropagation( em );
		q_preventDefault( em );
	}
	function upHandler( ee ) {	
		var eu = ee || window.event ; 
		document.onmouseup = null ;
		document.onmousemove = null ;
		var ew = q_clientX( eu ) - dw ;
		var isMove = ( ( parseInt( clientX0 , 10 ) == parseInt( q_clientX( eu ) , 10 ) ) ) ;
		upcallBack( elem , ew ) ;
		elem = null ;
		q_stopPropagation( eu ) ;
		q_preventDefault( eu ) ;
	}
	document.onmousemove = moveHandler ;
	document.onmouseup = upHandler ;
	q_stopPropagation( e );
	// q_preventDefault( e );
	if ( ( window.getSelection ) && ( window.getSelection() == "" ) ) q_preventDefault( e );
	if ( ! window.getSelection ) q_preventDefault( e );
}

function eqr_moveResizeHandler( elem , ew ){
	var leftcolwidth = Math.max ( 420, ew );
	var containerwidth = getContainer(elem).offsetWidth - 22;
	eqr_switchlistitem(getContainer(elem),true);
	if ((containerwidth-eqr_magnetism) <= leftcolwidth){
		leftcolwidth =  containerwidth;
		eqr_switchlistitem(getContainer(elem),false);
	}
	var leftcolmargin = containerwidth - leftcolwidth;
	var preview=getElementsByClassName(getContainer(elem),"eqr_preview_container")[0];
	elem.style.width = leftcolwidth + "px";
	preview.style.width = leftcolmargin + "px";
}

function eqr_upResizeHandler( elem , ew ) {
	elem.style.cursor = "auto" ; // "move" ;
	var y = getContainer( elem ) ;
	var theid = y.id ;
	var sc = qsn_thenotes[ theid ].spacedefaults.common ;
	var uc = qsn_thenotes[ theid ].user.common ;
	if ( ! uc ) {
		qsn_thenotes[ theid ].user.common = {} ;
		uc = qsn_thenotes[ theid ].user.common ;
	}
	var isselected = ( ( qsn_currstate == "view" ) || ( qsn_currstate == "tm" ) ) ;
	if ( qsn_currstate == "tm" ) isselected = tmswitchSelected ( elem ) ;
	if ( isselected ) qsn_puttofront( theid ) ;
	if ( qsn_currstate == "tm" ) return false ;
	var isowner = ( members[memberid].userlevel == "admin" ) ;
	
	if (ew==parseInt(uc.leftcolwidth)){
		var containerwidth = getContainer(elem).offsetWidth - 22;
		var preview=getElementsByClassName(getContainer(elem),"eqr_preview_container")[0];
		if (containerwidth > ew){
			eqr_switchlistitem(getContainer(elem),false);
			elem.style.width = containerwidth + "px";
			preview.style.width = "0px";
			uc.leftcolwidth = "" + elem.offsetWidth + "px" ;
			if ( isowner ) sc.leftcolwidth = "" + elem.offsetWidth + "px" ;
		}
		else{
			if (ew == 420) getContainer(elem).style.width = parseInt(getContainer(elem).style.width) + 300 + "px";
			ew = Math.max ( 420, ew - 300 );
			eqr_switchlistitem(getContainer(elem),true);
			elem.style.width = ew + "px";
			containerwidth = getContainer(elem).offsetWidth - 22;
			preview.style.width = containerwidth - ew + "px";
			uc.leftcolwidth = "" + ew + "px" ;
			uc.width = "" + containerwidth + "px" ;
			if ( isowner ){
				sc.leftcolwidth = "" + ew + "px" ;
				sc.width = "" + containerwidth + "px" ;
			}
		}
	}
	else{
		ew = Math.max ( 420, ew );
		var containerwidth = getContainer(elem).offsetWidth - 22;
		if ((containerwidth-eqr_magnetism) <= ew) ew = containerwidth;
		uc.leftcolwidth = "" + ew + "px" ;
		if ( isowner ) sc.leftcolwidth = "" + ew + "px" ;
	}

	if ( qsn_edittarget != null ) return false ;
	if ( isowner ) {
		qsn_adduserrefreshid( theid ) ;
		qsn_spacedefaultsnotechanged( theid ) ;
	} else {
		qsn_usernotechanged( theid ) ;
	}
}

function eqr_beginDrag( elem , e ) {
	xqsn_beginDrag( elem , e , eqr_moveHandler , eqr_upHandler ) ;
}

function eqr_moveHandler( elem , ex , ey , ew , isGrow , xylimits ) {
	qsn_moveHandler( elem , ex , ey , ew , isGrow , xylimits );
//	qsn_hasmoved = true ;
	if ( isGrow ) {
		var preview=getElementsByClassName(getContainer(elem),"eqr_preview_container")[0];
		var leftcol=getElementsByClassName(getContainer(elem),"eqr_leftcontent")[0];
		ew = Math.max ( 420, ew ) ;
		//ew = Math.max ( leftcol.offsetWidth, ew );
		eqr_switchlistitem(elem,true);
		if (ew<=(leftcol.offsetWidth+eqr_magnetism)){
			ew=leftcol.offsetWidth;
			eqr_switchlistitem(elem,false);
		}
		var xmax = ( ( xylimits ) && ( xylimits.xmax != undefined ) ) ? xylimits.xmax : null ;
		if ( ( xmax != null ) && ( elem.offsetLeft + ew > xmax ) ) ew = xmax - elem.offsetLeft ;
		elem.style.cursor = "e-resize" ;
		elem.style.width = ew + "px";
		preview.style.width =( ew - leftcol.offsetWidth) + "px";
	}
//	else {
//		elem.style.cursor = "move" ; // "default" ;
//		var xmin = ( ( xylimits ) && ( xylimits.xmin != undefined ) ) ? xylimits.xmin : 2 ;
//		var ymin = ( ( xylimits ) && ( xylimits.ymin != undefined ) ) ? xylimits.ymin : 0 ;
//		if ( ex < xmin ) ex = xmin ;
//		if ( ey < ymin ) ey = ymin ;
// 
//		var xmax = ( ( xylimits ) && ( xylimits.xmax != undefined ) ) ? xylimits.xmax : null ;
//		var ymax = ( ( xylimits ) && ( xylimits.ymax != undefined ) ) ? xylimits.ymax : null ;
//		if ( ( xmax != null ) && ( ex > ( xmax - elem.offsetWidth ) ) ) ex = xmax - elem.offsetWidth ;
//		if ( ( ymax != null ) && ( ey > ( ymax - elem.offsetHeight ) ) ) ey = ymax - elem.offsetHeight ;
//		elem.style.left = ex + "px";
//		elem.style.top = ey+ "px";
//	}
//	if ( ( qsn_currstate == "view" ) || ( qsn_currstate == "tm" ) ) if ( ! isGrow ) qsn_puttofront( getContainer( elem ).id ) ;
}

function eqr_upHandler( elem , ex , ey , ew , isGrow , isMove , xylimits ) {
	elem.style.cursor = "auto" ; // "move" ;
	var y = getContainer( elem ) ;
	var theid = y.id ;
	var sc = qsn_thenotes[ theid ].spacedefaults.common ;
	var uc = qsn_thenotes[ theid ].user.common ;
	if ( ! uc ) {
		qsn_thenotes[ theid ].user.common = {} ;
		uc = qsn_thenotes[ theid ].user.common ;
	}
//	var left = ( uc.left ) ? uc.left : sc.left ;
//	var top = ( uc.top ) ? uc.top : sc.top ;
//	if ( ( ! isGrow ) && ( parseInt( clientX0 , 10 ) == parseInt( left , 10 ) ) && ( parseInt( elem.style.top , 10 ) == parseInt( top , 10 ) ) ) {
	var isselected = ( ( qsn_currstate == "view" ) || ( qsn_currstate == "tm" ) ) ;
	if ( qsn_currstate == "tm" ) isselected = tmswitchSelected ( elem ) ;
	if ( isselected ) qsn_puttofront( theid ) ;
	if ( qsn_currstate == "tm" ) return false ;
//	if ( ! ( /note/.test( y.className ) ) ) return false ;
	var isowner = ( members[memberid].userlevel == "admin" ) ; 
	if ( isGrow ) {
		var leftcol=getElementsByClassName(getContainer(elem),"eqr_leftcontent")[0];
		ew = Math.max ( 420, ew ) ;
		ew = Math.max ( leftcol.offsetWidth, ew );
		var xmax = ( ( xylimits ) && ( xylimits.xmax != undefined ) ) ? xylimits.xmax : null ;
		if ( ( xmax != null ) && ( elem.offsetLeft + ew > xmax ) ) ew = xmax - elem.offsetLeft ;
		if (ew>leftcol.offsetWidth && ew<=(leftcol.offsetWidth+eqr_magnetism)) ew=leftcol.offsetWidth;
		uc.width = "" + ew + "px" ;
		if ( isowner ) sc.width = "" + ew + "px" ;
	} else {
		if ( ex < 0 ) ex = 2 ;
		if ( ey < 0 ) ey = 0 ;
		uc.left = "" + ex + "px" ;
		uc.top =  "" + ey + "px"  ;
		if ( isowner ) {
			sc.left = "" + ex + "px" ;
			sc.top =  "" + ey + "px"  ;
		}
	}
	if ( qsn_edittarget != null ) return false ;
	if ( isowner ) {
		qsn_adduserrefreshid( theid ) ;
		qsn_spacedefaultsnotechanged( theid ) ;
	} else {
		qsn_usernotechanged( theid ) ;
	}
}


function eqr_selectItem(div){
	if (qsn_edittarget && qsn_currstate=="edit"){
		if (qsn_edittarget != div){
			return;
			// qsn_saveedit();
		}
	}

	var selecteditems=getElementsByClassName(getContainer(div.parentNode),"eqr_selectedItem");
	if (selecteditems.length>0){
		for (var i=0; i<selecteditems.length; i++){
			if (selecteditems[i]!=div) selecteditems[i].className=selecteditems[i].className.replace(/\beqr_selectedItem\b/g,"");
		}
	}
	div.className=div.className +" eqr_selectedItem";
	eqr_additem(div.className.split(" ")[0].split("__")[0]);
}

function eqr_selectedItem(div){
	var selecteditems=getElementsByClassName(getContainer(div.parentNode),"eqr_selectedItem");
	if (selecteditems.length>0){
		return selecteditems[0].className.split(" ")[0].split("__")[0]
	}
	else return false;
}

function eqr_selectItemimport(div){
	var memb=div.id.split("__")[1];
	var container=getContainer(div);
	var membercontainer=getElementsByClassName(div,"eqr_membercontent")[0];
	if (members[memb].username){
		var name=members[memb].username;
		var namecontainer=getElementsByClassName(container,"eqr_lastname")[0];
		namecontainer=getElementsByClassName(namecontainer,"eqr_editfield")[0];
		namecontainer.value=name;
		eqr_focusdefaultitem(namecontainer);
		eqr_updateEdit(namecontainer);
	}
	if (members[memb].firstname){
		var name=members[memb].firstname;
		var namecontainer=getElementsByClassName(container,"eqr_forename")[0];
		namecontainer=getElementsByClassName(namecontainer,"eqr_editfield")[0];
		namecontainer.value=name;
		eqr_focusdefaultitem(namecontainer);
		eqr_updateEdit(namecontainer);
	}
	if (members[memb].birthdate){
		var name=members[memb].birthdate;
		var namecontainer=getElementsByClassName(container,"eqr_date")[0];
		namecontainer=getElementsByClassName(namecontainer,"eqr_editfield")[0];
		namecontainer.value=name;
		eqr_focusdefaultitem(namecontainer);
		eqr_updateEdit(namecontainer);
	}
	if (members[memb].pict){
		var name=members[memb].pict;
		var namecontainer=getElementsByClassName(container,"eqr_imgcol")[0];
		if (!getElementsByClassName(namecontainer,"eqr_noteimage")[0]){
			var img = document.createElement("img");
			img.className = "eqr_noteimage";
			img.alt = eqr_message["validateimage"];
			var imgperso=getElementsByClassName(namecontainer,"eqr_imgperso")[0];
			imgperso.appendChild(img);
		}
		namecontainer=getElementsByClassName(namecontainer,"eqr_noteimage")[0];
		namecontainer.src = q_spaceabsoluteurl( null , name );
		qsn_thenotes[container.id].img.src=name;
	}
	rm(div.parentNode);
}

function eqr_notesupdate(noteid,vartoupdate){
	var notes;
	if (vartoupdate=="mynotes") notes=eqr_mynotes;
	if (vartoupdate=="load") notes=eqr_notesload;
	if (vartoupdate!="mynotes" && vartoupdate!="load") return;

	if (vartoupdate=="mynotes"){
		if (notes[noteid]!=null) notes[noteid]=null;
		notes[noteid]= new Array();
	}
	else {if (notes[noteid]==null) notes[noteid]= {};}
	for (var itemid in qsn_thenotes){
		if (qsn_thenotes[itemid]!=null){
			if (qsn_thenotes[itemid].parentid && qsn_thenotes[itemid].common.notekind=="eqr"){
				if (qsn_thenotes[itemid].parentid==noteid){
					if (vartoupdate=="mynotes") notes[noteid].push(itemid);
					else{
						if (notes[noteid][itemid]==null) notes[noteid][itemid]=false;
					}
				}
			}
		}
	}
}

function eqr_addnote ( noteid ) {
	var div=document.getElementById("q_author_stuff");
	if ( qsn_thenotes[ noteid ].parentid ){
		var parid=qsn_thenotes[ noteid ].parentid;
		if (qsn_thenotes[parid]==null){
			qsn_thenotes[noteid]=null;
		}
		else{
			if (eqr_notesload[parid]==null){
				if (getelement(parid)) rm(getelement(parid));
				qsn_addnote(parid);
			}
			else{
				if (eqr_notesload[parid][noteid]!=null){
					if (eqr_notesload[parid][noteid]==false) eqr_notesload[parid][noteid]=true;
					else{
						if (getelement(parid)) rm(getelement(parid));
						qsn_addnote(parid);
					}
				}
				else{
					if (getelement(parid)) rm(getelement(parid));
					qsn_addnote(parid);
				}
			}
		}
	}
	else{
		var template = ( qsn_currstate == "edit" ) ? "eqr_notetemplate_edit" : "eqr_notetemplate" ;
		if (qsn_currstate != "edit"){
			eqr_notesupdate(noteid,"load");
			eqr_notesupdate(noteid,"mynotes");
			eqr_sortlistitem(noteid);
		}
		var itemlist=eqr_mynotes[noteid];
		div = qsn_clonetemplate( noteid , template ) ;
		if (qsn_isnewnote){
			div.style.left= qsn_thenotes[noteid].spacedefaults.common.left;
			div.style.top= qsn_thenotes[noteid].spacedefaults.common.top;
			div.style.width= qsn_thenotes[noteid].spacedefaults.common.width;
			var leftcol=gebcn(div,"eqr_leftcontent");
			var preview=gebcn(div,"eqr_preview_container");
			leftcol.style.width= qsn_thenotes[noteid].spacedefaults.common.leftcolwidth;
			preview.style.width= parseInt(qsn_thenotes[noteid].spacedefaults.common.width) - parseInt(qsn_thenotes[noteid].spacedefaults.common.leftcolwidth) + "px";
//			div.style.width= qsn_thenotes[noteid].spacedefaults.common.width;
			div.style.zindex= qsn_thenotes[noteid].spacedefaults.common.zindex;
			var colors=getsncontextualbackgroundcolors(7);
			var i=Math.round(6*Math.random());
			qsn_thenotes[div.id].color=colors[i];
			div.style.backgroundColor=colors[i];
		}
		
		qsn_renderhtml( noteid ) ;
	}

	return div ;
}

function eqr_renderhtml( noteid ) {
	var div = getelement ( noteid ) ;
	var r = qsn_thenotes[ noteid ] ;
	eqr_rendertext( div , r );
	if (! r.parentid){
		if (qsn_currstate!="edit"){
/*
			if (r.user["lastitem"] && qsn_thenotes[r.user["lastitem"]]) {setTimeout(function (){eqr_additem(r.user['lastitem']);},500);}
			else{
				if (eqr_mynotes[noteid].length>0) {setTimeout(function (){eqr_additem(eqr_mynotes[noteid][0]);},500);}
			}
*/
			eqr_renderlistitem(div,true);
			qsn_setnotecolors(noteid,["linkinnote","eqr_nomequipe","eqr_description"]);
			var buttons=getElementsByClassName(div,"eqr_buttonsleft")[0];
			buttons.style.display="none";
		}
		else{
			eqr_renderlistitem(div,false);
			qsn_setnotecolors(noteid,["linkinnote"]);
		}
	}
	else{
		if ( qsn_currstate == "edit" ) {
			var x=getElementsByClassName(div,"eqr_items")[ 0 ];
			var fields=getElementsByClassName(x,"eqr_editfield");
			var n_fields=fields.length;
			var i=0;
			for (i=0;i<n_fields;i++){
				eqr_blurdefaultitem(fields[i]);
			}
		}
	}
	eqr_renderimg( div , r );
	if (! r.parentid){
		if ( qsn_currstate!="edit" ) {
			if ( r.user.lastitem && qsn_thenotes[ r.user.lastitem ] ) eqr_additem( r.user.lastitem ) ;
			else if (eqr_mynotes[noteid].length>0) eqr_additem(eqr_mynotes[noteid][0]);
		}
	}
}


function eqr_rendertext( div , r ) {
	if (r.parentid){
		if ( r.items == undefined ) return ;

		if (qsn_currstate=="edit"){
			var linkadd=getElementsByClassName(div,"eqr_imgmembadd")[0];
			var linkmodif=getElementsByClassName(div,"eqr_imgmembmodif")[0];
			var linkdelete=getElementsByClassName(div,"eqr_imgmembdelete")[0];
			if (!r.img.src || r.img.src==""){
				linkmodif.style.display="none";
				linkdelete.style.display="none";
			} 
			else linkadd.style.display="none";
		}

		var x=getElementsByClassName(div,"eqr_items")[0];
		var field=getElementsByClassName(x,"eqr_field")[0];
		var containfield=getElementsByClassName(field,"eqr_containfield")[0];
		if (qsn_currstate=="edit") var inputfield=getElementsByClassName(containfield,"eqr_editfield")[0];

		var rr=r.items;
		var rrr=eqr_json_templatereply.items;

		for (var tag in rrr){
			var clone=q_CloneFromNode(field);
			clone.className= "eqr_"+ tag +" "+ clone.className;
			if (qsn_currstate == "edit"){
				var editfield=getElementsByClassName(clone,"eqr_editfield")[0];
				editfield.className= "eqr_"+ tag +" "+ editfield.className;
			}
			var item=x.appendChild(clone);
			item.style.display="none";
			for (var i=0; i<item.childNodes.length; i++) item.removeChild(item.firstChild);
			if (rrr[tag] instanceof Object){
				for (var tag2 in rrr[tag]){
						var clonefield=q_CloneFromNode(containfield);
						clonefield.className= "eqr_"+ tag2 +" eqr_containfield_"+ tag2 +" "+ clonefield.className;
						var duplicatedfield=item.appendChild(clonefield);
						if (qsn_currstate!="edit"){
							var renderfield=getElementsByClassName(duplicatedfield,"eqr_renderfield")[0];
							if (tag2!="type"){
								var content=rr[tag][tag2];
								if (tag=="poids" && content!="") content=rr[tag][tag2]+" kg";
								if (tag=="taille" && content!="") content=rr[tag][tag2]+" m";
								if (content!="") renderfield.innerHTML = wiqi_text2HTML(content);
								else if (tag!="address") renderfield.innerHTML ="&nbsp;";
							}
							else {renderfield.innerHTML=eqr_message[tag+"_type"];}
						}
						else{
							var inputfield_bis=getElementsByClassName(duplicatedfield,"eqr_editfield")[0];
							if (tag2!="type"){
								inputfield_bis.className="eqr_"+ tag2 +" "+ inputfield_bis.className;
								inputfield_bis.value=rr[tag][tag2];
							}
							else{
								rm(inputfield_bis);
								var renderfield=document.createElement("div");
								renderfield.className="eqr_"+ tag2 +" eqr_renderfield eqr_relative";
								renderfield.innerHTML=eqr_message[tag+"_type"];
								duplicatedfield.appendChild(renderfield);
							}
						}
				}
			}
			else{
				var clonefield=q_CloneFromNode(containfield);
				clonefield.className= "eqr_"+ tag +" eqr_containfield_"+ tag +" "+ clonefield.className;
				var duplicatedfield=item.appendChild(clonefield);
				if (qsn_currstate != "edit"){
					var renderfield=getElementsByClassName(duplicatedfield,"eqr_renderfield")[0];
					var content=rr[tag];
					if (tag=="surname" && content!="") content='"'+rr[tag]+'"';
					if (content!="") renderfield.innerHTML = wiqi_text2HTML(content);
					else renderfield.innerHTML ="&nbsp;";
				}
				else{
					var inputfield_bis=getElementsByClassName(duplicatedfield,"eqr_editfield")[0];
					inputfield_bis.className="eqr_"+ tag +" "+ inputfield_bis.className;
					inputfield_bis.value=rr[tag];
				}
			}
		item.style.display="block";
	}
	x.removeChild(field);
	}
	else{
		var leftcol=gebcn(div,"eqr_leftcontent");
		var preview=gebcn(div,"eqr_preview_container");
		var rr=r.spacedefaults.common;
		leftcol.style.width= rr.leftcolwidth;
		preview.style["width"]= parseInt(rr.width) - parseInt(rr.leftcolwidth) + "px";
		
		if (qsn_currstate!="edit"){
			var linkadd=getElementsByClassName(div,"eqr_imgadd")[0];
			var linkmodif=getElementsByClassName(div,"eqr_imgmodif")[0];
			var linkdelete=getElementsByClassName(div,"eqr_imgdelete")[0];
			if (!r.img.src || r.img.src==""){
				linkmodif.style.display="none";
				linkdelete.style.display="none";
			}
			else linkadd.style.display="none";
		
			var nomequipe=getElementsByClassName(div,"eqr_nomequipe")[0];
			nomequipe.innerHTML=wiqi_text2HTML(r.nomequipe);
			var description=getElementsByClassName(div,"eqr_description")[0];
			description.innerHTML=wiqi_text2HTML(r.description);
		}
		else{
			var nomequipe=getElementsByClassName(div,"eqr_nomequipe")[0];
			var inputfield=getElementsByClassName(nomequipe,"eqr_editfield")[0];
			inputfield.value=r.nomequipe;
			var description=getElementsByClassName(div,"eqr_description")[0];
			var inputfield2=getElementsByClassName(description,"eqr_editfield")[0];
			if (r.description) inputfield2.value=r.description;
			else eqr_blurdefaultitem(inputfield2);
		}
	}
}

function eqr_renderimg( div , r ) {
	if ( ! div ) div = qsn_edittarget ;
	if ( ! r ) r = qsn_thenotes[ div.id ] ;
	var img ;
	var cnode ;
	if (r.parentid){
		img = div.getElementsByTagName( "img" )[ 0 ] ;
		if ( ( r.img ) && ( r.img.src ) ) {
			if ( ! img ) {
				cnode = getElementsByClassName( div , "eqr_img" )[ 0 ] ;
				img = document.createElement("img");
				img.className = "eqr_noteimage";
				img.alt = eqr_message["validateimage"];
				if (pages_mode() == "edit"){
					img.onclick=function(){eqr_editimg(this); return false;};
					img.style.cursor="pointer";
				}
				img = cnode.appendChild( img ) ;
				cnode = null ;
			}
			img.src = q_spaceabsoluteurl( null , r.img.src ) ;
		}
		// else {
		// 	if (div.className.match(/\beqr_itemnote\b/g)){
		// 		if ( ! img ) {
		// 			cnode = getElementsByClassName( div , "eqr_img" )[ 0 ] ;
		// 			img = document.createElement("img") ;
		// 			img.className = "eqr_noteimage" ;
		// 			img.alt = eqr_message["validateimage"] ;
		// 			if (!window.web_js_loaded){
		// 				if (members[memberid].userlevel == "admin"){
		// 					img.onclick=function(){eqr_editimg(this); return false;};
		// 					img.style.cursor="pointer";
		// 				}
		// 			}
		// 			img = cnode.appendChild( img ) ;
		// 			cnode = null ;
		// 		}
		// 		img.src="../services/eqr/images/int.png";
		// 		img.className = img.className + " png" ;
		// 	}
		// }
		else{
			rm(img);
		}
	}
	else{
		var leftcont=getElementsByClassName(div,"eqr_leftcontent")[0];
		img = leftcont.getElementsByTagName( "img" )[ 0 ] ;
		if ( ( r.img ) && ( r.img.src ) ) {
			if ( ! img ) {
				cnode = getElementsByClassName( div , "eqr_imgequip" )[ 0 ] ;
				img = document.createElement("img");
				img.className = "eqr_noteimage";
				img.alt = eqr_message["validateimage"];
				if (pages_mode() == "edit"){
					img.onclick=function(){eqr_editimg(this); return false;};
					img.style.cursor="pointer";
				}
				img = cnode.appendChild( img ) ;
				cnode = null ;
			}
			img.src = q_spaceabsoluteurl( null , r.img.src ) ;
			// img.style.width="100%";
		}
		else{
			rm(img);
		}
	}
}


function eqr_displaysettings(){
	if (!eqr_prepared && !qsn_thenotes[qsn_edittarget.id].parentid){
		eqr_prepared=true;
		qsn_colorblock(true,false,eqr_setnotecolor);
	}
	if (eqr_prepared && qsn_thenotes[qsn_edittarget.id].parentid){
		eqr_prepared=false;
		var elem=ge("eqr_colorblock");
		elem.innerHTML="";
	}
}

function eqr_setnotecolor(x,c){
	var r=qsn_thenotes[qsn_edittarget.id];
	r.color = c ? c : x.style.backgroundColor ;
	qsn_setnotecolors(qsn_edittarget.id,["linkinnote"]);
}


function eqr_canceledit(id) {
	if (qsn_isnewnote){
		if (qsn_thenotes[id].parentid){
			if (eqr_selectedItem(ge(id)) != false) var selectedId=eqr_selectedItem(ge(id));
		}
	}
		
	var zindex = qsn_getzindex( id ) ;
	var div = getelement( id ) ;
	rm ( div ) ;

	if ( qsn_isnewnote ){
		qsn_thenotes[ id ] = null;
		if (selectedId){
			qsn_currstate = "view" ;
			eqr_additem(selectedId);
		}
	}
	else {
		var newdiv;
		qsn_thenotes[ id ] = q_cloneObject( qsn_thenotes[ qsn_backupid( id ) ] ) ;
		qsn_thenotes[ qsn_backupid( id ) ] = null ;
		qsn_currstate = "view" ;
		if (qsn_thenotes[id].parentid) newdiv=eqr_additem(id);
		else qsn_addnote( id );
	}
	qsn_finishedit();
}

function eqr_saveedit(id) {
	if (qsn_thenotes[id].parentid) var parentid=qsn_thenotes[id].parentid;
	
	if (parentid){
		if (qsn_thenotes[id].items.name.lastname == "" && qsn_thenotes[id].items.name.forename == ""){
			alert(eqr_message["emptyItem"]);
			return false;
		}
	}
	
	if ( ! q_readytosubmit() ) return false ;
	qsn_currstate = "view" ;
	var zindex ;
	if ( ! qsn_isnewnote ) qsn_thenotes[ qsn_backupid( id ) ] = null ;

	zindex = qsn_getzindex( id ) ;

	rm ( qsn_edittarget ) ;

	if (! parentid) var div=qsn_addnote( id ) ;
	else {
		var div=eqr_additem(id);
		// eqr_globaldata[parentid].id=id;
	}
	// qsn_notechanged( id , ( qsn_isnewnote ) ? "newnote" : "notechanged" , eqr_cb_itemlist) ;
	qsn_notechanged( id , ( qsn_isnewnote ) ? "newnote" : "notechanged");

	if (parentid && !qsn_isnewnote ){
		var parentdiv=getelement(parentid);

		eqr_sortlistitem(parentid);
		eqr_updatelistitem(parentdiv);
	}

	qsn_finishedit() ;
}


function eqr_applynewnoterefresh(newid,oldid){
	if (newid){
		var parentid=qsn_thenotes[newid].parentid;
		
		// if (!parentid){
		// 	eqr_globaldata[ newid ] = eqr_globaldata[ oldid ] ;
		// 	eqr_globaldata[ oldid ] = null ;
		// }
		// else eqr_globaldata[parentid].id="";
	}
	// else{
	// 	if (eqr_id!=""){
	// 		// var parid=qsn_thenotes[eqr_id].parentid;
	// 		// qsn_usernotechanged(parid);
	// 		eqr_id="";
	// 	}
	// }
	if (parentid){
		var parentdiv=getelement(parentid);

		eqr_notesupdate(parentid,"mynotes");
		eqr_sortlistitem(parentid);

		qsn_thenotes[parentid].user["lastitem"]=newid;
		// qsn_usernotechanged(parentid);
		qsn_notechanged(parentid);

		eqr_updatelistitem(parentdiv);
	}
}

function eqr_compare(a,b){
	var res=0;
	var a_bis=qsn_thenotes[a].items.name.lastname.toLowerCase();
	var b_bis=qsn_thenotes[b].items.name.lastname.toLowerCase();
	if (a_bis < b_bis) res=-1;
	if (a_bis > b_bis) res=1;

	if (res==0){
		var a_ter=qsn_thenotes[a].items.name.forename.toLowerCase();
		var b_ter=qsn_thenotes[b].items.name.forename.toLowerCase();
		if (a_ter < b_ter) res=-1;
		if (a_ter > b_ter) res=1;
	}
	return res;
}

function eqr_sortlistitem(noteid){
	eqr_mynotes[noteid].sort(eqr_compare);
}

function eqr_updatelistitem(div){
	var template = ( qsn_currstate == "edit" ) ? "eqr_notetemplate_edit" : "eqr_notetemplate" ;
	template=getElementsByClassName(getelement(template),"eqr_listitem")[0];
	var newdiv=q_CloneFromNode(template);
	var olddiv=getElementsByClassName(getContainer(div),"eqr_listitem")[0];
	olddiv.style.display="none";
	var listitem= olddiv.parentNode.insertBefore(newdiv,olddiv);
	listitem.className=olddiv.className;

	rm(olddiv);

	eqr_renderlistitem(div,true);

	return div ;
}

function eqr_renderlistitem(div,full){
	if (qsn_currstate!="edit"){
		var listitem=getElementsByClassName(div,"eqr_listitem")[0];
		var itemname_container=getElementsByClassName(listitem,"eqr_itemname_container")[0];
		var itemname=getElementsByClassName(listitem,"eqr_itemname")[0];
		var itemlist=eqr_mynotes[div.id];
		for (var j=0; j<itemlist.length; j++){
			var authorName=qsn_thenotes[itemlist[j]].items.name.lastname;
			var authorForename=qsn_thenotes[itemlist[j]].items.name.forename;
			var authorBirthday=qsn_thenotes[itemlist[j]].items.birthday.date;
			var authorPoste=qsn_thenotes[itemlist[j]].items.poste.posteequipe;
			if (authorPoste=="") authorPoste=qsn_thenotes[itemlist[j]].items.numero.numerojoueur;
			var itemname_clone=q_CloneFromNode(itemname_container);
			var name=document.createTextNode(authorName);
			var forename=document.createTextNode(authorForename);
			var birthday=document.createTextNode(authorBirthday);
			var poste=document.createTextNode(authorPoste);
			var item_clone=getElementsByClassName(itemname_clone,"eqr_itemname")[0];
			var item_clone2=q_CloneFromNode(item_clone);
			var item_clone3=q_CloneFromNode(item_clone);
			var item_clone4=q_CloneFromNode(item_clone);
			item_clone2.appendChild(name);
			item_clone.appendChild(forename);
			item_clone3.appendChild(birthday);
			item_clone4.appendChild(poste);
			itemname_clone.appendChild(item_clone2);
			itemname_clone.appendChild(item_clone3);
			itemname_clone.appendChild(item_clone4);
			itemname_clone.className = itemlist[j] + "__id " + itemname_clone.className;
			listitem.appendChild(itemname_clone);
		}
		if (itemlist.length==0){
			var nomember=document.createTextNode(eqr_message["nomember"]);
			listitem.appendChild(nomember);
		}
		itemname_container.parentNode.removeChild(itemname_container);
		
		var r=qsn_thenotes[getContainer(div).id];
		var linkadd=getElementsByClassName(div,"eqr_imgadd")[0];
		var linkmodif=getElementsByClassName(div,"eqr_imgmodif")[0];
		var linkdelete=getElementsByClassName(div,"eqr_imgdelete")[0];
		if (!r.img.src || r.img.src==""){
			linkmodif.style.display="none";
			linkdelete.style.display="none";
		}
		else linkadd.style.display="none";
	}
	if(qsn_thenotes[div.id].spacedefaults.common.width==qsn_thenotes[div.id].spacedefaults.common.leftcolwidth){
		eqr_switchlistitem(div,false);
	}
}

function eqr_switchlistitem(div,show){
	var listitem=getElementsByClassName(div,"eqr_border_top")[0];
	if (show==true) listitem.style.display="block";
	else listitem.style.display="none";
}

function eqr_newitem( x ) {
	var id = qsn_makenewjson( "eqr" ) ;

	qsn_thenotes[ id ] = q_cloneObject( eqr_json_templatereply , qsn_thenotes[id] ) ;
	qsn_currstate = "edit" ;
	var container=getContainer( x );
	qsn_thenotes[ id ].parentid = container.id ;
	qsn_thenotes[ id ].common.width = "auto" ;

	var sc = qsn_thenotes[ container.id ].spacedefaults.common ;
	var uc = qsn_thenotes[ container.id ].user.common ;
	
	var isowner = ( members[memberid].userlevel == "admin" ) ;
	
	var preview=getElementsByClassName(container,"eqr_preview_container")[0];
	if ( parseInt(preview.style.width) == "0"){
		var containerwidth = container.offsetWidth - 22;
		var ew = containerwidth;
		var elem=getElementsByClassName(container,"eqr_leftcontent")[0]
	
		ew = Math.max ( 420, ew - 300 );
		eqr_switchlistitem(container,true);
		elem.style.width = ew + "px";
		preview.style.width = containerwidth - ew + "px";
		uc.leftcolwidth = "" + ew + "px" ;
		if ( isowner ) sc.leftcolwidth = "" + ew + "px" ;
			
		if ( isowner ) {
			qsn_adduserrefreshid( container.id ) ;
			qsn_spacedefaultsnotechanged( container.id ) ;
		} else {
			qsn_usernotechanged( container.id ) ;
		}
	}
	
	eqr_additem(id);
	qsn_entereditmode( id ) ;
}

function eqr_closenote( id ){
	if (eqr_mynotes[id]){
		for (var i=0; i<eqr_mynotes[id].length; i++) rm(eqr_mynotes[id][i]);
	}	
	qsn_closenote(id,true);
}

function eqr_newnote() {
	var id = qsn_makenewjson("eqr") ;
	
	// eqr_globaldata[id] = eqr_globaldata["template"];
	
	eqr_buildnewPosition( qsn_thenotes[ id ] ) ;
	q_cloneObject( eqr_json_template , qsn_thenotes[ id ] ) ;
	
	var div=qsn_addnote( id ) ;
	
	// qsn_notechanged( id , "newnote", eqr_cb_newnote ) ;
	qsn_notechanged(id,"newnote");
}

function eqr_buildnewPosition( n ) {
	n.spacedefaults.common.left = ( rndab(10,50) +  q_windowscrollX() ) + "px" ;
	n.spacedefaults.common.top = ( rndab(20,100) +  q_windowscrollY() ) + "px" ;
	n.spacedefaults.common.width = rndab(700,750) + "px";
	n.spacedefaults.common.leftcolwidth = "420px";
	n.user.common.zindex = "" + ( ++zindexmax ) ;
}

function eqr_focusdefaultitem( x ) {
	var id = getContainer( x ).id ;
	focusdefault(x, eqr_message[x.parentNode.className.split(" ")[0].split("_")[1]], "#444444" ) ;
}

function eqr_blurdefaultitem( x ) {
	var id = getContainer( x ).id ;
	blurdefault(x, eqr_message[x.parentNode.className.split(" ")[0].split("_")[1]] , ( qsn_thenotes[ id ].color == "4" ) ? "#FAA" : q_blue , "#444444" ) ;
}

function eqr_updateEdit( x ) {
	var parentdiv=x.parentNode;
	var parentdiv2=parentdiv.parentNode;
	var json;
	if (qsn_thenotes[getContainer(x).id].items) json=qsn_thenotes[getContainer(x).id].items;
	else json=qsn_thenotes[getContainer(x).id];
	if (parentdiv2.className.split(" ")[0].split("_")[1]!=parentdiv.className.split(" ")[0].split("_")[1]) json[parentdiv2.className.split(" ")[0].split("_")[1]][parentdiv.className.split(" ")[0].split("_")[1]]= ( x.value ) ? x.value : "" ;
	else json[parentdiv.className.split(" ")[0].split("_")[1]] = ( x.value ) ? x.value : "" ;
}

function eqr_text_edit_blocks() {
	return [ 'eqr_eb_img' ] ;
}


var eqr_upload_request = {
	"callerid" : "" ,
	"uploadkind" : "image",
	"title" : "" ,
	"prompt" : "" ,
	"multiple" : false,
	"extensions" : ["jpg" , "jpeg" , "png" , "gif" , "tiff" , "tif" ] ,
	"namingdata" : { "wantname" : true },
	"formats" : "halfscreen",
	"callback" : "",
	"cancel": { "callback" : "eqr_cancelimageedit", "args" : [] },
	"reveal": { "anim" : true },	
	"resize" : true ,
 	"resize_option" : { "ratio" : "image" }
}

function eqr_cancelimageedit(){
	var div=qsn_edittarget;
	if (!qsn_thenotes[div.id].parentid) qsn_canceledit();
}

function eqr_launch_upload( x ) {
	eqr_upload_request.callback = "eqr_" + x + "_pc_img_done";
	var id = qsn_edittarget.id ;
	eqr_upload_request.callerid = id ;
	eqr_upload_request.prompt = eqr_message[ "selectanimage" ] ;
	if (qsn_thenotes[qsn_edittarget.id].parentid) eqr_upload_request.title = eqr_message[ "uploadtitlemember" + x ] ;
	else eqr_upload_request.title = eqr_message[ "uploadtitle" + x ] ;
	qdyn_qorgload('qu_reveal',[eqr_upload_request],'qu');
}

function eqr_deleteimg(div){
	if (qsn_currstate!="edit") qsn_editnote(div);
	qsn_thenotes[ qsn_edittarget.id ].imgbk = null ;
	qsn_thenotes[ qsn_edittarget.id ].img.src = null ;
	
	var img = qsn_edittarget.getElementsByTagName( "img" )[ 0 ] ;
	
	rm(img);
	
	if (!qsn_thenotes[ qsn_edittarget.id ].parentid) qsn_saveedit();
}

function eqr_editimg(div){
	var parentdiv=getContainer(div);
	var parid=parentdiv.id;
	
	var typeupload="";
	// eqr_displaycolor=false;
	if (qsn_currstate!="edit") qsn_editnote(div);
	else{
		if (qsn_edittarget!=parentdiv) return;
	}
	
	// eqr_displaycolor=true;
	
	var r=qsn_thenotes[parid];
	if (!r.img.src || r.img.src=="") typeupload="new_pc_img";
	else typeupload="edit_pc_img";
	
	eqr_editimage(typeupload);
}

function eqr_editimage( s ) {
	if ( s == "new_pc_img" ) {
		eqr_launch_upload( "new" ) ;
		return ;
	}
	if ( s == "edit_pc_img" ) {
		eqr_launch_upload( "edit" ) ;
		return ;
	}
	qsn_thenotes[ qsn_edittarget.id ].imgbk = q_cloneObject( qsn_thenotes[ qsn_edittarget.id ].img ) ;
}

function eqr_suppress_img( editblockid ) {
	qsn_thenotes[ qsn_edittarget.id ].imgbk = null ;
	qsn_thenotes[ qsn_edittarget.id ].img.src = null ;
	var img = qsn_edittarget.getElementsByTagName( "img" )[ 0 ] ;
	hideshowblock( [ editblockid ,  'eqr_eb_imgoptions' , 'eqr_eb_imgfinished' ] , eqr_text_edit_blocks() ) ;
	eqr_displaysettings() ;
	
	if (qsn_edittarget.className.match(/\beqr_note\b/g)) qsn_saveedit();
	return false ;
}

function eqr_setimagefromfile( t ) {
	if ( ! q_checkimgextensionfile( t ) ) {
		alert( eqr_message[ "badimgextension" ] ) ;
		return false ;
	}
	qsn_thenotes[ qsn_edittarget.id ].img.src = "file://" + t.value ;
	qsn_thenotes[ qsn_edittarget.id ].img.kind = "pc_local" ;
	eqr_renderimg( qsn_edittarget , qsn_thenotes[ qsn_edittarget.id ] ) ;
	return false ;
}

function eqr_suppress_pc_img() {
	return eqr_suppress_img( "eqr_edit_pc_img" ) ;
}

function eqr_validate_new_pc_img() {
	return eqr_validate_pc_img( "eqr_new_pc_img" ) ;
}

function eqr_validate_edit_pc_img() {
	return eqr_validate_pc_img( "eqr_edit_pc_img" ) ;
}

function eqr_validate_pc_img( editblockid ) {
	if ( ! q_checkimgextensionfile( editblockid + "_file" ) ) {
		alert( eqr_message[ "bagimgextension" ] ) ;
		return false ;
	}
	q_remote_upload( editblockid + "_form" , eval( editblockid + "_done" ) ) ;
	hideshowblock( editblockid , 'eqr_wait_pc_img' ) ;
	return false ;
}

function eqr_new_pc_img_done( x ) {
	return eqr_pc_img_done( "eqr_new_pc_img" , x ) ;
}

function eqr_edit_pc_img_done( x ) {
	return eqr_pc_img_done( "eqr_edit_pc_img" , x ) ;
}

function eqr_pc_img_done( editblockid , x ) {
	qsn_thenotes[ qsn_edittarget.id ].imgbk = null ;
	if (qsn_edittarget.className.match(/\beqr_itemnote\b/g)) qsn_thenotes[ qsn_edittarget.id ].img.src = x.files[0].formats["halfscreen"];
	if (qsn_edittarget.className.match(/\beqr_note\b/g)) qsn_thenotes[ qsn_edittarget.id ].img.src = x.files[0].formats["halfscreen"];
	qsn_thenotes[ qsn_edittarget.id ].img.kind = "pc" ;
	eqr_renderimg( qsn_edittarget , qsn_thenotes[ qsn_edittarget.id ] ) ;
	
	if (qsn_edittarget.className.match(/\beqr_note\b/g)) qsn_saveedit();
	return false ;
}

function eqr_terminateimg() {
	if ( qsn_thenotes[ qsn_edittarget.id ].img.kind == "pc_local" ) {
		if ( ! confirm( eqr_message["pclocalnotvalidate"] ) ) return false ;
		qsn_thenotes[ qsn_edittarget.id ].img = q_cloneObject( qsn_thenotes[ qsn_edittarget.id ].imgbk ) ;
		qsn_thenotes[ qsn_edittarget.id ].imgbk = null ;
		eqr_renderimg( qsn_edittarget , qsn_thenotes[ qsn_edittarget.id ] ) ;
	}
	hideshowblock( [ 'eqr_new_web_img' , 'eqr_new_pc_img' , 'eqr_edit_web_img' , 'eqr_edit_pc_img' , 'eqr_eb_imgfinished' ] , eqr_text_edit_blocks() ) ;
	eqr_displaysettings() ;
	return false ;
}

function eqr_entereditmode(id) {
	if (qsn_thenotes[id].parentid){
		var parentdiv=getelement(qsn_thenotes[id].parentid);
		var x = getelement( id ) ;
		if ( ! qsn_isnewnote ) {
			rm( x ) ;
			qsn_thenotes[ qsn_backupid( id ) ] = q_cloneObject( qsn_thenotes[ id ] ) ;
			eqr_additem(id);
			qsn_edittarget = getelement( id ) ;
		}
		else qsn_edittarget = x ;
		qsn_showsettings(id) ;
		qsn_dimothers( id ) ;
		qsn_puttofront ( ( qsn_thenotes [ qsn_edittarget.id ].parentid ) ? qsn_thenotes [ qsn_edittarget.id ].parentid : id ) ;
		initsky() ;
	}
	else{
		qsn_entereditmode(id,true);
	}
}

function eqr_switchitemvalidation(parentdiv,display){
	var buttons=getElementsByClassName(parentdiv,"eqr_editionbuttons")[0];
	var itemvalidation=getElementsByClassName(parentdiv,"eqr_itemvalidation")[0];
	if (display==false){
		buttons.style.display="block";
		itemvalidation.style.display="none";
	}
	else{
		itemvalidation.style.display="block";
		buttons.style.display="none";
	}
}

function eqr_suppressnote(x){
	if (qsn_thenotes[x].itemslist){
		for (var i=0; i<qsn_thenotes[x].itemslist.length; i++) qsn_thenotes[qsn_thenotes[x].itemslist[i]]= null;
	}
	qsn_suppressnote(x,true);
}

function eqr_allowsuppress( id ) {
	if (qsn_thenotes[ id ].parentid){
		return ( ( qsn_thenotes[ id ].common.ownerid == "quomodo" ) || ( confirm( eqr_message[ "suppressmember" ] ) ) );
	}
	else return qsn_allowsuppress(id, true);
}

function eqr_suppressitem(x){
	var container=getContainer(x);
	if (getElementsByClassName(container,"eqr_selectedItem")[0]){
		selecteditems=getElementsByClassName(container,"eqr_selectedItem");
		var noteid=selecteditems[0].className.split(" ")[0].split("__")[0];
		qsn_suppressnote(noteid,true);
	}
	else{
		if (getElementsByClassName(container,"eqr_itemnote")[0]){
			var itemnote=getElementsByClassName(container,"eqr_itemnote")[0];
			var noteid=itemnote.id;
			qsn_suppressnote(noteid,true);
		}
	}
	
	if (noteid){
		var parid=container.id;

		var itemlist=eqr_mynotes[parid];
		var j;
		var test=false;
		for (var i=0; i<itemlist.length; i++){
			if (itemlist[i]==noteid){
				j=i;
				test=true;
			}
		}

		if (test==true){
			eqr_notesupdate(parid,"mynotes");
		
			itemlist=eqr_mynotes[parid];		
			if (j!=0){
				if (j!=itemlist.length) eqr_additem(itemlist[j]);
				else eqr_additem(itemlist[j-1]);
			}
			else{
				if (itemlist.length>0) eqr_additem(itemlist[j]);
			}
			eqr_updatelistitem(container);
		}
	}
}

function eqr_edititem(x){
	if (pages_mode() != "edit") return false;
	if (members[memberid].userlevel != "admin") return false;
	var container=getContainer(x);
	if (gebcn(container,"eqr_selectedItem")){
		var selecteditem=getElementsByClassName(container,"eqr_selectedItem")[0];		
		var id=selecteditem.className.split(" ")[0].split("__")[0];
	}
	else{
		if (getElementsByClassName(container,"eqr_itemnote")[0]){
			var itemnote=getElementsByClassName(container,"eqr_itemnote")[0];
			var id=itemnote.id;
		}
	}
	if (id){
		qsn_isnewnote = false;
		qsn_currstate = "edit";
		qsn_entereditmode(id);
	}
}

function eqr_importmember(div){
	div.style.display = "none";
	
	var container=getElementsByClassName(getContainer(div),"notecontent")[0];
	var importcontainer=document.createElement('div');
	importcontainer.className="eqr_membercontent eqr_membercontentedit eqr_importcontainer";
	for (var memb in members){
		var linecontainer=document.createElement('div');
		linecontainer.className="eqr_importline";
		linecontainer.id="eqr_member__" + memb;
		linecontainer.onclick=function(){eqr_selectItemimport(this); return false;};
		var name="";
		if (members[memb].username){
			name=name + members[memb].username;
			if (members[memb].firstname) name=name + ", ";
		}
		if (members[memb].firstname) name=name + members[memb].firstname;
		var namenode=document.createTextNode(name);
		linecontainer.appendChild(namenode);
		if (members[memb].username!="Quomodo") importcontainer.appendChild(linecontainer);
	}
	container.appendChild(importcontainer);
}


function eqr_buttonsSwitch(div){
	var buttons=getElementsByClassName(getContainer(div),"eqr_buttonsleft")[0];
	if (buttons.style.display=="none") buttons.style.display="block";
	else buttons.style.display="none";
}

function eqr_widthinfo(){
	return {wfixed: true};
}

function eqr_initforweb(noteid){
//	var div=getelement(noteid);
//	var listitem=getElementsByClassName(div,"eqr_listitem")[0];
//	var itemname_containers=getElementsByClassName(listitem,"eqr_itemname_container");
//	for (var j=0; j<itemname_containers.length; j++){
//		itemname_containers[j].onclick=function(){eqr_selectItem(this); return false;};
//	}
}

var eqr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "eqr_js_loaded" ) ;


var ffbb_templates_prepared = false ;
var ffbb_leftcol_prepared = false ;

//var ffbb_json_template = { version : 1 , color : "#ACD2EA" , textsize : "2" , textfont : "1" , headerdisplay : "1" , header : { color: "0" } , signature : "0" } ;
var ffbb_json_template = { version : 2 , color : "#ACD2EA" , textstyles: { size : "1" , font : "0" }, header : { display: "true", color: "0", text : "Actualités de la FFBB" }} ;

var ffbb_colordesc = { "qmc1" : "color" , "qmc2_qmc1" : "header.color" , "qmc3" : ffbb_qmc3} ; 
var ffbb_textdesc = { "qtxt1" : { "size" : "textstyles.size" , "font" : "textstyles.font" }  };

var ffbb_leftcol_description = [ 
{what : "notecolor" , tabname : "tabcolor" , visible : true , elems : [ 
	{ handler : "qsn_addqlubcolorblock" , params : { jsonpath : "color" , others : true ,  transparent:true , title:false , menuseparator: false , modifynote : "qsn_setcolors"  } },
	{ handler : "ffbb_addffbbcolor" , params : { jsonpath : "color" } }		
	] } , 
{ what : "bandeau" , tabname : "tabheader" , visible : false , elems : [    
	{ handler : "xqsn_addheadercolor" , params : { notekind:"ffbb" , jsonpath : "header.color" } }
	] } , 
{ what : "textstyles" , tabname : "tabtext" , visible : false , elems : [ 
	{ handler : "qsn_addfontfsizes"   , params : { jsonpath : "textstyles.size" , ncols : 2  } } , 
	{ handler : "qsn_addfontfamilies", params : { jsonpath : "textstyles.font" , ncols : 2  } } 
	] }
] ;


function ffbb_qmc3( r ) {
	return "/services/ffbb/images/ffbb48.png" ;
}

function ffbb_upgradejson( r ) {
	if ( ( r.version ) && ( r.version == ffbb_json_template.version ) ) return r ;
	if ( r.version<2 ) ffbb_upgradejsontov2( r ) ;
	r.version = ffbb_json_template.version;
	return r ;
}

function ffbb_upgradejsontov2(r){
	r.textstyles = { size: String( Math.max( Math.min( 3 - parseInt( r.textsize , 10 ) , 2 ) , 0 ) ) } ;
	var oldfonts = [ "0" , "1" , "3" , "4" ] ;
	r.textstyles.font = oldfonts[ parseInt( r.textfont , 10 ) - 1 ] ;
	r.header.display = String( r.headerdisplay == 1 ) ;
	delete r.textsize ;
	delete r.textfont ;
	delete r.headerdisplay ;
	delete r.signature ;
	return r ;
}

/*
function -
function RENDER
*/


function ffbb_template( id ) {
	if ( ffbb_templates_prepared ) return qsn_template( id , true ) ;
	qsn_installcontainer( "view" , "ffbb" , ge( "ffbb_notecontent" ).innerHTML ) ;
	var div = qsn_installcontainer( "edit" , "ffbb" , ge( "ffbb_notecontent_edit" ).innerHTML ) ;
	ffbb_templates_prepared = true ;
	return qsn_template( id , true ) ;
}

function ffbb_renderhtml( noteid ) {
	var div = getelement( noteid ) ;
	div.minWidth = "200px" ;
	var r = qsn_thenotes[ noteid ] ;
	gebcn( div , "text" ).value = r.text ;
	
	qsn_container_renderhtml( div , r ) ;
	ffbb_rendertext( div );
}

function ffbb_rendertext( div ) {
	var txt = gebcn( div , "text" ) ;
	txt.innerHTML = "" ;
	ffbb_ajaxget( "/cgi-bin/cgihtmlperl_ffbb?url=http://www.ffbb.com/index.php?champ=1" , ffbb_rendertext_done , div);
}

function ffbb_rendertext_done( ffbbsite , div ) {
	var noteid = div.id;
	var r = qsn_thenotes[ noteid ] ;
	var txt = gebcn( div , "text" ) ;
	var re = new RegExp("<a class=\"corpsli\" href=\"_actu/page_m\\.php\\?d=actu&p=actu[^>]*>([^<]+?)<\\/a>", "g" ) ;
	var thelines = ffbbsite.match( re ) ;
	var EndResult = ""; 
	for ( var i = 0 ; i < thelines.length ; i++ ) EndResult += '<br /><img class="ffbb_puce" width="11" height="10" src="/images/blank.gif" border="0"/> ' + thelines[ i ]; 
	var re = new RegExp("_actu/page_m\.php\?" , "g" ) ;
	EndResult = EndResult.replace ( re , "http://www.basketfrance.com/_actu/page_m.php?");
	re = new RegExp("corpsli" , "g" ) ;
	EndResult = EndResult.replace (re, "corpsli qmc1 text_contrast150 qtxt1 all");
	re = new RegExp("href=" , "g" ) ;
	EndResult = EndResult.replace ( re , "target=\"_blank\" href=");
	txt.innerHTML = EndResult; 
	qsn_setcolors( noteid ) ;
	qsn_settextproperties( noteid ) ;
	ffbb_renderpuce ( div , r ) ;
}

function ffbb_renderpuce ( div , r ) {
	if (r.color == "#ACD2EA" ) {
		var items = getElementsByClassName ( div , "ffbb_puce" ) ;
		for ( var i in items ) items[i].style.backgroundImage = "url('/services/ffbb/images/puce0.png')";
	}
}

/*
function -
function EDIT
*/

function ffbb_newnote( ) {
	if ( qsn_currstate != "view" ) {
		alert ( qsn_message [ "notviewmode" ] ) ;
		return false ;
	}
	var jsonnewnote = qsn_fulljson_template( "ffbb" ) ;
	var id = qsn_makenewfulljson( "ffbb" , jsonnewnote ) ;
	qsn_thenotes[ id ].color = "#ACD2EA" ;
	qsn_addnote( id ) ;
	qsn_notechanged( id , "newnote"  ) ;
	qsn_currstate = "view" ;
	qsn_isnewnote = false ; 
	return true ; 
}

function ffbb_saveedit( ) {
	qsn_container_saveedit() ;
	qsn_saveedit( true ) ;
}

function ffbb_setffbbcolor() {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	r.color= "#ACD2EA" ;
	qsn_setcolors( qsn_edittarget.id ) ;
	ffbb_renderpuce( qsn_edittarget, r ) ;
}

function ffbb_addffbbcolor( target , js ) {
	var div = qsn_addleftcolelem( target , "<div align=\"center\"><a class=\"button\" href=\"quomodo:background\" onclick=\"ffbb_setffbbcolor(); return false\" style=\"background-color:#ACD2EA;color:black;\">Couleur FFBB</a></div>" ) ;
	return div ;
}

function ffbb_displaysettings() {
	qsn_initdisplaysetting() ;
	return false ;
}

function ffbb_focusdefault( x ) {
	if ( x.value == ffbb_message[ "newnoteprompt" ] ) x.value = "" ;
}

function ffbb_blurdefault( x ) {
	if ( ( x.value == "" ) ) x.value = ffbb_message[ "newnoteprompt" ] ;
}

/*
function -
function UTILES
*/

function ffbb_ajaxget( url , callBack , params ) {
	//correction de l'url pour safari (qui remplace http par feed)
	var re = new RegExp("feed://" , "g" ) ;
	url = url.replace( re , "http://" ) ;
	var req=null;
	if ( window.XMLHttpRequest ) {
 		req = new XMLHttpRequest() ;
	} else if ( window.ActiveXObject ) {
		try { req = new ActiveXObject ( "Msxml2.XMLHTTP" ) ;} 
		catch (e )  {
			try { req = new ActiveXObject ( "Microsoft.XMLHTTP" ) ; } 
			catch (e )  {}
		}
	}
	//var temp = new Date( );
	//url = url + "?temp=" + temp.getTime();
	req.open( "GET" , url , true ) ;
	req.send ( null ) ;
	req.onreadystatechange = function () { 
		if(req.readyState != 4 ) return;
		if( req.status !=200 && req.status != 304 ) return ;
		  callBack (req.responseText , params);
	} ;
}

/*
function -
function TOOLBAR
*/

function ffbb_toolbarversion() {
	return 1 ;
}


function ffbb_initforweb( id ) {
	ffbb_rendertext( ge( id ) ) ;
}


var ffbb_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "ffbb_js_loaded" ) ;


var files_message = {
"newnoteprompt" : "Cliquez ici pour créer une nouvelle note Documents" ,
"notetitleprompt" : "Cliquez ici pour ajouter un titre." ,
"notedescprompt" : "Entrez ici votre description",
"plug" : "Documents_Affichez les documents de votre choix et proposez une archive ZIP." ,
"desc" : "La note Documents permet de stocker et de télécharger des documents dans une page",
"upload_title" : "Importer des documents",
"upload_prompt" : "Cliquez sur OK pour sélectionner les documents à importer",
"thefile" : "Cliquez ici pour ouvrir le fichier ",
"nofiles" : "Vous devez sélectionner au moins un fichier avant de valider.",
"confirmdelete" : "Êtes-vous sûr de vouloir supprimer ce fichier ?",
"deletefilealt" : "Supprimer ce fichier", 
"ziping" : "Le fichier est en cours de préparation. Merci de bien vouloir patienter..."
} ;

var files_msgs_fr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "files_msgs_fr_js_loaded" ) ;


var files_templates_prepared = false ;
var files_leftcol_prepared = false ;
var files_json_template = { version: 2 ,  text : "" , color : "rgb(100%,100%,100%)" , header : { display: "true", color: "c1", text : "" } , textstyles: { size : "1" , font : "0" , bold : "false" , italic : "false" , center : "false" }, files : [] } ;

var files_colordesc = { "qmc1" : "color" , "qmc2_qmc1" : "header.color" , "qmc3" : files_qmc3 } ; 
var files_textdesc = { "qtxt1" : { "size" : "textstyles.size" , "font" : "textstyles.font" ,  "bold" : "textstyles.bold" , "center" : "textstyles.center" , "italic" : "textstyles.italic" }  };


var files_leftcol_description = [
{ what : "notecolor" , tabname : "tabcolor" , visible : true , elems : [ 
	{ handler : "qsn_addqlubcolorblock" , params : { jsonpath : "color" , others : true ,  transparent:true , title:false , menuseparator: false , modifynote : "qsn_setcolors"  } } 
	] } , 
{ what : "bandeau" , tabname : "tabheader" , visible : false , elems : [    
	{ handler : "qsn_addheaderhideshow" , params : { notekind:"files" , title:"" , jsonpath : "header.display" } } , 
	{ handler : "qsn_addheadercolor" , params : { jsonpath : "header.color" } }
	] } , 
{ what : "textstyles" , tabname : "tabtext" , visible : false , elems : [ 
	{ handler : "qsn_addfontfsizes" , params : { jsonpath : "textstyles.size" , ncols : 2  } } , 
	{ handler : "qsn_addfontfamilies", params : { jsonpath : "textstyles.font" , ncols : 2  } } , 
	{ handler : "qsn_addtextoptions", params : { jsonpath : "textstyles" , ncols : 2 , opts : [ "bold" , "center" , "italic"  ] } }
	] }
] ;

function files_qmc3( r ) {
	return "/services/files/images/files48.png" ;
}

function files_upgradejson( r ) {
	if ( ! r.version ) r.version = 1 ;
	if ( r.version == files_json_template.version ) return r ;
	if ( r.version < 2 ) r = files_upgradejsontov2( r ) ;
	r.version = files_json_template.version ;
	return r ;
}

function files_upgradejsontov2( r ) {
	if ( r.headerdisplay ) { 
		r.header.display = (r.headerdisplay == "1") ? "true" : "false";
		delete r.headerdisplay;
	}	
	r.textstyles = { size : "1" , font : "0" , bold : "false" , italic : "false" , center : "false" } ;
	return r ;
}

/*
function -
function FILES FUNCTIONS
*/

var files_upload_request = {
	"callerid" : "",
	"uploadkind" : "",
	"title" : "N/A",
	"prompt" : "N/A",
	"multiple" : true,
	"extensions" : [ "any" ] ,
	"namingdata" : { "wantname" : false },
	"callback" : "files_addfiles_done", 
	"multiple_callback" : "files_addfiles_done",
	"multiple_extensions" : [ "any" ],
	"formats" : "",
	"cancel": { } , 
	"reveal": { "anim" : true }
};

function files_addfiles(){
	files_upload_request.callerid = qsn_edittarget.id ;
	files_upload_request.title = files_message["upload_title"];
	files_upload_request.prompt = files_message["upload_prompt"];
	qdyn_qorgload( 'qu_reveal', [ files_upload_request ], 'qu' ) ;
}


function files_addfiles_done( pdata ){
	var div = qsn_edittarget;
	var r = qsn_thenotes[ div.id ];
	for ( var i = 0; i < pdata.files.length; i++)  r.files.push( pdata.files[ i ] );
	files_renderfilestable(div, r );
}

function files_zipall(elem) {
	var div = getContainer(elem);
	var r = qsn_thenotes[ div.id ];
	qdyn_qorgload( "waitforfile_reveal" , [ files_message["ziping"] , files_zipall_submit, [ r ] ] , "waitforfile" ) ;
}

function files_zipall_submit(record){
	document.mainform.mission.value = "zipfiles" ;
	q_ajaxsubmitwithservice( "common@fr" , record, waitforfile_done ) ;
}

/*
function -
function SET FUNCTIONS
*/

function files_displaysettings() {
	qsn_initdisplaysetting() ;
	return false ;	
}

function files_focusdefault( x, elem ) {
	if ( x.value == files_message[ elem ] ) x.value = "" ;
}

function files_blurdefault( x, elem ) {
	//if ( ( x.value == "" ) || ( x.value == files_message[ elem ] ) ) x.value = files_message[ elem ] ;
}

/*
function -
function RENDER FUNCTIONS
*/

function files_template( id ) {
	if ( files_templates_prepared ) return qsn_template( id , true ) ;
	qsn_installcontainer( "view" , "files" , ge( "files_notecontent" ).innerHTML ) ;
	var div = qsn_installcontainer( "edit" , "files" , ge( "files_notecontent_edit" ).innerHTML ) ;
	files_templates_prepared = true ;
	return qsn_template( id , true ) ;
}

function files_renderhtml( noteid ) {
	var div = ge( noteid ) ;
	var r = qsn_thenotes[ noteid ] ;
	files_renderdesc(div, r);
	files_renderfilestable(div, r);
	
	qsn_container_renderhtml( div , r ) ;
	if ( qsn_currstate == "edit" ) files_blurdefault ( gebcn( div , "files_desc" ), "notedescprompt") ;
}

function files_renderdesc(div, r){
	if ( qsn_currstate == "edit" ) gebcn( div, "files_desc" ).value = r.text;
	else q_innerHTML( gebcn( div, "files_desc" ) , r.text ) ;
}

function files_renderfilestable( div, r ){
	var thediv = gebcn(div, "files_files");
	thediv.innerHTML ="";

	var filesoptions = {
		filespath : "files",		
		pics : "false",
		size : ( qsn_currstate == "edit" ) ? "true" : "false",
		rmline : ( qsn_currstate == "edit" ) ? "true" : "false",
		selection : { active : "false", multiple : "true", selected : [] },
		titles : ( qsn_currstate == "edit" ) ? "true" : "false"
	};

	thediv.appendChild( qsn_filestable_add( div.id, filesoptions ) );
	qsn_filestable_sorttable( div.id, filesoptions );

	qsn_settextproperties( div.id ) ;
	qsn_setcolors( div.id ) ;

};

/*
function -
function SAVE FUNCTIONS
*/


function files_saveedit() {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;

	var desc = gebcn( qsn_edittarget, "files_desc" );
	r.text = (desc.value && desc.value != files_message["notedescprompt"]) ? desc.value : "";
	  if ( r.files.length == 0 ) {
		alert( files_message["nofiles"] );
		return false;
	  }
	qsn_container_saveedit() ;
	qsn_saveedit( true ) ;
}

/*
function -
function TOOLBAR
*/

function files_toolbarversion() {
	return 1 ;
}

var files_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "files_js_loaded" ) ;


var flickr_message = {
"newnoteprompt" : "cliquez ici pour créer une nouvelle note Flickr" ,
"plug" : "Flickr_Affichez dans votre espace des photos stockées chez Flickr." ,
"desc" : "La note Flickr permet d'afficher très simplement des photos issues de site de partage de photos Flickr",
"notetitleprompt" : "Entrez le titre de la note",
"back" : "précédent",
"next" : "suivant",
"on" : " sur ",
"page" : "page ",
"nokeywords" : "Aucun mot-clé n'a été entré", 
"nophoto" : "Aucune photo ne correspond à la recherche",
"sortby" : "Trier par : ",
"interest" : "interêt",
"interestingnesstitle" : "Cliquez ici pour afficher les images classées par interet",
"date" : "date",
"recentnesstitle" : "Cliquez ici pour afficher les images classées par date depuis la plus récente",
"relevance" : "pertinence",
"relevancenesstitle" : "Cliquez ici pour afficher les images classées par pertinence", 
"originalphototitle" : "Cliquez ici pour télécharger l'original de la photo",
"originalphoto" : "Télécharger l'original",
"backtolist" : "retour à la liste",
"search_display" :  "afficher la recherche",
"search_hide" : "masquer la recherche", 
"flickroptions" : "Affichage", 
"ppp" : "Nb d'images par page :", 
"taboptions" : "Options de la note"
} ;

var flickr_msgs_fr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "flickr_msgs_fr_js_loaded" ) ;


var flickr_templates_prepared = false ;
var flickr_leftcol_prepared = false ;
var flickr_json_template = { version: 3 ,  text : "" , color : "rgb(100%,100%,100%)" , header : { display:"true", color: "c1", text : "" } , ppp : 9 , lastsearch : { keywords : "", option : "text", sorting : "" , page : 1 } , laststate : { state : "" , photo_id : "" } , searchvisible : true } ;

function flickr_upgradejson( r ) {
	if ( ( r.version ) && ( r.version == flickr_json_template.version ) ) return r ;
	if ( ! r.header ) r.header = flickr_json_template.header ;
	if ( r.headerdisplay ) { 
		r.header.display = ( r.headerdisplay == "1" ) ? "true" : "false" ;
		delete r.headerdisplay ;
	}
	return r ;
}

var flickr_colordesc = {  "qmc1" : "color" , "qmc2_qmc1" : "header.color" , "qmc3" : flickr_qmc3 } ; 

var flickr_leftcol_description = [
{ what : "notecolor" , tabname : "tabcolor" , visible : true , elems : [ 
	{ handler : "qsn_addqlubcolorblock" , params : { jsonpath : "color" , others : true ,  transparent:true , title:false , menuseparator: false , modifynote : "qsn_setcolors"  } } 
	] } , 
{ what : "bandeau" , tabname : "tabheader" , visible : false , elems : [    
	{ handler : "qsn_addheaderhideshow" , params : { notekind:"flickr" , title:"" , jsonpath : "header.display" } } , 
	{ handler : "qsn_addheadercolor" , params : { jsonpath : "header.color" } }
	] } , 
{ what : "options" , tabname : "taboptions" , visible : false , elems : [ 
	{ handler : "flickr_addradios" , params : { className : "flickr_imagenb" , jsonpath:"ppp" , title:"ppp" , cols : "2", radios : [ [ "9", "9" ], [ "12", "12" ] , [ "15", "15" ] , [ "18", "18" ] , [ "21", "21" ] , [ "24", "24" ] ]  } }
	] }
] ;

function flickr_qmc3( r ) {
	return "/services/flickr/images/flickr48.png" ;
}

/*
function -
function GLOBAL VARIABLES
*/

var flickr_key;
var flickr_format;
var flickr_address;

function flickr_defineGlobals(){
	flickr_key = "97c5d44998f5acf90f56dfe661b4bbaa";
	flickr_format = "json";
	flickr_address= "http://api.flickr.com/services/rest/?";
};

/*
function -
function BASIC FUNCTIONS
*/

function ctn(x){ return document.createTextNode(x); }
function cel(x){ return document.createElement(x); }

function JSONscriptRequest(fullUrl) {
	  this.fullUrl = fullUrl;
	  this.noCacheIE = '&noCacheIE=' + (new Date() ) .getTime();
	  this.headLoc = document.getElementsByTagName("head").item(0);
	  this.scriptId = 'azScriptId' + JSONscriptRequest.scriptCounter++;
	};
	JSONscriptRequest.scriptCounter = 1;
	JSONscriptRequest.prototype.buildScriptTag = function () {
	  this.scriptObj = document.createElement("script");
	  this.scriptObj.setAttribute("type", "text/javascript");
	  this.scriptObj.setAttribute("src", this.fullUrl + this.noCacheIE);
	  this.scriptObj.setAttribute("id", this.scriptId);
	};
	JSONscriptRequest.prototype.removeScriptTag = function () {
	  this.headLoc.removeChild(this.scriptObj);
	};
	JSONscriptRequest.prototype.addScriptTag = function () {
	  this.headLoc.appendChild(this.scriptObj);
};

function flickr_removeblanks( text ) { return text.replace( /^ +/ , "" ).replace( / +$/ , "") ; } ;

function flickr_displaysettings() {
	qsn_initdisplaysetting() ;
	return false ;	
}

function flickr_addradios( target , js ) {
	return qsn_addleftcolelem( target , qsn_addradiotable( js ) , js.className ) ;
}


/*
function -
function RENDER FUNCTIONS
*/

function flickr_template( id ) {
	if ( flickr_templates_prepared ) return qsn_template( id , true ) ;
	qsn_installcontainer( "view" , "flickr" , ge( "flickr_notecontent" ).innerHTML ) ;
	var div = qsn_installcontainer( "edit" , "flickr" , ge( "flickr_notecontent_edit" ).innerHTML ) ;
	flickr_templates_prepared = true ;
	return qsn_template( id , true ) ;
}


function flickr_renderhtml( noteid ) {
	var div = ge( noteid ) ;
	var r = qsn_thenotes[ noteid ] ;
	if ( qsn_currstate != "edit" &&  ! ( window.q_makeweb &&  ! window.web_js_loaded ) ) {//on n'est pas en train de webber la page !!
		flickr_search( div, { page : r.lastsearch.page, sorting : r.lastsearch.sorting } , "dontsave" );
	}

	if ( qsn_currstate == "edit" ) flickr_renderlastsearch( div ) ;
	qsn_container_renderhtml( div , r ) ;
	qsn_setcolors( r.common.noteid ) ;
}

function flickr_renderlastsearch( x ){
	var note = getContainer( x );
	var r = qsn_thenotes[ note.id ].lastsearch;
	gebcn( note, "searchkw" ).value = r.keywords;
	if ( r.option == "tags" ) gebcn( note, "flickr_search_tags" ).checked=true;
	else gebcn( note, "flickr_search_text" ).checked=true;
}

/*
function -
function SAVE FUNCTIONS
*/


function flickr_saveedit() {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;

	var content = flickr_removeblanks(gebcn(qsn_edittarget, "searchkw").value);
	if ( content == ""){
		alert(flickr_message[ "nokeywords" ]);
		return false;
	}
	r.lastsearch.keywords = content;
	r.lastsearch.page = 1;
	r.lastsearch.option =  (gebcn(qsn_edittarget, "flickr_search_tags").checked) ? "tags" : "text";
	qsn_container_saveedit() ;
	qsn_saveedit( true ) ;
}

function flickr_notechanged(id, alerttype){
	//console.log("Alerte : "+ alerttype + ", j'essaie de sauver");
	qsn_notechanged( id , "notechanged") ;
}

/*
function -
function SEARCH FUNCTIONS
*/

function flickr_search(elem, params, savestatus){
	var note = getContainer(elem);
	var r = qsn_thenotes[note.id];
	flickr_defineGlobals();
	var content = r.lastsearch.keywords;
	if ( content == ''){
		gebcn(note, "searchkw").value = content;
		if (!savestatus) alert(flickr_message[ "nokeywords" ]);
		return false;
	}
	var request = flickr_address;
	request += "method=flickr.photos.search";
	request +=  "&" + r.lastsearch.option + "=";
	request += content;
	request += "&per_page=";
	request += r.ppp;
	if (params && params.page) {
		request += "&page=";
		request += params.page;
		r.lastsearch.page = params.page;
		}
	request += "&sort=";
	if (params && params.sorting && params.sorting != ""){
		request += params.sorting;
		r.lastsearch.sorting = params.sorting;
		}
	else {
		request += "date-posted-desc";
		r.lastsearch.sorting = "date-posted-desc";	
		}
	request += "&format=";
	request += flickr_format;
	request += "&api_key=";
	request += flickr_key;
	request += "&jsoncallback="; 
	var callback="flickr_displayphotos";
	request +=  callback+ "_"+ note.id;
	eval("window." + callback + "_" + note.id + " = function(x){ flickr_displayphotos('"+note.id+"', x); }");
	//alert("Keywords : " + r.lastsearch.keywords + ", option : " + r.lastsearch.option + " , page : " + r.lastsearch.page);
	if (!savestatus && document.mainform.pagemode && document.mainform.pagemode.value == "edit") flickr_notechanged(note.id, "search");
	
	//alert(request);
	//window.open(request);
	var aObj = new JSONscriptRequest(request);
	aObj.buildScriptTag();
	aObj.addScriptTag();
}

function flickr_searchphoto(elem, photoid, savestatus){
	var note = getContainer(elem);
	var callback = "flickr_displayphoto";
	flickr_defineGlobals();
	var request = flickr_address;
	request += "method=flickr.photos.getInfo";
	request += "&photo_id=";
	request += photoid;
	request += "&format=";
	request += flickr_format;
	request += "&api_key=";
	request += flickr_key;
	request += "&jsoncallback=";
	request += callback + "_" + note.id;
	eval("window." + callback + "_" + note.id + " = function(x){ " + callback + "('"+note.id+"', x); }");
	//console.log(request);
	//window.open(request);
	var aObj = new JSONscriptRequest(request);
	aObj.buildScriptTag();
	aObj.addScriptTag();
}

/*
function -
function DISPLAY FUNCTIONS
*/

function flickr_displayphotos(noteid, x){
	var note = ge(noteid);
	//flickr_switchdisplay(noteid, "displayphotos");
	var div = gebcn( note, "flickr_photosdiv");	
	div.innerHTML = "";
	if (x.stat =="ok"){
		var page = x.photos.page;
		var pages = x.photos.pages;
		var perpage = x.photos.perpage;
		var total = x.photos.total;
		var listphotos = x.photos.photo;
		//alert("Page : "  + page + ", Pages : " + pages + ", Perpage : " + perpage + ", Total : " + total);
		if ( listphotos.length == 0 ) {
			div.appendChild( ctn( flickr_message[ "nophoto" ] ) );
			return false;
		}
		div.appendChild( flickr_displaysorting( note.id ) );
		for ( var i in listphotos ){
			var tmpfarm = listphotos[ i ].farm;
			var tmpserver = listphotos[ i ].server;
			var tmpid  = listphotos[ i ].id;
			var tmptitle = listphotos[ i ].title;
			var tmpsecret = listphotos[ i ].secret;
			var tmpadress = "http://farm" + tmpfarm + ".static.flickr.com/" + tmpserver + "/" + tmpid + "_" + tmpsecret + "_s.jpg";
			//alert("Adress : " + tmpadress + ", Title : " + tmptitle);
			div.appendChild( flickr_displaythumb( tmpid, tmpadress, tmptitle ) );
		}
		div.appendChild( cel( "BR" ) );
		div.appendChild( flickr_displaynav( note.id, page, pages ) );
	}
	else div.appendChild(ctn(x.stat.message) ) ;
	qsn_setcolors(noteid);
	hideshowblock ( "flickr_wait" , "flickr_photosdiv", note.id ) ;
}

function flickr_displaynav(noteid, x, y){
	var r = qsn_thenotes[noteid].lastsearch;
	var navdiv = cel("div");
	var curpage = parseInt(x, 10);
	var totalpages = parseInt(y, 10);
	if ( curpage > 1){
		var backpage = create_elem("A", { innerHTML : '< ' + flickr_message[ "back" ] , className : "qmc1 text_contrast150", href : "quomodo_back", style : { cursor : "pointer" } } );
		backpage.onmousedown = function( event ){ q_stopPropagation( event ) ; }
		backpage.onclick = function(){ flickr_search( this, { page : curpage-1, sorting : r.sorting } ) ; return false ; } ;
		navdiv.appendChild(backpage);
		navdiv.appendChild(ctn(' | ') ) ;
	}
	navdiv.appendChild( ctn( flickr_message[ "page" ] + curpage + flickr_message[ "on" ] + totalpages) ) ;
	if ( curpage < totalpages ){
		var nextpage = create_elem( "A", { innerHTML : flickr_message[ "next" ] + ' >', className : "qmc1 text_contrast150", href : "quomodo_next", style : { cursor : "pointer" } } ); 
		nextpage.onmousedown = function( event ){ q_stopPropagation( event ) ; }
		nextpage.onclick = function () { flickr_search( this, { page : curpage+1, sorting : r.sorting } ) ; return false ; } ;
		navdiv.appendChild( ctn( ' | ' ) );	
		navdiv.appendChild( nextpage );
	}
	navdiv.appendChild( cel( "BR" ) );
	navdiv.style.paddingBottom = "10px";
	return navdiv;
}

function flickr_displaysorting( noteid ){
	var note = ge( noteid );
	noteid = note.id;
	var r = qsn_thenotes[ noteid ].lastsearch;

	var sortingdiv = create_elem("DIV", {className : "sorting_options", innerHTML : flickr_message[ "sortby" ]});
	//date-posted-asc, date-posted-desc, date-taken-asc, date-taken-desc, interestingness-desc, interestingness-asc, and relevance.
	sortingdiv.appendChild( flickr_sort( noteid, "interestingness-desc", "interest", "interestingnesstitle") ) ;
	sortingdiv.appendChild(ctn(" | ") ) ;
	sortingdiv.appendChild( flickr_sort( noteid, "date-posted-desc", "date", "recentnesstitle") ) ;
	if (r.option != "tags"){
		sortingdiv.appendChild(ctn(" | ") ) ;
		sortingdiv.appendChild( flickr_sort( noteid, "relevance", "relevance", "relevancenesstitle") ) ;
	}
	return sortingdiv;
}

function flickr_displaythumb( id, adress, title ){
	var dims = "75";
	var img = create_elem("IMG", { className : "flickr_thumb", title : title, src : adress, width : dims, height : dims, style : { cursor : "url('/services/flickr/images/zoomin.cur'), pointer" } } );
	img.onmousedown = function( event ){ q_stopPropagation( event ) ; }
	img.onclick = function(){ flickr_searchphoto( this, id ) ; } ;
	return img;
}

function flickr_displayphoto( noteid, x ){
	var r = qsn_thenotes[ noteid ];
	var div = create_elem("DIV", { className : "flickr_photodiv", align : "center", style : { backgroundColor : "white" , padding : "20px", width : "600px" } } ) ;
	if ( x.stat =="ok" ) {
		var photo = x.photo;
		var photofarm = photo.farm;
		var photoserver = photo.server;
		var photoid  = photo.id;
		var phototitle = photo.title._content || "Détails de la photo";
		var photodescription = photo.description._content;
		var photosecret = photo.secret;
		var photoadress = "http://farm" + photofarm + ".static.flickr.com/" + photoserver + "/" + photoid + "_" + photosecret + "_m.jpg";
		//var title = create_elem( "SPAN", { innerHTML : phototitle, className : "flickr_phototitle" } ) ;
		//div.appendChild( title );
		//div.appendChild( cel( 'BR' ) );
		var img = create_elem( "IMG", { className : "flickr_photoimg" , title : photo.title._content , src : photoadress, style : { cursor : "url('/services/flickr/images/zoomout.cur'), pointer", padding : "10px" } } ) ;
		img.onclick = function(){ q_fsm_delete(); return false ; } ;
		div.appendChild( img );
		div.appendChild( cel( 'BR' ) );
		if ( photo.originalsecret ) {
			var originalphoto = create_elem("A", { href : "http://farm" + photofarm + ".static.flickr.com/" + photoserver + "/" + photoid + "_" + photo.originalsecret + "_o."+ photo.originalformat , title : flickr_message[ "originalphototitle" ], innerHTML : flickr_message[ "originalphoto" ], target : "_blank", style : { fontStyle : "oblique", crusor : "pointer", color : "#333" } } ) ;
			div.appendChild( originalphoto );
			div.appendChild( cel('br') ) ;
		}
		var desc = create_elem("SPAN", { innerHTML : photodescription, style : { fontSize : "11px", fontWeight : "normal" } } );
		div.appendChild( desc );
		div.appendChild( cel("BR" ) );
		div.appendChild( cel("BR" ) );
		var backtolist = create_elem("A", { innerHTML : flickr_message[ "backtolist" ], className : "flickr_backtolist", href : "quomodo:backtolist", style : { fontStyle : "oblique", cursor : "pointer", color : "#333" } } );
		backtolist.onclick=function(){ q_fsm_delete(); return false ; } ;
		div.appendChild(backtolist);
	}
	else div.innerHTML  = x.stat.message;
	q_fsm_reveal( { src : div  , title : phototitle } ) ;
}


/*
function -
function UTILES
*/

function flickr_sort(noteid, alias, theMessage, theMessageTitle){
	var r = qsn_thenotes[ noteid ].lastsearch;
	var elem = create_elem( "A", { innerHTML : flickr_message[ theMessage ], title : flickr_message[ theMessageTitle ] } );
	if ( r.sorting == alias ) {
		elem.className = "sorting-" + alias + " qmc1 text_bw";
		elem.style.cursor = "default";
		elem.style.fontWeight = "bold";
	} else {	
		elem.className = "sorting-" + alias + " qmc1 text_contrast150";
		elem.style.cursor = "pointer";
		elem.onclick=function(){ flickr_search( this, { sorting : alias } ) ; } ;
		elem.onmousedown = function( event ){ q_stopPropagation( event ) ; }
	}
	return elem;
}


function flickr_initforweb( id ) {
	flickr_renderhtml( id );
}


/*
function -
function TOOLBAR
*/

function flickr_toolbarversion() {
	return 1 ;
}


var flickr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "flickr_js_loaded" ) ;


var fv_templates_prepared = false ;
var fv_leftcol_prepared = false ;

//var fv_json_template = { version: 1 , text : "" , fv : { kind : "", xmlconfig: "", width:400, height:300, version: 0 } , color : 1 , textstyles : { size : "2" , font : "0" , bold : "false" , center : "false" , italic : "false" } , textcolor : -1, notemargin: 1} ;

//var fv_json_template = { version: 2 , text : "" , fv : { kind : "", xmlconfig: "", width:400, height:300, version: 0 } , color : 1 , textstyles : { size : "2" , font : "0" , bold : "false" , center : "false" , italic : "false" } , textcolor : -1, notemargin: 1, options : {autoplay : "false", loop : "false", showplayer : "autohide", controls : "normal"}} ;

var fv_json_template = { version: 3 , text : "" , fv : { kind : "", xmlconfig: "", width:400, height:300, version: 0 } , color : "rgb(100%,100%,100%)" , textstyles : { size : "12" , font : "0" , bold : "false" , center : "false" , italic : "false" } , textcolor : -1, notemargin: 10, options : {autoplay : "false", loop : "false", showplayer : "autohide", controls : "normal"}} ;

var fv_prepared = false;

var fv_request = {
	"callerid" : "" ,
	"uploadkind" : "flash video" ,
	"title" : "" ,
	"prompt" : "" ,
	"multiple" : false,
	"extensions" : [ "mpg" , "mpeg" , "mov" , "mp4" , "mp3" , "m4p" , "m4v" , "m3u" , "avi" , "wmv" ] ,
	"namingdata" : { "wantname" : true },
	"formats" : "",
	"callback" : "",
//	"fromquomodo" : false ,//ne pas avoir la possibilité de prendre un fichier depuis quomodo
	"cancel": { "callback" : "qsn_canceledit", "args" : [] }
} ;

var fv_colordesc = { "qmc1" : "color" , "qmc2" : [ "textcolor" , "color" ] } ; 
var fv_textdesc = { "textstyles" : {"slider": "textstyles.size" , "font" : "textstyles.font" , "bold" : "textstyles.bold" , "italic" : "textstyles.italic", "center" : "textstyles.center" } , "qtxt1" : { "paddingslider" : "notemargin" } } ;

var fv_leftcol_description = [
{ what : "tabstyles" , tabname : "tabtext" , visible : true , elems : [
		{ handler : "qsn_addtextsizeslider"   , params : { jsonpath : "textstyles.size" } } ,
		{ handler : "qsn_addfontfamilies"   , params : { jsonpath : "textstyles.font" , ncols : 2  } } ,
		{ handler : "qsn_addtextoptions"     , params : { jsonpath : "textstyles" , ncols : 3 , opts : [ "bold" , "italic" , "center" ] } }
	] 
} ,
{ what : "notecolor" , tabname : "tabcolor" , visible : false , elems : [ 
		{ handler : "qsn_addqlubcolorblock" , params : { jsonpath: "color" , others : true ,  transparent:false , menuseparator: false , modifynote : "qsn_setcolors"  } }
	] 
} ,
{ what : "textcolor" , tabname : "tabtextcolor" , visible : false , elems : [ 
		{ handler : "qsn_addoldqlubcolorblock" , params : { jsonpath: "textcolor" , others : true ,  transparent:false , menuseparator: false , modifynote : "qsn_setcolors"  } } 
	] 
} , 
{ what : "notemargin" , tabname : "qsn_tabmargin" , visible : false , elems : [
	{ handler : "qsn_addslider" , params : { jsonpath : "notemargin" , slidermin : 0 , slidermax : 20 , modifynote : "fv_modifymargin" , sliderlabelmin : "margeslidermin" , sliderlabelmax : "margeslidermax" } } 
	]
} , 
{ what : "options" , tabname : "taboptions" , visible : false , elems : [ 
	{ handler : "fv_addautoplayblock" , params : { checkboxes : [ { name : "autoplay" , jsonpath : "options.autoplay" } ] } }, 
	{ handler : "qsn_addcheckboxtable" , params : { className : "fv_loop" , title:false , menuseparator: false, checkboxes : [ { name : "loop" , jsonpath : "options.loop" } ] } },
	{ handler : "qsn_addselect" , params : { className : "fv_showplayer" , jsonpath:"options.showplayer" , title:"showplayer" , selects : [["always", "always"], ["autohide", "autohide"], ["never", "never"]]  } } ,
	{ handler : "qsn_addradiotable" , params :{ className  : "fv_controltype", title : "controltype", jsonpath : "options.controls" , radios : [ [ "simple", "simple" ] , [ "normal",  "normal" ], [  "extended", "extended" ] ] } } 
	]
} ] ;	

function fv_upgradejson( r ) {
	if ( ( r.version ) && ( r.version == fv_json_template.version ) ) return r ;
	if ( r.version < 2 ) fv_upgradejsontov2( r ) ;
	if ( r.version < 3 ) fv_upgradejsontov3( r ) ;
	r.version = fv_json_template.version ;
	return r ;
}

function fv_upgradejsontov2( r ) {
	if ( ! r.notemargin ) r.notemargin = 1 ;
	if ( r.textcolor == undefined ) r.textcolor = -1 ;
	if ( ! r.textstyles ) r.textstyles = { size : r.textsize , font : r.textfont , bold : String( r.textbold != "0" ) , center : String( r.textcenter != "0" ) , italic : String( r.textitalic != "0" ) } ;
	if ( ! r.options ) r.options = fv_json_template.options ;
	return r ;
}

function fv_upgradejsontov3( r ) {
	r.notemargin = parseInt( qsn_definepaddings( "fv" )[ r.notemargin ] , 10 ) ;
	r.textstyles.size = "" + parseInt( qsn_definefontsizes( "fv" )[ r.textstyles.size ] , 10 ) ;
	return r ;
}

function fv_checkaudiofield( noteid ) {
	var r = qsn_thenotes[ noteid ] ;
	if ( r.fv && ( r.fv.audio == undefined ) ) {
		var k = fv_moviekind ( noteid ) ;
		r.fv.audio = ( k ==  "audiostream" ||  k == "audio"  ) ;
	}
}

function fv_moviekind( noteid ) {
	var r = qsn_thenotes[ noteid ] ;
	if ( ! r.fv.duration ) return "unknown" ;
	if ( r.fv.duration == 3579139 ) return "audiostream" ;
	return ( ( r.fv.width == 150 ) && ( r.fv.height == 0 ) ) ? "audio" : "film" ;
}

/*
function fv_setautoplay( x ) {
	var b = x.checked ;
	qsn_thenotes[ qsn_edittarget.id ].options.autoplay = b ;
}

function fv_getautoplayblock( ) {
	return "<div id=\"fv_enablezoom_elem\" style=\"margin-top: 12px\"><a id=\"fv_autoplay\" name=\"fv_autoplay\" class=\"fv_autoplay checkbox off\" onclick=\"qsn_handleclick(this , fv_setautoplay) ; return false\" onmouseover=\"showblock( gebcn(ge('fv_editblock'), 'fv_autoplay_info'))\" onmouseout=\"hideblock( gebcn(ge('fv_editblock'), 'fv_autoplay_info') )\"><img src=\"/images/blank.gif\" />" + fv_message[ "autoplay" ] + "</a><div class=\"fv_info fv_autoplay_info\"><table cellspacing=\"5\" cellpadding=\"0\"><tr><td valign=\"top\"><img class=\"png\" src=\"/images/warning24.png\" style=\"width : 24px ; height : 24px\" /></td><td align=\"left\">" + fv_message[ "helpautoplay" ] + "</td></tr></table></div></div>" ;	
}
*/

function fv_template( id ) {
	if ( fv_templates_prepared ) return qsn_template( id , true ) ;
	var div = qsn_installcontainer( "view" , "fv" , ge( "fv_notecontent" ).innerHTML ) ;
	div.style.borderWidth = "0px" ;
	var div = qsn_installcontainer( "edit" , "fv" , ge( "fv_notecontent_edit" ).innerHTML ) ;
	fv_templates_prepared = true ;
	return qsn_template( id , true ) ;
}

/*
function -
function RENDER
*/

function fv_rgb2hexa(rgb){//rgb='rgb(117,18,18)'
	rgb = rgbvalues(rgb,1);
	var cols=['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E', 'F'];
	var s='';
	for(var i=0;i<3;i++){
		var c=rgb[i];
		s=s+cols[Math.floor(c/16)];
		s=s+cols[c%16];
	}
	return s;
}

function fv_renderhtml( noteid ) { 
	var div = ge ( noteid ) ;
	var r = qsn_thenotes[ noteid ] ;
	fv_checkaudiofield( noteid ) ;
	if ( qsn_currstate != "edit" ) {
		div.toresize = function () { return [ gebcn( div,  'fv_video' ) ] ; } ;
		var marginsize = 2 * r.notemargin ;
		gebcn( div,  'fv_video' ).resized = function( elem , w ) {
			elem.style.width = ( w - marginsize ) + "px" ; 
			elem.style.height = Math.max( Math.round( ( w - marginsize ) * r.fv.height / r.fv.width ) , 20 ) + "px" ;
		} ;
		var rgbcol1 = qsn_selfclasscolor( qsn_colorvalue( noteid , "qmc1" ) , "color" , true )[0] ;
		var col1 = fv_rgb2hexa( rgbcol1 ) ;
		var rgbcol2 = ( r.textcolor != "-1" ) ? qsn_selfclasscolor( qsn_colorvalue( noteid , "qmc2" ) , "color" , true )[0] : rgbcontrastcolor( rgbcol1 , 150 ) ;
		var col2 =fv_rgb2hexa( rgbcol2 ) ;
		var hsv2 = rgb2hsv( rgbcol2 ) ;
		rgbcol2 = hsv2rgb( [ hsv2[ 0 ] , 25 , 100 ]) ;
		var col3 =fv_rgb2hexa( rgbcol2 ) ;
//		var col2 = fv_rgb2hexa( qsn_selfclasscolor( qsn_colorvalue( noteid , "qmc2" ) , "color" , true ) [0] ) ;
		var theplayercode = "<object type='application/x-shockwave-flash' data='"+q_spaceabsoluteurl( r.common.ownerid , r.fv.videofolder+'video_player.swf' )+"' width='100%' height='100%'><param name='movie' value='"+q_spaceabsoluteurl( r.common.ownerid , r.fv.videofolder+'video_player.swf' )+"' /><param name='wmode' value='transparent' /><param name='allowFullScreen' value='true' />";
		theplayercode += "<param name='FlashVars' value='configxml="+q_spaceabsoluteurl( r.common.ownerid , r.fv.videofolder+'video_config.xml?v='+r.fv.version )+"&amp;startimage="+q_spaceabsoluteurl( r.common.ownerid , r.fv.videofolder+'preview.jpg?v='+r.fv.version )+"&amp;playercolor="+col2+"&amp;iconplaybgcolor="+col2+"&amp;videobgcolor="+col1+"&amp;bgcolor="+col1+"&amp;bgcolor1="+col1+"&amp;bgcolor2="+col1+"&amp;slidercolor1="+col1+"&amp;slidercolor2="+col2+"&amp;sliderovercolor="+col2 ;
		theplayercode += ( r.options.autoplay == "true" ) ? "&amp;autoplay=1" : "" ;
		theplayercode += ( r.options.loop == "true" ) ? "&amp;loop=1" : "" ;
		theplayercode += "&amp;showplayer=" + ( r.options.showplayer ) ;
		
		var showstop = ( r.options.controls == "simple")  ? "0" : "1" ;
		var showtime = ( r.options.controls == "simple" || r.options.controls == "normal" ) ? "0" : "1" ;
		var showvolume = ( r.options.controls == "simple" || r.options.controls == "normal" ) ? "0" : "1" ;
		var showfullscreen = ( r.options.controls == "simple" )  ? "0" : "1" ;
 
		theplayercode += "&amp;showstop=" + showstop ;
		theplayercode += "&amp;showtime=" + showtime ;
		theplayercode += "&amp;showvolume=" + showvolume ;
		theplayercode += "&amp;showfullscreen=" + showfullscreen ;
			
		theplayercode += "' /></object>" ;
		gebcn( div,  'fv_video' ).innerHTML = theplayercode ;
	}
	fv_rendertext( div , r ) ;
	qsn_container_renderhtml( div , r ) ;
	qsn_setcolors( noteid ) ;
	qsn_settextproperties( noteid ) ;

	if ( qsn_currstate == "edit" ) {
		qsn_blurdefault ( gebcn( div , "fv_comment" ), "newnoteprompt" ) ;
	} else {
		gebcn( div, "fv_comment" ).style.margin = r.text ? "5px" : "0px" ;
		q_changedwidth( div , div.offsetWidth ) ;
	}
}
/*
function fv_settextcolor( x, c ) {
	var id = qsn_edittarget.id ;
	fv_rendertextcolor( qsn_edittarget , qsn_thenotes[ id ] ) ;
	qsn_settextcolor( x, c , true ) ;
}

function fv_rendertextcolor( div , r ) {
	var elem = gebcn( div , "text" ) ;
	if ( r.textcolor != "-1" ) elem.className = elem.className.replace( /(qmc1 [^ ]+)__text_contrast150/ , "$1 qmc2 text_self" ).replace( /qmc1 text_contrast150/ , "qmc2 text_self" ) ;
}
*/
function fv_rendertext( div , r ) {
	if ( r.text == undefined ) return ;
	var txt = gebcn( div , "text" ) ;
	if ( qsn_currstate != "edit" ) txt.innerHTML = wiqi_text2HTML( r.text ) ;
	else txt.value = r.text ;
}

function fv_modifymargin( id ) {
	var r = qsn_thenotes[ id ] ;
	var div = gebcn( qsn_edittarget , "fv_textarea" ).parentNode ;
	div.style.width = ( gebcn( qsn_edittarget , "fv_notecontent" ).offsetWidth - 2 * r.notemargin ) + "px" ;
	qsn_settextproperties( id ) ;
}

function fv_launch_upload() {
	fv_request.callback = "fv_new_fv_done";
	var id = qsn_edittarget.id ;
	fv_request.callerid = id ;
	fv_request.prompt = fv_message[ "selectafv" ] ;
	fv_request.title = fv_message[ "uploadtitle" ] ;
	qdyn_qorgload('qu_reveal',[fv_request],'qu');
}

/*
function -
function EDIT
*/

function fv_addautoplayblock( target , js ) {
	js.className = "fv_autoplay_elem" ;
	js.setsetting = "fv_setsettingautoplay" ; 
	var elem = qsn_addleftcolelem( target , qsn_addcheckboxtable( js )  , js.className ) ;
	var td = gebcn( elem , "fv_autoplay_elem" ) ;
	td.onmouseover= function () { showblock( gebcn( 'fv_editblock' , 'fv_autoplay_info' ) ) ; } ;
	td.onmouseout= function () { hideblock( gebcn( 'fv_editblock' , 'fv_autoplay_info' ) ) ; } ;
	var divinfo = create_elem( "DIV" , { className : "fv_info fv_autoplay_info" } ) ;
	divinfo.innerHTML =  '<table cellspacing="5" cellpadding="0"><tr><td valign="top"><img class="png" src="/images/warning24.png" style="width : 24px ; height : 24px" /></td><td align="left">' + fv_message[ "helpautoplay" ] + '</td></tr></table>' ;
	td.appendChild( divinfo ) ;
	return elem ;
}

function fv_displaysettings() {
	qsn_initdisplaysetting() ;
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	if (( r.fv.src == undefined ) || ( r.fv.src == "" )) { // pas de vidéo
		fv_launch_upload() ;
		//? hideblock ( ["fv_eb_textsize", "fv_eb_textstyle", "fv_eb_textoptions"] ) ;
	} else {
		fv_showfvinfos( qsn_edittarget.id ) ;
	}
	var s = q_spacetype() ;
	if ( ( s == "qlub" ) || ( s == "fede" ) ) showblock( "fv_helplink" ) ;
	return false ;

}

function fv_showfvinfos( id ) {
	var div = getelement( id ) ;
	var r = qsn_thenotes[ id ] ;
	gebcn ( div , "fv_source" ).innerHTML = r.fv.src.replace( /.*\/(.*)$/ , "$1" ) ;
	var audio = ( r.fv.height == 0 ) ;
	visibleblock( gebcn ( div , "fv_dimensions" ).parentNode , ( ! audio ) ) ;
	visibleblock( gebcn ( div , "fv_duration" ).parentNode , ( ! audio ) ) ;
	if ( ! audio ) gebcn ( div , "fv_dimensions" ).innerHTML = r.fv.width + " x " + r.fv.height + " pixels" ;
	if ( ! audio ) gebcn ( div , "fv_duration" ).innerHTML = r.fv.duration + fv_message[ "seconds" ] ;
}

function fv_saveedit() {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	var x = gebcn( qsn_edittarget, "fv_textarea" ) ;
	r.text = ( x.value ) ? x.value : "" ;
	if ( ( qsn_edittarget ) && ( gebcn( qsn_edittarget , "text" ) ) ) {
		if ( r.text == fv_message[ "newnoteprompt" ] ) r.text = '' ;
	}
	//r.fv.src = r.fv.src.replace( /(\?.*)?$/ , "?v=ok" ) ;
	r.fv.firstimage = r.fv.firstimage.replace( /(\?.*)?$/ , "?v=ok" ) ;
	qsn_saveedit( true ) ;
}

function fv_new_fv_done( x ) {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	r.fv.src = x.files[ 0 ].filename ;
	r.fv.firstimage = x.files[ 0 ].firstimagefilename ;
	r.fv.filename = x.files[ 0 ].filename ;
	r.fv.width = x.files[ 0 ].videowidth ;
	r.fv.height = x.files[ 0 ].videoheight ;
	r.fv.duration = x.files[ 0 ].videoduration ;
	r.fv.size = x.files[ 0 ].filesize ;
	r.fv.videofolder = x.files[ 0 ].videofolder ;
	// r.fv.version=r.fv.version+1;
	r.fv.version = new Date().getTime() ;
	r.fv.kind = "pc" ;
	var k = fv_moviekind ( qsn_edittarget.id ) ;
	r.fv.audio = ( k ==  "audiostream" ||  k == "audio"  ) ;
	if ( r.fv.audio ) r.fv.firstimage = "/services/video/images/radio.png" ;
	var div = ge ( qsn_edittarget.id ) ;
	//div.style.width=(r.fv.width+0)+"px";
	//div.style.height=(r.fv.height+0)+"px";
	fv_displaysettings() ;
}

// ccc globales pour afficheur
// ccc v 24/04/08
var fv_play_src;
var fv_play_title;
var fv_play_w;
var fv_play_h;
var fv_play_movieid;
var fv_play_backcolor;
var fv_play_color;
var fv_play_txt;
var fv_r ;

/*function fv_showfv( x, v , newwin ) {
	var div = getContainer( x ) ;
	var r = qsn_thenotes[ div.id ] ;
//	var k = fv_moviekind ( div.id ) ;
	if ( r.fv.audio  ) {
		fv_play_w = 180 ;
		fv_play_h = 200;
		// fv_play_txt = r.text ;
		// fv_r = r;
		
	} else {
		fv_play_w = r.fv.width ;
		fv_play_h = r.fv.height ;
		
	}
	var rr = r.fv.src ;
	var fv_baseurl = q_spacebaseurl( r.common.ownerid ) ;

	var params = {} ;
	params.flv = fv_baseurl + rr ;
	params.startimage = fv_baseurl + r.fv.firstimage ;
	params.title = rr.replace( /.*\/(.*).flv/ , "$1" ) ;
	params.width = "" + fv_play_w ;
	params.height = "" + fv_play_h ;
	q_include( q_elems[ "siteloader" ] , "siteloader_load" , [ "/services/flashplayer@" + q_lang + "/index.html" , params ] ) ;
	return false;	
}*/

/*
function -
function TOOLBAR
*/

function fv_toolbarversion() {
	return 1 ;
}

var fv_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "fv_js_loaded" ) ;


var gm_message = {
"notetitleprompt" : "Cliquez ici pour ajouter un titre." ,
"newcommentprompt" : "Cliquez ici pour ajouter un commentaire." ,
"notedescprompt" : "Entrez ici votre description",
"taboptions" : "Options de la carte", 
"visitorinteraction" : "Interactivité visiteurs :",
"static" : "Aucune interaction",
"move" : "Déplacement/Zoom autorisé",
"dynamic" : " + Types de carte autorisé",
"search": " + Recherche autorisée",
"kmloverlay" : "Fond de carte :",
"kmlzoom" : "Zoomer et centrer sur ce département",
"trafficoptions" : "Trafic : ",
"displaytraffic" : "Afficher le trafic",
"add_dep" : "Entrez ici l'adresse que vous recherchez",
"add_arr" : "Entrez ici votre adresse d'arrivée",
"street": "Rue",
"zipcode": "CP",
"city": "Ville",
"country": "Pays",
"error_dep_empty": "Vous n'avez pas entré d'adresse dans la Google Map. La carte ne peut s'afficher.",
"error_arr_empty": "Vous n'avez entré d'adresse d'arrivée dans la Google Map. L'itinéraire ne peut s'afficher.",
"go": "Aller ici ?",
"leave": "En partir ?",
"hideform" : "Cacher le formulaire",
"printform" : "Afficher le Formulaire",
"hidemap" : " Masquer la carte",
"printmap" : "Afficher la carte",
"hidepanel" : "Masquer l'itinéraire",
"printpanel" : "Afficher l'itinéraire",
"direction" : "Itinéraire",
"map" : "Plan",
"start" : "Départ :",
"address" : "Adresse ou code postal :",
"shrink" : "réduire",
"enlarge" : "agrandir",
"plug" : "Cartes_Affichez une carte, des points d'interêts ou un itinéraire, avec Google Maps®." ,
"notfound" : "L'adresse que vous avez indiquée dans la Google Map est introuvable. Essayez en précisant davantage.",
"add" : "Ajouter", 
"addmarker" : "Ajouter un point",
"addline" : "Tracer une ligne", 
"addshape" : "Dessiner une forme",
"chooseicon" : "Choisissez une icone :",
"confirmdeletemarker" : "Êtes-vous sûr de vouloir supprimer ce marqueur ?",
"deletemarker" : "Supprimer le marqueur",
"title" : "Titre",
"properties" : "Propriétés",
"mapoptions" : "Options de la carte",
"didyoumean" : "Vouliez-vous dire ?",
"resultsfound" : "résultats trouvé(s)",
"found" : "Trouvé : "
} ;

var gm_errors={
	"200" :  ["G_GEO_SUCCESS", "Succès"],
	"400" :  ["G_GEO_BAD_REQUEST", "Requête rejetée : Votre demande n'a pas pu aboutir. Merci de contacter le service technique."],
	"500" :  ["G_GEO_SERVER_ERROR" , "Erreur du serveur : Votre demande n'a pas pu être traitée correctement. Merci de contacter le service technique."],
	"601" :  ["G_GEO_MISSING_QUERY" , "Adresse manquante : L'adresse est manquante ou vide."],
	"602" :  ["G_GEO_UNKNOWN_ADDRESS" , "Adresse inconnue : Aucune position géographique n'a pu être trouvée à l'adresse donnée"],
	"603" :  ["G_GEO_UNAVAILABLE_ADDRESS" , "Adresse indisponible : La position géographique n'a pas pu être retournée pour des raisons légales ou contractuelles."],
	"604" :  ["G_GEO_UNKNOWN_DIRECTIONS" , "Itinéraire indisponible : Impossible de calculer l'itinéraire entre les adresses données."],
	"610" :  ["G_GEO_BAD_KEY" , "Clé invalide : La clé de l'API est soit invalide ou ne correspond pas au bon domaine. Merci de contacter le service technique."],
	"620" :  ["G_GEO_TOO_MANY_QUERIES", "Trop de requêtes : Le nombre maximum de requêtes journalières a été atteinte pour ce site. Merci de contacter le service technique."]
	
};


var gm_msgs_fr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "gm_msgs_fr_js_loaded" ) ;


/* gm contains methods and properties specific to gm notes */

//var gm_json_template = { version: 3 , text : "" , color : "3" ,  header : { display: "true", color: "0", text : "" } , type : "map", add_dep : "" , add_arr : "" , coords : "", center : "", maptype: "m", interacttype : "dynamic" , zoom : 13 , markers : [], lines : [], shapes : [] , kml : "", kmlzoom : false, traffic : false, common : {width : 450} } ;
var gm_json_template = { version: 4 , text : "" , color : "rgb(100%,100%,100%)" ,  header : { display: "true", color: "c1", text : "" } , type : "map", add_dep : "" , add_arr : "" , coords : "", center : "", maptype: "m", interacttype : "dynamic" , zoom : 13 , markers : [], lines : [], shapes : [] , kml : "", kmlzoom : "false", traffic : "false", common : {width : 450} } ;

// Forme des marqueurs : {coords : "", title : "", icon : ""}
// Forme des lignes : {color : "", levels : "", numLevels : "", opacity : "", points : "", weight : "", zoomFactor : ""}
// Forme des formes : {color : "", levels : "", numLevels : "", opacity : "", points : "", weight : "", zoomFactor : ""}

var gm_colordesc = { "qmc1" : "color" , "qmc2_qmc1" : "header.color" , "qmc3" : gm_qmc3 } ; 

function gm_qmc3( r ) {
	return "/services/gm/images/gm48.png" ;
}

var gm_templates_prepared = false ;
var gm_leftcol_prepared = false ;
var gm_gmap_prepared = false;


function gm_leftcol_description() {
	return [ 
{ what : "notecolor" , tabname : "tabcolor" , visible : false , elems : [ 
	{ handler : "qsn_addqlubcolorblock" , params : { jsonpath : "color" , others : true ,  transparent:true , title:false , menuseparator: false , modifynote : "qsn_setcolors"  } }
	] } , 
{ what : "bandeau" , tabname : "tabheader" , visible : false , elems : [    
	{ handler : "qsn_addheaderhideshow" , params : { notekind:"gm" , title:"" , jsonpath : "header.display" } }, 
	{ handler : "xqsn_addheadercolor" , params : { notekind:"gm" , jsonpath : "header.color" } }
	] } , 
{ what : "gm options" , tabname : "taboptions" , visible : true , elems : [ 
	{ handler : "gm_addinteractoptions" , params :{ className  : "gm_interacttype", title : "visitorinteraction", jsonpath : "interacttype" , radios : [ [ "static", "static" ] , [ "move",  "move" ], [  "dynamic", "dynamic" ], [ "search", "search" ] ] } } ,
	{ handler : "gm_addoverlayoptions" , params : { className : "gm_kmloverlay" , jsonpath:"kml" , title:"kmloverlay" , selects : gm_france_departments  } } ,
	{ handler : "gm_addoverlayzoom" , params : { className : "gm_kmlzoom" , title:false , menuseparator: false, checkboxes : [ { name : "kmlzoom" , jsonpath : "kmlzoom" } ] } }
//	{ handler : "gm_addtrafficoptions" , params : { className : "gm_traffic" , title:"trafficoptions" , menuseparator: false,  checkboxes : [ { name : "displaytraffic" , jsonpath : "traffic" } ] } }
	] }
] ;
}

function gm_addinteractoptions( target , js ) {
	return qsn_addleftcolelem( target , qsn_addradiotable( js ) , js.className ) ;
}

function gm_addoverlayoptions ( target , js ) {
	var div = qsn_addleftcolelem( target , qsn_addselect( js ) ,  js.className ) ;
	return div ;
}

function gm_addoverlayzoom ( target , js ) {
	var div = qsn_addleftcolelem( target , qsn_addcheckboxtable( js ) , js.className ) ;
	return div ;
}

function gm_addtrafficoptions ( target , js ) {
	var div = qsn_addleftcolelem( target , qsn_addcheckboxtable( js ) , js.className ) ;
	return div ;
}

function gm_upgradejson( r ) {
	if ( ( r.version ) && ( r.version == gm_json_template.version ) ) return r ;
	if ( r.version<3 ) gm_upgradejsontov3( r ) ;
	if ( r.version<4 ) gm_upgradejsontov4( r ) ;
	r.version = gm_json_template.version;
	return r ;
}

function gm_upgradejsontov3( r ) {
	if ( ! r.header ) r.header = gm_json_template.header ;
	if ( ! r.interacttype ) r.interacttype = gm_json_template.interacttype ;
	if ( ! r.coords ) r.coords = gm_json_template.coords ;
	if ( ! r.center ) r.center = gm_json_template.center ;
	if ( ! r.maptype ) r.maptype = gm_json_template.maptype ;
	if ( ! r.markers ) r.markers = gm_json_template.markers ;
	if ( ! r.lines ) r.lines = gm_json_template.lines ;
	if ( ! r.shapes ) r.shapes = gm_json_template.shapes ;
	if ( ! r.kml ) r.kml = gm_json_template.kml ;
	if ( ! r.kmlzoom ) r.kmlzoom = gm_json_template.kmlzoom ;
	if ( ! r.traffic) r.traffic = gm_json_template.traffic ;
	if ( r.headerdisplay) { 
		r.header.display = (r.headerdisplay == "1") ? "true" : "false" ;
		delete r.headerdisplay;
	}
	if (r.displaytype) delete r.displaytype;
	return r ;
}

function gm_upgradejsontov4(r) {
	r.kmlzoom = ( r.kmlzoom ) ? "true" : "false" ;
	r.traffic = ( r.traffic ) ? "true" : "false" ;
	return r ;
}

/*
function -
function CREATION NOTE
*/

function gm_getservername() { 
	return document.domain ;
}

/*
function -
function RENDER
*/

function gm_template( id ) {
	if ( gm_templates_prepared ) return qsn_template( id , true ) ;
	qsn_installcontainer( "view" , "gm" , ge( "gm_notecontent" ).innerHTML ) ;
	var div = qsn_installcontainer( "edit" , "gm" , ge( "gm_notecontent_edit" ).innerHTML ) ;
	gm_templates_prepared = true ;
	return qsn_template( id , true ) ;
}

function gm_installresize( div , r ) {
	if ( qsn_currstate == "edit" ) return ;
	var obj_map = gebcn( div , "map_canvas") ;
	obj_map.widthrule = function ( w ) { return Math.max( w - 20 , 1 ) ; } ;
	obj_map.resized = function ( elem , w ) {
		if ( elem.innerHTML == "" ) return ;
		var height = Math.round( w * 3 / 5 + 10 ) ;
		var maptype = r.type ;
		if ( maptype == "directions" ) height = ( height * 2 ) + 5 ;
		if ( maptype == "directions" ) {
	//				if ( ( height / w ) < 1.25 ) elem.style.height = height + "px";
			elem.style.height = height + "px";
		} else {
	//				if ( ( height / w ) < 0.6 ) elem.style.height = height + "px";
			elem.style.height = height + "px";
		}
	} ;
}

function gm_renderhtml( noteid ) {
try {
	var div = getelement ( noteid ) ;
	var r = qsn_thenotes[ noteid ] ;
	gm_renterdesc( div, r ) ;
	
	if ( qsn_currstate != "edit" ) {
		var obj_map = gebcn( div , "map_canvas") ;
		div.toresize = function () { return [ obj_map ].concat( qsn_container_toresize( this ) ) ; } ;
		div.dragupdone = function () { gm_finishresize( this ); } ;
		gm_loadmap( div, r ) ;
	}
	if ( qsn_currstate == "edit" ) {
		gm_renderTitle ( div ) ;
		gm_blurdefault( gebcn( div , "gm_desc" ), "notedescprompt") ;
		gm_renderForm(div, r);
	}
	qsn_container_renderhtml( div , r ) ;
	qsn_setcolors( noteid ) ;
} catch( err ) { debugmail("google map: " + err.message ) ; }
}

function gm_renterdesc(div, r) {
	var desc = gebcn( div , "gm_desc" ) ;
	if ( qsn_currstate == "edit" ) desc.value = qHTML2text( r.text ) ;
	else q_innerHTML(desc, r.text ) ;
}

function gm_renderTitle ( x, force_iti ) {
	var div = getContainer(x);
	var r = qsn_thenotes[ div.id ] ;
	var type = (force_iti) ? "directions" : r.type;
	
	var title_map = gebcn(div, "gm_titlemap");
	var title_dir = gebcn(div, "gm_titledir");	
	title_map.innerHTML = "";
	title_dir.innerHTML = "";
	
	var lien_map_type = (type == "map") ? "SPAN" : "A";
	var lien_map = create_elem(lien_map_type, {className : "qmc1 text_contrast150" , href : "#"});
	q_innerHTML(lien_map, gm_message["map"]);
	lien_map.style.cursor = (type == "map") ? "default" : "pointer";
	if (type == "directions") lien_map.onclick = function () { r.type = "map"; gm_renderTitle(this) ; return false;};
	
	var lien_pan_type = (type == "directions") ? "SPAN" : "A";
	var lien_pan = create_elem(lien_pan_type, {className : "qmc1 text_contrast150" , href : "#"});
	q_innerHTML(lien_pan , gm_message["direction"]);
	lien_pan.style.cursor = (type == "directions") ? "default" : "pointer";
	if (type == "map") lien_pan.onclick = function () { r.type = "directions"; gm_renderTitle(this) ; return false;};
	
	title_map.appendChild(lien_map);
	title_dir.appendChild(lien_pan);
	visibleblock(getElementsByClassName(div, "gm_directions") , type != "map");
	q_innerHTML(gebcn(div, "gm_titledepart"), gm_message[(type == "map")?"address":"start"]);
	try {
		var td = gebcn(div, "gm_checkfrance") ;
		var checkbox = td.getElementsByTagName( "INPUT" )[ 0 ] ;
		td.style.visibility = (type == "map") ? "visible" : "hidden" ;
		if ( r.add_dep_france != null ) checkbox.checked = r.add_dep_france ? "checked" : "" ;
	} catch(err) {} ;
}

function gm_renderForm(div, r) {
	gebcn(div, "gm_input_dep").value = (r.add_dep != "") ? r.add_dep : gm_message["add_dep"];
	gebcn(div, "gm_input_arr").value = (r.add_arr != "") ? r.add_arr : gm_message["add_arr"];
}

function gm_beginDrag( elem , e ) {
//	xqsn_beginDrag( elem , e , gm_moveHandler , qsn_upHandler ) ;
	qsn_beginDrag( elem , e , true ) ;
	gm_prepareresize( elem ) ;
}

function gm_moveHandler( elem , ex , ey , ew , isGrow , xylimits ) {
	var r = qsn_thenotes[ elem.id ] ;
	var div = ge( elem.id ) ;
	var isowner = ( r.common.ownerid == memberid ) ;	
		
	qsn_moveHandler( elem , ex , ey , ew , isGrow , xylimits ) ;
	if (isGrow) {
		var obj_map = gebcn( div , "map_canvas");
		if (!obj_map) return;
		if (obj_map.innerHTML != "") { //Il y a une map
			var height = Math.round( ( ew - 20 ) * 3 / 5 + 10 ) ;
			if (r.type == "directions") height = (height * 2) + 5;
			if (r.type == "directions" ) {
				if ( (height/ge(div).clientWidth) < 1.25 ) obj_map.style.height = height + "px";
			} else {
				if ( (height/ge(div).clientWidth) < 0.6 ) obj_map.style.height = height + "px";
			}
		}
	}
}

function gm_prepareresize( div ) {
	showblock( gebcn ( div , "waitmap" ) ); 
}

function gm_finishresize( div ) {
	hideblock( gebcn ( div , "waitmap" ) ); 
}

/*
function -
function ESSENTIALS
*/


function gm_displaysettings() {
	if (! gm_gmap_prepared) {
		qdyn_load ( gm_displaysettings , [] , "/scripts/gmap/gm_france.js" ) ;
		gm_gmap_prepared = true;
		return;
	}
	qsn_initdisplaysetting() ;
}

function gm_focusdefault( x, msg ) {
	if ( x.value == gm_message[ msg ] ) x.value = "" ;
}

function gm_blurdefault( x, msg ) {
	if ( ( x.value == "" ) || ( x.value == gm_message[ msg ] ) ) x.value = gm_message[ msg ] ;
}

function gm_invertAddress( x ) {
	var div = getContainer(x);
	
	var div_dep = gebcn(div, "gm_input_dep");
	var div_arr = gebcn(div, "gm_input_arr");
	
	var temp = div_dep.value;
	div_dep.value = div_arr.value;
	div_arr.value = temp;
	
	gm_blurdefault( div_dep, "add_dep");
	gm_blurdefault( div_arr, "add_arr");
	
	gm_renderTitle ( x, true );
}

function gm_windowWidth() { 
	if (document.getElementById) { 
		if (window.innerWidth) return window.innerWidth;
		if (document.documentElement&&document.documentElement.clientWidth) return document.documentElement.clientWidth;
		if (document.body.clientWidth) return document.body.clientWidth;
	}
}

/*
function -
function SEARCH
*/

var gm_retrycount = {};
var gm_key;

function gm_defineGlobals(){
	gm_key = "ABQIAAAAL999glpu4EgA79M1WyqXsBT2yXp_ZAY8_ufC3CFXhHIE1NvwkxSXY33WGuA_3puFlLkBHSZqa1tRKA";
};

function gm_request(url, callback, params){
	callback = eval( callback ) ;
 	var r = { "json" : { "url" : url } } ;
	gm_ajaxget("/cgi-bin/cgixml?url="+url , callback, params);
}


function gm_ajaxget( url , callBackFunction, params ) {
	var req=null;
	if ( ! req ) {
		if ( window.XMLHttpRequest ) {
	 		req = new XMLHttpRequest() ;
			//if ( req.overrideMimeType )  { req.overrideMimeType( 'text/plain' ) ; }
		} else if ( window.ActiveXObject ) {
			try { req = new ActiveXObject ( "Msxml2.XMLHTTP" ) ;} 
			catch (e )  {
				try { req = new ActiveXObject ( "Microsoft.XMLHTTP" ) ; } 
				catch (e )  {}
			}
	        }
	}
	req.open( "GET" , url , true ) ;
	req.send ( null ) ;
	req.onreadystatechange = function () { 
		if(req.readyState != 4 ) return;
		if(req.status !=200 && req.status !=304)  {
			if ( callBackFunction.toString().split( "(" )[0].replace( /function /, "" ) == "gm_searchgmhandler" ) {
				if ( ! gm_retrycount[ params ] || gm_retrycount[ params ] == null ) gm_retrycount[ params ] = 0 ;
				if ( gm_retrycount[ params ]++ < 5 ) 	setTimeout( function () { gm_searchgm( params, qsn_thenotes [ params ] ); }, 2000); 
				else {
					gm_retrycount[ params ] = 0 ;
					return;
				}
			}
		} else callBackFunction(req.responseXML, params);
	}  ;
}

function gm_searchaddress(elem){
	gm_defineGlobals();
	var input = "gm_input_" + elem;
	var div = gebcn(qsn_edittarget, input).value;
	var errormsg = "error_" + elem + "_empty";
	if (div == "") return alert(gm_message[errormsg]);
	try { 
		var td = gebcn(qsn_edittarget, "gm_checkfrance") ;
		var checkbox = td.getElementsByTagName( "INPUT" )[ 0 ] ;
		if ( td.style.visibility != "hidden" && checkbox.checked ) div += ", France, France" ;
	} catch( err ) {}
	var theaddress = encodeURI(div.replace(/ /g, "+"));
	var request = "http://maps.google.com/maps/geo?q=" + theaddress + "&output=xml&oe=utf8&sensor=false&key=" + gm_key;
	var handler = "gm_search_" + elem;
	gm_request(request, handler);
}


function gm_selectaddress(elem, thecoords, thename, type){
	elem.onclick = function (){
		var r = qsn_thenotes[qsn_edittarget.id];
		
		var field = "add_" + type;
		r[field] = thename;
		if ( type == "dep") {r.coords = thecoords;}
		
		var input = "gm_input_" + type;
		gebcn(qsn_edittarget, input).value = thename;
		hideblock(gebcn(qsn_edittarget, "gm_resultsDiv"));
	};
}

function gm_search_dep(result){gm_searchaddresshandler(result, "dep");}
function gm_search_arr(result){gm_searchaddresshandler(result, "arr");}

function gm_searchaddresshandler(result, elem){
	var r = qsn_thenotes[qsn_edittarget.id];
	
	var input = "gm_input_" + elem;
	var search = gebcn(qsn_edittarget, input).value;
	
	var resultsDiv = gebcn(qsn_edittarget, "gm_resultsDiv");
	showblock(resultsDiv);
	resultsDiv.innerHTML = "";
	
	var status = result.getElementsByTagName("Status")[0].getElementsByTagName("code")[0].firstChild.nodeValue;
	if (status && status == "200") {
 		var theplaces = result.getElementsByTagName("Placemark");
		
		 if (theplaces.length > 1) { 
			
			var resultsnumber = create_elem("DIV", {style : { fontStyle : "oblique" }});
			q_innerHTML(resultsnumber, gm_message["didyoumean"]);
			resultsDiv.appendChild(resultsnumber);
		
			var resulttable = create_elem("TABLE", {width : "100%", style : { border : "solid 1px #CCC", backgroundColor : "white"}});
			for (var i=0; i < theplaces.length; i++) {
				
				var thename = theplaces[i].getElementsByTagName("address")[0].firstChild.nodeValue;
				var thecoords = theplaces[i].getElementsByTagName("Point")[0].firstChild.firstChild.nodeValue;
				thecoords = thecoords.split(",");
				thecoords = thecoords[1] + "," + thecoords[0];
				
				var newrow = resulttable.insertRow(-1);
				newrow.width="100%";
				newrow.style.color="#000";
				newrow.onmouseover = function(){this.style.backgroundColor = "#DDD";};
				newrow.onmouseout =  function(){this.style.backgroundColor = "#FFF";};
				gm_selectaddress(newrow, thecoords, thename, elem);
				var newcell = create_td(newrow, {align:"center"});
				q_innerHTML(newcell, thename);
			}
			resultsDiv.appendChild(resulttable);
			var resultsnumber = create_elem("DIV", {style : { fontStyle : "oblique", paddingBottom : "15px" }});
			q_innerHTML(resultsnumber, theplaces.length + " " + gm_message["resultsfound"]);
			resultsDiv.appendChild(resultsnumber);
		}
		else {
			resultsDiv.innerHTML = "";
			var thename = theplaces[0].getElementsByTagName("address")[0].firstChild.nodeValue;
			var thecoords = theplaces[0].getElementsByTagName("Point")[0].firstChild.firstChild.nodeValue;
			thecoords = thecoords.split(",");
			thecoords = thecoords[1] + "," + thecoords[0];
			
			var field = "add_" + elem;
			r[field] = thename;
			if ( elem == "dep") {r.coords = thecoords;}
			if ( elem == "dep" )	try { 
				var td = gebcn(qsn_edittarget, "gm_checkfrance") ;
				var checkbox = td.getElementsByTagName( "INPUT" )[ 0 ] ;
				if ( td.style.visibility != "hidden" && checkbox.checked ) r[field] += ", France, France" ;
			} catch( err ) { }
			gebcn(qsn_edittarget, input).value = thename;
			q_innerHTML(resultsDiv, gm_message["found"]  + thename);
		}
	}
	else {
		var reason="Code :"+status;
		if (gm_errors[status]) {reason = gm_errors[status][1];} 
	  	var resultstable = create_elem("DIV", {style : {width : "100%", border : "solid 1px #CCC", backgroundColor : "white", color : "#333"}});
	    	q_innerHTML(resultstable, reason);
		resultsDiv.appendChild(resultstable);
	}
}
 
   // ===== list of words to be standardized =====
var gm_standards = [   
	["road","rd"],   
	["street","st"], 
	["avenue","ave"], 
	["av","ave"], 
	["drive","dr"],
	["saint","st"], 
	["north","n"],   
	["south","s"],    
	["east","e"], 
	["west","w"],
	["expressway","expy"],
	["parkway","pkwy"],
	["terrace","ter"],
	["turnpike","tpke"],
	["highway","hwy"],
	["lane","ln"]
];

// ===== convert words to standard versions =====
function gm_standardize(a) {
	for (var i=0; i < gm_standards.length; i++) {
		if (a == gm_standards[i][0])  {a = gm_standards[i][1];}
	}
	return a;
}

// ===== check if two addresses are sufficiently different =====
function gm_different(a,b) {

	// only interested in the bit before the first comma in the reply
	var c = b.split(",");
	b = c[0];
	
	// convert to lower case
	a = a.toLowerCase();
	b = b.toLowerCase();
	
	// remove apostrophies
	a = a.replace(/'/g ,"");
	b = b.replace(/'/g ,"");
	
	// replace all other punctuation with spaces
	a = a.replace(/\W/g," ");
	b = b.replace(/\W/g," ");
	
	// replace all multiple spaces with a single space
	a = a.replace(/\s+/g," ");
	b = b.replace(/\s+/g," ");
	// split into words
	awords = a.split(" ");
	bwords = b.split(" ");
	
	// perform the comparison
	var reply = false;
	
	for (var i=0; i<bwords.length; i++) {
		//GLog.write (gm_standardize(awords[i])+"  "+gm_standardize(bwords[i]))
		if (gm_standardize(awords[i]) != gm_standardize(bwords[i])) {reply = true;}
	}
	//GLog.write(reply);
	return (reply);
}

/*
function -
function SAVE
*/

function gm_notechanged(id, alerttype) { 
	//console.log("Alerte : "+ alerttype + ", j'essaie de sauver");
	qsn_notechanged( id , "notechanged") ;
}

function gm_saveedit() {
	var div = qsn_edittarget;
	var r = qsn_thenotes[ div.id ] ;
	
	var desc = gebcn(div, "gm_desc").value;
	r.text = ( desc == gm_message["notedescprompt"]) ? "" : desc ;
	
	var div_dep = gebcn(qsn_edittarget, "gm_input_dep").value;
	var div_arr =	gebcn(qsn_edittarget, "gm_input_arr").value;
	
	if (div_dep == gm_message["add_dep"] || div_dep == "") {
		alert(gm_message["error_dep_empty"]);		
		return;
	}
	if (r.add_dep != div_dep){
		r.add_dep = div_dep;
		r.coords = "";
		r.zoom = 12;
	}
	try {
		var td = gebcn(div, "gm_checkfrance") ;
		var checkbox = td.getElementsByTagName( "INPUT" )[ 0 ] ;
		if ( r.add_dep_france != Boolean ( checkbox.checked ) ) {
			r.add_dep_france = Boolean ( checkbox.checked ) ;
			r.coords = "" ;
			r.zoom = 12 ;
		}
	} catch( err ) {}
	if (r.type == "directions"){
		if (div_arr == gm_message["add_arr"] || div_arr == ""){
			alert(gm_message["error_arr_empty"]);		
			return;
		}
		r.add_arr = div_arr;
	}
		
	qsn_container_saveedit() ;	
	qsn_saveedit( true ) ;
}

/*
function -
function SERVICE PAGES
*/

function gm_initforweb( id ) {
	var div = ge( id ) ;
	var obj_map = gebcn( div , "map_canvas") ;
	div.toresize = function () { return [ obj_map ] ; } ;
	gm_loadmap( ge( id ) , qsn_thenotes[ id ] ) ;
}

/*
function -
function TOOLBAR
*/

function gm_toolbarversion() {
	return 1 ;
}


/*
function -
function -
function GOOGLE MAP
*/

// Les variables et fonctions suivantes sont appellées directement depuis l'iframe contenant la Google Map

var gm_initInIFramecount = 0 ;
var gm_map , gm_zoomcontrol , gm_maptypecontrol ;
var gm_noteid ="";
var gm_mode = "view";
var gm_markersIndex = 0 ;
var gm_markers = [];
var gm_lines=[];
var gm_shapes=[];
var gm_markerListener=null;
var gm_last_poly=null;
var gm_last_poly_id=null;
var gm_colorIndex=0;
var gm_colors=[["red","#ff0000"],["orange","#ff8800"],["green","#008000"],["blue","#000080"],["purple","#800080"]];
var gm_options={};


function gm_url( r ) {
	if ( window.q_makeweb && ! window.web_js_loaded ) return "" ;
	var depart = r.add_dep;
	if ( r.add_dep_france ) depart += ", France, France" ;
	var myURL =	"/services/gm/iframe_" + gm_getservername() + ".html?start=" + encodeURI(depart);
	if (r.type =="directions") {
		var arrive = r.add_arr;
		myURL += "&end=" + encodeURI(arrive);
	}
	if (r.coords) {
		myURL += "&coords=" + r.coords;
	}

	if (r.markers) {
		myURL += "&markers=" + r.markers.length;
		for ( var i = 0; i < r.markers.length; i++) { 
			myURL += "&marker_" + i + "_coords=" + encodeURIComponent(r.markers[i].coords);
			myURL += "&marker_" + i + "_title=" + encodeURIComponent(r.markers[i].title);
			myURL += "&marker_" + i + "_icon=" + encodeURIComponent(r.markers[i].icon);
		}
	}
	if (r.lines) {
		myURL += "&lines=" + r.lines.length;
		for ( var i = 0; i<r.lines.length; i ++) { 
			myURL += "&line_" + i + "_color=" + encodeURIComponent(r.lines[i].color);
			myURL += "&line_" + i + "_levels=" + encodeURIComponent(r.lines[i].levels);
			myURL += "&line_" + i + "_numlevels=" + encodeURIComponent(r.lines[i].numLevels);
			myURL += "&line_" + i + "_opacity=" + encodeURIComponent(r.lines[i].opacity);
			myURL += "&line_" + i + "_points=" + encodeURIComponent(r.lines[i].points);
			myURL += "&line_" + i + "_weight=" + encodeURIComponent(r.lines[i].weight);
			myURL += "&line_" + i + "_zoomfactor=" + encodeURIComponent(r.lines[i].zoomFactor);
		}
	}

	if (r.shapes) {
		myURL += "&shapes=" + r.shapes.length;
		for ( var i = 0; i<r.shapes.length; i ++) { 
			myURL += "&shape_" + i + "_color=" + encodeURIComponent(r.shapes[i].color);
			myURL += "&shape_" + i + "_levels=" + encodeURIComponent(r.shapes[i].levels);
			myURL += "&shape_" + i + "_numlevels=" + encodeURIComponent(r.shapes[i].numLevels);
			myURL += "&shape_" + i + "_opacity=" + encodeURIComponent(r.shapes[i].opacity);
			myURL += "&shape_" + i + "_points=" + encodeURIComponent(r.shapes[i].points);
			myURL += "&shape_" + i + "_weight=" + encodeURIComponent(r.shapes[i].weight);
			myURL += "&shape_" + i + "_zoomfactor=" + encodeURIComponent(r.shapes[i].zoomFactor);
		}
	}
	if (r.kml != "" ){
		myURL += "&kml=" + r.kml;
		myURL += "&kmlzoom=" + r.kmlzoom;
	}
	if (r.traffic == "true"){
		myURL += "&traffic=" + r.traffic;
	}
	myURL += "&center=" + r.center;
	myURL += "&maptype=" + ( r.maptype || "m");
	myURL += "&interact=" + ( r.interacttype || "dynamic") ;
	myURL += "&zoom=" + ( r.zoom || 13 ) ;
	myURL += "&noteid=" + r.common.noteid ;
	myURL += "&gm_mode=" + ( ( window.web_js_loaded || ( document.mainform && document.mainform.pagemode && document.mainform.pagemode.value == "view" ) ) ? "view" : "edit" ) ;
	return myURL ;
}
	
function gm_loadmap( div, r ) {
	var frame = gebcn(div, "gm_mapframe");
	showblock(frame) ;
	var url = gm_url( r ) ;
	//console.log(url);
	if ( url != "" ) frame.src = url ;
	gm_installresize( div , r ) ;
	q_changedwidth( div ) ;
/*
	var width = parseInt(r.spacedefaults.common.width.replace("px", ""), 10) - 20;
	if (r.type == "map") gebcn(div, "map_canvas").style.height = (Math.ceil(width * (3/5)) + 10) + "px";
	if (r.type == "directions") gebcn(div, "map_canvas").style.height = (Math.ceil(width * (3/5))*2 + 10) + "px";
*/	
}

function gm_resizemap() {
	var type = (document.getElementById("map_panel").style.display == "none") ? "map" : "directions";
	var width = gm_windowWidth() - 10 + 6;
	var height = Math.ceil(gm_windowWidth() * 3/5) +6;
	var map = document.getElementById("map_canvas");
try{	map.style.width = width + "px";} catch(err) { } // weird error under ie6
try{	map.style.height = height + "px";} catch(err) { }
	
	if (type == "directions" ) {
		var pan = document.getElementById("map_panel");
		pan.style.width = (width ) + "px";
		pan.style.height = (height) + "px";
	}
	if ( gm_map ) {
		gm_map.checkResize() ;
		gm_ZoomControl3D() ;
		gm_MapType() ;
	}
}

function gm_displaymap(elem) {
	var map = document.getElementById("map_canvas");
	if (map.style.display == "block") {
		hideblock(map);
		q_innerHTML(elem , gm_message["printmap"]);
	} else {
		showblock(map);
		q_innerHTML(elem , gm_message["hidemap"]);
	}
	gm_resizemap();
}

function gm_displaypan(elem) {
	var pan = document.getElementById("map_panel");
	if (pan.style.display == "block") {
		hideblock(pan);
		q_innerHTML(elem, gm_message["printpanel"]);
	} else {
		showblock(pan);
		q_innerHTML(elem,  gm_message["hidepanel"]);
	}
	gm_resizemap();
}

/*
function -
function MAP : Création et Initialisation
*/

function gm_initInIFrame() {
	if ( ! window.GMap2 ) {
		if ( gm_initInIFramecount < 60 ) setTimeout( gm_initInIFrame , 1000 ) ;
		gm_initInIFramecount ++ ;
		return ;
	}
	var x = window.location.search.replace( /^\?/ , "" ) ;
	var t = x.split( "&" ) ;
	var tt , key ;
	var y = {} ;
	for ( var i = 0 ; i<t.length ; i++ ) {
		tt = t[ i ].split( "=" ) ;
		y[ tt[ 0 ] ] = tt[ 1 ] ;
	}
	document.getElementById("map_canvas").style.display = "block";
	document.getElementById("map_panel").style.display = "none";
	
	y = gm_initURL(y);

	gm_initMap(y);
	gm_initControls(y);
	gm_initKml(y);
	gm_initTraffic(y);
	gm_initShapes(y);
	

	if ( gm_mode == "edit" ) {gm_bindMapEvents();}

	var depart = decodeURI(y.start);
	if ( y.end ) {
		var arrive = decodeURI(y.end);
		gm_showDirection(depart, arrive ) ;
	}
	else {
		if (y.coords) {
			var c = y.coords.split(",");
			var point = new GLatLng(c[0],c[1]);
			gm_putMarker(point, depart);
		}
		else gm_showAddress( depart ) ;
	}
	try {
		gm_resizemap();
	} catch ( err ) {} ;
}

function gm_initURL(y) { 
	gm_noteid = y.noteid;
	gm_mode = y.gm_mode;
	
	y.zoom = parseInt(y.zoom, 10);
	
	var markers = new Array(0);
	var nbmarker = y.markers;
	for (var i = 0; i< nbmarker; i++) { 
		var a = decodeURIComponent(eval("y.marker_" + i + "_coords"));
		var b = decodeURIComponent(eval("y.marker_" + i + "_title"));
		var c = decodeURIComponent(eval("y.marker_" + i + "_icon")) ;
		markers.push({coords : a, title : b, icon : c});
	}
	y.markers = markers;
	
	var lines = new Array(0);
	var nblines = y.lines;
	for (var i = 0; i< nblines; i++) { 
		var a = decodeURIComponent(eval("y.line_" + i + "_color"));
		var b = decodeURIComponent(eval("y.line_" + i + "_levels"));
		var c = parseInt(decodeURIComponent(eval("y.line_" + i + "_numlevels")));
		var d = parseFloat(decodeURIComponent(eval("y.line_" + i + "_opacity")));
		var e = decodeURIComponent(eval("y.line_" + i + "_points"));
		var f = parseInt(decodeURIComponent(eval("y.line_" + i + "_weight")));
		var g = parseInt(decodeURIComponent(eval("y.line_" + i + "_zoomfactor")));
		lines.push({color : a, levels : b, numLevels : c, opacity : d, points: e, weight : f, zoomFactor : g});
	}
	y.lines = lines;
	
	var shapes = new Array(0);
	var nbshapes = y.shapes;
	for (var i = 0; i< nbshapes; i++) { 
		var a = decodeURIComponent(eval("y.shape_" + i + "_color"));
		var b = decodeURIComponent(eval("y.shape_" + i + "_levels"));
		var c = decodeURIComponent(eval("y.shape_" + i + "_numlevels"));
		var d = parseFloat(decodeURIComponent(eval("y.shape_" + i + "_opacity")));
		var e = decodeURIComponent(eval("y.shape_" + i + "_points"));
		var f = parseInt(decodeURIComponent(eval("y.shape_" + i + "_weight")));
		var g = parseInt(decodeURIComponent(eval("y.shape_" + i + "_zoomfactor")));
		shapes.push({color : a, levels : b, numLevels : c, opacity : d, points: e, weight : f, zoomFactor : g});
	}
	y.shapes = shapes;
	return y;
}

function gm_initMap(y) { 
	var obj_map = document.getElementById("map_canvas");
	gm_map = new GMap2(obj_map);

	if (y.center && y.center != "") {gm_setCenter(y.center, y.zoom);}
	else {
		if (y.coords && y.coords != "") {gm_setCenter(y.coords, 13);}
		else gm_setCenter("48.8566667,2.3509871", 5);
	}	
	gm_setMapType(y.maptype);
}

function gm_initControls(y) {
		
	function AddElemsControl() {}
	AddElemsControl.prototype = new GControl();
	
	AddElemsControl.prototype.initialize = function() {
		var thediv = create_elem("div", { style : { textDecoration : "none", color : "black", backgroundColor : "white", fontSize : "12px", textAlign : "center", border : "1px solid black", padding : "1px", marginBottom : "2px", cursor : "pointer", width : "110px"}});
		var thetable = create_table(thediv, {width:"100%", align:"center", cellPadding:"3"});
		var therow  = thetable.insertRow(-1);
		create_td(therow, {colSpan : "3", id:"icon_message", innerHTML : "Ajouter"});
		var therow  = thetable.insertRow(-1);
		
		var thetd = create_td(therow);
		var img1 = create_elem("IMG", {height:"31", width:"31", src:"/services/gm/images/dis-m.gif", alt:gm_message["addmarker"]});
		thetd.appendChild(img1);
		
		var thetd = create_td(therow);
		var img2 = create_elem("IMG", {height:"31", width:"31", src : "/services/gm/images/dis-l.gif", alt:gm_message["addline"]});
		thetd.appendChild(img2);
		
		var thetd = create_td(therow);
		var img3 =create_elem("IMG", {height:"31", width:"31", src : "/services/gm/images/dis-s.gif", alt:gm_message["addshape"]});
		thetd.appendChild(img3);
		
		GEvent.addDomListener(img1, "click", function() {gm_placeMarker();});
		GEvent.addDomListener(img1, "mouseover", function() {gm_updateMessage("addmarker");});
		GEvent.addDomListener(img1, "mouseout", function() {gm_updateMessage();});
		
		GEvent.addDomListener(img2, "click", function() { gm_startLine();});
		GEvent.addDomListener(img2, "mouseover", function() { gm_updateMessage("addline");});
		GEvent.addDomListener(img2, "mouseout", function() { gm_updateMessage();});
	
		GEvent.addDomListener(img3, "click", function() { gm_startShape();});	
		GEvent.addDomListener(img3, "mouseover", function() { gm_updateMessage("addshape");});	
		GEvent.addDomListener(img3, "mouseout", function() { gm_updateMessage();});
		
		gm_map.getContainer().appendChild(thediv);
		return thediv;
	};

	AddElemsControl.prototype.getDefaultPosition = function() {
		return new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(7, 7));
	};
	
	if ( y.gm_mode == "edit" ) {
		gm_setUIToDefault() ;
		gm_map.addControl(new AddElemsControl());
	} else {
		if ( y.interact == "static" ) gm_map.disableDragging();
		else if ( y.interact == "move" ) {
			var customUI = gm_map.getDefaultUI();
			customUI.controls.maptypecontrol = false;
			customUI.controls.menumaptypecontrol = false;
			gm_map.setUI(customUI);
		}
		else gm_setUIToDefault() ;
		if ( y.interact == "search" ) gm_map.enableGoogleBar(); 
	}
}

function gm_ZoomControl3D() {
	var size = parseInt( gm_map.getSize().width , 10 ) ;
	var lastsize = ( gm_zoomcontrol && gm_zoomcontrol.lastsize ) || null ;
	if ( size < 450 && ( ! lastsize || lastsize >= 450 ) ) {
		if ( gm_zoomcontrol && gm_zoomcontrol.control ) gm_map.removeControl( gm_zoomcontrol.control ) ;
		gm_zoomcontrol = { lastsize : size, control : new GSmallZoomControl3D() } ;
		gm_map.addControl( gm_zoomcontrol.control ) ;
	} else if ( size >= 450 && ( ! lastsize || lastsize < 450 ) ) {
		if ( gm_zoomcontrol && gm_zoomcontrol.control ) gm_map.removeControl( gm_zoomcontrol.control ) ;
		gm_zoomcontrol = { lastsize : size , control : new GLargeMapControl3D() } ;
		gm_map.addControl( gm_zoomcontrol.control ) ;
	}
}

function gm_MapType() {
	var size = parseInt( gm_map.getSize().width , 10 ) ;
	var lastsize = ( gm_maptypecontrol && gm_maptypecontrol.lastsize ) || null ;
	if ( size < 450 && ( ! lastsize || lastsize >= 450 ) ) {
		if ( gm_maptypecontrol && gm_maptypecontrol.control ) gm_map.removeControl( gm_maptypecontrol.control ) ;
		gm_maptypecontrol = { lastsize : size, control : new GMenuMapTypeControl() } ;
		gm_map.addControl( gm_maptypecontrol.control ) ;
	} else if ( size >= 450 && ( ! lastsize || lastsize < 450 ) ) {
		if ( gm_maptypecontrol && gm_maptypecontrol.control ) gm_map.removeControl( gm_maptypecontrol.control ) ;
		gm_maptypecontrol = { lastsize : size , control : new GMapTypeControl() } ;
		gm_map.addControl( gm_maptypecontrol.control ) ;
	}
}

function gm_setUIToDefault() { 
//	gm_map.setUIToDefault();
/*
vh : trouvé info suivante

http://code.google.com/p/gmaps-api-issues/issues/detail?id=1479

The problem seems to occurs deep inside a code, that does some job with map type
controls. Also, if I comment out map.setUIToDefault() method call, it works fine and
no error occurs.
I'll try to reproduce the problem with different map controls and will write results
here later.

[later]
Yep, it looks like the bug is because of old friend ;) map.setUIToDefault().

Changed that call to a set of equal (?) calls:

map.addMapType(G_PHYSICAL_MAP);        
map.addControl(new GLargeMapControl3D());
map.addControl(new GScaleControl());
map.addControl(new GMapTypeControl());

and it works fine now.

MAIS

nous nous devons adapter la taille des contrôles à la taille de la fenêtre donc on le fait un peu différemment.

*/

	gm_ZoomControl3D() ;
	gm_MapType() ;
	var keyboard = new GKeyboardHandler(gm_map);
	gm_map.addControl(new GScaleControl()); 
	gm_map.addMapType(G_PHYSICAL_MAP);
}

function gm_initKml(y) { 
//	if (y.kml && y.kml!="") { 
	if (y.kml) { 
		//var dep_address = "http://" + gm_getservername() + "/services/gm/images/gm_france/";
		var dep_address = "http://club2.quomodo.com/scripts/gmap/images/gm_france/";
		theoverlay=new GGeoXml(dep_address + y.kml + ".kml");
		gm_map.addOverlay(theoverlay);
		
		if (y.kmlzoom == "true"){
			gm_setCenter(gm_france_departmentsCenter[y.kml]);
			theoverlay.gotoDefaultViewport(gm_map);
		}
	}
}

function gm_initTraffic(y){
	if(y.traffic){
		var trafficOptions = {incidents:true};
		trafficInfo = new GTrafficOverlay(trafficOptions);
		gm_map.addOverlay(trafficInfo);
	}
}

function gm_initShapes(y) { 
	if (y.shapes) { for ( var i=0;i<y.shapes.length;i++) { try { gm_drawShape(y.shapes[i], y.gm_mode); } catch( err ) {} }}
	if (y.lines) { for ( var i=0;i<y.lines.length;i++) { try { gm_drawLine(y.lines[i], y.gm_mode); } catch( err ) {} }}
	if (y.markers) { for ( var i=0;i<y.markers.length;i++) { try { gm_drawMarker(y.markers[i], y.gm_mode); } catch( err ) {} }}
}

function gm_bindMapEvents() { 
	GEvent.addListener( gm_map, "zoomend", function(b, a) { parent.gm_saveZoom( gm_noteid , a ) ; } ) ;
	GEvent.addListener( gm_map, "moveend", function() { parent.gm_saveCenter( gm_noteid , gm_map.getBounds().getCenter().toUrlValue()) ; } ) ;
	GEvent.addListener( gm_map, "maptypechanged", function() { parent.gm_saveMapType( gm_noteid , gm_map.getCurrentMapType().getUrlArg()); } ) ;
}

function gm_showAddress( address , recall ) {
	if (address == "F-") address= "Paris, France";
	var geocoder = new GClientGeocoder();
	GEvent.addListener(geocoder, "error", gm_handleErrors);
	var f = function(point) {
			if (!point) {
				if ( ! recall ) {
					parent.adminalert( gm_message[ "notfound"] );
					gm_showAddress( "quomodo" , true ) ;
				}
				return ;
			}
			gm_map.setCenter(point, 13);
			gm_putMarker(point, address);
			if (gm_mode == "edit"){
				parent.gm_saveCoords(gm_noteid, point.toUrlValue());
				parent.gm_saveCenter( gm_noteid , gm_map.getBounds().getCenter().toUrlValue()) ;
			}
		} ;
	geocoder.getLatLng( address, f ) ;
}

function gm_showDirection( address_dep, address_arr ) {
	var obj_panel = document.getElementById( "map_panel") ;
	obj_panel.style.display = "block";

	var dir = new GDirections(gm_map, obj_panel);
	GEvent.addListener(dir, "error", gm_handleErrors);
	dir.load("from: "+ address_dep +" to: "+ address_arr);
}

function gm_setCenter(center, zoom) { 
	var c=center.split(",");
	var a=new GLatLng(c[0],c[1]);
	gm_map.setCenter(a, zoom);
}

function gm_setMapType(a) { 
	var gm_types = {m:G_NORMAL_MAP,k:G_SATELLITE_MAP,h:G_HYBRID_MAP,p:G_PHYSICAL_MAP}; 
	if (gm_types[a]) { gm_map.setMapType(gm_types[a]);}
}

/*
function -
function MAP : Marqueurs
*/

function gm_drawMarker(marker, gm_mode){
	var index = gm_markers.length;
	var a = marker.coords.split(",");
	gm_markers[index]={ marker : new GMarker(new GLatLng(a[0],a[1]), { icon : gm_createIcon(marker.icon) , title : marker.title, draggable : (gm_mode == "edit") } ), title : marker.title} ;
	if ( gm_mode == "edit" ){ gm_bindMarkerEvents(index); }
	else { gm_bindMarkerEventsViewer(index); }
}

function gm_placeMarker(){
	gm_stopDrawing();
	gm_selectCursor("m");
	gm_markerListener = GEvent.addListener(gm_map,"click",function(a,c){
		if(c){
			gm_selectCursor("h");
			GEvent.removeListener(gm_markerListener);
			var markerindex = gm_markers.length;
			gm_markers[markerindex]={marker :new GMarker(c,{icon:gm_createIcon(),draggable:true}), title:""};
			gm_bindMarkerEvents(markerindex);
			gm_markersInfoWindow(markerindex);
		}
	});
}

function gm_putMarker(point, title, icon) { 
	var marker = new GMarker(point, {title : (title || ""), icon : gm_createIcon(), draggable:(gm_mode == "edit")});
	gm_map.addOverlay(marker);

	if (title != "") GEvent.addListener(marker, "click", function() {marker.openInfoWindowHtml(title);});
	GEvent.addListener(marker, "dragstart", function() {gm_map.closeInfoWindow();});
	if ( gm_mode == "edit" ) GEvent.addListener(marker, "dragend", function(point) {parent.gm_saveCoords(gm_noteid, point.toUrlValue());});
}

function gm_updateMarker(index, elem, value){
	if (elem == "title") {
		gm_markers[index].title = value;
		gm_markers[index].marker.title = value;
	}
	else if (elem == "icon") {
		gm_markers[index].marker.setImage(value); 
		gm_markers[index].marker.getIcon().image = value;
	}
	else if (elem == "suppr"){
		gm_map.removeOverlay(gm_markers[index].marker);
		gm_markers[index] = null;
	}
	parent.gm_saveMarkers(gm_noteid, gm_markerEncodeArray());
}

function gm_bindMarkerEventsViewer(index){
	gm_map.addOverlay(gm_markers[index].marker);
	if ( gm_markers[index].title !=""){
		GEvent.addListener(gm_markers[index].marker,"mouseover",function(){ gm_markers[index].marker.openInfoWindow(gm_markers[index].title);});
		GEvent.addListener(gm_markers[index].marker,"click",function(){ gm_markers[index].marker.openInfoWindow(gm_markers[index].title);});
	}
}

function gm_bindMarkerEvents(index){
	gm_map.addOverlay(gm_markers[index].marker);
	GEvent.addListener(gm_markers[index].marker,"dragstart",function() { gm_map.closeInfoWindow();});
	GEvent.addListener(gm_markers[index].marker,"dragend",function(){parent.gm_saveMarkers(gm_noteid, gm_markerEncodeArray()); });
	GEvent.addListener(gm_markers[index].marker,"click",function(){gm_markersInfoWindow(index);});
}


function gm_markersInfoWindow(index){
	var e="<textarea type='text' style='font-family:Arial;font-size:11px;' width='100%'>" + gm_markers[index].title + "</textarea><br/><input type='button' value='valider' onclick='gm_updateMarker(" + index + ", \"title\", this.parentNode.getElementsByTagName(\"textarea\")[0].value);gm_map.closeInfoWindow();'/></div>";
	
	var d="<div>" + gm_message["chooseicon"] + "<br/>";
	var gm_iconAddress = "http://" + gm_getservername() + "/services/gm/images/icons/";
	var gm_icons = ["default", "flag_black_32", "flag_blue_32", "flag_green_32", "flag_red_32", "flag_yellow_32", "pin", "star"];
	
	for(var b=0;b<gm_icons.length;b++){
		var a = gm_iconAddress + gm_icons[b] + ".png";
		d+="<a href='#' onclick='gm_updateMarker(" + index + ", \"icon\", \"" + a + "\");gm_map.closeInfoWindow();\'><img border=0 src=\""+a+"\"/></a>";
	}
	d+="<br/><br/><a href='#' onclick='if (confirm(\"" + gm_message["confirmdeletemarker"] + "\")) {gm_updateMarker(" + index + ", \"suppr\");} return false;\'>" + gm_message["deletemarker"] + "</a></div>";
	
	gm_markers[index].marker.openInfoWindowTabsHtml([new GInfoWindowTab(gm_message["title"],e),new GInfoWindowTab(gm_message["properties"],d)]);
}

function gm_markerEncodeArray(){
	var b = new Array(0);
	for(var c = 0 ; c < gm_markers.length ; c++){
		if (gm_markers[c] != null){
			b.push({ coords : gm_markers[c].marker.getLatLng().toUrlValue(), icon : gm_markers[c].marker.getIcon().image, title :gm_markers[c].title });
		}
	}
	return b;
}


/*
function -
function MAP : Lignes et formes
*/

function gm_drawLine( line ) { 
	var lineIndex=gm_lines.length;
	gm_lines[lineIndex] = GPolyline.fromEncoded(line);
	if (gm_mode == "edit" ) { 
		gm_startDrawing(gm_lines , lineIndex , function() {parent.gm_saveLines( gm_noteid , gm_polyEncodeArray(gm_lines)); } ,false); 
	}
	else{ gm_map.addOverlay( gm_lines[lineIndex] ); }
}

function gm_drawShape( shape ) { 
	shape.opacity = 1;
	var shapeIndex = gm_shapes.length;
	gm_shapes[shapeIndex] = (new GPolygon.fromEncoded( { polylines : [shape], fill : true, outline : true, color : shape.color} ) );
	if (gm_mode == "edit") { 
		gm_startDrawing(gm_shapes , shapeIndex , function() {parent.gm_saveShapes( gm_noteid , gm_polyEncodeArray( gm_shapes ));} , false);
	}
	else { gm_map.addOverlay( gm_shapes[shapeIndex] ); }
}


function gm_stopDrawing() { 
	if (gm_markerListener) { 
		gm_selectCursor("h");
		GEvent.removeListener(gm_markerListener);
	}
	if (gm_last_poly && gm_last_poly_id) { 
		if (gm_deletePolygone( gm_last_poly , gm_last_poly_id , true ) ) { 
			gm_last_poly = null;
			gm_last_poly_id = null;
		 	gm_selectCursor("h");
		}
	}
}

function gm_startShape() { 
	gm_stopDrawing();
	gm_selectCursor("s");
	var color = gm_getColor(false);
	var shapeIndex = gm_shapes.length;
	gm_shapes[shapeIndex] = new GPolygon( [] , color , 2 , 0.7 , color , 0.2);
	gm_startDrawing(gm_shapes , shapeIndex , function() {	parent.gm_saveShapes( gm_noteid , gm_polyEncodeArray( gm_shapes )); } );
}

function gm_startLine() { 
	gm_stopDrawing();
	gm_selectCursor("l");
	var color = gm_getColor(false);
	var lineIndex = gm_lines.length;
	gm_lines[lineIndex]=new GPolyline( [] , color);
	gm_startDrawing(gm_lines , lineIndex , function() { parent.gm_saveLines(gm_noteid, gm_polyEncodeArray(gm_lines)); } );
}

function gm_startDrawing( elem , theindex , thecallback , editable) { 
	gm_map.addOverlay( elem[theindex] );
	if ( editable != false ) { 
		gm_last_poly= elem;
		gm_last_poly_id=theindex;
		elem[theindex].enableDrawing(gm_options);
	}
	
	elem[theindex].enableEditing( { onEvent:"mouseover" } );
	elem[theindex].disableEditing( { onEvent:"mouseout" } );
	elem[theindex].enableEditing();
	if ( editable != false ) { 
		GEvent.addListener( elem[theindex], "endline" , function() { 
			gm_selectCursor("h");
			thecallback();
			gm_last_poly=null;
			gm_last_poly_id=null;
			GEvent.bind( elem[theindex] , "lineupdated" , "" , thecallback);
			gm_bindPolygoneEvents( elem , theindex , thecallback);
		});
	}
	else{
		GEvent.bind( elem[theindex] , "lineupdated" , "" , thecallback);
		gm_bindPolygoneEvents(elem , theindex , thecallback);
	}
}

function gm_bindPolygoneEvents(elem , theindex , thecallback) { 
	GEvent.addListener( elem[theindex] , "click" , function(a, e) { 
		if ( typeof e == "number" ) {
			if ( (elem === gm_shapes && elem[theindex].getVertexCount() > 4) || (elem === gm_lines && elem[theindex].getVertexCount() > 2) ) { elem[theindex].deleteVertex(e); }
			else { gm_deletePolygone( elem , theindex); }		
		} 
		else{
			var color = gm_getColor(false);
			elem[theindex].setStrokeStyle( {color : color , weight : 4} );
		}
		thecallback();
	});
}

function gm_deletePolygone(elem , theindex , b) { 
	if (b || confirm( "Êtes-vous sûr de vouloir supprimer ce polygone ?" )) { 
		elem[theindex].disableEditing();
		gm_map.removeOverlay( elem[theindex] );
		elem[theindex] = null;
		if (elem === gm_shapes ) parent.gm_saveShapes(gm_noteid, gm_polyEncodeArray(elem));
		else parent.gm_saveLines(gm_noteid, gm_polyEncodeArray(elem));
		return true;
	}
	return false;
}

function gm_polyEncode( elem ) { 
	if (typeof poly_enc=="undefined") { 
		poly_enc=new PolylineEncoder();
	}
	var vertexarray = new Array(0);
	for ( var c=0 ; c < elem.getVertexCount() ; c++) { 
		vertexarray.push( elem.getVertex(c) );
	}
	return poly_enc.dpEncodeToJSON( vertexarray , elem.color , elem.weight , elem.opacity , elem.fill , elem.outline);
}

function gm_polyEncodeArray( elem ) { 
	var b = new Array(0);
	for ( var d = 0 ; d < elem.length ; d++) { 
		if ( elem[d] != null ) { b.push( gm_polyEncode( elem[d]) ); }
	}
	return b;
}

/*
function -
function MAP : Enregistrement des événements
*/


function gm_saveLines(noteid, lines){
	var r = window.qsn_thenotes || parent.qsn_thenotes ;
	if ( ! r ) return ;
	if ( ! r[ noteid ] ) noteid = q_idalias[ noteid ] ;
	r[noteid].lines = lines;
	gm_notechanged( noteid , "lignes mises à jour") ;
}

function gm_saveShapes(noteid, shapes){
	var r = window.qsn_thenotes || parent.qsn_thenotes ;
	if ( ! r ) return ;
	if ( ! r[ noteid ] ) noteid = q_idalias[ noteid ] ;
	r[noteid].shapes = shapes;
	gm_notechanged( noteid , "formes mises à jour") ;
}

function gm_saveMarkers(noteid, markers) { 
	var r = window.qsn_thenotes || parent.qsn_thenotes ;
	if ( ! r ) return ;
	if ( ! r[ noteid ] ) noteid = q_idalias[ noteid ] ;
	r[noteid].markers = markers;
	gm_notechanged( noteid , "marqueurs mis à jour") ;
}

function gm_saveCenter(noteid , center ) {
	var r = window.qsn_thenotes || parent.qsn_thenotes ;
	if ( ! r ) return ;
	if ( ! r[ noteid ] ) noteid = q_idalias[ noteid ] ;
	if ( center == r[ noteid ].center ) return ;
	r[ noteid ].center = center ;
	gm_notechanged( noteid , "centre enregistré") ;
}

function gm_saveCoords(noteid , point ) {
	var r = window.qsn_thenotes || parent.qsn_thenotes ;
	if ( ! r ) return ;
	if ( ! r[ noteid ] ) noteid = q_idalias[ noteid ] ;
	r[ noteid ].coords = point;
	gm_notechanged( noteid , "coordonnées enregistrées") ;
}

function gm_saveZoom( noteid , zoom ) {
	var r = window.qsn_thenotes || parent.qsn_thenotes ;
	if ( ! r ) return ;
	if ( ! r[ noteid ] ) noteid = q_idalias[ noteid ] ;
	if ( zoom == r[ noteid ].zoom ) return ;
	r[ noteid ].zoom = zoom ;
	gm_notechanged( noteid , "zoom enregistré") ;
}

function gm_saveMapType(noteid, maptype) { 
	var r = window.qsn_thenotes || parent.qsn_thenotes ;
	if ( ! r ) return ;
	if ( ! r[ noteid ] ) noteid = q_idalias[ noteid ] ;
	if ( maptype == r[ noteid ].maptype ) return ;
	r[ noteid ].maptype = maptype ;
	gm_notechanged( noteid , "type de carte enregistré") ;
}


/*
function -
function MAP : Définitions des prototypes
*/


// PolylineEncoder.js copyright Mark McClure	April/May 2007
//
// This software is placed explicitly in the public
// domain and may be freely distributed or modified.
// No warranty express or implied is provided.
//
// History:
// V 2.1	July 2007
//	 Minor modification in distance function to enhance
//	 speed.	Suggested by Joel Rosenberg.
// V 2.0 May 2007.
//	 Major revisions include:
//		 Incorporation of Douglas-Peucker algorithm
//		 Encapsulation into the PolylineEncoder package.
// V 1.0 September 2006
//	 Original version based on simple vertex reduction
// 
// This module defines a PolylineEncoder class to encode
// polylines for use with Google Maps together with a few
// auxiliary functions. Documentation at
// http://facstaff.unca.edu/mcmcclur/GoogleMaps/EncodePolyline/PolylineEncoder.html
//
// Google map reference including encoded polylines:
//	 http://www.google.com/apis/maps/documentation/
//
// Details on the algorithm used here:
//	 http://facstaff.unca.edu/mcmcclur/GoogleMaps/EncodePolyline/
//
// Constructor:
//	 polylineEncoder = new PolylineEncoder(numLevels, 
//		 zoomFactor, verySmall, forceEndpoints?);
// where numLevels and zoomFactor indicate how many 
// different levels of magnification the polyline has
// and the change in magnification between those levels,
// verySmall indicates the length of a barely visible 
// object at the highest zoom level, forceEndpoints 
// indicates whether or not the	endpoints should be 
// visible at all zoom levels.	forceEndpoints is 
// optional with a default value of true.	Probably 
// should stay true regardless.
// 
// Main methods:
// * PolylineEncoder.dpEncodeToPolyline(points, 
//		 color?, weight?, opacity?)
// Accepts an array of latLng objects (see below) and
// optional style specifications.	Returns an encoded 
// polyline that may be directly overlayed on a Google 
// Map.	Requires that the Google Maps API be loaded.
//
// * PolylineEncoder.dpEncodeToPolygon(pointsArray, 
//		 boundaryColor?, boundaryWeight?, boundaryOpacity?,
//		 fillColor?, fillOpacity?, fill?, outline?)
// Accepts an array of arrays latLng objects and
// optional style specifications.	Returns an encoded 
// polylgon that may be directly overlayed on a Google 
// Map.	Requires that the Google Maps API be loaded.
//
//
// Convenience classes and methods:
// * PolylineEncoder.latLng
// Constructor:
//	 myLatLng = new PolylineEncoder.latLng(y,x);
// The dpEncode* functions expect points in the
// form of an object with lat and lng methods.	A
// GLatLng as defined by the Google Maps API does 
// quite nicely.	If you're developing a javascript
// without loading the API, however, you can use
// a PolylineEncoder.latLng for this purpose.
// //
// PolylineEncoder.pointsToLatLngs
// Sometimes your points are defined in terms of an
// array of arrays, rather than an array of latLngs.
// PolylineEncoder.pointsToLatLngs converts to an array
// of arrays to an array of latLngs for use by the
// dpEncode functions.
// //
// PolylineEncoder.pointsToGLatLngs
// PolylineEncoder.pointsToGLatLngs is analagous to the 
// previous function, but it returns GLatLngs rather
// than PolylineEncoder.latLngs.	The first function may
// be used independently of Google Maps.	Use the second,
// if you need to use the result in a Goole Map function.
//
//
// Lower level methods
// PolylineEncoder.dpEncodeToJSON(points, 
//		 color?, weight?, opacity?)
// Returns a legal argument to GPolyline.fromEncoded.
// //
// PolylineEncoder.dpEncode(points);
// This is where the real work is done.	The return value
// is a JSON object with properties named	encodedLevels,
// encdodedPoints and encodedPointsLiteral. These are
// strings which are acceptable input to the points and
// levels properties of the GPolyline.fromEncoded
// function. The encodedPoints string should be used for
// maps generated dynamically, while the
// encodedPointsLiteral string should be copied into a
// static document.
// 
// The standard disclaimers, such as "use at your own risk, 
// since I really don't have any idea what I'm doing," apply. 

// The constructor
PolylineEncoder = function(numLevels, zoomFactor, verySmall, forceEndpoints) {
	var i;
	if(!numLevels) {
		numLevels = 18;
	}
	if(!zoomFactor) {
		zoomFactor = 2;
	}
	if(!verySmall) {
		verySmall = 0.00001;
	}
	if(!forceEndpoints) {
		forceEndpoints = true;
	}
	this.numLevels = numLevels;
	this.zoomFactor = zoomFactor;
	this.verySmall = verySmall;
	this.forceEndpoints = forceEndpoints;
	this.zoomLevelBreaks = new Array(numLevels);
	for(i = 0; i < numLevels; i++) {
		this.zoomLevelBreaks[i] = verySmall*Math.pow(zoomFactor, numLevels-i-1);
	}
};

// The main function.	Essentially the Douglas-Peucker
// algorithm, adapted for encoding. Rather than simply
// eliminating points, we record their from the
// segment which occurs at that recursive step.	These
// distances are then easily converted to zoom levels.
PolylineEncoder.prototype.dpEncode = function(points) {
	var absMaxDist = 0;
	var stack = [];
	var dists = new Array(points.length);
	var maxDist, maxLoc, temp, first, last, current;
	var i, encodedPoints, encodedLevels;
	var segmentLength;
	
	if(points.length > 2) {
		stack.push([0, points.length-1]);
		while(stack.length > 0) {
			current = stack.pop();
			maxDist = 0;
			segmentLength = Math.pow(points[current[1]].lat()-points[current[0]].lat(),2) + 
				Math.pow(points[current[1]].lng()-points[current[0]].lng(),2);
			for(i = current[0]+1; i < current[1]; i++) {
				temp = this.distance(points[i], 
					points[current[0]], points[current[1]],
					segmentLength);
				if(temp > maxDist) {
					maxDist = temp;
					maxLoc = i;
					if(maxDist > absMaxDist) {
						absMaxDist = maxDist;
					}
				}
			}
			if(maxDist > this.verySmall) {
				dists[maxLoc] = maxDist;
				stack.push([current[0], maxLoc]);
				stack.push([maxLoc, current[1]]);
			}
		}
	}
	
	encodedPoints = this.createEncodings(points, dists);
	encodedLevels = this.encodeLevels(points, dists, absMaxDist);
	return {
		encodedPoints: encodedPoints,
		encodedLevels: encodedLevels,
		encodedPointsLiteral: encodedPoints.replace(/\\/g,"\\\\")
	};
};

PolylineEncoder.prototype.dpEncodeToJSON = function(points,	color, weight, opacity) {
	var result;
	
	if(!opacity) {
		opacity = 0.9;
	}
	if(!weight) {
		weight = 3;
	}
	if(!color) {
		color = "#0000ff";
	}
	result = this.dpEncode(points);
	return {
		color: color,
		weight: weight,
		opacity: opacity,
		points: result.encodedPoints,
		levels: result.encodedLevels,
		numLevels: this.numLevels,
		zoomFactor: this.zoomFactor
	};
};

PolylineEncoder.prototype.dpEncodeToGPolyline = function(points,
	color, weight, opacity) {
	if(!opacity) {
		opacity = 0.9;
	}
	if(!weight) {
		weight = 3;
	}
	if(!color) {
		color = "#0000ff";
	}
	return new GPolyline.fromEncoded(
		this.dpEncodeToJSON(points, color, weight, opacity));
};

PolylineEncoder.prototype.dpEncodeToGPolygon = function(pointsArray,
	boundaryColor, boundaryWeight, boundaryOpacity,
	fillColor, fillOpacity, fill, outline) {
	var i, boundaries;
	if(!boundaryColor) {
		boundaryColor = "#0000ff";
	}
	if(!boundaryWeight) {
		boundaryWeight = 3;
	}
	if(!boundaryOpacity) {
		boundaryOpacity = 0.9;
	}
	if(!fillColor) {
		fillColor = boundaryColor;
	}
	if(!fillOpacity) {
		fillOpacity = boundaryOpacity/3;
	}
	if(fill==undefined) {
		fill = true;
	}
	if(outline==undefined) {
		outline = true;
	}
	
	boundaries = new Array(0);
	for(i=0; i<pointsArray.length; i++) {
		boundaries.push(this.dpEncodeToJSON(pointsArray[i],
			boundaryColor, boundaryWeight, boundaryOpacity));
	}
	return new GPolygon.fromEncoded({
		polylines: boundaries,
		color: fillColor,
		opacity: fillOpacity,
		fill: fill,
		outline: outline
	});
};

// distance(p0, p1, p2) computes the distance between the point p0
// and the segment [p1,p2].	This could probably be replaced with
// something that is a bit more numerically stable.
PolylineEncoder.prototype.distance = function(p0, p1, p2, segLength) {
	var u, out;
	
	if(p1.lat() === p2.lat() && p1.lng() === p2.lng()) {
		out = Math.sqrt(Math.pow(p2.lat()-p0.lat(),2) + Math.pow(p2.lng()-p0.lng(),2));
	}
	else {
		u = ((p0.lat()-p1.lat())*(p2.lat()-p1.lat())+(p0.lng()-p1.lng())*(p2.lng()-p1.lng()))/
			segLength;
	
		if(u <= 0) {
			out = Math.sqrt(Math.pow(p0.lat() - p1.lat(),2) + Math.pow(p0.lng() - p1.lng(),2));
		}
		if(u >= 1) {
			out = Math.sqrt(Math.pow(p0.lat() - p2.lat(),2) + Math.pow(p0.lng() - p2.lng(),2));
		}
		if(0 < u && u < 1) {
			out = Math.sqrt(Math.pow(p0.lat()-p1.lat()-u*(p2.lat()-p1.lat()),2) +
				Math.pow(p0.lng()-p1.lng()-u*(p2.lng()-p1.lng()),2));
		}
	}
	return out;
};

// The createEncodings function is very similar to Google's
// http://www.google.com/apis/maps/documentation/polyline.js
// The key difference is that not all points are encoded, 
// since some were eliminated by Douglas-Peucker.
PolylineEncoder.prototype.createEncodings = function(points, dists) {
	var i, dlat, dlng;
	var plat = 0;
	var plng = 0;
	var encoded_points = "";

	for(i = 0; i < points.length; i++) {
		if(dists[i] != undefined || i == 0 || i == points.length-1) {
			var point = points[i];
			var lat = point.lat();
			var lng = point.lng();
			var late5 = Math.floor(lat * 1e5);
			var lnge5 = Math.floor(lng * 1e5);
			dlat = late5 - plat;
			dlng = lnge5 - plng;
			plat = late5;
			plng = lnge5;
			encoded_points += this.encodeSignedNumber(dlat) + 
				this.encodeSignedNumber(dlng);
		}
	}
	return encoded_points;
};

// This computes the appropriate zoom level of a point in terms of it's 
// distance from the relevant segment in the DP algorithm.	Could be done
// in terms of a logarithm, but this approach makes it a bit easier to
// ensure that the level is not too large.
PolylineEncoder.prototype.computeLevel = function(dd) {
	var lev;
	if(dd > this.verySmall) {
		lev=0;
		while(dd < this.zoomLevelBreaks[lev]) {
			lev++;
		}
		return lev;
	}
};

// Now we can use the previous function to march down the list
// of points and encode the levels.	Like createEncodings, we
// ignore points whose distance (in dists) is undefined.
PolylineEncoder.prototype.encodeLevels = function(points, dists, absMaxDist) {
	var i;
	var encoded_levels = "";
	if(this.forceEndpoints) {
		encoded_levels += this.encodeNumber(this.numLevels-1);
	} else {
		encoded_levels += this.encodeNumber(
			this.numLevels-this.computeLevel(absMaxDist)-1);
	}
	for(i=1; i < points.length-1; i++) {
		if(dists[i] != undefined) {
			encoded_levels += this.encodeNumber(
				this.numLevels-this.computeLevel(dists[i])-1);
		}
	}
	if(this.forceEndpoints) {
		encoded_levels += this.encodeNumber(this.numLevels-1);
	} else {
		encoded_levels += this.encodeNumber(
			this.numLevels-this.computeLevel(absMaxDist)-1);
	}
	return encoded_levels;
};

// This function is very similar to Google's, but I added
// some stuff to deal with the double slash issue.
PolylineEncoder.prototype.encodeNumber = function(num) {
	var encodeString = "";
	var nextValue, finalValue;
	while (num >= 0x20) {
		nextValue = (0x20 | (num & 0x1f)) + 63;
//		 if (nextValue == 92) {
//			 encodeString += (String.fromCharCode(nextValue));
//		 }
		encodeString += (String.fromCharCode(nextValue));
		num >>= 5;
	}
	finalValue = num + 63;
//	 if (finalValue == 92) {
//		 encodeString += (String.fromCharCode(finalValue));
//	 }
	encodeString += (String.fromCharCode(finalValue));
	return encodeString;
};

// This one is Google's verbatim.
PolylineEncoder.prototype.encodeSignedNumber = function(num) {
	var sgn_num = num << 1;
	if (num < 0) {
		sgn_num = ~(sgn_num);
	}
	return(this.encodeNumber(sgn_num));
};

// The remaining code defines a few convenience utilities.
// PolylineEncoder.latLng
PolylineEncoder.latLng = function(y, x) {
	this.y = y;
	this.x = x;
};

PolylineEncoder.latLng.prototype.lat = function() {
	return this.y;
};

PolylineEncoder.latLng.prototype.lng = function() {
	return this.x;
};

// PolylineEncoder.pointsToLatLngs
PolylineEncoder.pointsToLatLngs = function(points) {
	var i, latLngs;
	latLngs = new Array(0);
	for(i=0; i<points.length; i++) {
		latLngs.push(new PolylineEncoder.latLng(points[i][0], points[i][1]));
	}
	return latLngs;
};

// PolylineEncoder.pointsToGLatLngs
PolylineEncoder.pointsToGLatLngs = function(points) {
	var i, gLatLngs;
	gLatLngs = new Array(0);
	for(i=0; i<points.length; i++) {
		gLatLngs.push(new GLatLng(points[i][0], points[i][1]));
	}
	return gLatLngs;
};

/*
function -
function MAP : Utiles
*/


function gm_handleErrors() { 
	var code = this.getStatus().code;
	try {
		 if (gm_errors[code]) adminalert(gm_errors[code][1]);
		 else adminalert("An unknown error occurred.");
	} catch( err ) { }		 
}

function gm_selectCursor(a){
	//console.log("Curseur : " + a);
	var obj_map = document.getElementById("map_canvas");
	if (a == "h") {
		obj_map.style.cursor = "hand";
		gm_map.getDragObject().setDraggableCursor("hand");
	}
	if (a == "s" || a =="l" || a=="m") {
		obj_map.style.cursor = "crosshair";
		gm_map.getDragObject().setDraggableCursor("crosshair");
	}
}

function gm_getColor(a){
	return gm_colors[ (gm_colorIndex++)%gm_colors.length] [ a ? 0 :1 ];
}


function gm_updateMessage(t){
	var text = (t) ? gm_message[t] : gm_message["add"];
	var div = document.getElementById("icon_message");
	q_innerHTML(div, text);
}

function gm_createIcon(url, size, position) { 
	var thesize = (size || 32);
	var theposition = (position || "center");
	var theurl = (url || "http://" + gm_getservername() + "/services/gm/images/icons/default.png");
	
	if (url == "" || url == "http://maps.google.com/intl/fr_ALL/mapfiles/marker.png") {
		//return G_DEFAULT_ICON;
		theurl = "http://" + gm_getservername() + "/services/gm/images/icons/default.png";
		thesize = 32;
		theposition = "center";
	}
	else if (theurl == "http://" + gm_getservername() + "/services/gm/images/icons/star.png"){theposition = "center";}
	
	var theicon = new GIcon();
	theicon.image = theurl;
	//theicon.shadow = theurl;
	theicon.iconSize = new GSize(thesize, thesize);
	//theicon.shadowSize = new GSize(thesize, thesize);
	theicon.iconAnchor = (theposition == "center") ? new GPoint((thesize/2), (thesize/2)) : (theposition == "bottomleft") ? new GPoint(0, thesize) : (theposition == "bottomright") ? new GPoint(thesize, thesize) : new GPoint(thesize, 0);		
	theicon.infoWindowAnchor = (theposition == "center") ? new GPoint((thesize/2), (thesize/2)) : (theposition == "bottomleft") ? new GPoint(0, thesize) : (theposition == "bottomright") ? new GPoint(thesize, thesize) : new GPoint(thesize, 0);
	return theicon;
}

var gm_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "gm_js_loaded" ) ;


var matchnext_message = {
"notetitleprompt" : "Titre de la note" ,
"newnoteprompt" : "Cliquez ici pour ajouter un commentaire général" ,
"newcommentprompt" : "Cliquez ici pour ajouter un commentaire." ,
"delete" : "Supprimer ce match" ,
"add" : "Ajouter un nouveau match" ,
"nomatch" : "Aucun match" ,
"onematch" : "Un seul match" ,
"severalmatch" : "%s matchs" ,
"confirmdelete" : "Voulez-vous vraiment supprimer ce match ?" ,
"matchline" : "%date% : %team1% vs %team2%" ,
"snname" : "Note Matchs et Résultats" ,
"plug" : "Matchs_Affichez les matchs joués ou à venir de toutes ou partie de vos équipes." ,
"atTIME" : " à " ,
"playedDATE" : "Joué " ,
"desc" : "(...)",
"seecomment" : "voir le commentaire",
"commentitle" : "Commentaire du match",
"showicons" : "Afficher les smileys",
"noteoptions" : "Options de la note"
} ;

var matchnext_msgs_fr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "matchnext_msgs_fr_js_loaded" ) ;

var matchnext_templates_prepared = false ;
var matchnext_leftcol_prepared = false ;

var matchnext_json_template = { version : 3 ,  text : "" , color : "rgb(100%,100%,100%)" , textstyles: { size : "1" , font : "0" , bold : "false" , italic : "false" , "center" : "false"}, header : { display: "true", color: "c1", text : "" }  , showsignature : "false" , displayteams : [ ] , displaymode: "0" , options : { dateselect : "2" , timeselect : "2" , scoreselect : "2" } , displayframes : "1", showicons : "true" } ; 

var matchnext_oldjson_template = {
"2" : { version : 2 ,  text : "" , color : "3" , textstyles: { size : "1" , font : "0" , bold : "false" , italic : "false" , "center" : "false"}, header : { display: "true", color: "0", text : "" }  , showsignature : "false" , displayteams : [ ] , displaymode: "0" , options : { dateselect : "2" , timeselect : "2" , scoreselect : "2" } , displayframes : "1" }
} ;

var matchnext_formtypes = [ "input", "textarea", "select", "checkboxes" ] ;

var matchnext_colordesc = { "qmc1" : "color" , "qmc2_qmc1" : "header.color" , "qmc3" : matchnext_qmc3} ; 
var matchnext_textdesc = { "qtxt1" : { "size" : "textstyles.size" , "font" : "textstyles.font" ,  "bold" : "textstyles.bold" , "italic" : "textstyles.italic", "center" : "textstyles.center" }  };

var matchnext_leftcol_description = [ 
{ what : "notecolor" , tabname : "tabcolor" , visible : true , elems : [ 
	{ handler : "qsn_addqlubcolorblock" , params : { jsonpath : "color" , others : true ,  transparent:true , title:false , menuseparator: false , modifynote : "qsn_setcolors"  } }
	] } , 
{what : "bandeau" , tabname : "tabheader" , visible : false , elems : [    
	{ handler : "qsn_addheaderhideshow" , params : { notekind:"matchnext" , title:"" , jsonpath : "header.display" } }, 
	{ handler : "xqsn_addheadercolor" , params : { notekind:"matchnext" , jsonpath : "header.color" } }
	] } , 
{ what : "textstyles" , tabname : "tabtext" , visible : false , elems : [ 
	{ handler : "qsn_addfontfsizes"   , params : { jsonpath : "textstyles.size" , ncols : 2  } } , 
	{ handler : "qsn_addfontfamilies", params : { jsonpath : "textstyles.font" , ncols : 2  } } , 
	{ handler : "qsn_addtextoptions", params : { jsonpath : "textstyles" , ncols : 2 , opts : [ "bold" , "center" , "italic"  ] } }
	] } , 
{ what : "signature" , tabname : "tabsignature" , visible : false , elems : [ 
	{ handler : "qsn_addsignature" , params : { jsonpath : "showsignature" , ncols : 1} }
	] } ,
{ what : "noteoptions" , tabname : "noteoptions" , visible : false , elems : [ 
	{ handler : "qsn_addcheckboxtable" , params : { checkboxes : [ { name : "showicons" , jsonpath : "showicons" } ] } }
	] }
] ;


function matchnext_qmc3( r ) {
	return "/services/matchnext/images/matchnext48.png" ;
}

function matchnext_upgradejson( r ) {
	if ( ( r.version ) && ( r.version == matchnext_json_template.version ) ) return r ;
	if ( r.version<2 ) r = matchnext_upgradejsontov2( r ) ;
	if ( r.version<3 ) r = matchnext_upgradejsontov3( r ) ;
	r.version = matchnext_json_template.version;
	return r ;
}

function matchnext_upgradejsontov2(r) {
	r.textstyles = { size: String( Math.max( Math.min( 3 - parseInt( r.textsize , 10 ) , 2 ) , 0 ) ) , bold : "false" , italic : "false", center : "false" } ;
	var oldfonts = [ 0 , 1 , 3 , 4 ] ;
	r.textstyles.font = oldfonts[ parseInt( r.textfont , 10 ) - 1 ] ;
	r.header.display = String( r.headerdisplay == 1 ) ;
	r[ "showsignature" ] = String( r.signature !=0 ) ;
	delete r.textsize ;
	delete r.textfont ;
	delete r.textcenter;
	delete r.textbold;
	delete r.textitalic;
	delete r.headerdisplay ;
	delete r.signature ;
	return r ;
}

function matchnext_upgradejsontov3(r) {
	r.showicons = "true";
	return r ;
}

var matchnext_timers = { } ;
var matchnext_height = 137 ;
var matchnext_data = { } ;

/*
function -
function RENDER
*/

function matchnext_template( id ) {
	if ( matchnext_templates_prepared ) return qsn_template( id , true ) ;
	qsn_installcontainer( "view" , "matchnext" , ge( "matchnext_notecontent" ).innerHTML ) ;
	var div = qsn_installcontainer( "edit" , "matchnext" , ge( "matchnext_notecontent_edit" ).innerHTML ) ;
	matchnext_templates_prepared = true ;
	return qsn_template( id , true ) ;
}

function matchnext_renderhtml( noteid ) {
	var div = getelement( noteid ) ;
	var r = qsn_thenotes[ noteid ] ;
	var t = gebcn( div , "matchnext_text" ) ;
	if ( qsn_currstate != "edit" ) {
		visibleblock( t.parentNode , r.text ) ;
		q_innerHTML( t, r.text ) ;
		gebcn( div, "matchnext_matchstable" ).style.height = gebcn( div, "matchnext_matchslist" ).style.height = matchnext_height * parseInt( r.displayframes ) + "px" ;
	} else {
		t.value = r.text ;
		matchnext_blurdefault ( t ) ;
	}
	hideshowblock( [ gebcn( div, "matchnext_matchstable" ), gebcn( div, "matchnext_infos" ) ] , gebcn( div, "matchnext_wait" ) ) ;
	qlub_silentloadeventsmgr( "matchnext_rendermatchs", [ noteid ] ) ;
	qsn_container_renderhtml( div , r ) ;
	qsn_settextproperties( noteid ) ;
	qsn_setcolors( noteid ) ;
}

function matchnext_showlist( x, v ) {
	var div = getContainer( x ) ;
	var id = div.id ;
	var links = gebcn( div , "matchnext_infos_list" ).getElementsByTagName( "A" ) ;
	var t0 = [ links[ 0 ], gebcn( div, "matchnext_matchstable" ), gebcn( div, "matchnext_infos_animstatus" ) ] ;
	var t1 = [ links[ 1 ], gebcn( div, "matchnext_matchslist" ) ] ;
	if ( v ) {
		gebcn( div, "matchnext_matchslist" ).innerHTML = matchnext_data[ id ].mlisthtml ;
		hideshowblock( t0, t1 ) ;
		matchnext_stopanim( div ) ;
	} else {
		hideshowblock( t1, t0 ) ;
		gebcn( div, "matchnext_matchslist" ).innerHTML = "" ;
	}
}

/*
function -
function RENDER MATCHS
*/

function matchnext_rendermatchs( noteid ) {
// alert("starting matchnext_rendermatchs") ;
	var div = ge( noteid ) ;
	var r = qsn_thenotes[ noteid ] ;
	if ( qsn_currstate == "edit" ) matchnext_rendermatchs_edit( div, r ) ;
	else matchnext_rendermatchs_view( div, r ) ;
	hideshowblock( gebcn( div, "matchnext_wait" ), [ gebcn( div, "matchnext_matchstable" ), gebcn( div, "matchnext_infos" ) ] ) ;
}

function matchnext_getmatchstorender( div, r ) {
	if ( ! window.clubevents ) return ;
	var allmatchs = q_getElemByTagAndAttr( clubevents, "event", "kind", "match", true ) ;
	var s = [ ] ;
	var m ;
	if ( r.displaymode == 0 ) { // simple display
		var o = parseInt( r.options.dateselect, 10 ) ;
		var currdate = new Date() ;
		var today = "" + currdate.getFullYear() + twodigs( currdate.getMonth() + 1 ) + twodigs( currdate.getDate() ) ;
		var prevdate = [ ] ;
		var nextdate = [ ] ;
		var previndex = [ ] ;
		var nextindex = [ ] ;
		for ( var j = 0 ; j < r.displayteams.length ; j++) {
			prevdate[ j ] = "11111111" ;
			nextdate[ j ] = "99999999" ;
			previndex[ j ] = -1 ;
			nextindex[ j ] = -1 ;
		}
		for ( var j=0; j < allmatchs.length; j++ ) {
			m = allmatchs[ j ] ;
			var i = indexOfItem( q_getInnerText( gebtn( m, "localteam" ) ) , r.displayteams ) ;
			if ( i == -1 ) continue ;
			prevnextmatch = null ;
			d = q_getInnerText( gebtn( m, "date" ) ) ;
					if ( d == today ) {
				s.push( m ) ;
				continue ;
			}
			if ( o == 2 || o == 0 ) { // prevmatch
				if ( d < today && d > prevdate[ i ] ) {
					prevdate[ i ] = d ;
					if ( previndex[ i ] == -1 ) {
						s.push( m ) ;
						previndex[ i ] = s.length - 1 ;
					} else s[ previndex[ i ] ] = m ;
				}
			}
			if ( o == 2 || o == 1 ) { // nextmatch
				if ( d > today && d < nextdate[ i ] ) {
					nextdate[ i ] = d ;
					if ( nextindex[ i ] == -1 ) {
						s.push( m ) ;
						nextindex[ i ] = s.length - 1 ;
					} else s[ nextindex[ i ] ] = m ;
				}
			}
		}
	} else { // options
		var m, v, o ;
		for ( var i=0; i < allmatchs.length; i++ ) {
			m = allmatchs[ i ] ;
			v = q_getInnerText( gebtn( m, "localteam" ) ) ;
			if ( indexOfItem( v, r.displayteams ) != -1 ) { // team ok
				v = q_getInnerText( gebtn( m, "homescore" ) ) ;
				o = parseInt( r.options.scoreselect, 10 ) ;
				if ( ( o == 2 ) || ( ( o == 0 ) && ( v == "" ) ) || ( ( o == 1 ) && ( v != "" ) ) ) { // score ok
					o = parseInt( r.options.timeselect, 10 ) ;
					v = q_getInnerText( gebtn( m, "date" ) ) ;
					if ( matchnext_comparedate( v, [ "", "today", "thisweek", "previousweek",  "thismonth" ][ o ] ) ) s.push( m ) ; // date ok
				}
			}
		}
	}
	s.sort( matchnext_matchssort ) ;
	return s ;
}

function matchnext_rendermatchs_view( div, r ) {
	var noteid = div.id ;
	var selmatchs = matchnext_getmatchstorender( div, r ) ;
	// info bar
	if ( selmatchs.length == 0 ) {
		q_innerHTML( gebcn( div, "matchnext_infos_number" ), matchnext_message[ "nomatch" ] ) ;
		hideblock( [ gebcn( div, "matchnext_infos_list" ), gebcn( div, "matchnext_infos_animstatus" ) ] ) ;
	} else if ( selmatchs.length == 1 ) {
		q_innerHTML( gebcn( div, "matchnext_infos_number" ), matchnext_message[ "onematch" ] ) ;
		hideblock( [ gebcn( div, "matchnext_infos_list" ), gebcn( div, "matchnext_infos_animstatus" ) ] ) ;
	} else {
		q_innerHTML( gebcn( div, "matchnext_infos_number" ), matchnext_message[ "severalmatch" ].replace( "%s", selmatchs.length ) ) ;
		showblock( [ gebcn( div, "matchnext_infos_list" ), gebcn( div, "matchnext_infos_animstatus" ) ] ) ;
	}
	// matchs
	var p = events_prototypes[ "match" ].properties ;
	var d = gebcn( div, "matchnext_matchstrack" ) ;
	var mlist = gebcn( div, "matchnext_matchslist" ) ;
	var h = parseInt( gebcn( div, "matchnext_matchstable" ).style.height, 10 ) ;
	q_removeChildren( d ) ;
	q_removeChildren( mlist ) ;
	var vsindex, homeindex ;
	var viewmatchdonetemplate = "<div class=\"matchnext_viewmatchdiv\" style=\"width: 100% ; height: " + h + "px\" matchindex=\"%i\">" + gebcn( div, "matchnext_viewmatchdone_template" ).innerHTML + "</div>";
	var viewnextmatchtemplate = "<div class=\"matchnext_viewmatchdiv qmc1 bg_contrast13\" style=\"width: 100% ; height: " + h + "px\" matchindex=\"%i\">" + gebcn( div, "matchnext_viewnextmatch_template" ).innerHTML + "</div>" ;

	var mlisthtml = "" ;
	matchnext_data[ noteid ] = { dhtml : [ ] , mlisthtml : "" , currindex : 0 } ;
	for ( var i=0; i < selmatchs.length; i++ ) {
		var id = selmatchs[ i ].getAttribute( "id" ) ;
		var data = qlub_eventsmgr_getitem_JSON( "match", id ) ;
		var matchdone = data.homescore != "" && data.vsscore != "" ;
		var onedhtml = matchdone ? viewmatchdonetemplate : viewnextmatchtemplate ;
		var listline = matchnext_message[ "matchline" ] ;
		
		// club qui reçoit affiché en premier : en haut en mode fiche, avant le vs en mode liste	
		if ( q_getInnerText( gebtn( qlub_eventsmgr_getitem( "match", id ), "home" ) ) == "1" ) vsindex = 1 ;
		else vsindex = 2 ;
		homeindex = 3 - vsindex ;
		onedhtml = onedhtml.replace( new RegExp( "_team" + vsindex , "g" ) , "_vsteam" ).replace( new RegExp( "_team" + homeindex , "g" ) , "_localteam" ) ;
		onedhtml = onedhtml.replace( new RegExp( "_score" + vsindex , "g" ) , "_vsscore" ).replace( new RegExp( "_score" + homeindex , "g" ) , "_homescore" ) ;
		listline = listline.replace( "%team" + vsindex + "%", "%vsteam%" ).replace( "%team" + homeindex + "%", "%localteam%" ) ;
		
		// properties
		for ( var pp in data ) {
			var val = data[ pp ] ;
			if ( val && pp == "time" ) val = matchnext_message[ "atTIME" ] + val ;
			if ( val && pp == "date" && matchdone ) val = matchnext_message[ "playedDATE" ] + val ;
			if ( val && pp == "comment" ) val  = '<a href="#" onclick="q_alert( \'' + val.replace(/\\/g, "\\\\").replace(/'/g, "\\'") + '\', { title : \'' + matchnext_message[ "commentitle" ]  + '\',  icon : \'matchnext_commenticon\' } ); return false;"><img src="/services/matchnext/images/commenticon_16.png" class="png" border="0" style="cursor:pointer" title="' + matchnext_message[ "seecomment" ] + '"/></a>';
			onedhtml = onedhtml.replace( new RegExp( "matchnext_viewmatchnext_" + pp + "%" , "g" ) , val ) ;
			listline = listline.replace( "%" + pp + "%", data[ pp ] ) ;
		}
		
		// score icon
		if ( matchdone ) {
			hs = parseInt( data.homescore.replace( /[^0-9]+/g , "" ), 10 ) ;
			vs = parseInt( data.vsscore.replace( /[^0-9]+/g , "" ), 10 ) ;
			icon = ( hs == vs ) ? "Dizzy" : ( ( hs > vs ) ? "Smile" : "Sad" ) ;
			var iconurl = "/services/matchnext/images/smileys32/" + icon + ".png" ;
			var iconhtml = "<div style=\"width: 32px ; height: 32px ; background-image : url(" + iconurl + ") ; _filter :progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + iconurl + "',sizingMethod='scale') ; _background-image : none\">" ;
			onedhtml = onedhtml.replace( /matchnext_viewmatchnext_icon%/g , (r.showicons == "true" ) ?  iconhtml : "") ;
			var localbold = ( hs > vs ) ? "bold" : "normal" ;
			var vsbold = ( vs > hs ) ? "bold" : "normal" ;
			onedhtml = onedhtml.replace( /("|')matchnext_viewmatchnext_localteam\1/ , "$1matchnext_viewmatchnext_localteam$1 style=$1font-weight: " + localbold + "$1" ) ;
			onedhtml = onedhtml.replace( /("|')matchnext_viewmatchnext_homescore\1/ , "$1matchnext_viewmatchnext_homescore$1 style=$1font-weight: " + localbold + "$1" ) ;
			onedhtml = onedhtml.replace( /("|')matchnext_viewmatchnext_vsteam\1/ , "$1matchnext_viewmatchnext_vsteam$1 style=$1font-weight: " + vsbold + "$1" ) ;
			onedhtml = onedhtml.replace( /("|')matchnext_viewmatchnext_vsscore\1/ , "$1matchnext_viewmatchnext_vsscore$1 style=$1font-weight: " + vsbold + "$1" ) ;
			onedhtml = onedhtml.replace( /class=matchnext_viewmatchnext_localteam/ , "class=matchnext_viewmatchnext_localteam style='font-weight: " + localbold + "'" ) ;
			onedhtml = onedhtml.replace( /class=matchnext_viewmatchnext_homescore/ , "class=matchnext_viewmatchnext_homescore style='font-weight: " + localbold + "'" ) ;
			onedhtml = onedhtml.replace( /class=matchnext_viewmatchnext_vsteam/ , "class=matchnext_viewmatchnext_vsteam style='font-weight: " + vsbold + "'" ) ;
			onedhtml = onedhtml.replace( /class=matchnext_viewmatchnext_vsscore/ , "class=matchnext_viewmatchnext_vsscore style='font-weight: " + vsbold + "'" ) ;
		} else onedhtml = onedhtml.replace( /matchnext_viewmatchnext_icon%/g , "" ) ;
		onedhtml = onedhtml.replace( /%i/ , "" + ( i + 1 ) ) ;
		matchnext_data[ noteid ].dhtml.push( onedhtml ) ;
		mlisthtml += "<div class=\"matchnext_listline\" matchindex=\"" + ( i + 1 ) + "\" ><span>" + listline + "</span></div>" ;
	}
	if ( matchnext_data[ noteid ].dhtml.length ) d.innerHTML = matchnext_data[ noteid ].dhtml[ matchnext_data[ noteid ].currindex ] ;

	matchnext_data[ noteid ].mlisthtml = mlisthtml ;

	qsn_settextproperties( div.id ) ;
	qsn_setcolors(div.id);
	// anim
	matchnext_startanim( div ) ;
}

function matchnext_mouseoverlist( target ) {
	var id = getContainer( target ).id ;
	if ( ! id ) return ;
	var r = qsn_thenotes[ id ] ;
	if ( ! r ) return ;
	target.className = "matchnext_listline qmc1 bg_contrast13";
	qsn_setcolors([target]);
}

function matchnext_mouseoutlist( target ) {
	var id = getContainer( target ).id ;
	if ( ! id ) return ;
	target.className = "matchnext_listline qmc1 bg_self";
	qsn_setcolors([target]);
}

function matchnext_clickinlist( target ) {
	matchnext_scrollanimto( getContainer( target ) , target.getAttribute( "matchindex" ) ) ;
}

function matchnext_rendermatchs_edit( div, r ) {
	var teamdiv = gebcn( div, "matchnext_teamselect" ) ;
	var t = qlub_eventsmgr_getopenselectitems( "localteam" ) ;
	if ( t.length > 0 ) {
		q_removeChilds( teamdiv ) ;
		// teams
		var d, cb, s, v ;
		for ( var i=0; i<t.length; i++ ) {
			v = t[ i ].getAttribute( "value" ) ;
//console.log( i + " - team : " + t[ i ] + " value = " + v )
			d = teamdiv.appendChild( create_elem( "div", { className : "matchnext_teamselect_team" } ) ) ;
			cb = create_elem( "input", { type : "checkbox", value : v } ) ;
			cb = d.appendChild( cb ) ;
			cb.onmousedown = function( event ) { q_stopPropagation( event ); } ;
			cb.checked = indexOfItem( v , r.displayteams ) != -1 ;
			d.appendChild( create_elem( "span", { innerHTML : q_getInnerText( gebtn( t[ i ], "name" ) ) } ) ) ;
		}
	}
	// time
	v = parseInt( r.options.timeselect, 10 ) ;
	s = gebcn( div, "matchnext_timeselect" ) ;
	s.selectedIndex = v ;
	// with/without score
	v = parseInt( r.options.scoreselect, 10 ) ;
	s = gebcn( div, "matchnext_scoreselect" ).getElementsByTagName( "input" ) ;
	s[ v ].checked = true ;
}

/*
function -
function EVENTS_MGR
*/

function matchnext_openeventsmgr( x ) {
	var div = qsn_edittarget ;
	var r = qsn_thenotes[ div.id ] ;
	qlub_tools.events.option = [ "smartnotematchnext" ] ;
	qlub_open_admindrawer( 'events' ) ;
}

/*
function -
function EDIT
*/

function matchnext_saveedit( ) {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	// comment
	r.text = gebcn( qsn_edittarget , "matchnext_text" ).value ;
	if ( r.text == matchnext_message[ "newnoteprompt" ] ) r.text = "" ;
	// mode : in matchnext_switchdisplaymode
	// teams	
	r.displayteams = [ ] ;
	var cb = gebcn( qsn_edittarget, "matchnext_teamselect" ).getElementsByTagName( "input" ) ;
	for ( var i=0; i<cb.length; i++ ) if ( cb[ i ].checked ) r.displayteams.push( cb[ i ].value ) ;
	// date
	var cb = gebcn( qsn_edittarget, "matchnext_dateselect" ).getElementsByTagName( "input" ) ;
	for ( var i=0; i<cb.length; i++ ) if ( cb[ i ].checked ) r.options.dateselect = i ;
	// time	
	r.options.timeselect = gebcn( qsn_edittarget, "matchnext_timeselect" ).selectedIndex ;
	// score
	cb = gebcn( qsn_edittarget, "matchnext_scoreselect" ).getElementsByTagName( "input" ) ;
	for ( var i=0; i<cb.length; i++ ) if ( cb[ i ].checked ) r.options.scoreselect = i ;
	// save
	qsn_container_saveedit() ;
	qsn_saveedit( true ) ;
}


function matchnext_displaysettings( ) {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	// display mode + options
	matchnext_updatedisplaymode( qsn_edittarget, parseInt( r.displaymode, 10 ) ) ;
	var cbs ;
	cbs = gebcn( qsn_edittarget, "matchnext_dateselect" ).getElementsByTagName( "input" ) ;
	cbs[ parseInt( r.options.dateselect, 10 ) ].checked = true ;
	cbs = gebcn( qsn_edittarget, "matchnext_scoreselect" ).getElementsByTagName( "input" ) ;
	cbs[ parseInt( r.options.scoreselect, 10 ) ].checked = true ;
	cbs = gebcn( qsn_edittarget, "matchnext_timeselect" ).getElementsByTagName( "option" ) ;
	cbs[ parseInt( r.options.timeselect, 10 ) ].checked = true ;
	qsn_initdisplaysetting() ;
	return false ;
}

function matchnext_focusdefault( x ) {
	if ( x.value == matchnext_message[ "newnoteprompt" ] ) x.value = "" ;
}

function matchnext_blurdefault( x ) {
	if ( ( x.value == "" ) || ( x.value == matchnext_message[ "newnoteprompt" ] ) ) x.value = matchnext_message[ "newnoteprompt" ] ;
}

function matchnext_selectteams( x, v ) {
	var teamdiv = gebcn( getContainer( x ), "matchnext_teamselect" ) ;
	var cb = teamdiv.getElementsByTagName( "input" ) ;
	for ( var i=0; i<cb.length; i++ ) cb[ i ].checked = v ;
}

function matchnext_mouseontab( x, v ) {
	if ( x.className.match("matchnext_optiontab_on")) return ;
	if ( v == "over" ) {
		x.className = "matchnext_optiontab_off qmc1 bg_contrast13"
	} else {
		x.className = "matchnext_optiontab_off qmc1 bg_self"
	}
	qsn_setcolors([x]);
}

function matchnext_switchtab( x ) {
	if ( x.className.match("matchnext_optiontab_on")) return ;
	var tabs = gebcn( getContainer( x ), "matchnext_optiontabs" ).getElementsByTagName( "td" ) ;
	var panes = gebcn( getContainer( x ), "matchnext_optionpanes" ) ;
	for ( var i=0; i<tabs.length; i++ ) {
		if ( tabs[ i ] == x ) {
			tabs[ i ].className = "matchnext_optiontab_on qmc1 bg_contrast19" ;
			showblock( panes.rows[ i ] ) ;
		} else {
			if ( tabs[ i ].className.match("matchnext_optiontab_on") ) {
				tabs[ i ].className = "matchnext_optiontab_off qmc1 bg_self" ;
			}
			hideblock( panes.rows[ i ] ) ;
		}
	}
	qsn_setcolors([x]);
}

function matchnext_switchdisplaymode( x, v ) {
	var div = getContainer( x ) ;
	qsn_thenotes[ div.id ].displaymode = "" + v ;
	matchnext_updatedisplaymode( div, v ) ;
}

function matchnext_updatedisplaymode( div, v ) {
	hideshowblock( gebcn( div, "matchnext_displaypane_" + ( ( v == 1 ) ? 0 : 1 ) ), gebcn( div, "matchnext_displaypane_" + v ) ) ;
	hideshowblock( gebcn( div, "matchnext_displaybutton_" + ( ( v == 1 ) ? 0 : 1 ) ), gebcn( div, "matchnext_displaybutton_" + v ) ) ;
	hideshowblock( gebcn( div, "matchnext_displaymsg_" + ( ( v == 1 ) ? 0 : 1 ) ), gebcn( div, "matchnext_displaymsg_" + v ) ) ;
}

/*
function -
function MOUSEOVER/MOUSEOUT
*/

function matchnext_mouseover( elem , e ) {
	qsn_showlinks( elem, true ) ;
	if ( qsn_currstate != "view" ) return ;
	var cursor = ( q_clientX( e ) > ( elem.offsetLeft + elem.offsetWidth + qdr_leftcolwidth - qdr_resizewidth ) ) ? "e-resize" : "default" ;
	if ( elem.style.cursor != cursor ) elem.style.cursor = cursor ;
	if ( parseInt( qsn_thenotes[ elem.id ].color, 10 ) == -1 ) {
		elem.style.marginLeft = elem.style.marginTop = elem.style.marginRight = elem.style.marginBottom = "-1px" ;
		elem.style.borderWidth = "1px" ;
		elem.style.borderColor = rgbcomplement( getpagebackgroundcolor() ) ;
		elem.style.borderStyle = "dotted" ;
	}
}

function matchnext_mouseout( elem , e ) {
	qsn_showlinks( elem, false ) ;
	elem.style.cursor = "default" ;
	if ( parseInt( qsn_thenotes[ elem.id ].color, 10 ) == -1 ) elem.style.marginLeft = elem.style.marginTop = elem.style.marginRight = elem.style.marginBottom = elem.style.borderWidth = "0px" ;
}

/*
function -
function ANIMATION
*/

function matchnext_doanim( div ) {
	var id = div.id ;
	if ( qsn_currstate == "edit" || q_fsmpresent() ) return matchnext_program( div ) ;
	var pane = gebcn( div , "matchnext_matchstrack" ) ;
	if ( ! pane ) return ;
	if ( matchnext_data[ id ].dhtml.length < 2 ) return ;
	pane.targettop = - matchnext_height ;
	// showblock( pane.firstChild.nextSibling ) ;
	matchnext_data[ id ].currindex = ( 1 + matchnext_data[ id ].currindex ) % matchnext_data[ id ].dhtml.length ;
	pane.innerHTML += matchnext_data[ id ].dhtml[ matchnext_data[ id ].currindex ] ;
	matchnext_movediv( pane ) ;
	matchnext_program( div ) ;
	qsn_setcolors(id);
}

function matchnext_movediv( div ) {
	if ( isremoved ( div ) ) return ;
	var v = div.style.top ;
	div.style.top = ( Math.round( parseInt( v ) + 0.35 * ( div.targettop - parseInt( v ) ) ) ) + "px" ;
	if ( Math.abs( div.targettop - parseInt( div.style.top ) ) > 1 ) setTimeout( function() { matchnext_movediv( div ) ; } , 100 ) ;
	else {
		div.firstChild.innerHTML = div.firstChild.nextSibling.innerHTML ;
		div.firstChild.style.backgroundColor = div.firstChild.nextSibling.style.backgroundColor ;
		div.style.top = "0px" ;
		rm( div.firstChild ) ;
	}
}

function matchnext_startanim( x , fast ) {
	var div = getContainer( x ) ;
	matchnext_program( div , fast? 10 : 2500 ) ;
	hideshowblock( [ gebcn( div, "matchnext_infosanim" ), gebcn( div, "matchnext_infospause_off" ) ], [ gebcn( div, "matchnext_infosanim_off" ), gebcn( div, "matchnext_infospause" ) ] ) ;
}

function matchnext_stopanim( x ) {
	var div = getContainer( x ) ;
	matchnext_cleartimer( div.id ) ;
	hideshowblock( [ gebcn( div, "matchnext_infosanim_off" ), gebcn( div, "matchnext_infospause" ) ], [ gebcn( div, "matchnext_infosanim" ), gebcn( div, "matchnext_infospause_off" ) ] ) ;
}

function matchnext_scrollanimto( div, x ) {
	var noteid = div.id ;
	var n = parseInt( x , 10 ) - 1 ;
	matchnext_cleartimer( noteid ) ;
	matchnext_data[ noteid ].currindex = n ;
	gebcn( div, "matchnext_matchstrack" ).innerHTML = matchnext_data[ noteid ].dhtml[ n ] ;
	matchnext_showlist( div, false ) ;
}

/*
function -
function UTILES
*/


function matchnext_matchssort( m1, m2 ) {
	m1 = q_getInnerText(gebtn( m1 , "date" ) ) ;
	m2 = q_getInnerText(gebtn( m2 , "date" ) ) ;
	if ( m1 == m2 ) return 0 ;
	if ( m1 > m2 ) return 1 ;
	return -1 ;
}

function matchnext_comparedate( x, g ) { // x date 20080221
	var y = parseInt( x.substr( 0, 4 ), 10 ) ;
	var m = parseInt( x.substr( 4, 2 ), 10 ) - 1 ;
	var d = parseInt( x.substr( 6, 2 ), 10 ) ;
	if ( g == "" ) return true ;
	if ( g == "today" ) {
		var currdate = new Date() ;
		if ( ( currdate.getFullYear() == y ) && ( currdate.getMonth() == m ) && ( currdate.getDate() == d ) ) return true ;
		else return false ;
	}
	if ( g == "thisweek" ) { // monday - sunday [ 1, 0 ]
		var currweekmonday = new Date() ;
		while ( currweekmonday.getDay( ) != 1 ) currweekmonday.setTime( currweekmonday.getTime() - 86400000 ) ;
		currweekmonday.setHours( 0 ) ;
		currweekmonday.setMinutes( 0 ) ;
		currweekmonday.setSeconds( 0 ) ;
		currweekmonday.setMilliseconds( 0 ) ;
		var d = new Date( y, m, d ).getTime() - currweekmonday.getTime( ) ;
		return ( ( d >= 0 ) && ( d <= 86400000 * 7 ) ) ;
	}
	if ( g == "previousweek" ) { // monday - sunday [ 1, 0 ]
		var thedate = new Date() ;
		var prevweekmonday = new Date( thedate.getFullYear() , thedate.getMonth() , thedate.getDate() - 7 ) ;
		while ( prevweekmonday.getDay( ) != 1 ) prevweekmonday.setTime( prevweekmonday.getTime() - 86400000 ) ;
		prevweekmonday.setHours( 0 ) ;
		prevweekmonday.setMinutes( 0 ) ;
		prevweekmonday.setSeconds( 0 ) ;
		prevweekmonday.setMilliseconds( 0 ) ;
		var d = new Date( y, m, d ).getTime() - prevweekmonday.getTime( ) ;
		return ( ( d >= 0 ) && ( d <= 86400000 * 7 ) ) ;
	}
	if ( g == "thismonth" ) {
		var currdate = new Date() ;
		if ( ( currdate.getFullYear() == y ) && ( currdate.getMonth() == m ) ) return true ;
		else return false ;
	}
}

/*
function -
function TIMERS
*/

function matchnext_pauseall () {
	for ( var id in matchnext_timers ) if ( matchnext_timers [ id ] ) matchnext_cleartimer( id ) ;
}

function matchnext_resumeall () {
	if ( qsn_currstate == "edit" ) return ;
	for ( var id in matchnext_timers ) if ( ge( id ) ) matchnext_program( ge( id ) ) ; 
}

function matchnext_cleartimer( id ) {
	if ( ! matchnext_timers[ id ] ) return ;
	clearTimeout( matchnext_timers[ id ] ) ;
	matchnext_timers[ id ] = null ;
}

function matchnext_applynewnoterefresh( newid , oldid ) {
	if ( matchnext_data[ oldid ] ) matchnext_data[ newid ] = matchnext_data[ oldid ] ;
	matchnext_data[ oldid ] = null ;
	if ( matchnext_timers[ oldid ] ) matchnext_timers[ newid ] = matchnext_timers[ oldid ] ;
	matchnext_timers[ oldid ] = null ;
	matchnext_program( ge( newid ) ) ;
}

function matchnext_program( div , t ) {
	if ( q_pagemode() == "makeweb" ) return ;
	matchnext_cleartimer( div.id ) ;
	matchnext_timers[ div.id ] = setTimeout( function() { matchnext_doanim( div ) ; } , t ? t : 5000 ) ;	
}

function matchnext_addnote( noteid ) {
	// q_addwindowblurhandlers( "matchnext_pauseall" ) ;
	// q_addwindowfocushandlers( "matchnext_resumeall" ) ;
	if ( q_pagemode() != "makeweb" ) setTimeout( "q_addwindowfocushandlers( 'matchnext_resumeall' ) ; q_addwindowblurhandlers( 'matchnext_pauseall' ) ; " , 5000 ) ;
	return qsn_addnote( noteid , true ) ;
}

/*
function -
function WEB
*/

function matchnext_initforweb( id ) {
	matchnext_renderhtml( id ) ;
	setTimeout( "q_addwindowfocushandlers( 'matchnext_resumeall' ) ; q_addwindowblurhandlers( 'matchnext_pauseall' ) ; " , 5000 ) ;
}

/*
function -
function TOOLBAR
*/

function matchnext_toolbarversion() {
	return 1 ;
}

var matchnext_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "matchnext_js_loaded" ) ;

var meteo_message = {
"newnoteprompt" : "cliquez ici pour créer une nouvelle note météo" ,
"plug" : "Météo_Affichez dans vos pages la météo de votre ville." ,
"desc" : "La note météo permet d'afficher la météo de la ville la plus proche de chez vous",
"noresults" : "Aucun résultat pour la recherche",
"results" :  " résultat(s) trouvé(s)", 
"resultsdesc" : "Cliquez sur l'une des villes pour la sélectionner :",
"nocity" : "Vous n'avez pas sélectionné de ville, ou la ville que vous avez sélectionnée n'est pas reconnue. Merci de sélectionner une autre ville.",
"noaccess" : "Suite à un incident, il nous est impossible d'afficher la météo pour le moment. Rechargez la page ultérieurement pour voir si l'incident est terminé. Merci de votre compéhension.",
"gotoTWC" : "Consulter la météo directement sur The Weather Channel ®",
"date" : "date",
"tabcolor" : "Couleur de la note",
"forecasttype" : "Affichage",
"forecasttypep" : "prévisions, images seules" ,
"forecasttypes" : "prévisions avec températures" ,
"forecasttypem" : "prévisions et temps actuel" ,
"forecasttypel" : "toutes les infos" ,
"forecastnumbertitle" : "Nombre de jours affichés :" ,
"forecastnumber0" : "juste aujoud'hui",
"forecastnumber1" : "2 jours",
"forecastnumber2" : "3 jours",
"forecastnumber3" : "4 jours",
"forecastnumber4" : "5 jours",
"parameters" : "Paramètres" ,
"unitstitle" : "Unités" ,
"unitsm" : "Métriques (C°)" ,
"unitss" : "USA (F°)" ,
"imagesizetitle" : "Taille des images" ,
"imagesize31" : "Petites" ,
"imagesize61" : "Moyennes" ,
"imagesize93" : "Grandes" ,
"imagesize0" : "Pas d'image" ,

"tempressentie" : "Temp. ressentie",
"wind_dir" : "",
"wind_speed" : ", ",
"reported" : "Mise à jour ",
"reported_time" : "",

"sunrise" : "Lever",
"sunset" : "Coucher", 
"humidity" : "Humidité",
"humidity_short" : "Humid",
"visibility" : "Visibilité",
"ppcp" : "Chance de précipitations",
"ppcp_short" : "Précip",
"pression" : "Baromètre",
"dewp" : "Point de rosée",
"wind" : "Vent",
"uv" : "Indice UV",

"Very Low" : "Très Bas",
"Low" : "Bas",
"Moderate" : "Modéré",
"High" : "Élevé",
"Very High" : "Très élevé",
"Extreme" : "Extrême",

"falling" : "en chute",
"rising" : "en hausse",
"steady" : "stable",
"calm" : "calme",

"N" : "N", 
"NNW" : "N-NO", 
"NW" : "NO", 
"WNW" : "O-NO",
"W" : "O", 
"WSW" : "O-SO",
"SW" : "SO", 
"SSW" : "S-SO", 
"S" : "S", 
"SSE" : "S-SE", 
"SE" : "SE", 
"ESE" : "E-SE",
"E" : "E", 
"ENE" : "E-NE",
"NE" : "NE", 
"NNE" : "N-NE", 
"VAR" : "VAR",

"mintemp" : "Min",
"maxtemp" : "Max",

"today" : "Aujourd'hui",
"tomorrow" : "Demain", 
"Monday" : "Lun",
"Tuesday" : "Mar", 
"Wednesday" : "Mer", 
"Thursday" : "Jeu",
"Friday" : "Ven", 
"Saturday" : "Sam",
"Sunday" : "Dim",

"Jan" : "Jan",
"Feb" : "Fév",
"Mar" : "Mar",
"Apr" : "Avr",
"May" : "Mai", 
"Jun" : "Juin",
"Jul" : "Juil",
"Aug" : "Août",
"Sep" : "Sep",
"Oct" : "Oct",
"Nov" : "Nov",
"Dec" : "Déc",

"AM" : "le matin",
"PM" : "après midi",
"Early" : "en matinée",
"Late" : "en soirée",

"Blustery" : "Très venteux",
"Clear" : "Beau",
"Cloudy" : "Nuageux",
"Clouds": "Nuages",
"Cold" : "Froid",
"Drifting Snow" : "Tempête de Neige",
"Drizzle" : "Bruine",
"Dust" : "Nuage de poussière",
"Fair" : "Belles éclaircies",
"Few Showers" : "Quelques averses",
"Few Snow Showers" : "Quelques chutes de neige",
"Flurries" : "Averses",
"Fog" : "Brouillard",
"Foggy" : "Brumeux",
"Freezing Drizzle" : "Bruine givrante",
"Freezing Rain" : "Pluie glaçante",
"Hail" : "Grêle",
"Haze" : "Brume",
"Heavy Rain" : "Forte pluie",
"Heavy Snow" : "Forte neige",
"Hot" : "Chaleur",
"Hurricane" : "Ouragan",
"Isolated T-Storms" : "Orages isolés",
"Isolated Thunderstorms" : "Orages isolés",
"Light Drizzle" : "Légère bruine",
"Light Rain" : "Légère pluie",
"Light Rain with Thunder" : "Légère pluie et tonnerre",
"Light Snow Showers" : "Légères chutes de neige",
"Light Snow" : "Légère neige",
"Light Wintry Mix" : "Légère neige",
"Mist" : "Brume",
"Mixed Precipitation" : "Variable avec averses",
"Mixed Rain and Hail" : "Pluie et grêle",
"Mixed Rain and Sleet" : "Pluie et neige fondue",
"Mixed Rain and Snow" : "Pluie et neige",
"Mostly Clear" : "Assez dégagé",
"Mostly Cloudy" : "Assez nuageux",
"Mostly cloudy and windy" : "Assez nuageux et venteux",
"Mostly Sunny" : "Assez ensoleillé",
"N/A" : "N/A",
"Partly Cloudy and Windy" : "Nuages épars et vent",
"Partly Cloudy" : "Nuages épars",
"Rain" : "Pluie",
"Scattered Showers" : "Averses localisées",
"Scattered Snow Showers" : "Tempêtes de neige localisées",
"Scattered T-Storms" : "Orages localisés",
"Scattered Thunderstorms" : "Orages localisés",
"Severe Thunderstorms" : "Orages Violents",
"Showers Early" : "Pluie en matinée",
"Showers in the Vicinity" : "Pluie aux alentours",
"Showers" : "Averses",
"Sleet" : "Neige fondue",
"Smoke" : "Fumée",
"Snow Flurries" : "Averses de neige",
"Snow Showers" : "Averses de neige",
"Snow" : "Neige",
"Sun" : "Soleil",
"Sunny" : "Ensoleillé",
"T-Showers" : "Pluies orageuses",
"T-Storms" : "Orages",
"Thunder" : "Tonnerre",
"Thunder Showers" : "Orages",
"Thunderstorms" : "Orageux",
"Tornado" : "Tornade",
"Tropical Storm" : "Tempête Tropicale",
"Wind" : "Vent",
"Windy" : "Venteux"
} ;

var meteo_msgs_fr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "meteo_msgs_fr_js_loaded" ) ;


var meteo_templates_prepared = false ;
var meteo_leftcol_prepared = false ;

/* meteo contains methods and properties specific to meteo notes */

var meteo_json_template = { version: 2 ,  text : "" , color : "rgb(100%,100%,100%)" , header : { display : "true" , color: "c1", text : "", icon : "meteo" } , cityname: "", cityid : "", forecasttype : "s" , forecastnumber : 3, unit : "m" , "imagesize" : 93 } ;

var meteo_oldjson_template = {
"1" : { version: 1 ,  text : "" , color : "3" , headerdisplay : "1" , header : { color: "0", text : "" } , cityname: "", cityid : "", forecasttype : "s" , forecastnumber : 3, unit : "m" , "imagesize" : 93 } 
} ;

var meteo_colordesc = { "qmc1" : "color" , "qmc2_qmc1" : "header.color" ,  "qmc3" : meteo_qmc3 } ;

var meteo_leftcol_description = [
{ what : "notecolor" , tabname : "tabcolor" , visible : false , elems : [ 
	{ handler : "qsn_addqlubcolorblock" , params : { jsonpath : "color" , others : true ,  transparent:true , menuseparator: false , modifynote : "qsn_setcolors"  } } 
	] } , 
{ what : "bandeau" , tabname : "tabheader" , visible : false , elems : [ 
	{ handler : "qsn_addheaderhideshow" , params : { title:"" , jsonpath : "header.display" } } ,
	{ handler : "qsn_addheadercolor" , params : { jsonpath : "header.color" } }
	] } ,
{ what : "forecasttype" , tabname : "forecasttype" , visible : true , elems : [ 
	{ handler : "meteo_addforecasttype" , params : { jsonpath : "forecasttype" } } ,
	{ handler : "meteo_addforecastnumber" , params : { jsonpath : "forecastnumber" } }
	] } ,
{ what : "parameters" , tabname : "parameters" , visible : false , elems : [ 
	{ handler : "meteo_addunits" , params : { jsonpath : "unit" } } ,
	{ handler : "meteo_addimagesizes" , params : { jsonpath : "imagesize" } }
	] } 
]

/*
function GLOBAL VARIABLES
*/
var meteo_key;
var meteo_partnerID;
var meteo_retrycount = {};


function meteo_qmc3( r ) {
	return "/services/meteo/images/meteo48.png" ;
}

function meteo_upgradejson( r ) {
	if ( ( r.version ) && ( r.version == meteo_json_template.version ) ) return r ;
	if ( r.version<2 ) meteo_upgradejsontov2( r ) ;
	r.version = meteo_json_template.version;
	return r ;
}

function meteo_upgradejsontov2( r ) {
	r.header.display = String( r.headerdisplay == 1 ) ;
	delete r.headerdisplay ;
	return r ;
}

function meteo_defineGlobals(){
	meteo_key = "bb8be7be7251b0b0";
	meteo_partnerID = "1058922955";
};

function meteo_template( id ) {
	if ( meteo_templates_prepared ) return qsn_template( id , true ) ;
	var div = qsn_installcontainer( "view" , "meteo" , ge( "meteo_notecontent" ).innerHTML ) ;
	var div = qsn_installcontainer( "edit" , "meteo" , ge( "meteo_notecontent_edit" ).innerHTML ) ;
	meteo_templates_prepared = true ;
	return qsn_template( id , true ) ;
}

/*
function -
function USEFUL FUNCTIONS
*/

function ctn(x){ return document.createTextNode(x); }
function cel(x){ return document.createElement(x); }

function meteo_removeblanks(text){return text.replace(/ /g, "%20");};

function meteo_getTranslation(text) { return meteo_message[ text ] || text ; }

function meteo_prepareText(text){
	var result = "";
	var temp = text.split( " / " );
	for (var i = 0; i < temp.length; i++ ){
		if ( i  >0 ) result += meteo_getTranslation(" / ") ;
		
		if ( temp[ i ].match(/AM (.+)/) ){
			var t = temp[ i ].replace("AM ", "");
			if (q_lang == "fr") result += meteo_getTranslation( t ) + " " + meteo_message["AM"];
			else result += meteo_message["AM"] + " " + meteo_getTranslation( t );
		}
		else if (temp[ i ].match(/PM (.+)/)){
			var t = temp[ i ].replace("PM ", "");
			if (q_lang == "fr") result += meteo_getTranslation( t ) + " " + meteo_message["PM"];
			else result += meteo_message["PM"] + " " + meteo_getTranslation( t );
		}
		else if (temp[ i ].match(/(.+) Early/)){
			var t = temp[ i ].replace(" Early", "");
			result += meteo_getTranslation( t ) + " " + meteo_message["Early"];
		}
		else if (temp[ i ].match(/(.+) Late/)){
			var t = temp[i].replace(" Late", "");
			result += meteo_getTranslation( t ) + " " + meteo_message["Late"];
		}
		else result += meteo_getTranslation( temp[ i ] );
	}
	return result;
}

function meteo_insertRow(table, object, object_text){
	var tmprow = table.insertRow(-1);
	var tmpcell = create_td(tmprow, {className : "meteo_section", innerHTML : object + " : "});
	var tmpcell2 = create_td(tmprow, {innerHTML : object_text});
	return tmprow;
}

function meteo_getcolor( r ){
	var color = parseInt( r.color,10);
	color = (color == -1) ?  "transparent" : (color < 10) ? getsncontextualbackgroundcolors(7)[ color - 1 ] : r.color;
	return color;
}

function meteo_isdark(color){
	var isdark = (color == "transparent" ) ? false : ( rgb2brightness( color ) < 50 ) ;
	return isdark;
}

/*
function -
function SET FUNCTIONS
*/

function meteo_addforecasttype( target , js ) {
	var ftype = [ "p" , "s" , "m" , "l" ] ;
	var tt = new Array( ftype.length ) ;
	for ( var i = 0 ; i < ftype.length ; i++ ) tt[ i ] = [ ftype[ i ] , "forecasttype" + ftype[ i ]  ] ;
	qsn_addleftcolelem( target , qsn_addradiotable( { "className" : "meteo_forecasttype_elem" , jsonpath : js.jsonpath , radios : tt } ) , "meteo_forecasttype_elem" ) ;
}

function meteo_addforecastnumber( target , js ) {
	var tt = new Array( 5 ) ;
	for ( var i = 0 ; i < 5 ; i++ ) tt[ i ] = [ i + 1 , "forecastnumber" + i  ] ;
	qsn_addleftcolelem( target , qsn_addselect( { "className" : "meteo_forecastnumber_elem" , title : "forecastnumbertitle" , jsonpath : js.jsonpath , selects : tt } ) , "meteo_forecastnumber_elem" ) ;
}

function meteo_addunits( target , js ) {
	var ftype = [ "m" , "s" ] ;
	var tt = new Array( 2 ) ;
	for ( var i = 0 ; i < ftype.length ; i++ ) tt[ i ] = [ ftype[ i ] , "units" + ftype[ i ]  ] ;
	qsn_addleftcolelem( target , qsn_addselect( { "className" : "meteo_units_elem" , title : "unitstitle" , jsonpath : js.jsonpath , selects : tt } ) , "meteo_units_elem" ) ;
}

function meteo_addimagesizes( target , js ) {
	var ftype = [ 31 , 61 , 93 , 0 ] ;
	var tt = new Array( 4 ) ;
	for ( var i = 0 ; i < ftype.length ; i++ ) tt[ i ] = [ ftype[ i ] , "imagesize" + ftype[ i ]  ] ;
	qsn_addleftcolelem( target , qsn_addselect( { "className" : "meteo_imagesize_elem" , title : "imagesizetitle" , jsonpath : js.jsonpath , selects : tt } ) , "meteo_imagesize_elem" ) ;
}

function meteo_displaysettings() {
	qsn_initdisplaysetting() ;
}

/*
function -
function RENDER FUNCTIONS
*/

function meteo_renderhtml( noteid ) {
	var div = ge( noteid ) ;
	var r = qsn_thenotes[ noteid ] ;
	qsn_container_renderhtml( div , r ) ;
	if ( qsn_currstate != "edit" ) {
		hideshowblock ( "meteo_content" , "meteo_wait", noteid ) ;
		meteo_searchmeteo(div, r);
	}
	meteo_renderselectedcity(div, r);
	qsn_setcolors( noteid ) ;
}

function meteo_renderselectedcity(div, r){
	if ( qsn_currstate == "edit" ) {gebcn(div, "searchcity").value = r.cityname;}
	var elem = gebcn(div, "qlubcontainer_headertext") ;
	if ( elem ) elem.innerHTML = r.cityname;
}

/*
function -
function SAVE FUNCTIONS
*/


function meteo_saveedit() {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	if (r.cityid == "") {
		alert(meteo_message["nocity"]);
		return false;		
	}
	qsn_saveedit( true ) ;
}

/*
function -
function SEARCH FUNCTIONS
*/

function meteo_ajaxget( url , callBackFunction, params ) {
	var req=null;
	if ( ! req ) {
		if ( window.XMLHttpRequest ) {
	 		req = new XMLHttpRequest() ;
			//if ( req.overrideMimeType )  { req.overrideMimeType( 'text/plain' ) ; }
		} else if ( window.ActiveXObject ) {
			try { req = new ActiveXObject ( "Msxml2.XMLHTTP" ) ;} 
			catch (e )  {
				try { req = new ActiveXObject ( "Microsoft.XMLHTTP" ) ; } 
				catch (e )  {}
			}
	        }
	}
	req.open( "GET" , url , true ) ;
	req.send ( null ) ;
	req.onreadystatechange = function () { 
		if(req.readyState != 4 ) return;
		if(req.status !=200 && req.status !=304)  {
			if ( callBackFunction.toString().split( "(" )[0].replace( /function /, "" ) == "meteo_searchmeteohandler" ) {
				if ( ! meteo_retrycount[ params ] || meteo_retrycount[ params ] == null ) meteo_retrycount[ params ] = 0 ;
				if ( meteo_retrycount[ params ]++ < 5 ) 	setTimeout( function () { meteo_searchmeteo( params, qsn_thenotes [ params ] ); }, 2000); 
				else {
					meteo_retrycount[ params ] = 0 ;
					return;
				}
			}
		} else callBackFunction(req.responseXML, params);
	}  ;
}

function meteo_searchcity(){
	meteo_defineGlobals();
	var cityname= gebcn(qsn_edittarget, "searchcity").value;
	if (cityname == "") return alert(meteo_message["noresults"]);
	var request = "http://xoap.weather.com/search/search?";
	request += "where=";
	request += meteo_removeblanks(cityname);
	//console.log(request);
	//window.open(request);
	meteo_request(request, "meteo_searchcityhandler");
}
	
function meteo_searchmeteo(elem, r){
	var note = ge(elem);
	var cityID = r.cityid;
	meteo_defineGlobals();
	//console.log(cityID);

	var request = "http://xoap.weather.com/weather/local/";
	request += cityID;
	request += "?cc=*";
	request += "&dayf=";
	request += r.forecastnumber ;
	request += "&link=xoap";
	request += "&prod=xoap";
	request += "&par=";
	request += meteo_partnerID;
	request += "&key=";
	request += meteo_key;
	request += "&unit=";
	request += r.unit;
	//console.log(request);
	//window.open(request);
	meteo_request(request, "meteo_searchmeteohandler", note.id);
}

function meteo_request(url, callback, params){
	callback = eval( callback ) ;
 	var r = { "json" : { "url" : url } } ;
	
	//document.mainform.mission.value = "getxml" ;
	//q_xmlajaxsubmitwithservice( "common@" + q_lang , r , callback , params) ;
	
	//nouvelle méthode via cgi
	meteo_ajaxget("/cgi-bin/cgixml?url="+url , callback, params);
}



/*
function -
function HANDLERS
*/

function meteo_selectcity(elem, cityname, cityid){
	elem.onclick = function (){
		var r = qsn_thenotes[qsn_edittarget.id];
		r.cityname = cityname;
		r.cityid = cityid;	
		meteo_renderselectedcity(qsn_edittarget, r);
		hideblock(gebcn(qsn_edittarget, "meteo_resultsDiv"));
	};
}

function meteo_searchcityhandler(content){
	var search  = content.getElementsByTagName("search")[0];
	var searchresults = search.getElementsByTagName("loc");
	var resultsDiv = gebcn(qsn_edittarget, "meteo_resultsDiv");
	showblock(resultsDiv);
	resultsDiv.innerHTML = "";
	
	if (!searchresults || (searchresults && searchresults.length == 0)) {
		var resultstable = create_elem("DIV", {innerHTML : meteo_message["noresults"], style : {width : "100%", border : "solid 1px #CCC", backgroundColor : "white", color : "#333"}});
		    resultsDiv.appendChild(resultstable);
	} else {
		if (searchresults.length == 1){
			var r = qsn_thenotes[qsn_edittarget.id];
			r.cityname = searchresults[0].firstChild.nodeValue;
			r.cityid = searchresults[0].getAttribute("id");	
			meteo_renderselectedcity(qsn_edittarget, r);
		} else{
		var resultsnumber = create_elem("DIV", {innerHTML : meteo_message["resultsdesc"], style : { fontStyle : "oblique" }});
			resultsDiv.appendChild(resultsnumber);
			
			var resulttable = create_elem("TABLE", {width : "100%", style : { border : "solid 1px #CCC", backgroundColor : "white"}});
			for (var i = 0; i<searchresults.length; i++) {
				var cityname = searchresults[i].firstChild.nodeValue;
				var cityID = searchresults[i].getAttribute("id");
			var newrow = resulttable.insertRow(-1);
				newrow.width="100%";
				newrow.style.color="#000";
				newrow.onmouseover = function(){this.style.backgroundColor = "#DDD";};
				newrow.onmouseout =  function(){this.style.backgroundColor = "#FFF";};
				meteo_selectcity(newrow, cityname, cityID);
				var newcell = create_td(newrow, {align:"center", innerHTML : cityname});;
			}
			resultsDiv.appendChild(resulttable);
			var resultsnumber = create_elem("DIV", {innerHTML : searchresults.length + meteo_message["results"], style : { fontStyle : "oblique", paddingBottom : "15px" }});
			resultsDiv.appendChild(resultsnumber);
		}
	}
}

function meteo_searchmeteohandler(content, noteid){
	var note = ge(noteid);
	noteid = note.id;
	var r= qsn_thenotes[noteid];
	var meteodiv = getElementsByClassName(note, "meteoresult");
	if (meteodiv.length == 0) return;
	else meteodiv = meteodiv[0];
	meteodiv.innerHTML = "";
	if (!content || content.getElementsByTagName("loc").length == 0) {
		var messdiv = create_elem("DIV", { innerHTML : meteo_message["noaccess"] + "<br/><br/>", style : { fontSize : "12px", fontStyle : "oblique" }});
		var link = create_elem("A", {href :  "http://www.weather.com/weather/local/" + r.cityid, innerHTML : meteo_message["gotoTWC"], style : { textDecoration : "underline" }});
		link.style.color = ( meteo_isdark( meteo_getcolor( r ) ) ) ? "#FFF" : "#333";
		var img =  create_elem("IMG", { title : meteo_message["gotoTWC"], src : "/services/meteo/images/logos/TWClogo_64px.png", className : "png", border : "0"});
		
		messdiv.appendChild(link);
		messdiv.appendChild(cel("br"));
		messdiv.appendChild(img);
		
		meteodiv.appendChild(messdiv);
	}
	else{
		var loc = meteo_getloc(content.getElementsByTagName("loc")[0]);
		try {
			var cc = meteo_getcc(content.getElementsByTagName("cc")[0]);
		} catch( err ) {
			var cc = null ;
		}
		var dayf = content.getElementsByTagName("dayf")[0];
		
		if (r.forecasttype == "m" || r.forecasttype == "l") if ( cc ) meteodiv.appendChild(meteo_displaycc(noteid, cc));
		meteodiv.appendChild(meteo_displayday(noteid, dayf));	
	}
	meteodiv.innerHTML = meteodiv.innerHTML.replace( /N\/A/g , "" ) ;
	hideshowblock ( "meteo_wait" , "meteo_content", noteid ) ;
}

/*
function -
function DISPLAY METEO FUNCTIONS
*/

function meteo_displayimg(noteid, day, size){
	thesize = size ? size : qsn_thenotes[noteid].imagesize;
	if (thesize == 32) thesize = 31;
	if (thesize == 64) thesize = 61;
	if (thesize == 128) thesize = 93;
	if (thesize == 0 ) return cel('br');
	else {
		var icon_adress = "/services/meteo/images/" + thesize + "x" + thesize + "/"+ twodigs(day.icon) + ".png";
		var img = create_elem("IMG", { className : "png", src : icon_adress, title : meteo_prepareText(day.text), style : { width : thesize + "px", height : thesize + "px"}});
		return img; 
	}
}

function meteo_displayday(noteid, days){
	var note = ge(noteid);
	var r = qsn_thenotes[noteid];
	var units = meteo_getunits(noteid);
	var meteotable = create_elem("TABLE", {width : "100%", className : "qmc1 bg_self"});
	
	//note.style.width = (r.forecastnumber * (((r.imagesize == 128 || r.imagesize == 93) ? 64 : 52) + 10)) + "px";

	var thedays = days.getElementsByTagName("day");
	var daysdata = [];
	var daysparts = [];
	for (var i=0; i< thedays.length; i++){
		daysdata[i] = meteo_getday(thedays[i]);
		daysparts[i] =  (daysdata[i].day.text != "N/A") ? daysdata[i].day : daysdata[i].night;
	}
	
	var meteodaytr = meteotable.insertRow(-1);
	
	for (var i=0; i<thedays.length; i++) {
		//if (daysdata[i].nb == "0") var thedate = meteo_message["today"];
		//else if (daysdata[i].nb == "1") var thedate = meteo_message["tomorrow"];
		//else {
			var thedate = daysdata[i].date;
			if (q_lang == "en") thedate = daysdata[i].dateday + ", " + thedate;
			else {
				thedatemonth = meteo_message[thedate.split(" ")[0]];
				thedateday = thedate.split(" ")[1];
				thedate = meteo_message[daysdata[i].dateday] + " " + thedateday + " " + thedatemonth;
			}
		//}
var meteodaytd = create_td(meteodaytr, {colSpan:"2", width : Math.round(100 / thedays.length) + "%", align:"center", innerHTML : thedate, style : { fontSize : "12px", fontWeight : "bold"}});
	}

	if (r.imagesize == 0) imagesize = 0;
	else if (r.imagesize <= 64) imagesize = 31;
	else if (r.imagesize >= 93) imagesize = 61;
		  
	meteodaytr = meteotable.insertRow(-1);
		
	for (var i=0; i<thedays.length; i++) {
		var imagecell = create_td(meteodaytr, {colSpan:"2", align:"center"});
		imagecell.appendChild(meteo_displayimg(noteid, daysparts[i], imagesize));
	}
		
	if (r.forecasttype != "p"){
			meteodaytr = meteotable.insertRow(-1);
		for (var i=0; i<thedays.length; i++) {
			var textcell = create_td(meteodaytr, {colSpan:"2", vAlign:"top", align:"center", innerHTML : meteo_prepareText(daysparts[i].text)});
		}
		
		meteodaytr = meteotable.insertRow(-1);
		for (var i=0; i<thedays.length; i++) {
			var highcell = create_td(meteodaytr, {colSpan:"2", align:"center", innerHTML : (daysdata[i].high != "N/A") ? daysdata[i].high + units.temp : "" , title : meteo_message["maxtemp"] + " : " + daysdata[i].high + units.temp, className:"qmc1 text_bw", style:{fontSize : "16px", fontWeight : "bold"}});
		}
		
		meteodaytr = meteotable.insertRow(-1);
		for (var i=0; i<thedays.length; i++) {	
			var lowcell = create_td(meteodaytr, {colSpan:"2", align:"center", innerHTML :  (daysdata[i].low != "N/A") ? daysdata[i].low + units.temp : "", title : meteo_message["mintemp"] + " : " + daysdata[i].low + units.temp, style : { fontSize : "14px", fontWeight : "bold"}});
		}
	}

	if (r.forecasttype == "l"){
			meteodaytr = meteotable.insertRow(-1);
		for (var i=0; i<thedays.length; i++) {	
			var sunrisecell = create_td(meteodaytr, {align:"right", innerHTML : meteo_message["sunrise"] + " : ", style : { fontWeight : "bold"}});
			var sunrisecell = create_td(meteodaytr, {align:"left", innerHTML : daysdata[i].sunrise});	
		}
	
		meteodaytr = meteotable.insertRow(-1);
		for (var i=0; i<thedays.length; i++) {	
			var sunsetcell = create_td(meteodaytr, {align:"right", innerHTML : meteo_message["sunset"] + " : ", style : {fontWeight : "bold"}});
			var sunsetcell = create_td(meteodaytr, {align:"left", innerHTML : daysdata[i].sunset});
		}
		
		meteodaytr = meteotable.insertRow(-1);
		for (var i=0; i<thedays.length; i++) {	
			var ppcpcell = create_td(meteodaytr, {align:"right" , innerHTML : meteo_message["ppcp_short"] + " : ", style : {fontWeight : "bold"}});
			var ppcpcell = create_td(meteodaytr, {align:"left", innerHTML : daysparts[i].precipitation_chance + "%"});
		}
		
		meteodaytr = meteotable.insertRow(-1);
		for (var i=0; i<thedays.length; i++) {	
			var humiditecell = create_td(meteodaytr, {align:"right", innerHTML : meteo_message["humidity_short"] + " : ", style : {fontWeight : "bold"}});
			var humiditecell = create_td(meteodaytr, {align:"left", innerHTML : daysparts[i].humidite + "%"});
		}
	}
	return meteotable;
}


function meteo_displaycc(noteid, thecc){
	var note = ge(noteid);
	var r = qsn_thenotes[noteid];
	var units = meteo_getunits(noteid);
	
	var cctable = create_elem("TABLE", {className : "qmc1 bg_self", style: {width:"100%"}});
	
	var datarow = cctable.insertRow(-1);
	
	var imgcell = create_td(datarow, {align : "center"});
	imgcell.appendChild(meteo_displayimg(noteid, thecc));
	imgcell.appendChild(cel('br'));
	
	imgcell.appendChild(ctn(meteo_prepareText(thecc.text)));
	
	var temp_reelle = create_elem("DIV", {innerHTML : thecc.temp +units.temp, className:"qmc1 text_bw", style : {padding : "5px",  fontSize : "16px", fontWeight :  "bold" } });
	imgcell.appendChild(temp_reelle);

	var datacell = create_td(datarow);
	var datatable= cel('table');
	meteo_insertRow(datatable, meteo_message["tempressentie"], thecc.ressentie + units.temp);
	meteo_insertRow(datatable, meteo_message["uv"], thecc.uv.value + " " + meteo_getTranslation(thecc.uv.text));
	meteo_insertRow(datatable, meteo_message["wind"], meteo_message["wind_dir"] + meteo_getTranslation(thecc.vent.text) + meteo_message["wind_speed"] + thecc.vent.speed + " " + units.speed);
	meteo_insertRow(datatable, meteo_message["humidity"], thecc.humidite + "%");
	meteo_insertRow(datatable, meteo_message["visibility"], thecc.visibilite + " " + units.distance);
	meteo_insertRow(datatable, meteo_message["pression"], thecc.pression.value + " " + units.pression);
	meteo_insertRow(datatable, meteo_message["dewp"], thecc.pointrosee + units.temp);	
	
	var footercell = create_td( datatable.insertRow(-1), { colSpan : "2", innerHTML : meteo_message["reported"] + thecc.obs_station + ". " +  meteo_message["reported_time"] + thecc.last_updated, style : { fontSize : "9px"}});

	datacell.appendChild(datatable);

	return cctable;
} 



/*
function -
function GET METEO FUNCTIONS
*/

function meteo_getunits(noteid){
	var unit = qsn_thenotes[noteid].unit;
	var units = {};
	
	if (unit == "s"){
		units.temp = "° F";
		units.distance = "miles";
		units.speed = "mph"; 
		units.precip = "in";
		units.pression = "in";
	}else{
		units.temp = "° C";
		units.distance = "km";
		units.speed = "km/h";
		units.precip = "mm";
		units.pression = "millibars";	
	}
	return units;
}

function meteo_getcc(node){
	var last_updated = node.getElementsByTagName("lsup")[0].firstChild.nodeValue;
	var obs_station= node.getElementsByTagName("obst")[0].firstChild.nodeValue;
	var temp = node.getElementsByTagName("tmp")[0].firstChild.nodeValue;
	var ressentie=node.getElementsByTagName("flik")[0].firstChild.nodeValue; 
	var text = node.getElementsByTagName("t")[0].firstChild.nodeValue;
	var icon = node.getElementsByTagName("icon")[0].firstChild.nodeValue;
	
	var pression = node.getElementsByTagName("bar")[0];
	var pression_value = node.getElementsByTagName("r")[0].firstChild.nodeValue;
	var pression_text = node.getElementsByTagName("d")[0].firstChild.nodeValue;
	
	var vent = node.getElementsByTagName("wind")[0];
	var vent_dir = vent.getElementsByTagName("d")[0].firstChild.nodeValue;
	var vent_speed = vent.getElementsByTagName("s")[0].firstChild.nodeValue;
	var vent_text = vent.getElementsByTagName("t")[0].firstChild.nodeValue;
	
	var humidite = node.getElementsByTagName("hmid")[0].firstChild.nodeValue;
	var visibilite = node.getElementsByTagName("vis")[0].firstChild.nodeValue;
	var pointrosee = node.getElementsByTagName("dewp")[0].firstChild.nodeValue;
	
	var uv = node.getElementsByTagName("uv")[0];
	var uv_value = uv.getElementsByTagName("i")[0].firstChild.nodeValue;
	var uv_text  = uv.getElementsByTagName("t")[0].firstChild.nodeValue;	
	var moon = node.getElementsByTagName("moon")[0];
	var moon_icon = moon.getElementsByTagName("icon")[0].firstChild.nodeValue;
	var moon_text = moon.getElementsByTagName("t")[0].firstChild.nodeValue;
	
	var result = { "last_updated" : last_updated , "obs_station" : obs_station, "temp" : temp , "ressentie" : ressentie, "text" : text , "icon" : icon , "pression" : { "value" : pression_value , "text" : pression_text } , "vent" : { "dir" : vent_dir , "speed" : vent_speed , "text" : vent_text } , "humidite" : humidite , "visibilite" : visibilite , "pointrosee" : pointrosee , moon : { "icon" : moon_icon , "text" : moon_text } , uv : { "value" : uv_value , "text" : uv_text } };
	return result;
}

function meteo_getloc(node){
	var theid = node.getAttribute("id");
	var name =  node.getElementsByTagName("dnam")[0].firstChild.nodeValue;
	var time =  node.getElementsByTagName("tm")[0].firstChild.nodeValue;
	var latitude = node.getElementsByTagName("lat")[0].firstChild.nodeValue;
	var longitude =  node.getElementsByTagName("lon")[0].firstChild.nodeValue;
	var sunrise = node.getElementsByTagName("sunr")[0].firstChild.nodeValue;
	var sunset =  node.getElementsByTagName("suns")[0].firstChild.nodeValue;
	var zone =  node.getElementsByTagName("zone")[0].firstChild.nodeValue;
	var result = { "id" : theid, "name" : name , "time" : time , "latitude" : latitude , "longitude" : longitude, "sunrise" : sunrise, "sunset" : sunset , "zone" : zone};
	return result;
}

function meteo_getday(node){
	var dayn = node.getAttribute("d");
	var day = node.getAttribute("t");
	var date = node.getAttribute("dt");
	
	var high = node.getElementsByTagName("hi")[0].firstChild.nodeValue;
	var low = node.getElementsByTagName("low")[0].firstChild.nodeValue;
	var sunrise = node.getElementsByTagName("sunr")[0].firstChild.nodeValue;
	var sunset =  node.getElementsByTagName("suns")[0].firstChild.nodeValue;
	
	var result = { "nb" : dayn, "dateday" : day , "date" : date, "high" : high, "low" : low ,  "sunrise" : sunrise , "sunset" : sunset , "day" : {} , "night" : {} };
	
	var parts = node.getElementsByTagName("part");
	for (var i=0; i<parts.length; i++)  {
		var part_id = parts[i].getAttribute("p");
		if (part_id == "d") result.day = meteo_getpart(parts[i]);
		if (part_id == "n") result.night = meteo_getpart(parts[i]);
	}
	return result;
}
	
function meteo_getpart(node){
	//var part_id = node.attributes.p.nodeValue;
	var text = node.getElementsByTagName("t")[0].firstChild.nodeValue;
	var icon = node.getElementsByTagName("icon")[0].firstChild.nodeValue;
	
	var vent = node.getElementsByTagName("wind")[0];
	var vent_dir = vent.getElementsByTagName("d")[0].firstChild.nodeValue;
	var vent_speed = vent.getElementsByTagName("s")[0].firstChild.nodeValue;
	var vent_text = vent.getElementsByTagName("t")[0].firstChild.nodeValue;
	
	var humidite = node.getElementsByTagName("hmid")[0].firstChild.nodeValue;
	var precipitation_chance = node.getElementsByTagName("ppcp")[0].firstChild.nodeValue;
	
	result = { "text" : text, "icon" : icon, "vent" : { "dir" : vent_dir, "speed" : vent_speed , "text" : vent_text } , "humidite" : humidite, "precipitation_chance" : precipitation_chance };
	return result;
}

function meteo_initforweb( id ) {
//	meteo_renderhtml( id ); // vh : renderhtml bug pour les vieilles notes qui n'avaient pas le container. Seule la requête ci-dessous est nécessaire
	var div = ge( id ) ;
	var r = qsn_thenotes[ id ] ;
	hideshowblock ( "meteo_content" , "meteo_wait", id ) ;
	meteo_searchmeteo(div, r);
}

/*
function -
function TOOLBAR
*/

function meteo_toolbarversion() {
	return 1 ;
}

var meteo_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "meteo_js_loaded" ) ;


var music_message = {
"newnoteprompt" : "Cliquez ici pour créer une nouvelle note Musique" ,
"notetitleprompt" : "Cliquez ici pour ajouter un titre." ,
"notedescprompt" : "Entrez ici votre description",
"plug" : "Musique_Ajoutez votre musique sur votre site." ,
"desc" : "La note Musique permet de jouer des morceaux de musique sur votre page",
"upload_title" : "Importer des morceaux",
"upload_prompt" : "Cliquez sur OK pour sélectionner les morceaux à importer",
"thefile" : "Cliquez ici pour ouvrir le fichier ",
"nofiles" : "Vous devez sélectionner au moins un morceau avant de valider.",
"confirmdelete" : "Êtes-vous sûr de vouloir enlever ce morceau ?",
"deletefilealt" : "Supprimer ce morceau", 
"taboptions" : "Options de la note",
"autostart" : "Lecture automatique",
"autoreplay" : "Lecture en boucle",
"randomplay" : "Lecture aléatoire",
"showtime" : "Temps affiché en min:sec",
"nopointer" : "Pas de curseur",
"showslider" : "Afficher le barre de lecture", 
"showlist" : "Afficher la liste des morceaux",
"controltype" : "Type de boutons", 
"simple" : "Simple", 
"normal" : "Normal", 
"extended" : "Complet"
} ;

var music_msgs_fr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "music_msgs_fr_js_loaded" ) ;


var music_templates_prepared = false ;
var music_leftcol_prepared = false ;
var music_json_template = { version: 1 ,  text : "" , color : "rgb(100%,100%,100%)" , header : { display: "true", color: "c1", text : "" } , textstyles: { size : "1" , font : "0" , bold : "false" , italic : "false" , center : "false" }, files : [] , options : {autostart : "true", autoreplay : "false", randomplay : "false", controls : "normal"} } ;

var music_colordesc = { "qmc1" : "color" , "qmc2_qmc1" : "header.color" , "qmc3" : music_qmc3 } ; 
var music_textdesc = { "qtxt1" : { "size" : "textstyles.size" , "font" : "textstyles.font" ,  "bold" : "textstyles.bold" , "center" : "textstyles.center" , "italic" : "textstyles.italic" }  };


var music_leftcol_description = [
{ what : "notecolor" , tabname : "tabcolor" , visible : true , elems : [ 
	{ handler : "qsn_addqlubcolorblock" , params : { jsonpath : "color" , others : true ,  transparent:true , title:false , menuseparator: false , modifynote : "qsn_setcolors"  } } 
	] } , 
{ what : "bandeau" , tabname : "tabheader" , visible : false , elems : [    
	{ handler : "qsn_addheaderhideshow" , params : { notekind:"music" , title:"" , jsonpath : "header.display" } } , 
	{ handler : "qsn_addheadercolor" , params : { jsonpath : "header.color" } }
	] } , 
{ what : "textstyles" , tabname : "tabtext" , visible : false , elems : [ 
	{ handler : "qsn_addfontfsizes" , params : { jsonpath : "textstyles.size" , ncols : 2  } } , 
	{ handler : "qsn_addfontfamilies", params : { jsonpath : "textstyles.font" , ncols : 2  } } , 
	{ handler : "qsn_addtextoptions", params : { jsonpath : "textstyles" , ncols : 2 , opts : [ "bold" , "center" , "italic"  ] } }
	] } , 
{ what : "music_options" , tabname : "taboptions" , visible : false , elems : [ 
	{ handler : "music_addoption" , params : { className : "music_autostart" , title:false , menuseparator: false, checkboxes : [ { name : "autostart" , jsonpath : "options.autostart" } ] } },
	{ handler : "music_addoption" , params : { className : "music_autoreplay" , title:false , menuseparator: false, checkboxes : [ { name : "autoreplay" , jsonpath : "options.autoreplay" } ] } },
	{ handler : "music_addoption" , params : { className : "music_randomplay" , title:false , menuseparator: false, checkboxes : [ { name : "randomplay" , jsonpath : "options.randomplay" } ] } },
	{ handler : "music_addcontoltype" , params :{ className  : "music_controltype", title : "controltype", jsonpath : "options.controls" , radios : [ [ "simple", "simple" ] , [ "normal",  "normal" ], [  "extended", "extended" ] ] } } 
	] }
] ;

function music_addoption ( target , js ) {
	var div = qsn_addleftcolelem( target , qsn_addcheckboxtable( js ) , js.className ) ;
	return div ;
}

function music_addcontoltype( target , js ) {
	return qsn_addleftcolelem( target , qsn_addradiotable( js ) , js.className ) ;
}

function music_qmc3( r ) {
	return "/services/music/images/music48.png" ;
}

var music_playerstyles = [
	{name : "silver", items : {}},
	{name : "dark", items : {}},
];

/*
function -
function FILES FUNCTIONS
*/

var music_upload_request = {
	"callerid" : "",
	"uploadkind" : "sound",
	"title" : "N/A",
	"prompt" : "N/A",
	"multiple" : true,
	"extensions" : [ "mp3" ] ,
	"namingdata" : { "wantname" : false },
	"callback" : "music_addfiles_done", 
	"multiple_callback" : "music_addfiles_done",
	"multiple_extensions" : "custom",
	"formats" : "",
	"cancel": { } , 
	"reveal": { "anim" : true }
};

function music_addfiles(){
	music_upload_request.callerid = qsn_edittarget.id ;
	music_upload_request.title = music_message["upload_title"];
	music_upload_request.prompt = music_message["upload_prompt"];
	qdyn_qorgload( 'qu_reveal', [ music_upload_request ], 'qu' ) ;
}


function music_addfiles_done(pdata){
	var div = qsn_edittarget;
	var r = qsn_thenotes[div.id];
	for (var i=0; i< pdata.files.length; i++) {
		r.files.push(pdata.files[i]);
	}
	music_renderfilestable(div, r);
}

function music_deletefile( noteid, rownb ) {
	var div = ge(noteid);
	var r = qsn_thenotes[noteid];
	if ( confirm ( music_message[ "confirmdelete" ] ) ) {
		r.files.splice(rownb, 1);
		music_renderfilestable(div, r);
	}
}

function music_deletefileOnclick( a , b, c ) {
	b.onclick = function () { 
		music_deletefile ( a , c); 
		return false;
		};
};

/*
function -
function SET FUNCTIONS
*/

function music_displaysettings() {
	qsn_initdisplaysetting() ;
	return false ;	
}

function music_focusdefault( x, elem ) {
	if ( x.value == music_message[ elem ] ) x.value = "" ;
}

function music_blurdefault( x, elem ) {
	//if ( ( x.value == "" ) || ( x.value == music_message[ elem ] ) ) x.value = music_message[ elem ] ;
}


/*
function -
function RENDER FUNCTIONS
*/


function music_template( id ) {
	if ( music_templates_prepared ) return qsn_template( id , true ) ;
	qsn_installcontainer( "view" , "music" , ge( "music_notecontent" ).innerHTML ) ;
	var div = qsn_installcontainer( "edit" , "music" , ge( "music_notecontent_edit" ).innerHTML ) ;
	music_templates_prepared = true ;
	return qsn_template( id , true ) ;
}

function music_renderhtml( noteid ) {
	var div = ge( noteid ) ;
	var r = qsn_thenotes[ noteid ] ;
	music_renderdesc(div, r);
	qsn_container_renderhtml( div , r ) ;
	
	if ( qsn_currstate == "view" ) {
		music_renderplayer(div, r);
		qsn_settextproperties( noteid ) ;
		qsn_setcolors( noteid ) ;
	}
		
	if ( qsn_currstate == "edit" ) {
		music_renderfilestable(div, r);
		music_blurdefault ( gebcn( div , "music_desc" ), "notedescprompt") ;
	}
}

function music_renderdesc(div, r){
	if (qsn_currstate == "edit") gebcn(div, "music_desc").value = r.text;
	else gebcn(div, "music_desc").innerHTML = r.text;

}

function music_renderplayer(div, r){
	if ( window.q_makeweb  && ! window.web_js_loaded ) return ;
	var thediv = gebcn(div, "music_player");
	var noteid = div.id;
	
	var musicfiles = "";
	var musictitles = "";
	for (var i in r.files){
		if (r.files[i].filename.match(".mp3")){
			musicfiles +=  q_spacebaseurl( memberid ) + encodeURI( r.files[i].filename.replace( /^.*\/(uploads\/.*)$/ , "$1" ) );
			musictitles +=  encodeURI( r.files[i].linkname );
			if (i != r.files.length -1) {musicfiles += "|";musictitles += "|";}
		}
	}
	musicfiles = encodeURIComponent( musicfiles ) ;
	
	var playeraddress = (r.files.length > 1) ? "/services/music/player/player_mp3_multi.swf" : "/services/music/player/player_mp3_maxi.swf";
	
	var rgbcol1 = qsn_selfclasscolor( qsn_colorvalue( noteid , "qmc1" ) , "color" , true )[0] ;
	rgbcol1 = rgbcontrastcolor(rgbcol1, 19);
	var hsvcol1 = rgb2hsv( rgbcol1 );
	var hexcol1 = rgb2hex( rgbcol1 ).replace(/#/g,"");
	var rgbcol2 = hsv2rgb( [ hsvcol1[ 0 ] , 50 , 100 ]);
	rgbcol2 = rgbcontrastcolor(rgbcol1, 19);
	var hexcol2 = rgb2hex( rgbcol2 ).replace(/#/g, "");
	var hexcoltext = ( rgb2brightness( rgbcol1 ) > 50 ) ? "333333" : "FFFFFF";
	var hexcoltext2 = ( rgb2brightness( rgbcol1 ) > 50 ) ? "000000" : "DDDDDD";
	
	var autostart = (r.options.autostart == "true") ? "1" : "0";
	var autoreplay = (r.options.autoreplay == "true") ? "1" : "0";
	var randomplay = (r.options.randomplay == "true") ? "2" : "0";
	var showstop = ( r.options.controls == "simple")  ? "0" : "1" ;
	var showlist = ( r.options.controls == "simple" || r.options.controls == "normal" ) ? "0" : "1" ;
	var showvolume = ( r.options.controls == "simple" || r.options.controls == "normal" ) ? "0" : "1" ;
	var showslider = ( r.options.controls == "simple" )  ? "0" : "1" ;
	var playerheight = (r.files.length > 1 && r.options.controls == "extended") ? "100" : "20";

	var playerdata = { mp3 :  musicfiles };
	playerdata.title = musictitles;
	playerdata.loop = autoreplay;
	playerdata.autoplay = autostart;
	playerdata.shuffle = randomplay;
	playerdata.showstop = showstop ;
	playerdata.showlist = showlist ;
	playerdata.showvolume = showvolume ;
	playerdata.showslider = showslider ;
	
	playerdata.bgcolor1 = hexcol1;
	playerdata.bgcolor2 = hexcol1;
	playerdata.slidercolor1 = hexcoltext;
	playerdata.slidercolor2 = hexcoltext;
	playerdata.sliderovercolor = hexcoltext2;
	playerdata.buttoncolor = hexcoltext;
	playerdata.buttonovercolor = hexcoltext2;
	playerdata.textcolor = hexcoltext;
	playerdata.playlistalpha = "10";

	var params = { wmode: "transparent", allowFullScreen: "true", allowScriptAccess : "always"};
	
	// check if SWF hasn't been removed, if this is the case, create a new alternative content container
	if ( ge( div.id + "_swfelem" ) ){ swfobject.removeSWF( div.id + "_swfelem"); }
	gebcn( div, "music_player").appendChild( create_elem( "DIV", { id : div.id + "_swfelem" } ) );
	swfobject.embedSWF( playeraddress, div.id + "_swfelem" ,"200", playerheight, "9.0.0", false, playerdata, params);

	//var thedata = "<object type=\"application/x-shockwave-flash\" data=\"" + playeraddress + "\" width=\"200\" height=\"" + playerheight + "\"><param name=\"movie\" value=\"" + playeraddress + "\" /><param name=\"wmode\" value=\"transparent\" /><param name=\"FlashVars\" value=\"" + playerdata+ "\" /></object>";
	//thediv.innerHTML = thedata;
}
		
function music_renderfilestable(div, r){
	var thediv = gebcn(div, "music_files");
	thediv.innerHTML ="";
	var thetable = create_elem("TABLE", {border : "0", cellSpacing : "0", cellPadding : "0", width: "100%"});
	thetable.className = "music_table qmc1 bd_bw";
	for (var i=0; i< r.files.length; i++) {
		var therow = thetable.insertRow(i);
		therow.onmouseover = function() { this.className = "music_tablerow qmc1 bg_contrast13"; qsn_setcolors([this]); } ;
		therow.onmouseout = function() { this.className = "music_tablerow qmc1 bg_self"; qsn_setcolors([this]); } ;
		var thecell = create_td(therow, {className : "music_tablecell qmc1 bd_bw__text_contrast150", width:"100%", align : "left", innerHTML : r.files[i].linkname});

		if (qsn_currstate =="edit") {
			thecell = create_td(therow, {className : "music_tablecell qmc1 bd_bw", align : "right"});
			var theimg = create_elem("IMG", { alt : music_message["deletefilealt"], src : "/services/music/images/delete16.png", className : "png" , style : {height : "16px", width : "16px", cursor : "pointer"} } );
			music_deletefileOnclick(div.id , theimg, i );
			thecell.appendChild(theimg);
		}
	}
	thediv.appendChild(thetable);

	qsn_settextproperties( div.id ) ;
	qsn_setcolors( div.id ) ;

};

function music_windowopen(elem){
	var x = decodeURI( elem.href ) ;
	window.open( q_spacebaseurl( memberid ) + x.replace( /^.*\/(uploads\/.*)$/ , "$1" ) ) ; 
}

function music_openfile(elem, href){
	elem.onclick = function () {window.open(href, "_blank");};
}

/*
function -
function SAVE FUNCTIONS
*/


function music_saveedit() {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;

	var desc = gebcn( qsn_edittarget, "music_desc" );
	r.text = (desc.value && desc.value != music_message["notedescprompt"]) ? desc.value : "";
	  if (r.files.length == 0) {
		alert(music_message["nofiles"]);
		return false;
	  }
	qsn_container_saveedit() ;
	qsn_saveedit( true ) ;
}

function music_notechanged(id, alerttype){
	//alert("Alerte : "+ alerttype + ", j'essaie de sauver");
	qsn_notechanged( id , "notechanged") ;
}

function music_initforweb( id ) {
	music_renderhtml( id );
}

/*
function -
function TOOLBAR
*/

function music_toolbarversion() {
	return 1 ;
}

var music_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "music_js_loaded" ) ;


var niceclock_message = {
"plug" : "Nice clock_Pour ceux qui choisissent de balader l'heure là où ils en ont envie sur le bureau.", "displayDate" : "Afficher la date", "displayTime" : "Afficher l'heure"
} ;

var niceclock_msgs_fr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "niceclock_msgs_fr_js_loaded" ) ;


/* niceclock.js contains methods and properties specific to niceclock notes */

var niceclock_json_template = {version : 1, text : "", textsize : "1", textfont : "1", displayTime : 1 } ;

var niceclock_timer = null ;
var niceclock_noteids = " " ;

function niceclock_addnote( id ) {
	if ( niceclock_noteids.indexOf ( " " + id + " " ) == -1 ) niceclock_noteids += id + " " ;
	var div = qsn_addnote ( id , true ) ;
	if ( ! div ) return false ;
	if ( ! niceclock_timer ) niceclock_timer = setInterval ( niceclock_refreshall , 1000 ) ;
	return div ;
}

function niceclock_renderhtml( noteid ) {
	if ( qsn_currstate == "edit" ) return ;
	ge( noteid ).style.width = "205px" ;
	var divNote = getelement ( noteid ) ;
	if(!qsn_thenotes[noteid].displayTime) getElementsByClassName(divNote,'niceclock_vueDate')[0].style.display = "block";

	niceclock_update (noteid);
	niceclock_setDisplayFromPrefs (noteid);
}

function niceclock_displaysettings() {}

function niceclock_refreshlist() {
	niceclock_noteids = " " ;
	for ( var id in qsn_thenotes ) if ( qsn_thenotes [ id ] ) if ( qsn_thenotes [ id ].common.notekind == "niceclock" ) if ( getelement ( id ) ) niceclock_noteids += id + " " ;
	if ( niceclock_noteids == " " ) clearInterval ( niceclock_timer ) ; 
}

function niceclock_refreshall () {
	if ( qsn_currstate == "edit" || q_fsmpresent() ) return ;
	var id ;
	var shouldrefresh = false ;
	var allNotes = niceclock_noteids.split ( " " ) ;
	if ( allNotes.length == 2 ) {
		clearInterval ( niceclock_timer ) ; 
		niceclock_timer = null ;
		return ;
	}
	for ( var i = 1 ; i < (allNotes.length - 1) ; i++ ) {
		id = allNotes [ i ] ;
		if ( ( ! qsn_thenotes [ id ] ) || ( ! getelement ( id ) ) ) shouldrefresh = true ;
		else if ( ( ! qsn_edittarget ) || ( id != qsn_edittarget.id ) ) niceclock_update ( id ) ;
	}
	if ( shouldrefresh ) niceclock_refreshlist() ; // next time it's OK
}

function niceclock_update (noteid) {
	var divNote = getelement ( noteid ) ;

	var aujourdhui = new Date();

	var divTime = getElementsByClassName(divNote,'niceclock_vueHorloge')[0];
	var divDate = getElementsByClassName(divNote,'niceclock_vueDate')[0];

	var annee = aujourdhui.getFullYear() - 2000;
	annee = "0" + annee;
	var mois = twodigs ( aujourdhui.getMonth() + 1 );
	var jour = twodigs ( aujourdhui.getDate() );
	var heure = twodigs ( aujourdhui.getHours() );
	var minute = twodigs ( aujourdhui.getMinutes() );
	var seconde = twodigs ( aujourdhui.getSeconds() );

	if (seconde % 2) //We want the dots to flash
	{
		divTime.innerHTML = heure + ":" + minute + ":" + seconde;
	}
	else
	{
		divTime.innerHTML = heure + " " + minute + " " + seconde;
	}
	
	if (seconde % 2) //We want the slashes to flash
	{
		divDate.innerHTML = jour + "/" + mois + "/" + annee;
	}
	else
	{
		divDate.innerHTML = jour + " " + mois + " " + annee;
	}
}

function niceclock_setDisplayFromPrefs (noteid) {

	var json = qsn_thenotes[ noteid ];

	var divnote = getelement(noteid);

	var divTime = getElementsByClassName(divnote,"niceclock_vueHorloge")[0];
	var divDate = getElementsByClassName(divnote,"niceclock_vueDate")[0];
	var swapDisplayLink = getElementsByClassName(divnote,"niceclock_swapDisplay")[0];
	if (json.displayTime)
	{
		divTime.style.opacity = 1;
		divTime.style.filter = "alpha(opacity=100)";

		divDate.style.opacity = 0;
		divDate.style.filter = "alpha(opacity=0)";
		
		hideshowblock( divDate , divTime ) ;
		swapDisplayLink.innerHTML = niceclock_message["displayDate"];
	} else {
		divTime.style.opacity = 0;
		divTime.style.filter = "alpha(opacity=0)";

		divDate.style.opacity = 1;
		divDate.style.filter = "alpha(opacity=100)";

		hideshowblock( divTime , divDate ) ;
		swapDisplayLink.innerHTML = niceclock_message["displayTime"];
	}
}

function niceclock_setDisplayFromCurrentState (link) {

	var divnote = getContainer(link);

	var noteid = divnote.id;
	var json = qsn_thenotes[ noteid ];

	var swapDisplayLink = getElementsByClassName(divnote,"niceclock_swapDisplay")[0];

	if (swapDisplayLink.innerHTML == niceclock_message["displayTime"])
	{
		niceclock_fadeIn(noteid, "niceclock_vueHorloge");
		niceclock_fadeOut(noteid, "niceclock_vueDate");
		swapDisplayLink.innerHTML = niceclock_message["displayDate"];
		json.displayTime = 1;
	}
	else
	{
		niceclock_fadeIn(noteid, "niceclock_vueDate");
		niceclock_fadeOut(noteid, "niceclock_vueHorloge");
		swapDisplayLink.innerHTML = niceclock_message["displayTime"];
		json.displayTime = 0;
	}
	qsn_notechanged ( noteid, "notechanged" );
}

function qsn_dim_by_class ( noteid, classe , dimtarget ) {
	var div = gebcn( ge( noteid ) , classe) ;
	showblock( div ) ;
//	if ( ( div.style.display ) && ( div.style.display == "none" ) ) return ;
	div.dimtarget = dimtarget ;
	do_qsn_dim_by_class( noteid, classe ) ;
}

function do_qsn_dim_by_class( noteid, classe ) {
	if ( ! ge( noteid ) ) return ;
	var div = gebcn( ge( noteid ) , classe) ;
	if ( ! div ) return ;
	if ( ! div.style.opacity ) div.style.opacity = "" + ( 1 - parseInt( div.dimtarget ) ) ;
	var opa = parseFloat ( div.style.opacity ) ;
	if ( div.dimtarget > opa ) {
		opa = opa + 0.1 ;
		if ( opa > div.dimtarget ) opa = div.dimtarget ;
	} else {
		opa = opa - 0.1 ;
		if ( opa < div.dimtarget ) opa = div.dimtarget ;
	}
	div.style.opacity = "" + opa ;
	div.style.filter = "alpha(opacity=" + Math.round ( 100 * opa ) + ")" ;
	if ( opa != div.dimtarget ) setTimeout ( "do_qsn_dim_by_class ( '" + noteid + "' , '" + classe + "' )" , 50 ) ;
	else visibleblock( div , div.dimtarget == "1" ) ;
} // opacity: "0.5" ; filter: alpha(opacity=50)

function niceclock_fadeIn(noteid, classe) {
	qsn_dim_by_class ( noteid, classe , 1 ) ;
}

function niceclock_fadeOut(noteid, classe) {
	qsn_dim_by_class ( noteid, classe , 0 ) ;
}

function niceclock_allowsuppress( id ) { return true ; }

/*
function -
function SERVICE PAGES
*/

function niceclock_widthinfos( r ) {
	return { wfixed : true } ;
}

function niceclock_initforweb( id ) {
	if ( niceclock_noteids.indexOf ( " " + id + " " ) == -1 ) niceclock_noteids += id + " " ;
	if ( ! niceclock_timer ) niceclock_timer = setInterval ( niceclock_refreshall , 1000 ) ;
}

var niceclock_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "niceclock_js_loaded" ) ;


var nl_message = {
"newnoteprompt" : "Indiquez le texte de présentation de la newsletter." ,
"plug" : "Inscription Newsletter_Invitez vos visiteurs à s'inscrire à vos newsletters.",
"emptynote" : "(aucun message)" ,
"desc" : "(...)",
"titlecolorbg" : "Fond" ,
"tabstyle" : "Style" ,
"textfont" : "Lettres" ,
"font0" : "Bâtons" ,
"font1" : "Empattement" ,
"font2" : "Machine" ,
"font3" : "Moderne" ,
"font4" : "A la main" ,
"bold" : "G" ,
"italic" : "I" ,
"uppercase" :"majusc." ,
"align0" : "à gauche" ,
"align1" : "à droite" ,
"align2" : "centré" ,
"align3" : "justifié" ,
"spacing0" : "réduit" ,
"spacing1" : "normal" ,
"spacing2" : "fort" ,
"tip_edit" : "modifier la note", 
"choice" : "Veuillez sélectionner une option" ,
"chooselist" : "Veuillez choisir une liste de diffusion.",
"alreadysubscribed" : "Votre adresse e-mail est déjà inscrite à cette newsletter." ,
"subscribeok" : "Votre adresse e-mail a été inscrite à cette newsletter." ,
"mail" : "votreadresse@mail.com"
}

var nl_msgs_fr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "nl_msgs_fr_js_loaded" ) ;


var nl_templates_prepared = false ;
var nl_leftcol_prepared = false ;
//var nl_json_template = { version: 1 ,  text : "" , textsize : 14 , textfont : "0" , textcolor : "-1" , textstyles: { bold : "false" , italic : "false" , uppercase : "false" } , textspacing : "1" , textalign : "0" , color : 3 , textmargin: 2 , textopacity : 0 , listid:"" } ;
var nl_json_template = { version: 2 ,  text : "" , textsize : 14 , textfont : "0" , textcolor : "-1" , textstyles: { bold : "false" , italic : "false" , uppercase : "false" } , textalign : "0" , color : 3 , listid:"" , header : { display: "true", color: "0", text : "", icon : "pencil" } } ;

var nl_colordesc = { 
	"qmc1" : "color" , 
	"qmc2" : [ "textcolor" , "color" ] , 
	"qmc2_qmc1" : "header.color" , 
	"qmc3" : nl_qmc3 
} ;

var nl_textdesc = { "qtxt1" : {"slider" : "textsize" , "font" : "textfont" , "bold" : "textstyles.bold" , "italic" : "textstyles.italic" , "uppercase" : "textstyles.uppercase" , "align" : "textalign" } } ;

function nl_upgradejson( r ) {
	if ( ( r.version ) && ( r.version == nl_json_template.version ) ) return r ;
	if ( r.version<2 ) nl_upgradejsontov2( r ) ;
	r.version = nl_json_template.version;
	return r ;
}

function nl_upgradejsontov2(r) {
	if ( r.textopacity < 0.5 ) r.color = "-1";
	r.header = { display: "false", color: "0", text : "", icon : "pencil" } ;
	delete r.textopacity ;
	delete r.textspacing ;
	delete r.textmargin ;
	return r;
}

var nl_textsizemin = 7 ;
var nl_prepared = false;

var nl_textfonts = [ "Arial, Helvetica, sans-serif" , "Times, 'Times New Roman', serif"  , "'Courier New', Courier, monospace" , "Verdana, sans-serif" , "Zapf-Chancery, 'Segoe Script', cursive" ] ;
var nl_textaligns = [ "left" , "right" , "center" , "justify" ] ;

var nl_leftcol_description = [
{ what : "notecolor" , tabname : "tabcolor" , visible : true , elems : [ 
	{ handler : "qsn_addqlubcolorblock" , params : { jsonpath : "color" , others : true ,  transparent:true , title:false , menuseparator: false , modifynote : "qsn_setcolors"  } }
	] } ,
{ what : "bandeau" , tabname : "tabheader" , visible : false , elems : [ 
	{ handler : "qsn_addheaderhideshow" , params : { notekind:"nl" , title:"" , jsonpath : "header.display" } } , 
	{ handler : "qsn_addheadercolor" , params : { notekind:"nl", jsonpath : "header.color" } } , 
	{ handler : "qsn_addheadericons" , params : { notekind:"nl" , jsonpath : "header.icon" } }
	] } , 
{ what : "textslider" , tabname : "qsn_textsize" , visible : false , elems : [ 
	{ handler : "qsn_addtextsizeslider" , params : { jsonpath : "textsize" } } 
	] } ,
{ what : "textcolor" , tabname : "tabtextcolor" , visible : false , elems : [ 
	{ handler : "qsn_addoldqlubcolorblock" , params : { jsonpath : "textcolor" , others : true ,  transparent:false , title:false , menuseparator: false , modifynote : "qsn_setcolors"  } } 
	] } ,
{ what : "textstyles" , tabname : "tabstyle", visible : false , elems : [ 
	{ handler : "qsn_addfontfamilies" , params : { jsonpath : "textfont" , ncols : 2  } } ,
	{ handler : "qsn_addtextoptions" , params : { jsonpath : "textstyles" , ncols : 3 , title : ""  , opts : [ "bold" , "italic" , "uppercase" ] } } ,
	{ handler : "qsn_addtextaligns" , params : { jsonpath : "textalign" , ncols : 2 } } 
	] }
] ;	

function nl_qmc3( r ) {
	if ( ! r.header.icon ) return null ;
	return "/services/wsg/images/icons/" + r.header.icon + ".png" ;
} 
function nl_template( id ) {
	if ( nl_templates_prepared ) return qsn_template( id , true ) ;
	var div = qsn_installcontainer( "view" , "nl" , ge( "nl_notecontent" ).innerHTML ) ;
	var div = qsn_installcontainer( "edit" , "nl" , ge( "nl_notecontent_edit" ).innerHTML ) ;
	nl_templates_prepared = true ;
	return qsn_template( id , true ) ;
}

/*
function -
function RENDER
*/

function nl_renderhtml( noteid ) {
	var div = ge( noteid ) ;
	var r = qsn_thenotes[ noteid ] ;
	nl_rendertext( div , r ) ;
	qsn_container_renderhtml( div , r ) ;
	qsn_settextproperties( noteid ) ;
	qsn_setcolors( noteid ) ;
	if ( qsn_currstate == "edit" ) {
		document.mainform.mission.value = "diflistgetshortlist" ;
		q_ajaxsubmitwithservice( "common@" + q_lang , {} , nl_makeselectlist , [ div ] ) ;
	}
}

function nl_modifynote( id ) {
	qsn_settextproperties( id ) ;
}

function nl_rendertext( div , r ) {
	var txt = gebcn( div , "text" ) ;
	if ( qsn_currstate != "edit" ) {
		if ( r.text ) txt.innerHTML = wiqi_text2HTML( r.text ) ;
		else txt.innerHTML = nl_message[ "emptynote" ] ;
	}
	else txt.value = r.text || nl_message[ "newnoteprompt" ] ;
}

/*
function -
function EDIT
*/

function nl_displaysettings() {
	qsn_initdisplaysetting() ;
	return false ;
}

function nl_saveedit() {
	var id = qsn_edittarget.id ;
	var r = qsn_thenotes[ id ] ;
	var s = ge('nl_selectlist' , qsn_edittarget )
	if ( s.selectedIndex == 0 ) {
		alert( nl_message["chooselist"] ) ;
		return false;
	}
	r.listid = s.value ; 
	var x = gebcn( qsn_edittarget, "text" ) ;
	r.text = ( x.value ) ? x.value : "" ;
	if ( r.text == nl_message[ "newnoteprompt" ] ) r.text = '' ;
	qsn_container_saveedit() ;
	qsn_saveedit( true ) ;
}

function nl_focusdefault( x ) {
	var div = getContainer( x ) ;
	var id = div.id ;
	var r = qsn_thenotes[ id ] ;
	if ( x.tagName == "INPUT" && x.value == nl_message[ "mail" ] ) x.value = "" ;
	else if ( x.value == nl_message["newnoteprompt"] ) x.value="" ;
}

function nl_blurdefault( x ) {
	var div = getContainer( x ) ;
	var id = div.id ;
	var r = qsn_thenotes[ id ] ;
	if ( x.tagName == "INPUT" && x.value == "" ) x.value = nl_message["mail"] ;
	else if ( ( x.value == "" ) || ( x.value == nl_message["newnoteprompt"] ) ) x.value = nl_message["newnoteprompt"] ;
}

function nl_subscribe( x ){
	var div = getContainer ( x ) ;
	var elem = ge('nl_inputmail' , div ) ;
	var mail = elem.value ;
	if ( mail == nl_message["mail"] ) mail = "" ;
	if ( ! verbosevalidemail( mail ) ) return focusandselect( elem ) ;
	document.mainform.mission.value = "nlsubscribe" ;
	q_ajaxsubmitwithservice( "common@" + q_lang , {mail:mail, listid:qsn_thenotes[ div.id ].listid} , nl_subscribe_done ) ;
/*
	if ( mail == nl_message["mail"] || mail == "" ) {
		alert( nl_message["nomail"] ) ;
		return ; 
	}
	if ( validemail( mail , true ) ) {
	document.mainform.mission.value = "nlsubscribe" ;
	q_ajaxsubmitwithservice( "common@" + q_lang , {mail:mail, listid:qsn_thenotes[ div.id ].listid} , nl_subscribe_done ) ;
	} else alert( nl_message["badmail"] ) ;
*/
}

function nl_subscribe_done ( x ) {
	if ( x.alreadysubscribed ) alert( nl_message["alreadysubscribed"] ) ;
	else alert( nl_message["subscribeok"] ) ;
}

function nl_makeselectlist ( x , div ) {
	var list = ge( "nl_selectlist" , div ) ;
	var r = qsn_thenotes[ div.id ] ;
	list.innerHTML = "" ;
	list.options[ 0 ] = new Option( nl_message[ "choice" ] , "choice" ) ;
	list.selectedIndex = 0 ;
	var j = 0 ;
	for ( var i in x ) {
		if ( i == "newlistid" || ! /^dif/.test( i ) ) continue ;
		list.options[ list.length ] = new Option( x[ i ].name , i ) ;
		j++ ;
		if ( r.listid == i ) list.selectedIndex = j ;
	}
}

/*
function -
function TOOLBAR
*/

function nl_toolbarversion() {
	return 1 ;
}

var nl_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "nl_js_loaded" ) ;


var nws_message = {
"snname" : "Note À la une" ,
"plug" : "À la une_Présentez les dernières actualités en texte et en images." ,
"newsid" : "News %n" ,
"imgratio0" : "Trés allongées" ,
"imgratio1" : "Allongées" ,
"imgratio2" : "Normales" ,
"imgratio3" : "Carrées" ,
"imgratio4" : "Etroites" ,
"imgratio5" : "Trés étroites" ,
"imgratio" : "Forme des images" ,
"displayoptions" : "Options d'affichage" ,
"showthumbs" : "Vignettes" ,
"showthumbs0" : "Masquer les vignettes" ,
"showthumbs1" : "Afficher les vignettes" ,
"newstimer" : "Temps d'affichage des news",
"editmodeclick" : "Les images liens sont désactivées en mode édition. Pour activer les liens, passez en mode visiteur. N'oubliez pas de publier d'abord la page si nécessaire !",
"noimage" : "(image par défaut)" ,
"notitle" : "(sans titre)" ,
"confirmerasenews" : "Voulez-vous vraiment supprimer cette news ?" ,
"selectimage" : "Veuillez sélectionner une image." ,
"uploadtitle" : "Insertion d'une image" ,
"desc" : "(...)" ,
"active" : "activer" ,
"desactive" : "désactiver",
"clickhere" : "Cliquez pour en savoir plus.",
"noactivenews" : "Vous devez avoir au moins une news sélectionnée pour afficher la note."
} ;

var nws_msgs_fr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "nws_msgs_fr_js_loaded" ) ;

var nws_templates_prepared = false ;
var nws_leftcol_prepared = false ;
var nws_alertlinksdone = false ; 

var nws_json_template = { version : 2 , text : "" , color : "rgb(100%,100%,100%)" , header : { display : "true" , color: "c1", text : "", icon : "nws48" } , textstyles: { font : "0" } , showthumbs : "1" , selectednews : "0" , news : [ ],  textmargin: 2 , imgratio : "2", timer : 3000 } ;
var nws_oldjson_template = {
"1" : { version : 1 , text : "" , color : "3" , header : { display : "true" , color: "0", text : "", icon : "nws48" } , textstyles: { font : "0" } , showthumbs : "1" , selectednews : "0" , news : [ ],  textmargin: 2 , imgratio : "2" }
} ;
var nws_newstemplate = { active : true , img : { src : "" , name : "" , width : "" , height : "" , position : "0" } , title : "" , comment : "" , link : { mode : "none" , url : "" , page : "" } } ;

var nws_colordesc = { "qmc1" : "color" , "qmc2_qmc1" : "header.color" , "qmc3" : nws_qmc3 } ; 
var nws_textdesc = { "qtxt1" : { "font" : "textstyles.font" } , "qtxt2" : { "margin" : "textmargin" } };
var nws_textfonts = [ "Arial, Helvetica, sans-serif" , "Times, 'Times New Roman', serif" ,"'Courier New', Courier, monospace", "Verdana, Helvetica, sans-serif" ] ;
var nws_leftcol_description = [
{ what : "notecolor" , tabname : "tabcolor" , visible : true , elems : [
	{ handler : "qsn_addqlubcolorblock" , params : { jsonpath : "color" ,others : true , transparent: true , title: false , menuseparator: false , modifynote : "qsn_setcolors" } }
	] } ,
{ what : "bandeau" , tabname : "tabheader" , visible : false , elems : [
	{ handler : "qsn_addheaderhideshow" , params : { notekind: "nws" , title: "" , jsonpath : "header.display" } } ,
	{ handler : "qsn_addheadercolor" , params : { notekind:"nws" , jsonpath : "header.color" } } ,
	{ handler : "qsn_addheadericons" , params : { notekind:"nws" , jsonpath : "header.icon" } }
	] } ,
{ what : "textmargin" , tabname : "qsn_tabmargin" , visible : false , elems : [ 
	{ handler : "qsn_addmargins" , params : { jsonpath : "textmargin" , ncols : 1 } } 
	] } ,
{ what : "Ratio de l'image" , tabname : "imgratio" , visible : false , elems : [ 
	{ handler : "nws_addimageratiooptions" , params : { jsonpath : "imgratio" , ncols : 2 , modifynote : "nws_changeimgratio" } } 
	] } ,
{ what : "displayoptions" , tabname : "displayoptions" , visible : false , elems : [
	{ handler : "qsn_addfontfamilies" , params : { jsonpath : "textstyles.font" , ncols : 2 } } ,
	{ handler : "nws_addradios" , params : { className : "nws_timer" , jsonpath:"timer" , title:"newstimer" , ncols : 2, radios : [ ["1000", "1s"] , ["2000", "2s"] , ["3000", "3s"] , ["5000", "5s"] , ["7000", "7s"] , ["10000", "10s"] , ["15000", "15s"] ]  } } ,
	{ handler : "nws_addshowthumbsoption" , params : { jsonpath : "showthumbs" , ncols : 1 } }
	] }
] ;

var nws_numnews = 4 ;
var nws_timers = { } ;

var nws_upload_request = {
	"callerid" : "" ,
	"uploadkind" : "image",
	"title" : "N/A" ,
	"prompt" : "N/A" ,
	"multiple" : false,
	"extensions" : ["jpg" , "jpeg" , "png" , "gif" , "tiff" , "tif" ] ,
	"namingdata" : { "wantname" : true },
	"formats" : "screen halfscreen quarterscreen",
	"callback" : "nws_newimg_done", 
	"reveal": { "anim" : true },
	"resize" : true ,
	"resize_option" : { "ratio" :  "image" } ,
	"transparency" : "image" ,
	"web" : false
} ;

function nws_qmc3( r ) {
	if ( ! r.header.icon ) return null ;
	if ( r.header.icon == "nws48" ) return "/services/nws/images/nws48.png" ;
	return "/services/wsg/images/icons/" + r.header.icon + ".png" ;
}

function nws_addradios( target , js ) {
	return qsn_addleftcolelem( target , qsn_addradiotable( js ) , js.className ) ;
}

function nws_upgradejson( r ) {
	if ( ( r.version ) && ( r.version == nws_json_template.version ) ) return r ;
	if ( r.version<2 ) nws_upgradejsontov2( r ) ;
	r.version = nws_json_template.version;
	return r ;
}

function nws_upgradejsontov2( r ) {
	if ( ! r.timer ) r.timer = nws_json_template.timer ;
}

/*
function -
function NEW / ADD NOTE
*/

function nws_newnote( ) {
	var jsonnewnote = qsn_fulljson_template( "nws" ) ;
	var id = qsn_makenewfulljson( "nws" , jsonnewnote ) ;
	var r = qsn_thenotes[ id ];
	for ( var i=0; i<nws_numnews; i++ ) r.news.push( q_cloneObject( nws_newstemplate ) ) ;
	r.spacedefaults.common.width = "400px" ;
	qsn_currstate = "edit" ;
	qsn_addnote( id ) ;
	qsn_entereditmode( id ) ;
}

function nws_addnote( noteid ) {
	setTimeout( "q_addwindowfocushandlers( 'nws_resumeall' ) ; q_addwindowblurhandlers( 'nws_pauseall' ) ; " , 5000 ) ;
	return qsn_addnote( noteid , true ) ;
}

/*
function -
function TIMERS
*/

function nws_pauseall () {
	for ( var id in nws_timers ) if ( nws_timers [ id ] ) nws_cleartimer( id ) ;
}

function nws_resumeall () {
	if ( qsn_currstate == "edit" ) return ;
	for ( var id in nws_timers ) if ( ge( id ) ) nws_program( ge( id ) ) ;
}

function nws_cleartimer( id ) {
	if ( ! nws_timers[ id ] ) return ;
	clearTimeout( nws_timers[ id ] ) ;
	nws_timers[ id ] = null ;
}

function nws_program( div , t ) {
	nws_cleartimer( div.id ) ;
	nws_timers[ div.id ] = setTimeout( function() { nws_doanim( div ) ; } , t ? t : qsn_thenotes[ div.id ].timer ) ;
}

/*
function -
function ANIMATION
*/

function nws_doanim( div ) {
	if ( isremoved ( div ) ) return ;
	if ( qsn_currstate == "edit" || q_fsmpresent() ) return nws_program( div ) ;
	if ( qsn_thenotes[ div.id ].nbnewsactive < 2 ) return ; 
	var d = gebcn( gebcn( div, "nws_maintable") , "nws_img" ) ;
	q_dim( d , 0 , 100 , function() { nws_doanim_next( div ); } ) ;
}

function nws_doanim_next( div ) {
	if ( isremoved ( div ) ) return ;
	if ( ! div.id || ! qsn_thenotes[ div.id ] ) return ;
	var r = qsn_thenotes[ div.id ] ;
	var i = r.selectednews ;
	for ( var j = i+1 ; j < i+5 ; j++ ) if ( r.news[ j % nws_numnews ].active ) {
		nws_rendermainnews( div, j % nws_numnews ) ;
		var d = gebcn( gebcn( div, "nws_maintable" ) , "nws_img" ) ;
		q_dim( d , 1 , 100 , function() { nws_timers[ div.id ] = setTimeout( function() { nws_doanim( div ) ; }, r.timer ) ; } ) ;
		break ;
	}
}


/*
function -
function RENDER
*/

function nws_template( id ) {
	if ( nws_templates_prepared ) return qsn_template( id , true ) ;
	qsn_installcontainer( "view" , "nws" , ge( "nws_notecontent" ).innerHTML ) ;
	var div = qsn_installcontainer( "edit" , "nws" , ge( "nws_notecontent_edit" ).innerHTML ) ;
	nws_templates_prepared = true ;
	return qsn_template( id , true ) ;
}

function nws_renderhtml( noteid ) {
	var div = ge( noteid ) ;
	var r = qsn_thenotes[ noteid ] ;
	qsn_container_renderhtml( div , r ) ;
	qsn_settextproperties( noteid ) ;
	qsn_setcolors( noteid ) ;
	if ( qsn_currstate != "edit" ) {
		div.growingupdone = function () { nws_fitimages( this ) ; } ;
		div.resized = function () { nws_fitimages( this ) ; } ;
		r.nbnewsactive = 0 ; 
		for ( var i = 0 ; i < nws_numnews ; i++ ) if ( r.news[ i ].active ) r.nbnewsactive++ ; 
		for ( var i = 0 ; i < nws_numnews ; i++ ) if ( r.news[ i ].active ) {
			r.selectednews = i ;
			nws_rendernews( div, r ) ;
			nws_program( div ) ;
			break ;
		}
	} else nws_prepareeditnews( div, r ) ;
}

function nws_rendernews( div, r ) {
	var thumbs = gebcn( div, "nws_thumbstable");
	visibleblock( thumbs, r.showthumbs == "1" ) ;
	var d = getElementsByClassName( thumbs, "nws_img" ) ;
	for ( var i = 0; i < nws_numnews; i++) {
		nws_renderonemainnews( div, i );
		nws_setimage( gebtn( d[ i ], "IMG" ), r.news[ i ] ) ;
	}
	nws_rendermainnews( div, r.selectednews ) ;
	nws_fitimages( div ) ;
}


function nws_renderonemainnews( div, newsindex ){
	div = getContainer( div ) ;
	var r = qsn_thenotes[ div.id ] ;
	var newsdiv = gebcn( div, "nws_mainnews" + newsindex );

	var d = gebcn( newsdiv, "nws_img" ) ;
	d.style.cursor = ( r.news[ newsindex ].link.mode == "none" )  ? "default" : "pointer" ;
	d.title = ( r.news[ newsindex ].link.mode == "none" )  ? "" : nws_message["clickhere"];
	
	nws_setimage( gebtn( d, "IMG" ), r.news[ newsindex ] ) ;

	gebcn( newsdiv, "nws_overimg" ).style.visibility = ( r.news[ newsindex ].title == "" && r.news[ newsindex ].comment == "" )  ? "hidden" : "visible" ;
	var title = gebcn( newsdiv, "nws_overimgtitle" );
	var comment = gebcn( newsdiv, "nws_overimgcomment" );
	q_innerHTML( title, ( r.news[ newsindex ].title == "" ) ? nws_message[ "notitle" ] : r.news[ newsindex ].title ) ;
	q_innerHTML( comment, r.news[ newsindex ].comment ) ;
	
	var link = r.news[ newsindex ].link ;
	title.style.cursor = "default" ;
	if ( link.mode == "none" ) {
		title.href="#";
		title.onclick = function(){return false;}
	}
	if ( ( link.mode == "web" ) && ( link.url != "" ) ) {
		title.target="_blank";
		title.href= link.url;
		title.onclick = function(){ window.open( this.href , "" ) ; return false;}
		title.style.cursor = "auto" ;
	}	
	else if ( ( link.mode == "page" ) && ( link.page != "" ) ) {
		title.target="_self";
		if ( window.q_makeweb ) {
			var svc = q_svcfromid( link.page ) ;
			if ( ! svc || ! svc.weblink ) title.href = link.page ;
			else title.href = svc.weblink ;
		} else title.href = link.page ;
		title.onclick = function(){return false;}
		title.style.cursor = "auto" ;
	}

}

function nws_rendermainnews( div, newsindex ) {
	div = getContainer( div ) ;
	var r = qsn_thenotes[ div.id ] ;
	r.selectednews = newsindex ;
	var thumbstable = gebcn( div, "nws_thumbstable" );
	var d = getElementsByClassName( thumbstable, "nws_img" ) ; // thumbs

	for ( var i = 0; i < nws_numnews; i ++ ) {
		visibleblock( gebcn( div, "nws_mainnews" + i ), ( i == newsindex ) );
		d[ i ].style.borderWidth = ( i == newsindex ) ? "1px 1px 4px 1px" : "1px" ;
	}
	nws_fitimages( div ) ;
}

function nws_setimage( img, news ) {
	var div = getContainer( img ) ;
	var src ;
	if ( news.img.src != "" ) src = q_spaceabsoluteurl( qsn_thenotes[ div.id ].common.ownerid , news.img.src ) ;
	else {
		src = "/services/nws/images/defaultimage.jpg" ;
		news.img.width = "900" ;
		news.img.height = "675" ;
	}
	img.src = src ;
}

function nws_changeimgratio(  ) {
	// qsn_default_handleclick( elem , ee ) ;
	// on redimensionne les miniatures du mode edit
	var tpanes = getElementsByClassName( qsn_edittarget, "nws_editnewspane" ) ;
	var r = qsn_thenotes[ qsn_edittarget.id ] ; 
	for ( var i = 0 ; i < r.news.length ; i ++ ) {
		var t = tpanes[ i ]  ;
		var divimg = gebcn( t, "nws_editnewspane_image" ) ;
		nws_setimage( gebtn( divimg, "IMG" ), r.news[ i ] ) ;
		nws_fitimage( divimg , 100, Math.round( 100 * nws_getimgratio( t ) ), r.news[ i ] ) ;
	}
}

function nws_getimgratio( x ) {
	if ( x.tagName ) var r = qsn_thenotes[ getContainer( x ).id ] ;
	else var r = x ;
	return [ 0.25 , 0.5 , 0.75 , 1 , 1.25 , 1.5 ][ parseInt( r.imgratio , 10 ) ] ; 
}

function nws_fitimages( div ) {
	var r = qsn_thenotes[ div.id ] ;
	var w, h, d, img ;
	var maintable = gebcn( div, "nws_maintable") ;
	var thumbstable = gebcn( div, "nws_thumbstable");
	var nws_imgratio = nws_getimgratio( r ) ;

	// all news
	w = Math.round( ( thumbstable.offsetWidth -  ( 7 * ( nws_numnews - 1 ) ) ) * ( 1 / nws_numnews ) ) ;
	h = Math.round( w * nws_imgratio ) ;
	d = getElementsByClassName( thumbstable , "nws_img" ) ;
	for ( var i = 0; i < d.length; i++) {
		nws_fitimage( d[ i ], w, h, r.news[ i ] ) ;
		d[ i ].style.visibility = ( r.news[ i ].active ) ? "visible" : "hidden" ;
	}
	
	// main news
	w = maintable.offsetWidth ;
	h = Math.round( w * nws_imgratio ) ;
	var selectednews = gebcn( maintable, "nws_mainnews" + r.selectednews ) ;
	nws_fitimage( gebcn( selectednews, "nws_img" ), w, h, r.news[ r.selectednews ] ) ;
	d = gebcn( selectednews , "nws_overimg" ) ;
	d.style.top = h - ( d.offsetHeight ) + "px" ;
}

function nws_fitimage( d, w, h, news ) {
	var div = getContainer ( d ) ;
	var r = qsn_thenotes[ div.id ] ; 
	if ( /nws_rendermainnews/.test(d.onclick) && r.showthumbs == "0")  return ;
	d.parentNode.style.width = w + "px" ; // div absolute
	d.parentNode.style.height = h + "px" ;
	d.parentNode.parentNode.width = w ; // td
	d.parentNode.parentNode.height = h ;
	d.style.height = h + "px" ;
	var img = gebtn( d, "IMG" ) ;
	
	var imgw = parseInt( news.img.width, 10 ) ;
	var imgh = parseInt( news.img.height, 10 ) ;

	if ( imgh / imgw >= nws_getimgratio( r ) ) { // image + verticale que le ratio
		var k = ( imgh / imgw) * ( w / h ) ;
		var dh = ( k - 1 ) * h ;	
		img.style.width = "100%" ;
		img.style.marginLeft = "0px" ;
		switch( parseInt( news.img.position, 10 ) ) {
			case( 0 ) :
			case( 1 ) :
			case( 2 ) :
				img.style.marginTop = "0px" ;
				break ;
			case( 3 ) :
			case( 4 ) :
			case( 5 ) :
				img.style.marginTop = -Math.round( dh / 2 ) + "px" ;
				break ;
			case( 6 ) :
			case( 7 ) :
			case( 8 ) :
				img.style.marginTop = -Math.round( dh ) + "px" ;
				break ;
		}
	} else { // image + horizontale que le ratio
		var k = ( imgw / imgh ) * ( h / w ) ;
		var dw = ( k - 1 ) * w ;		
		img.style.width = ( 1 + Math.round( k * 100 ) ) + "%" ;
		img.style.marginTop = "0px" ;
		switch( parseInt( news.img.position, 10 ) ) {
			case( 0 ) :
			case( 3 ) :
			case( 6 ) :
				img.style.marginLeft = "0px" ;
				break ;
			case( 1 ) :
			case( 4 ) :
			case( 7 ) :
				img.style.marginLeft = -Math.round( dw / 2 ) + "px" ;
				break ;
			case( 2 ) :
			case( 5 ) :
			case( 8 ) :
				img.style.marginLeft = -Math.round( dw ) + "px" ;
				break ;
		}
	}
}

function nws_mouseovermainnews( ee, v ) {
	var x = getElementFromEvent( ee ) ;
	var news = getContainer ( x, "nws_news" ) ;
	var newsindex = news.className.replace(/^.+nws_mainnews(.)$/ , "$1");
	
	var div = getContainer( x );
	var r = qsn_thenotes[ div.id ];
	if ( r.news[ newsindex ].link.mode != "none" ) gebcn( news, "nws_overimgbckg" ).style.backgroundColor = v ? q_contextualcolor( 2 , 7 ) : "#000" ;
	if ( v ) nws_cleartimer( div.id ) ;
	else nws_program( div ) ;
}

function nws_mouseovernews( ee, v ) {
	var x = getElementFromEvent( ee ) ;
	if ( x.tagName == "IMG" ) x.parentNode.style.borderStyle = v ? "inset" : "solid" ;
}

function nws_clickinmainnews( x, newsindex ) {
	if ( document.mainform.pagemode && document.mainform.pagemode.value == "edit" ) {
		if ( nws_alertlinksdone ) return ;
		else {
			alert( nws_message[ "editmodeclick" ] );
			nws_alertlinksdone = true ; 
			return;
		}
	}
	var div = getContainer( x ) ;
	var r = qsn_thenotes[ div.id ] ;
	var link = r.news[ newsindex ].link ;
	if ( link.mode == "none" ) return ;
	if ( ( link.mode == "web" ) && ( link.url != "" ) ) window.open( link.url, "" ) ;
	else if ( ( link.mode == "page" ) && ( link.page != "" ) ) openservice( link.page ) ;
}


/*
function -
function EDIT
*/

function nws_saveedit( ) {
	nws_preparesaveedit( ) ;
	
	var r = qsn_thenotes[ qsn_edittarget.id ];
	var activenews = r.news.length ;
	for ( var j = 0; j < r.news.length; j++) if ( r.news[ j ].active == false ) activenews--;
	if ( activenews <= 0 ) {
		alert( nws_message[ "noactivenews" ] );
		return false;
	}

	qsn_container_saveedit() ;
	qsn_saveedit( true ) ;
}

function nws_preparesaveedit( ) {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	var tpanes = getElementsByClassName( qsn_edittarget, "nws_editnewspane" ) ;
	var t ;
	for ( var i=0; i<nws_numnews; i++ ) {
		t = tpanes[ i ] ;
		r.news[ i ].title = gebcn( t, "nws_editnewspane_title" ).value ;
		r.news[ i ].comment = gebcn( t, "nws_editnewspane_comment" ).value ;
		r.news[ i ].link.url = gebcn( t, "nws_editnewspane_linkweburl" ).value ;
	}
}

function nws_prepareeditnews( div, r ) {
	var t = gebcn( div, "nws_editnewspane" ) ;
	t.newsindex = 0 ;
	nws_makepageselect( gebcn( t, "nws_editnewspane_pageselect" ) ) ;
	for ( var i=1; i<nws_numnews; i++) t.parentNode.appendChild( t.cloneNode( true ) ).newsindex = i ; // clone edit pane
	var tpanes = getElementsByClassName( div, "nws_editnewspane" ) ;
	for ( var i=0; i<nws_numnews; i++ ) nws_prepareeditnewsdata( tpanes[ i ], r.news[ i ] , i  ) ;
	nws_switcheditab( div, parseInt( r.selectednews, 10 ) ) ;
}

function nws_prepareeditnewsdata( t, news , index ) {
	// active or not
	var activenutton = gebcn( t , "active" ) ;
	activenutton.innerHTML = ( ! news.active ) ? nws_message[ "active" ] :  nws_message[ "desactive" ] ;

	// image
	nws_prepareeditnews_image( t, news ) ;
	var imgpos = gebcn( t, "nws_editnewspane_imagepos" ).getElementsByTagName( "IMG" ) ;
	imgpos[ parseInt( news.img.position, 10 ) ].className = "nws_imageposon" ;
	
	// texts
	q_innerHTML( gebcn( t, "nws_editnewspane_imagename" ), ( news.img.src == "" ) ? nws_message[ "noimage" ] : news.img.name ) ;
	gebcn( t, "nws_editnewspane_title" ).value = news.title ;
	gebcn( t, "nws_editnewspane_comment" ).value = news.comment ;
	
	// link
	var radios = gebcn( t, "nws_editnewspane_link" ).getElementsByTagName( "A" ) ;	
	var radioweb = gebcn( t, "nws_editnewspane_linkweb" ) ;
	var radiopage = gebcn( t, "nws_editnewspane_linkpage" ) ;
	if ( news.link.mode == "none" ) {
		radios[ 0 ].className = "radio on" ;
		hideblock( [ radioweb, radiopage ] ) ;
	} else if ( news.link.mode == "web" ) {
		radios[ 1 ].className = "radio on" ;
		hideshowblock( radiopage, radioweb ) ;
	} else if ( news.link.mode == "page" ) {
		radios[ 2 ].className = "radio on" ;
		hideshowblock( radioweb, radiopage ) ;
	}
	gebcn( t, "nws_editnewspane_linkweburl" ).value = news.link.url ;
	var select = gebcn( t, "nws_editnewspane_pageselect" ) ;
	for ( var i=0; i<select.options.length; i++ ) {
		if ( select.options[ i ].value == news.link.page ) select.selectedIndex = i ;
	}
	
	// switch news select
	select = gebcn( t, "nws_editnewspane_switchnewsselect" ) ;
	if ( select.options.length == 0 ) {
		for ( var j=0; j<nws_numnews; j++) {
			if ( j != t.newsindex ) select.options[ select.options.length ] = new Option( nws_message[ "newsid" ].replace( "%n", ( j + 1 ) ) , j ) ;
		}
	}
}

function nws_prepareeditnews_image( t, news ) {
	var divimg = gebcn( t, "nws_editnewspane_image" ) ;
	nws_setimage( gebtn( divimg, "IMG" ), news ) ;
	nws_fitimage( divimg , 100, Math.round( 100 * nws_getimgratio( t ) ), news ) ;
	q_innerHTML( gebcn( t, "nws_editnewspane_imagename" ), ( news.img.src == "" ) ? nws_message[ "noimage" ] : news.img.name ) ;
}

function nws_erasenewsdata( x ) {
	if ( ! confirm( nws_message[ "confirmerasenews" ] ) ) return ;
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	var t = getContainer( x, "nws_editnewspane" ) ;
	r.news[ t.newsindex ] = q_cloneObject( nws_newstemplate ) ;
	nws_prepareeditnewsdata( t, r.news[ t.newsindex ] , t.newsindex ) ;
}

function nws_displaysettings() {
	qsn_initdisplaysetting() ;
	return false ;
}

function nws_switchnews( x ) {
	nws_preparesaveedit( ) ;
	var t = getContainer( x, "nws_editnewspane" ) ;
	var n1 = t.newsindex ;
	var sel = gebcn( t, "nws_editnewspane_switchnewsselect" ) ;
	var n2 = sel.options[ sel.selectedIndex ].value ;
	
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	var news1 = q_cloneObject( r.news[ n1 ] ) ;
	r.news[ n1 ] = q_cloneObject( r.news[ n2 ] ) ; ;
	r.news[ n2 ] = news1 ;

	var tpanes = getElementsByClassName( qsn_edittarget, "nws_editnewspane" ) ;
	nws_prepareeditnewsdata( tpanes[ n1 ], r.news[ n1 ] , n1 ) ;
	nws_prepareeditnewsdata( tpanes[ n2 ], r.news[ n2 ] , n2 ) ;
}

function nws_mouseovereditab( ee, v ) {
	var x = getElementFromEvent( ee ) ;
	if ( x.tagName == "SPAN" ) x = x.parentNode ;
	if ( /\bnws_editnewstaboff/.test( x.className ) ) {
		var r = qsn_thenotes[ getContainer( x ).id ] ;
		var c = parseInt( r.color, 10 ) ;
		if ( c == -1 ) c = getpagebackgroundcolor( ) ;
		else c = ( c < 10 ) ? getsncontextualbackgroundcolors( 7 )[ c - 1 ] : r.color ;
		x.style.backgroundColor = v ? rgbcontrastcolor( c, 20 ) : "transparent" ;
	}
}

function nws_switcheditab( x , ee ) {
	var div = getContainer( x ) ;
	var r = qsn_thenotes[ div.id ] ;
	var tabs = getElementsByClassName( div, "nws_editnewstab" ) ;
	var panes = getElementsByClassName( div, "nws_editnewspane" ) ;

	if ( typeof( ee ) == "number" ) x = tabs[ ee ] ;
	else if ( x.tagName == "SPAN" ) x = x.parentNode ;
	var tab ;
	for ( var i=0; i<nws_numnews; i++ ) {
		tab = tabs[ i ] ;
		if ( tab == x ) {
			tab.style.backgroundColor = "" ;
			tab.className = "nws_editnewstab nws_editnewstabon" ;
			r.selectednews = i ;
			showblock( panes[ i ] ) ;
		} else {
			tab.className = "nws_editnewstab nws_editnewstaboff" ;
			hideblock( panes[ i ] ) ;
		}
	}
}

function nws_switchlinkmode( x, m ) {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	var tpane = getContainer( x, "nws_editnewspane" ) ;
	var radios = gebcn( tpane, "nws_editnewspane_link" ).getElementsByTagName( "A" ) ;
	for ( var i=0; i<radios.length; i++ ) radios[ i ].className = ( radios[ i ] == x ) ? "radio on" : "radio off" ;
	var radioweb = gebcn( tpane, "nws_editnewspane_linkweb" ) ;
	var radiopage = gebcn( tpane, "nws_editnewspane_linkpage" ) ;
	if ( m == "none" ) hideblock( [ radioweb, radiopage ] ) ;
	else if ( m == "web" ) hideshowblock( radiopage, radioweb ) ;
	else if ( m == "page" ) hideshowblock( radioweb, radiopage ) ;
	r.news[ tpane.newsindex ].link.mode = m ;
}

function nws_selectlinkpage( x ) {
	var tpane = getContainer( x, "nws_editnewspane" ) ;
	var news = qsn_thenotes[ qsn_edittarget.id ].news[ tpane.newsindex ] ;
	news.link.page = x.options[ x.selectedIndex ].value ;
}

function nws_mouseoverimagepos( ee, v ) {
	var x = getElementFromEvent( ee ) ;
	if ( x.tagName != "IMG" ) return ;
	if ( x.className == "nws_imageposon" ) return ;
	x.className = v ? "nws_imageposonoff" : "nws_imageposoff" ;
}

function nws_switchimagepos( t, ee ) {
	var x = getElementFromEvent( ee ) ;
	var imgs = t.getElementsByTagName( "IMG" ) ;
	var tpane = getContainer( t, "nws_editnewspane" ) ;
	var news = qsn_thenotes[ qsn_edittarget.id ].news[ tpane.newsindex ] ;
	for ( var i=0; i<imgs.length; i++ ) {
		if ( imgs[ i ] == x ) {
			news.img.position = i ;
			imgs[ i ].className = "nws_imageposon" ;
		} else imgs[ i ].className = "nws_imageposoff" ;
	}
	nws_fitimage( gebcn( tpane, "nws_editnewspane_image" ) , 100, Math.round( 100 * nws_getimgratio( t ) ), news ) ;
}

function nws_launch_upload( x ) {
	nws_upload_request.prompt = nws_message[ "selectimage" ] ;
	nws_upload_request.title = nws_message[ "uploadtitle" ] ;
	if ( qsn_isnewnote == false ) nws_upload_request.noteid = getContainer( x ).id ;
	qdyn_qorgload( "qu_reveal" , [ nws_upload_request ] , "qu" , { dynloadhandler : "qu_dynload" } ) ;
}

function nws_newimg_done( x ) {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	var news = r.news[ r.selectednews ] ;
	var img = x.files[ 0 ] ;
	news.img.src = img.formats.screen ; // pour vignette et image principale, choix discutable
	news.img.width = img.imagewidth ;
	news.img.height = img.imageheight ;
	news.img.name = img.filename.replace( /.*\/([^\/]*$)/ , "$1" ) ;
	
	var tpanes = getElementsByClassName( qsn_edittarget, "nws_editnewspane" ) ;
	nws_prepareeditnews_image( tpanes[ r.selectednews ], news ) ;
}

function nws_addshowthumbsoption( target , js )  {
	var tt =qsn_makeradiolist( 2 , "showthumbs" ) ;
	return qsn_addleftcolelem( target , qsn_addradiotable( { "className" : "qsn_showthumbs_elem" , title : "showthumbs", jsonpath : js.jsonpath , ncols : js.ncols , radios : tt , callback : js.callback } ) , "qsn_showthumbs_elem" ) ;	
}

function nws_addimageratiooptions( target , js )  {
	var tt =qsn_makeradiolist( 6 , "imgratio" ) ;
	return qsn_addleftcolelem( target , qsn_addradiotable( { "className" : "qsn_imgratio_elem" , title : "imgratio", jsonpath : js.jsonpath , ncols : js.ncols , radios : tt , modifynote : js.modifynote } ) , "qsn_imgratio_elem" ) ;	
}

function nws_activenews( x ) {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	if ( (typeof x) == "number" ) {
		var news = r.news[ x ] ;
		var tpane = getElementsByClassName( qsn_edittarget, "nws_editnewspane" )[ x ] ;
		var button = gebcn ( tpane , "active" ) ;
	}
	else {
		var news = r.news[ r.selectednews ] ;
		var button = x ;
	}
	if ( news.active ) {
		news.active = false ;
		x.innerHTML = nws_message[ "active" ] ;
	}
	else {
		news.active = true ;
		x.innerHTML = nws_message[ "desactive" ] ;
	}
}

/*
function -
function UTILES
*/

function nws_gettable( div, x ) {
	var t = gebcn( div, "nws_notebody" ).getElementsByTagName( "TABLE" ) ;
	if ( x != undefined ) return t[ x ] ;
	else return t ;
}

function nws_makepageselect( s, selectedpage ) {
	var n = 0 ;
	var c = s.options.length ;
	for ( var i in sitemap ) {
		var smi = sitemap[ i ] ;
		if ( smi.links.length > 0 ) {
			var optgrp = create_elem( "optgroup" ) ;
			optgrp.label = common_message[ "rubric" ] + " \"" + smi.name + "\"" ;
			if ( issafari() ) q_innerHTML(optgrp, common_message[ "rubric" ] + " \"" + smi.name + "\"") ; 
			s.appendChild( optgrp ) ;
		}
		for ( var j = 0; j < smi.links.length; j++ ) {
			var so = s.options[ n + c ] = new Option ( q_svcfromid( smi.links[ j ] ).shortname , smi.links[ j ] ) ;
			so.title = q_svcfromid( smi.links[ j ] ).shortname ;
			so.style.marginLeft = "10px" ;
			if ( smi.links[ j ] == currsvcid ) so.disabled = true ;
			if ( selectedpage && ( smi.links[ j ] == selectedpage ) ) so.selected = "true" ;
			n++ ;
		}
	}
}

function nws_validlink( s ) {
	return q_validlink( s ) ;
}

function nws_checklength( el, x ) {
	if ( el.value.length > x ) el.value = el.value.substring( 0 , x ) ;
}

/*
function -
function WEB
*/

function nws_initforweb( id ) {
	nws_renderhtml( id ) ;
	setTimeout( "q_addwindowfocushandlers( 'nws_resumeall' ) ; q_addwindowblurhandlers( 'nws_pauseall' ) ; " , 5000 ) ;
}


/*
function -
function TOOLBAR
*/

function nws_toolbarversion() {
	return 1 ;
}

/*
function -
function QWIZ
*/

function nws_mergeqwizdata( notejson, noteqwizkeys, qwiz_data ) {
	var v ;
	for ( var x in noteqwizkeys ) {
		v = noteqwizkeys[ x ] ;
		if ( ! notejson[ "news" ] ) {
			notejson[ "news" ] = new Array( ) ;
			for ( var i=0; i<nws_numnews; i++ ) notejson[ "news" ].push( q_cloneObject( nws_newstemplate ) ) ;
		}
		if ( x == "title" ) {
			for ( var i=0; i<nws_numnews; i++ ) {
				notejson[ "news" ][ i ][ x ] = qwiz_data[ v + "#" + i ] ;
			}
		} else if ( x == "img" ) {
			var imgdata ;
			var nonews = true ;
			for ( var i=0; i<nws_numnews; i++ ) {
				imgdata = qwiz_data[ v + "#" + i ] ;
				if ( ! imgdata[ 0 ] ) {
					notejson[ "news" ][ i ].active = false ;
					continue ;
				}
				notejson[ "news" ][ i ][ "img" ].src = imgdata[ 0 ][ "formats" ][ "screen" ] ;
				notejson[ "news" ][ i ][ "img" ].width = imgdata[ 0 ][ "imagewidth" ] ;
				notejson[ "news" ][ i ][ "img" ].height = imgdata[ 0 ][ "imageheight" ] ;
				notejson[ "news" ][ i ][ "img" ].position = 4 ;
				if ( imgdata[ 0 ] ) {
					notejson[ "news" ][ i ].active = true ;
					nonews = false ;
				}
			}
			if ( nonews ) notejson[ "news" ][ 0 ].active = true ;
		} else notejson[ x ] = qwiz_data[ v ] ;
	}
	return notejson ;
}

var nws_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "nws_js_loaded" ) ;


var pimg_message = {
"newnoteprompt" : "cliquez ici pour écrire votre message, puis cliquez sur ok" ,
"fermer" : "fermer" ,
"plug" : "Image_Ajoutez rapidement une photo (cliquable ou non) sur votre page.",
"desc" : "(...)",
"selectanimage" : "Veuillez sélectionner une image.",
"uploadtitle" : "Insertion d'une image",
"selectanimage_fo" : "Sélectionnez une image." ,
"pages_toolarge" : "La taille de l'image originale est trop grande. Vous ne pouvez pas utiliser cette option pour cette image.",
"delete" : "supprimer" ,
"reducing_margins" : "Le nouveau réglage de marge faisait déborder l'image. Le réglage a été modifié à la plus proche valeur valide.",
"link" : "Indiquez l'adresse du lien ici : http:// etc",
"background" : "Fond" ,
"tabmargin" : "Marge" ,
"margin0" : "aucune" ,
"margin1" : "fine" ,
"margin2" : "normale" ,
"margin3" : "large" ,
"margin4" : "très large" ,
"linkpagetitle" : "Cliquez pour accéder à la page",
"linkfiletitle" : "Cliquez pour télécharger le ficher",
"changeimg" : "Changer l'image..." ,
"usetrueimg" : "utiliser l'image originale" ,
"helptrueimg" : "Cette option donne la meilleure qualité d'image disponible mais empêche de la redimensionner.<br />Pour redimensionner la note, l'option doit être désactivée." ,
"enablezoom" : "autoriser le zoom" ,
"helpzoomimg" : "Cette option permet aux visiteurs de voir l'image en grand en cliquant sur la loupe en haut à gauche." ,
"clicktoclose" : "Cliquez pour fermer l'image et revenir à la page." ,
"linkbroken" : "La page vers laquelle pointait ce lien a été supprimée."
} ;

var pimg_msgs_fr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "pimg_msgs_fr_js_loaded" ) ;


var pimg_templates_prepared = false ;
var pimg_leftcol_prepared = false ;

var pimg_json_template = { version: 1 , img : { src : "" , downloadsrc : "" } , margin: "1" , color : "rgb(100%,100%,100%)" , linkdata : { kind: 0, address : "", pagelink : "" } , enablezoom : true } ;

var pimg_colordesc = { "qmc1" : "color" } ;
var pimg_textmargins = [ "0px", "5px", "11px", "21px", "31px" ] ;
var pimg_textpaddings = [ "0px", "5px", "11px", "21px" ] ;
var pimg_margins = pimg_textmargins ;
function pimg_definemargins() {
	return pimg_margins ;
}

var pimg_leftcol_description = [ 
{ what : "image" , tabname : "Image" , visible : true , elems : [
		{ handler : "qsn_addcustom" , params : { html : "pimg_getEditImageblock" } } ,
		{ handler : "qsn_addbutton" , params : { buttontext : "changeimg" , buttonhandler : "pimg_launch_upload" } } ,
		{ handler : "qsn_addcustom" , params : { html : "pimg_getZoomImageblock" } }
	] } ,
	{ what : "textmargin" , tabname : "qsn_tabmargin" , visible : false , elems : [ 
	{ handler : "qsn_addmargins" , params : { title:"" , jsonpath : "margin" , ncols : 2 , modifynote: "pimg_modifynote" } } 
	] } ,
{ what : "notecolor" , tabname : "tabcolor" , visible : false , elems : [ 
	{ handler : "qsn_addqlubcolorblock" , params : { jsonpath : "color" , others : true ,  transparent:true , title:false , menuseparator: false , modifynote : "qsn_setcolors"  } } 
	] } ,
{ what : "links" , tabname : "qsn_tablinks" , visible : false , elems : [
	{ handler : "qsn_addlinks" , params : { jsonpath: "linkdata" , ncols : 1 , callback: "qsn_linkhandleclick" } }
	] }
] ;

var pimg_links = [ 0 , 1 , 2 ] ;
//var pimg_prepared = false;
var pimg_currimgw ;

var pimg_upload_request = {
	"callerid" : "" ,
	"uploadkind" : "image",
	"title" : "N/A" ,
	"prompt" : "N/A" ,
	"multiple" : false,
	"extensions" : ["jpg" , "jpeg" , "png" , "gif" , "tiff" , "tif" , "pdf"] ,
	"namingdata" : { "wantname" : true },
	"formats" : "screen halfscreen quarterscreen",
	"callback" : "pimg_new_pc_img_done", 
	"cancel": { "callback" : "pimg_new_img_cancel" } , 
	"reveal": { "anim" : true },
	"resize" : true ,
	"resize_option" : { "ratio" :  "image" } ,
	"transparency" : "image" ,
	"web" : true ,
	"webcallback" : "pimg_new_web_img_done"
} ;

function pimg_upgradejson( r ) {
	if ( r.version == pimg_json_template.version ) return r ;
/*
	if ( r.version < 2 ) r = pimg_upgradejsontov2( r ) ;
	if ( r.version < 3 ) r = pimg_upgradejsontov3( r ) ;
	if ( r.version < 4 ) r = pimg_upgradejsontov4( r ) ;
	if ( r.version < 5 ) r = pimg_upgradejsontov5( r ) ;
	if ( r.version < 6 ) r = pimg_upgradejsontov6( r ) ;
*/
	r.version = pimg_json_template.version ;
	return r ;
}
/*
function pimg_upgradejsontov2 ( r ) {
	r.color = "rgb(255,255,255)" ;
	return r ;
}
function pimg_upgradejsontov3 ( r ) {
	r.margin = "2" ;
	return r ;
}

function pimg_upgradejsontov4 ( r ) {
	r.link = 0;
	r.address = "";
	return r ;
}

function pimg_upgradejsontov5 ( r ) {
	r.pagelink = "" ;
	return r ;
}

function pimg_upgradejsontov6( r ) {
	r[ "linkdata" ] = { kind : r.link , address : r.address , pagelink : r.pagelink } ;
	delete r.text ;
	delete r.textfont ;
	delete r.textsize ;
	delete r.textcenter ;
	delete r.textbold ;
	delete r.textitalic ;
	delete r.link ;
	delete r.address ;
	delete r.pagelink ;
	r.version = pimg_json_template.version;
	return r;
}
*/

function pimg_template( id ) {
	if ( pimg_templates_prepared ) return qsn_template( id , true ) ;
	var div = qsn_installcontainer( "view" , "pimg" , ge( "pimg_notecontent" ).innerHTML ) ;
	hideblock( [ gebcn( div , "qlubcontainer_noteheader" ) , gebcn( div , "qlubcontainer_signature" ) ]  ) ;
	var div = qsn_installcontainer( "edit" , "pimg" , ge( "pimg_notecontent_edit" ).innerHTML ) ;
	hideblock( gebcn( div , "qlubcontainer_noteheader" ) ) ;
	gebcn( div , "cancelokelem" ).width = "100%" ;
	pimg_templates_prepared = true ;
	return qsn_template( id , true ) ;
}

/*
function -
function UPLOAD
*/

function pimg_new_img_cancel( ) {
	if ( qsn_isnewnote ) qsn_canceledit( ) ;
}

function pimg_launch_upload( x ) {
	if ( ! window.rights_record ) return alert( common_message[ "membersonly" ] ) ;
	pimg_upload_request.prompt = pimg_message[ "selectanimage_fo" ] ;
	pimg_upload_request.title = pimg_message[ "uploadtitle" ] ;
	if ( qsn_isnewnote == false) pimg_upload_request.noteid = getContainer( x ).id ;
	qdyn_qorgload( "qu_reveal" , [ pimg_upload_request ] , "qu" , { dynloadhandler : "qu_dynload" } ) ;
}

function pimg_new_pc_img_done( x ) {
	pimg_new_img_done( x, "pc" ) ;
}

function pimg_new_web_img_done( x ) {
	pimg_new_img_done( x, "web" ) ;
}

function pimg_new_img_done( x, kind ) {
	var id = pimg_upload_request.noteid ;
	var r = qsn_thenotes[ id ] ;
	if ( kind == "web" ) {
		r.img.kind = kind ;
		if ( x != "" ) r.img.src = x.replace ( /[ \t\n\r]/g , "" ) ;
	} else {
		var ext = x.files[ 0 ].filename.replace(/^.*\.(.+)$/, "$1" ) ;
		visibleblock( "pimg_truewidth_elem" , ! (/pdf/i).test( ext ) ) ;
		pimg_setimagejson( r, x.files[ 0 ] ) ; // pc
	}
	var div = ge( id ) ;
	pimg_renderimg( div, r ) ;
}

function pimg_setimagejson( json, imgdata, imgwidth ) {
	json.img.kind = "pc" ;
	json.img.linkname = imgdata.linkname ;
	json.img.downloadsrc = imgdata.filename ;
	json.img.formats = imgdata.formats ;
	json.img.imagewidth = imgdata.imagewidth ;
	json.img.imageheight = imgdata.imageheight ;
	json.img.src = qsn_screenfilepath( json, imgwidth ) ;
	json.img.uploadid = imgdata.newuploadid ;
	json.img.samples = imgdata.samples ;
}

/*
function -
function NEW ADD SAVE DELETE
*/

function pimg_newnote( ) {
	var notekind = "pimg" ;
	qsn_newnote( notekind , true ) ;
	pimg_upload_request.noteid = qsn_edittarget.id ;
	pimg_launch_upload() ; 
}

/*
function pimg_blind( id ) {
	var olddiv = ge( id ) ;
	var blindcount = parseInt( olddiv.blindcount ,10 ) ;
	var div = q_CloneFromNode( olddiv ) ;
	var target = ge( ( blindcount%2 == 1 ) ? "paletteplane" : "q_author_stuff" ) ;
	rm( olddiv ) ;
	div = target.appendChild( div ) ;
	div.id = id ;
	div.blindcount = "" + ( --blindcount ) ;
	if ( blindcount < 0 ) return ;
	setTimeout( function () { pimg_blind( id ) ; } , 300 ) ;
}
*/

function pimg_finishnewnote( xs ) {
	if ( xs.newid ) {
		q_idalias [ xs.oldid ] = xs.newid ;
		qsn_thenotes[ xs.newid ] = q_cloneObject( qsn_thenotes[ xs.oldid ] ) ;
		qsn_thenotes[ xs.newid ].common.noteid = xs.newid ;
		qsn_thenotes[ xs.newid ].user.common.top = qsn_thenotes[ xs.oldid ].spacedefaults.common.top ;
		qsn_thenotes[ xs.newid ].user.common.left = qsn_thenotes[ xs.oldid ].spacedefaults.common.left ;
		qsn_thenotes[ xs.newid ].user.common.width = qsn_thenotes[ xs.oldid ].spacedefaults.common.width ;
		qsn_thenotes[ xs.oldid ] = null ;
		pimg_addnote( xs.newid ) ;
		var div = ge( xs.newid ) ;
		// div.blindcount = "5" ;
	}
}

function pimg_addnote( noteid ) {
	var template = qsn_template( noteid ) ;
	var div = qsn_clonetemplate( noteid , template ) ;
	qsn_renderhtml( noteid ) ;
	return div ;
}

function pimg_saveedit() {
	var id = qsn_edittarget.id ;
	var r = qsn_thenotes[ id ] ;
	if ( r.img.kind == "pc_local" ) {
		if ( ! confirm( pimg_message["pclocalnotvalidate"] ) ) return false ;
		r.img = q_cloneObject( r.imgbk ) ;
		r.imgbk = null ;
	}
	if ( r.linkdata.kind == 5 && ! verbosevalidemail( r.linkdata.mailto ) ) return false ;
//	r.linkdata.address = gebcn( ge( "pimg_link_urlinput" ) , "pimg_textarea" ).value ; // inutile ou alors il faut faire tous les autres
//	var s = ge( "pimg_link_selectpage" ).getElementsByTagName( "SELECT" )[ 0 ] ;
//	var v = s.options[ s.selectedIndex ].value ;
//	r.linkdata.pagelink = ( v == -1 ) ? "" : v ;
	if ( ! qsn_isnewnote ) rm ( getelement ( id + "_bk" ) ) ;
	qsn_saveedit( true ) ;
}

function pimg_suppressnote( id ) {
	qsn_suppressnote( id , true );
}

function pimg_allowsuppress( id ) {
	return qsn_allowsuppress( id , true ) ;
}

/*
function -
function RENDER
*/

function pimg_renderlink( x, r ) {
	var rr = r.linkdata ; 
	if ( qsn_currstate == "edit" || rr.kind <= 0 ) return ;
	var mode;
	try { mode = document.mainform.pagemode.value ; }
	catch(e) { mode = "view"; }
	if ( mode != "edit" ) {
		var par = x.parentNode ;
		var myimg = par.removeChild( x ) ;
		var mylink = document.createElement("A") ;
		if ( rr.kind == 1 ) { // web address
			var addr = rr.address ;
			if ( ! addr ) mylink.onclick = function() { return false; } ;
			else {
				if ( ! ( /^(javascript:|rel:|[a-zA-Z]+:\/\/)/.test( addr ) ) ) addr = "http://" + addr ;
				if ( /rel:/.test( addr ) ) {
					mylink.href = addr.replace( /http:\/\//g, "").replace( /rel:/ , "" );
					mylink.title = "";
					mylink.target = "_self" ;
				}else{
					mylink.href = addr ; 
					mylink.title = addr ;
					mylink.target = "_blank" ;
				}
			}
			par.appendChild( mylink ) ;
			mylink.appendChild( myimg ) ;
		} else if ( rr.kind == 2 ) { // site page
			var pagelink = rr.pagelink ;
			if ( pagelink ) {
				var svcinfo = q_svcfromid( pagelink ) ;
				if ( svcinfo ) {
					mylink.href = svcinfo.weblink ;
					mylink.setAttribute( "onclick" , "openservice( '" + pagelink + "' ) ; return false ;" ) ;
					mylink.title = pimg_message[ "linkpagetitle" ] + " '" + svcinfo.shortname + "'";
					myimg.alt = svcinfo.shortname ;
				} else {
					mylink.href = "" ;
					mylink.title = pimg_message[ "linkbroken" ] ;
				}
			}
			par.appendChild( mylink ) ;
			mylink.appendChild( myimg ) ;
		} else if ( rr.kind == 3 ) { 
			var filename = rr.filename ;
			mylink.href = filename ;
			mylink.setAttribute( "onclick" , "return q_openfile( this );" ) ;
			mylink.title = pimg_message[ "linkfiletitle" ] ;
			mylink.target = "_blank" ;
			mylink.appendChild( myimg ) ;
			par.appendChild( mylink ) ;
		} else if ( rr.kind == 4 ) { 
			var js = rr.js ;
			par.setAttribute( "onclick" , js ) ;
			par.appendChild( myimg ) ;
		} else if ( rr.kind == 5 ) { // web address
			mylink.href = "mailto:" + rr.mailto ;
			par.appendChild( mylink ) ;
			mylink.appendChild( myimg ) ;
		} else if ( rr.kind == 6 ) { // note
			mylink.href = "#" + rr.note ;
			mylink.appendChild( myimg ) ;
			par.setAttribute("q_link", rr.note);
			par.onclick = function(){ location.hash=""; location.hash="#" + this.getAttribute("q_link") ;}
			par.appendChild( mylink ) ;
		} else par.appendChild( myimg ) ;
	}
/*	} else {
		setchecked( "pimg_link_" + rr.kind, true) ;
		switch( parseInt( rr.kind, 10 ) ) {
			case( 0 ) :
				hideblock( [ "pimg_link_input", "pimg_link_selectpage" ] ) ;
				break ;
			case( 1 ) :
				hideshowblock( "pimg_link_selectpage", "pimg_link_input" ) ;
				var ta = gebcn ( ge ( "pimg_link_input" ) , "pimg_textarea" ) ;
				ta.value = rr.address ;	
				qsn_blurdefault( ta, "link" ) ;
				break ;
			case( 2 ) :
				hideshowblock( "pimg_link_input", "pimg_link_selectpage" ) ;
				break ;
		}
	}
*/
}

function pimg_imgwidthrule( w , r ) {
	return w - 2* parseInt( pimg_margins[ parseInt( r.margin, 10 ) ] , 10 ) ;
}

function pimg_renderhtml( noteid ) {
	var div = ge ( noteid ) ;
//	div.minWidth = "70px" ; ???
	var r = qsn_thenotes[ noteid ] ;
	div.toresize = function () {
		var x = [] ;
		var img = gebcn( this , "pimg_noteimage" ) ;
		if ( img ) x.push( img ) ;
		x = x.concat( qsn_container_toresize( this ) ) ;
		return x ;
	} ;
	div.growingupdone = function () {
		pimg_resizeimg( this ) ;
	} ;
	if ( qsn_currstate != "edit" ) {
		var notememberid = r.common.ownerid ;
		div.className += " pimg_note" ;
		var d = notememberid != "quomodo" && ( notememberid == memberid || ( members[ memberid ] && members[ memberid ].userlevel == "admin" ) ) ;
		visibleblock( gebcn( div , "edit" ) , d ) ;
		visibleblock( gebcn( div , "rich" ) , d && window.currsvcid && ( /artemapage/.test( currsvcid ) ) && ! r.pagesparent ) ;
		qsn_setcolors( r.common.noteid ) ;
	} else {
		div.className += " pimg_note" ;
		qsn_setcolors( r.common.noteid ) ;
		pimg_currimgw = r.user.common.width || r.spacedefaults.common.width ;
	}
	pimg_rendermargin( div , r ) ;
	qsn_container_renderhtml( div , r ) ;
	pimg_renderimg( div , r ) ;
}

function pimg_modifynote( id ) {
	pimg_rendermargin( qsn_edittarget , qsn_thenotes[ qsn_edittarget.id ] ) ;
	pimg_renderimg( qsn_edittarget , qsn_thenotes[ qsn_edittarget.id ] ) ;
}

function pimg_zoomhandleclick( elem , ee ) {
	qsn_setnoteproperty( elem , ee ) ;
	//pimg_rendermargin( qsn_edittarget , qsn_thenotes[ qsn_edittarget.id ] ) ;
}

function pimg_rendermargin( div , r ) {
	if ( ! div ) div = qsn_edittarget ;
	var id = div.id ;
	if ( ! r ) r = qsn_thenotes[ id ] ;
	var marginindex = parseInt( r.margin, 10 ) ;
	gebcn( div , "pimg_notecontent" ).style.padding = pimg_margins[ marginindex ] ;
	
	if(  qsn_currstate != "edit"  ) {
		var zoombutton = gebcn( div , "pimg_zoombutton" ) ;
		if ( zoombutton ) zoombutton.style.top = zoombutton.style.left = pimg_margins[ marginindex ] ;
		return ;
	}

	if ( ! window.pages_maxsnwidth ) return ;
	var maxsnwidth = pages_maxsnwidth() ;
	if ( div.offsetWidth > maxsnwidth ) {
		if ( r.img.truewidth ) {
			while( div.offsetWidth > maxsnwidth && marginindex > 0 ) {
				// setchecked( "pimg_margin_" + r.margin , false ) ;
				r.margin = "" + ( --marginindex ) ;
				setchecked( "pimg_margin_" + r.margin , true ) ;
				div.style.padding = pimg_margins[ marginindex ] ;
			}
			if ( div.offsetWidth > maxsnwidth ) adminalert( pimg_message[ "pages_toolarge" ] ) ;
			else adminalert( pimg_message[ "reducing_margins" ] ) ;
		} else {
//			var thewidth = maxsnwidth - 2 * parseInt(pimg_margins[ marginindex ] , 10 ) - 2 * parseInt( div.style.borderWidth , 10 ) ;
//			q_changedwidth( div , thewidth ) ;
//			r.common.width = r.user.common.width = r.spacedefaults.common.width = thewidth + "px" ;
			var thewidth = maxsnwidth - 2 * parseInt(pimg_margins[ marginindex ] , 10 ) - 2 * parseInt( div.style.borderWidth , 10 ) + "px";
			div.style.width = thewidth ;
			r.common.width = r.user.common.width = r.spacedefaults.common.width = thewidth ;
		}
	}
	var overflow = div.offsetWidth + qsn_trueleft( id ) - pages_maxsnX() ;
	if ( overflow > 0 ) {
		div.style.left = parseInt( div.style.left , 10 ) - overflow + "px" ;
		r.spacedefaults.common.left = r.user.common.left = div.style.left ;
	}
}

function pimg_renderimg( div , r ) {
	if ( ! div ) div = qsn_edittarget ;
	var id = div.id ;
	if ( ! r ) r = qsn_thenotes[ id ] ;
	var img = div.getElementsByTagName( "img" )[ 0 ] ;
	pimg_renderlink( img , r ) ;
	img = div.getElementsByTagName( "img" )[ 0 ] ;// on a peut-être encapsulé l'image dans un lien
	var b = ( ( r.img ) && ( r.img.truewidth ) ) || false ;
	var url = pimg_getimgurl( id , b ) ;
	img.widthrule = function ( w ) { return pimg_imgwidthrule( w , r ) ; } ;
	if ( img.alt == "" && r.img.linkname && r.img.linkname != "") img.alt = r.img.linkname;
	if ( r.img && r.img.imagewidth && r.img.imageheight ) img.dragratio = r.img.imageheight / r.img.imagewidth ;
	if ( ! url ) q_setimgsrc( img , "/services/pimg/images/noimage.png" ) ;
	else if ( ! b ) {
		q_changedwidth( div , parseInt( qsn_width( r.common.noteid ) , 10 ) ) ;
		//img.style.width = parseInt( qsn_width( r.common.noteid ) , 10 ) + "px" ;
		q_setimgsrc( img , url ) ;
	} else {
		hideblock( gebcn( div , "pimg_savecancel" ) ) ;
		if ( qsn_currstate == "edit" ) {
			var temp = document.body.appendChild( create_elem( "IMG", { style : { marginLeft : "-5000px" } } ) ) ;
			q_hsetimgsrc( [ temp , url ] , pimg_rendertrueimg , [ div, img , url , r , temp ] ) ;
		} else q_hsetimgsrc( [ img , url ] ) ; //pr le pied de page
	}
}

function pimg_rendertrueimg( div, img , url , r , temp ) {
	img.src = url ;
	if ( ( temp.offsetWidth + 2 * parseInt( pimg_margins[ parseInt( r.margin, 10 ) ] , 10 ) + 2 * parseInt ( div.style.borderWidth , 10 ) ) > pages_maxsnwidth() ) {
		adminalert( pimg_message[ "pages_toolarge" ] ) ;
		setchecked( "pimg_truewidth" , false ) ;
		pimg_settruewidth( { checked : false } ) ;
		showblock( gebcn( div , "pimg_savecancel" ) ) ;
		rm( temp ) ;
		return ;
	}
	if ( qsn_currstate == "edit" ) {
		var img = div.getElementsByTagName( "img" )[ 0 ] ;
		img.style.width = null ;
		img.style.height = null ;
		div.style.width = temp.offsetWidth + "px" ;
		var id = div.id ;
		r.spacedefaults.common.width = r.user.common.width = temp.offsetWidth + "px" ;
		// fix de l'image qui dépasse à droite avec trueimage 
		var overflow = div.offsetWidth + qsn_trueleft( id ) - pages_maxsnwidth() ;
		if ( overflow > 0 ) {
			div.style.left = parseInt( div.style.left , 10 ) - overflow + "px" ;
			r.spacedefaults.common.left = r.user.common.left = div.style.left ;
		}
	} else {
		div.style.width = temp.offsetWidth + "px" ;
	}
	showblock( gebcn( div , "pimg_savecancel" ) ) ;
	rm( temp ) ;
}

function pimg_sendtobckgnote( div ) {
	var v = -1 ;
	var currz, zmin, zmax ;
	zmin = zmax = currz = parseInt( qsn_thenotes[ div.id ].user.common.zindex , 10 ) ;
	var zs = [] ;
	var r1 = qsn_bounds( div.id ) ;
	var r2 ;
	var targetz , z ;
	for ( var id in qsn_thenotes ) {
		if ( ( ! qsn_thenotes[ id ] ) || ( id == div.id ) ) continue ;
		z = parseInt( qsn_thenotes[ id ].user.common.zindex , 10 ) ;
		if ( z < zmin ) zmin = z ;
		else if ( z > zmax ) zmax = z ;
		zs.push( z ) ;
		r2 = qsn_bounds( id ) ;
		if ( r2.length == 0 ) continue ;
		if ( ( r1[ 2 ] < r2[ 0 ] ) || ( r2[ 2 ] < r1[ 0 ] ) || ( r1[ 3 ] < r2[ 1 ] ) || ( r2[ 3 ] < r1[ 1 ] ) ) continue ;
		if ( v == -1 ) {
			if ( ( z <= currz ) && ( ( ! targetz ) || ( z > targetz ) ) ) targetz = z ;
		} else {
			if ( ( z >= currz ) && ( ( ! targetz ) || ( z < targetz ) ) ) targetz = z ;
		}
	}
	if ( ! targetz ) {
		targetz = ( v == 1 ) ? zmax : zmin ;
		if ( currz == targetz ) return ;
	}
	if ( indexOfItem( Math.max( targetz + v , 0 ) , zs ) == -1 ) {
		targetz = Math.max( targetz + v , 0 ) ;
	} else {
		targetz = ( v == 1 ) ? targetz + 1 : targetz ;
		for ( var id in qsn_thenotes ) {
			if ( ( ! qsn_thenotes[ id ] ) || ( id == div.id ) ) continue ;
			// pmimg_fixspacedefaults( id ) ;
			z = parseInt( qsn_thenotes[ id ].user.common.zindex , 10 ) ;
			if ( z < targetz ) continue ;
			ge( id ).style.zIndex = "" + ( z+1 ) ;
			qsn_thenotes[ id ].user.common.zindex = qsn_thenotes[ id ].spacedefaults.common.zindex = z+1 ;
			if ( qsn_thenotes[ id ].common.ghost || qsn_thenotes[ id ].common.col ) {
				if ( isie6() || isie78() ) ge( id ).parentNode.style.zIndex = "" + ( z+1 ) ;
			}
			qsn_adduserrefreshid( id ) ;
		}
	}
	div.style.zIndex = "" + targetz ;
	qsn_thenotes[ div.id ].user.common.zindex = qsn_thenotes[ div.id ].spacedefaults.common.zindex = targetz ;
	if ( qsn_thenotes[ div.id ].common.ghost || qsn_thenotes[ div.id ].common.col ) {
		if ( isie6() || isie78() ) ge( div.id ).parentNode.style.zIndex = "" + targetz ;
	}
	qsn_notechanged( div.id , "notechanged" ) ;
}

/*
function -
function RENDER IN FULL SCREEN MASK
*/

function pimg_mouseoverimg( x ) {
	var div = getContainer( x ) ;
	var r = qsn_thenotes[ div.id ] ;
	visibleblock( gebcn( div, "pimg_zoombutton" ) , r.enablezoom ) ;
}

function pimg_mouseoutimg( x ) {
	hideblock( gebcn( getContainer( x ), "pimg_zoombutton" ) ) ;
}

function pimg_renderimg_fsm( x ) {
	var r = qsn_thenotes[ getContainer( x ).id ] ;
	var src = ( r.img.kind == "web" ) ? r.img.src : q_spaceabsoluteurl( r.common.ownerid , r.img.formats.screen ) ;
	var fsm = ge( "q_fullscreenmask" ) ;
	showblock( "q_fullscreenmask" ) ;//pour que l'image soit réellement affichée et qu'on puisse en mesurer les dimensions
	var div = fsm.appendChild( create_elem( "DIV", { id: "pimg_fsm" } ) ) ;
	var img = div.appendChild( create_elem( "IMG", { title: pimg_message[ "clicktoclose" ] } ) ) ;
	div.style.visibility = "hidden" ;
	img.onclick = function() { pimg_removeimg_fsm( ); } ;
	q_hsetimgsrc( [ img , src ] , pimg_renderimg_fsmfinish, [ src ] ) ;
}

function pimg_renderimg_fsmfinish( src ) {
	var div = ge( "pimg_fsm" ) ;
	var img = gebtn( div, "IMG" ) ;
	var imgw = img.offsetWidth ;
	var imgh = img.offsetHeight ;
	var ww = q_windowInnerWidth() ;
	if ( isie6() && ( window.pages_mode || pages_mode() != "edit" ) ) ww = Math.min( ( window.pages_maxwidthpage && pages_maxwidthpage() ) || 1002 , ww ) ;// vh : sur IE6 le fullscreenmask en mode view ne prend pas toute la largeur de la fenêtre.
	var wh = q_windowInnerHeight() ;
	var h = Math.round( wh * 0.9 ) ; // 90% de la hauteur de la fenêtre
	var w = Math.round( h * imgw / imgh ) ;
	if ( w > Math.round( ww * 0.9 ) ) {
		w = Math.round( ww * 0.9 ) ; // 90% de la largeur de la fenêtre
		h = Math.round( w * imgh / imgw ) ;
	}
	img.style.height = h + "px" ;
	img.style.width = w + "px" ;
	var m = 8 ; // padding
	div.style.top = ( wh - ( 2*m + h ) ) / 2 + "px" ;
	div.style.left = ( ww - ( 2*m + w ) ) / 2 + "px" ;
	div.style.visibility = "visible" ;
}

function pimg_removeimg_fsm( ) {
	rm( "pimg_fsm" ) ;
	hideblock( "q_fullscreenmask" ) ;
}

/*
function -
function EDIT
*/

function pimg_editnote( x ) {
	var div = getContainer( x ) ;
	qsn_isnewnote = false ;
	qsn_currstate = "edit" ;
	qsn_entereditmode( div.id ) ;
}

function pimg_displaysettings() {	
//	showblock( "pimg_truewidth" ) ;
	qsn_initdisplaysetting() ;
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
//	setchecked( "pimg_margin_" + r.margin , true ) ;
	var ext = ( r.img && r.img.downloadsrc ) ? r.img.downloadsrc.replace(/^.*\.(.+)$/, "$1" ) : "" ;
	visibleblock( "pimg_truewidth_elem" , ! (/pdf/i).test( ext ) ) ;
	if ( currsvcid && ( /#artemapage/.test( currsvcid ) ) ) setchecked( "pimg_truewidth" , r.img.truewidth ) ;
	setchecked( "pimg_enablezoom" , r.enablezoom ) ;
}

function pimg_settruewidth( x ) {
	var b = x.checked ;
	var id = qsn_edittarget.id ;
	var r = qsn_thenotes[ id ] ;
	r.img.truewidth = b ;
	if ( b ) pimg_currimgw = r.user.common.width || r.spacedefaults.common.width ;
	else if ( pimg_currimgw ) {
		r.spacedefaults.common.width = r.user.common.width = pimg_currimgw ;
		qsn_edittarget.style.width = pimg_currimgw ;
	}
	pimg_renderimg( qsn_edittarget , r ) ;
}

function pimg_setenablezoom( x ) {
	var b = x.checked ;
	qsn_thenotes[ qsn_edittarget.id ].enablezoom = b ;
}

function pimg_getEditImageblock( ) {
	return "<div id=\"pimg_truewidth_elem\" style=\"margin-top: 12px\"><a id=\"pimg_truewidth\" name=\"pimg_truewidth\" class=\"pimg_truewidth checkbox off\" onclick=\"qsn_handleclick( this , pimg_settruewidth) ; return false\" onmouseover=\"showblock( gebcn('pimg_editblock', 'pimg_original_info'))\" onmouseout=\"hideblock( gebcn( 'pimg_editblock', 'pimg_original_info') )\"><img src=\"/images/blank.gif\" />" + pimg_message[ "usetrueimg" ] + "</a><div class=\"pimg_info pimg_original_info\"><table cellspacing=\"5\" cellpadding=\"0\"><tr><td valign=\"top\"><img class=\"png\" src=\"/images/warning24.png\" style=\"width : 24px ; height : 24px\" /></td><td align=\"left\">" + pimg_message[ "helptrueimg" ] + "</td></tr></table></div></div>" ;
}

function pimg_getZoomImageblock( ) {
	return "<div id=\"pimg_enablezoom_elem\" style=\"margin-top: 12px\"><a id=\"pimg_enablezoom\" name=\"pimg_enablezoom\" class=\"pimg_enablezoom checkbox off\" onclick=\"qsn_handleclick(this , pimg_setenablezoom) ; return false\" onmouseover=\"showblock( gebcn(ge('pimg_editblock'), 'pimg_zoom_info'))\" onmouseout=\"hideblock( gebcn(ge('pimg_editblock'), 'pimg_zoom_info') )\"><img src=\"/images/blank.gif\" />" + pimg_message[ "enablezoom" ] + "</a><div class=\"pimg_info pimg_zoom_info\"><table cellspacing=\"5\" cellpadding=\"0\"><tr><td valign=\"top\"><img class=\"png\" src=\"/images/warning24.png\" style=\"width : 24px ; height : 24px\" /></td><td align=\"left\">" + pimg_message[ "helpzoomimg" ] + "</td></tr></table></div></div>" ;	
}

/*
function -
function UTILES
*/

function pimg_getimgurl( noteid, srcimg ) {
	var r = qsn_thenotes[ noteid ] ;
	if ( r.img.kind == "web" ) return r.img.src ;
	else {
		if ( ! srcimg ) {
			if ( r.img.downloadsrc == "" ) return null ;
			if ( ( r.img.samples > 1 ) && ( /\.gif$/i ).test( r.img.downloadsrc ) ) return  q_spaceabsoluteurl( r.common.ownerid , r.img.downloadsrc ) ;
			return ( q_spaceabsoluteurl( r.common.ownerid , qsn_screenfilepath( r ) ) ) ;
		} else return ( q_spaceabsoluteurl( r.common.ownerid , r.img.downloadsrc ) ) ;
	}
	return null ;
}

/*
function pimg_measureimage( url, callback ) {
	var temp = document.body.appendChild( create_elem( "IMG", { style : { marginLeft : "-5000px" } } ) ) ;
	q_setimgsrc( temp , url ) ;
	var dim = [ temp.offsetWidth, temp.offsetHeight ] ;
	rm ( temp ) ;
	callback.apply( this, dim ) ;
}
*/

/*
function -
function DRAG
*/

function pimg_resizeimg( elem ) {
	var div = getContainer( elem ) ;
	var r = qsn_thenotes[ div.id ] ;
	var screenfilepath = qsn_screenfilepath( r ) ;
	var formats = r.img.formats ;
	var imgsrc = r.img.src ;
	if ( screenfilepath == imgsrc ) return ;
	if ( ! formats ) return ;
	if ( ( formats[ "screen" ] ) && ( imgsrc == formats[ "screen" ] ) ) return ;
	if ( ( formats[ "halfscreen" ] ) && ( imgsrc == formats[ "halfscreen" ] ) && ( formats[ "quarterscreen" ] ) && ( screenfilepath == formats[ "quarterscreen" ] ) ) return ;
//	r.img.src = screenfilepath ;
	pimg_renderimg( div , r ) ;
}

function pimg_upHandler( elem , ex , ey , ew , isGrow , isMove , xylimits ) {
	qsn_upHandler( elem , ex , ey , ew , isGrow , isMove , xylimits ) ;
	if ( isGrow ) pimg_resizeimg( elem ) ;
}

function pimg_beginDrag( elem , e ) {
	if ( ( ! window.currsvcid ) || ( ! /#artemapage/.test( currsvcid ) ) ) return qsn_beginDrag( elem , e , true ) ; //xqsn_beginDrag( elem , e , qsn_moveHandler , pimg_upHandler ) ;
	var r = qsn_thenotes[ elem.id ] ;
	if ( ( r.img ) && ( r.img.truewidth ) ) qsn_beginDragOnly( elem , e , true ) ;
	else qsn_beginDrag( elem , e , true ) ; //xqsn_beginDrag( elem , e , qsn_moveHandler , pimg_upHandler ) ;
}

/*
function -
function SERVICE PAGES
*/

function pimg_richnotes( id ) {
	return decor_fulllist ;
}

function pimg_widthinfos( r ) {
	if ( ( r.img ) && ( r.img.truewidth ) ) return { wfixed : true } ;
	return qsn_widthinfos( r , true ) ;
}

function qsn_addbutton ( target , js ) {
	var notekind = qsn_edittarget.notekind ;
	var text;
	if ( eval( notekind + "_message")[ js.buttontext ] ) text = eval( notekind + "_message")[ js.buttontext ] ;
	else if ( qsn_message[ js.buttontext ] ) text = qsn_message[ js.buttontext ] ;
	else text = js.buttontext ;
	return qsn_addleftcolelem( target , '<div style="text-align:center; margin-top:10px"><a href="#" class="button" onclick="' + js.buttonhandler + '( qsn_edittarget )"> ' + text + '</a></div>'  , "" ) ;
}

/*
function -
function WEB
*/

/*
function pimg_initforweb( id ) {
	var d = gebcn( ge( id ) , "pimg_zoombutton" ) ;
	d.parentNode.onmouseover = function() { pimg_mouseoverimg( this ) ; } ;
	d.parentNode.onmouseout = function() { pimg_mouseoutimg( this ) ; } ;
}
*/

/*
function -
function TOOLBAR
*/

function pimg_toolbarversion() {
	return 1 ;
}

function pimg_toolbaroptions( elem ) {
	if ( ( window.pm_publicpage ) && ( pm_publicpage == true ) ) return [ ] ;
	return qsn_toolbaroptions( elem , true ).concat( [ "sendtobckg" ] ) ;
}

function pimg_helpnote() {
//	window.open( "http://aide.quomodo.com/les_smartnotes-la_smartnote_image" ) ;
	window.open( "http://" + qlub_help_pages[ "a_image" ] , "quomodo help" ) ;
}

/*
function -
function QWIZ
*/

function pimg_mergeqwizdata( notejson, noteqwizkeys, qwiz_data ) {
	var v ;
	for ( var x in noteqwizkeys ) {
		v = noteqwizkeys[ x ] ;
		if ( x == "img" ) {
			var imgdata = qwiz_data[ v ][ 0 ] ;
			if ( imgdata != undefined ) pimg_setimagejson( notejson, imgdata, notejson.spacedefaults.common.width ) ; // imgwidth donné par défaut pour éviter une erreur dans qsn_screenfilepath (cherche r.common qui n'existe pas encore)
		} else notejson[ x ] = qwiz_data[ v ] ;
	}
	return notejson ;
}

var pimg_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "pimg_js_loaded" ) ;


var poll_message = {
"poll" : "Sondage" ,
"results" : "Résultats" ,
"votes" : "Voir les choix" ,
"resultstitle" : "Cliquez pour voir les résultats des votes" ,
"votestitle" : "Cliquez pour revenir aux choix proposés" ,
"newnoteprompt" : "Cliquez ici pour rédiger le message de ce sondage" ,
"delete" : "Supprimer cette option" ,
"clicktovalidate" : "Cliquez pour cocher ou décocher cette réponse" ,
"editmodeclickoption" : "Pour voter, passez en mode membre ou visitez la page en mode visiteur. N'oubliez pas de publier d'abord la page si nécessaire !",
"editmodeshowresults" : "Pour consulter les résultats, passez en mode membre ou visitez la page en mode visiteur. N'oubliez pas de publier d'abord la page si nécessaire !",
"choiceneedtovote" : "Vous devez choisir avant de voter" ,
"snname" : "Note Sondage" ,
"plug" : "Sondage_Réalisez un sondage avec choix multiples auprès de vos visiteurs." ,
"desc" : "(...)" , 
"fixedchoice" : "%c choix possibles" ,
"multiplechoice" : "Plusieurs choix possibles" ,
"simplechoice" : "Un seul choix possible" ,
"any" : "(indifférent)" ,
"votedone" : "Vous avez déjà participé à ce sondage le %date. Vous ne pouvez plus voter." ,
"nooptions" : "Vous devez au moins proposer un choix pour afficher la note."
} ;

var poll_msgs_fr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "poll_msgs_fr_js_loaded" ) ;

var poll_templates_prepared = false ;
var poll_leftcol_prepared = false ;

//var poll_json_template = {version:1,text:"",color:"3",textsize:"2",textfont:"1",textbold:"0",textcenter:"0",textitalic:"0",headerdisplay:"1",header:{color:"0",text:""},signature:"0",options:{},multiplechoice:"true"}

var poll_json_template = { version : 3 ,  text : "" , color : "rgb(100%,100%,100%)" , header : { display : "true" , color: "c1", text : "", icon : "pushpin" } , showsignature : "false" , options: { } , multiplechoice : "true" , textstyles: { size : "1" , font : "0" , bold : "false" , italic : "false" , center : "false" } } ; 
//version 3 suite à un mauvais passage à a version 2 pour textstyles.size

// multiplechoice : "true" = autant qu'on veut, "false" = "1"

var poll_colordesc = { "qmc1" : "color" , "qmc2_qmc1" : "header.color" , "qmc3" : poll_qmc3 } ; 
var poll_textdesc = { "qtxt1" : { "size" : "textstyles.size" , "font" : "textstyles.font" ,  "bold" : "textstyles.bold" , "center" : "textstyles.center" , "italic" : "textstyles.italic" }  };

var poll_leftcol_description = [
{ what : "notecolor" , tabname : "tabcolor" , visible : true , elems : [ 
	{ handler : "qsn_addqlubcolorblock" , params : { jsonpath : "color" , others : true ,  transparent:true , title:false , menuseparator: false , modifynote : "qsn_setcolors"  } } 
	] } , 
{ what : "bandeau" , tabname : "tabheader" , visible : false , elems : [ 
	{ handler : "qsn_addheaderhideshow" , params : { notekind:"poll" , title:"" , jsonpath : "header.display" } } ,
	{ handler : "qsn_addheadercolor" , params : { jsonpath : "header.color" } }
	] } , 
{ what : "textstyles" , tabname : "tabtext" , visible : false , elems : [ 
	{ handler : " qsn_addfontfsizes"   , params : { jsonpath : "textstyles.size" , ncols : 2  } } ,
	{ handler : " qsn_addfontfamilies"   , params : { jsonpath : "textstyles.font" , ncols : 2  } } ,
	{ handler : "qsn_addtextoptions"     , params : { jsonpath : "textstyles" , ncols : 2 , opts : [ "bold" , "center" , "italic"  ] } }
	] } , 
{ what : "signature" , tabname : "tabsignature" , visible : false , elems : [ 
	{ handler : "qsn_addsignature" , params : { jsonpath : "showsignature" , ncols : 1} } 
	] }
] ;

function poll_qmc3( r ) {
//	if ( ! r.header.icon ) return null ; //on ne peut pas ne pas avoir d'icon
	return "/services/poll/images/poll48.png" ;
}

function poll_upgradejson( r ) {
	if ( ( r.version ) && ( r.version == poll_json_template.version ) ) return r ;
	if ( r.version<2 ) poll_upgradejsontov2( r ) ;
	if ( r.version<3 ) poll_upgradejsontov3( r ) ;
	r.version = poll_json_template.version;
	return r ;
}

function poll_upgradejsontov2( r ) {
	r.textstyles = { size: String( Math.max( Math.min( 3 - parseInt( r.textsize , 10 ) , 2 ) , 0 ) ) , font:r.textfont, bold : String( r.textbold !=0 ) , center : String( r.textcenter != 0 ) , italic : String( r.textitalic !=0 ) } ;
	r.header.display = String( r.headerdisplay == 1 ) ;
	r[ "showsignature" ] = String( r.signature !=0 ) ;
	delete r.textsize ;
	delete r.textfont ;
	delete r.textbold ;
	delete r.textcenter ;
	delete r.textitalic ;
	delete r.headerdisplay ;
	delete r.signature ;
	return r ;
}

function poll_upgradejsontov3( r ) {
	r.textstyles.size = String( Math.max( Math.min( parseInt( r.textstyles.size , 10 ) , 2 ) , 0 ) ) ;
	return r ;
}

/*
function -
function RENDER
*/

function poll_template( id ) {
	if ( poll_templates_prepared ) return qsn_template( id , true ) ;
	qsn_installcontainer( "view" , "poll" , ge( "poll_notecontent" ).innerHTML ) ;
	var div = qsn_installcontainer( "edit" , "poll" , ge( "poll_notecontent_edit" ).innerHTML ) ;
	poll_templates_prepared = true ;
	return qsn_template( id , true ) ;
}

function poll_renderhtml( noteid ) {
	var div = ge( noteid ) ;
	div.minWidth = "200px" ;
	var r = qsn_thenotes[ noteid ] ;
	if ( qsn_currstate != "edit" ) {
		gebcn( div , "poll_text" ).innerHTML = r.text ;
	} else {
		var t = gebcn( div , "poll_text" ) ;
		t.value = r.text ;
		qsn_blurdefault ( t ) ;
	}
	qsn_container_renderhtml( div , r ) ;
	poll_renderoptions( div, r ) ;
	poll_rendermultiplechoice( div, r ) ;
	qsn_settextproperties( noteid ) ;
	qsn_setcolors( noteid ) ;
	if ( qsn_currstate == "edit") poll_appendoption( div , "edit");
}

function poll_renderoptions( div, r ) {
	if ( ! r ) r = qsn_thenotes[ div.id ] ;
	xpoll_renderoptions( div, r, "" ) ;
}

function xpoll_renderoptions( div, r, optionToCheck ) {
	if ( ! r ) r = qsn_thenotes[ div.id ] ;
	var options = poll_sortoptionsbyid( r.options ) ;
	if ( qsn_currstate != "edit" ) gebcn( div , "poll_results" ).style.display = "none" ;
	var thelist = gebcn( div , "poll_options" ) ;
	while ( thelist.childNodes.length > 0 ) thelist.removeChild( thelist.firstChild ) ;	
	thelist.style.display = "block" ;
	for ( var i=0; i<options.length; i++ ) xpoll_appendoption( div, qsn_currstate, options[ i ][ 0 ], options[ i ][ 1 ] , optionToCheck ) ;
}

function poll_renderresults( div, r ) {
	if ( ! r ) r = qsn_thenotes[ div.id ] ;
	var n = poll_sortoptionsbyid( r.options ).length ;
	var divwait = gebcn( div , "poll_wait" ) ;
	if ( divwait ) divwait.style.height = Math.max( 30 * n , 30 ) + "px" ;
	hideshowblock( gebcn( div, "poll_options" ) , divwait ) ;
	document.mainform.mission.value = "getdataSNweb" ;
	q_ajaxsubmit( { noteid : r.common.noteid }, poll_renderresults_callback) ; 
}

function poll_renderresults_callback( x ) {
	var r = qsn_thenotes[ x.noteid ] ;
	var div = ge( x.noteid ) ;
	var options = poll_sortoptionsbyid( r.options ) ;
	var thelist = gebcn( div , "poll_results" ) ;
	while ( thelist.childNodes.length > 0 ) thelist.removeChild( thelist.firstChild ) ;	
	hideshowblock( gebcn( div, "poll_wait" ) , thelist ) ;
	var t = document.createElement( "TABLE" ) ;
	t.cellSpacing = "0" ;
	t.cellPadding = "0" ;
	t.width = "100%" ;
	var div = gebcn( ge(x.noteid) , "poll_results" ) ;
	t = div.appendChild( t ) ;
	for ( var i=0; i<options.length; i++ ) {
		var tr = t.insertRow( -1 ) ;
		var td = tr.insertCell( -1 ) ;
		td.height = "30" ;
		td.vAlign = "middle" ;
		poll_appendresult( td , x , options[ i ][ 0 ] ) ;
	}
}

function poll_appendresult( td , x , voteoption ) {	
	var pourcent = ( ( x.votecount > 0 ) && ( x.options[ voteoption ] ) ) ? Math.round( ( x.options[ voteoption ] / x.votecount ) * 100 ) : 0 ;
	var t = document.createElement( "TABLE" ) ;
	t.cellSpacing = "0" ;
	t.cellPadding = "0" ;
	t.width = "100%" ;
	t.onmousedown = function( event ) { q_stopPropagation( event ) ; } ;
	t.className = "poll_result" ;
	t = td.appendChild( t ) ;

	var tr = t.insertRow( -1 ) ;
	var td1 = tr.insertCell( -1 ) ;
	td1.width = "100%" ;
	td1.className = "pngscale poll_scorebckg" ;
	var scorebar = document.createElement( "DIV" ) ;
	scorebar.className = "pngscale poll_scorebar" ;
	scorebar = td1.appendChild( scorebar ) ;
	scorebar.style.width = "0%" ;
	applyresize( scorebar , pourcent , 5 , "+" ) ;

	var scoretext = document.createElement( "DIV" ) ;
	scoretext.className = "poll_scoretext" ;
	var nbvotes = ( x.options && x.options[ voteoption ] ) ? x.options[ voteoption ] : 0 ;
	scoretext.innerHTML = "(" + pourcent + "% ~ " + nbvotes + "/" + x.votecount + ") " + qsn_thenotes[ x.noteid ].options[ voteoption ] ;
	scoretext = td.appendChild( scoretext ) ;
}

function poll_rendermultiplechoice( div, r ) {
	var c = gebcn( div , "poll_multiplechoice" ) ;
	if ( qsn_currstate == "edit" ) poll_constructchoice( div , r ) ;
	else {
		var n = poll_countoptions( div , r ) ;
		visibleblock( gebcn( div , "poll_multiplechoice" ) , n > 1 ) ;
		if ( n < 2 ) return ;
		if ( r.multiplechoice == "true" ) c.innerHTML = poll_message[ "multiplechoice" ] ; 
		else if ( r.multiplechoice == "false" ) c.innerHTML = poll_message[ "simplechoice" ] ; 
		else if ( r.multiplechoice == "1" ) c.innerHTML = poll_message[ "simplechoice" ] ; 
		else if ( r.multiplechoice < n ) c.innerHTML = poll_message[ "fixedchoice" ].replace("%c" , r.multiplechoice ) ;
		else if ( r.multiplechoice > ( n - 1 ) ) c.innerHTML = poll_message[ "multiplechoice" ] ;
		else {
			c.innerHTML = "(désolés, une erreur est survenue)" ;
			debugmail( "poll.js/r.multiplechoice = " + r.multiplechoice ) ;
		}
	}
}

/*
function -
function EDIT
*/

function poll_saveedit( ) {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	r.text = gebcn( qsn_edittarget , "poll_text" ).value ;
	if ( r.text == poll_message[ "newnoteprompt" ] ) r.text = "" ;
	
	var inp = gebcn( qsn_edittarget , "poll_options" ).getElementsByTagName( "INPUT" ) ;
	var o, options = {} ;
	for (var i=0; i < inp.length; i++ ) {
		o = inp[ i ] ;
		if ( o.value != "" ) options[ o.id ] = o.value ;
	}
	r.options = options ;
	if (options.length == 0) {
		alert( poll_message["nooptions"] );
		return false;
	}
	qsn_container_saveedit() ;
	qsn_saveedit( true ) ;
}

function poll_setmultiplechoice( x ) {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	r.multiplechoice = x.value ;
}

function poll_displaysettings() {
	qsn_initdisplaysetting() ;
	return false ;
}

/*
function -
function OPTIONS
*/

function poll_appendoption( div, mode, id, value ) {
	 xpoll_appendoption( div, mode, id, value , "" );
}

function xpoll_appendoption( div, mode, id, value, optionToCheck ) { // ajoute une option en mode edit
	if ( ! div ) div = qsn_edittarget ;
	if ( ! mode ) mode = "edit" ;
	if ( ! id ) id = "" + new Date().getTime() ;
	if ( ! value ) value = "" ;
	var r = qsn_thenotes[ div.id ] ;
	var optionlist = gebcn( div , "poll_options" ) ;
	
	if ( mode == "edit" ) {
		var o = create_elem( "INPUT", { type : "text", id : id, value : value } ) ;
		o.onmousedown = function( event ) { q_stopPropagation( event ) ; } ;
		o.onblur = function() { poll_constructchoice( getContainer( this ) ) ; } ;
	} else {
		var o = create_elem( "LI", { className : "poll_option_name" , innerHTML : value , style : { listStyleType:"none", marginLeft : "0px"}} ) ;
	}
	
	var t = document.createElement( "TABLE" ) ;
	t.border = "0" ;
	t.cellSpacing = "0" ;
	t.cellPadding = "0" ;
	t.width = "100%" ;
	if ( mode != "edit" ) {
		t.id = id ;
		t.onmousedown = function( event ) { q_stopPropagation( event ) ; } ;
		t.onmouseover = function( ) { q_mouseoverbutton( this.rows[ 0 ].cells[ 0 ].getElementsByTagName( "DIV" )[ 0 ] ) ; } ;
		t.onmouseout = function( ) { q_mouseoutbutton( this.rows[ 0 ].cells[ 0 ].getElementsByTagName( "DIV" )[ 0 ] ) ; } ;
		t.onclick = function( ) { q_mouseoutbutton( this.rows[ 0 ].cells[ 0 ].getElementsByTagName( "DIV" )[ 0 ] ) ; poll_clickoption( this ) ; } ;
		t.title = poll_message[ "clicktovalidate" ] ;
		if ( optionToCheck == "" ) t.className = ( ( r.members[ memberid ] ) && ( r.members[ memberid ].search( id ) != -1 ) ) ? "poll_option_on poll_an_option" : "poll_option_off poll_an_option" ;
		else {
			t.className = ( optionToCheck.search( id ) != -1 ) ? "poll_option_on poll_an_option" : "poll_option_off poll_an_option" ;
		}
	}
	
	var tr = t.insertRow( -1 ) ;
	var td1 = create_td( tr, { height : "30" } );
	var d = create_elem( "DIV" ) ;
	if ( mode == "edit" ) {
		td1.width = "28" ;
		d.className = "png poll_option_left_edit" ;
	} else {
		td1.width = "30" ;
		d.className = "pngbtn poll_option_left" ;
	}
	td1.appendChild( d ) ;
	
	var td2 = create_td( tr, { height : "30" } );
	var d = create_elem( "DIV" ) ;
	d.className = ( mode == "edit" ) ? "pngscale poll_option_inter_edit" : "pngscale poll_option_inter" ;
	o = d.appendChild( o ) ;
	td2.appendChild( d ) ;
	
	var td3 = create_td( tr, { height : "30" } );
	var d = document.createElement( "DIV" ) ;
	if ( mode == "edit" ) {
		td3.width = "32" ;
		d.className = "png poll_option_right_edit" ;
		d.title = poll_message[ "delete" ] ;
		d.onmousedown = function( event ) { q_stopPropagation( event ) ; } ;
		d.onclick = function( ) { poll_deleteoption( this ) ; return false ; } ;
	} else {
		td3.width = "18" ;
		d.className = "png poll_option_right" ;
	}
	td3.appendChild( d ) ;
	
	optionlist.appendChild( t ) ;
	if ( mode == "edit" ) {
		o.focus() ;
		poll_constructchoice( div , r ) ; 
	}
}

function poll_deleteoption( x ) {
	var div =  getContainer( x ) ;
	q_deleteRow( x.parentNode.parentNode ) ;	
	poll_constructchoice( div , qsn_thenotes[ div.id ] )
}

function poll_clickoption( x ) {
	if ( document.mainform.pagemode && document.mainform.pagemode.value == "edit" ) return alert( poll_message[ "editmodeclickoption" ] ) ;	
	var div = getContainer( x ) ;
	var noteid = div.id ;
	var r = qsn_thenotes[ noteid ] ;
	var memberoptions = r.members[ memberid ] ;
	if ( /poll_option_off/.test( x.className ) ) {
		if ( r.multiplechoice == "true" ) {
			x.className = "poll_option_on poll_an_option" ;
		} else if ( r.multiplechoice == "false" || r.multiplechoice == "1" ) {
			var t = x.parentNode.getElementsByTagName( "TABLE" ) ;
			for ( var i=0; i<t.length; i++ ) {
				t[ i ].className = ( t[ i ] == x ) ? "poll_option_on poll_an_option" : "poll_option_off poll_an_option" ;
			}
		} else if ( r.multiplechoice > 1 ) {
			var options_on = getElementsByClassName( div , "poll_option_on" ) ;
			if ( options_on.length >= r.multiplechoice ) return ;
			x.className = "poll_option_on poll_an_option" ;
		}
	} else { 
		x.className = "poll_option_off poll_an_option" ;
	}
	if ( isie6( ) ) {
		var optionToCheck = "" ;
		var t = x.parentNode.getElementsByTagName( "TABLE" ) ;
		for ( var i=0; i<t.length; i++ ) if ( t[ i ].className == "poll_option_on poll_an_option" ) optionToCheck = optionToCheck + " " +t[ i ].id ;
		xpoll_renderoptions( div, qsn_thenotes[ div.id ] , optionToCheck ) ;
	}
}

function poll_hideshowresults( x ) {
	if ( document.mainform.pagemode && document.mainform.pagemode.value == "edit" ) return alert( poll_message[ "editmodeshowresults" ] ) ;
	var div = getContainer( x ) ;
	var targetmode = x.getAttribute( "targetmode" ) || "results" ;
	if ( targetmode == "results" ) {
		poll_renderresults( div ) ;
		hideblock( gebcn( div, "poll_btntd" ) );
		x.setAttribute( "targetmode" , "votes" ) ;
		targetmode = "votes" ;
	} else {
		if ( window.web_js_loaded ) hideshowblock( gebcn( div , "poll_results" ) , gebcn( div , "poll_options" ) ) ;
		else poll_renderoptions( div ) ;
		showblock( gebcn( div, "poll_btntd" ) );
		x.setAttribute( "targetmode" , "results" ) ;
		targetmode = "results" ;
	}
	q_innerHTML( x , poll_message[ targetmode ] );
	x.title = poll_message[ targetmode + "title" ] ;
}

/*
function -
function UTILES
*/

function poll_sortoptionsbyid( opt ) {  // tri des options dans l'ordre des ids
	var options = [ ] ;
	for ( var o in opt ) options[ options.length ] = [ o, opt[ o ] ] ;
	return options.sort( poll_numsort ) ;
}

function poll_numsort( a, b ) {
	return ( a[ 0 ] - b[ 0 ] ) ;
}

function poll_countoptions( div , r ) {
	var n = 0 ;
	if ( qsn_currstate == "edit" ) {
		var inp = gebcn( div  , "poll_options" ).getElementsByTagName( "INPUT" ) ;
		for ( var i=0; i < inp.length; i++ ) if ( inp[ i ].value != "" ) n++ ;
	} else for ( var x in r.options ) n++ ;
	return n ;
}

function poll_constructchoice( div , rr  ) {
	var r = rr || qsn_thenotes[ div.id ] ;
	if ( r.multiplechoice == "0" ) r.multiplechoice = "1" ; // réparation
	var choice = ge ( "poll_nbchoix" , div ) ; 
	choice.innerHTML = "" ;
	var n = poll_countoptions( div , r ) ;
	visibleblock( gebcn( div , "poll_multiplechoice" ) , n > 1 ) ;
	if ( n < 2 ) return ;
	for ( var i = 0 ; i < n ; i++ ) {
/*
// vh : pour supprimer indifférent et mettre le nombre de choix total possible suite remaqrque ds
		if ( i < (n - 1 ) ) choice.options[ i ] = new Option( i+1 , i+1 );
		else choice.options[ i ] = new Option( poll_message[ "any" ] , "true" ) ;
*/
		choice.options[ i ] = new Option( i+1 , i+1 ) ;
	}
	if ( r.multiplechoice == "true" ) choice.options[ n - 1 ].selected = "selected" ; 
	else if ( r.multiplechoice == "false" ) choice.options[ 0 ].selected = "selected" ; 
	else if ( r.multiplechoice < n ) choice.options[ r.multiplechoice - 1 ].selected = "selected" ;
	else choice.options[ n - 1 ].selected = "selected" ; 
}

/*
function -
function VOTES
*/


function poll_vote( x ) {
	if ( ! document.mainform ) return ;
	if ( document.mainform.pagemode && document.mainform.pagemode.value == "edit" ) return alert( poll_message[ "editmodeclickoption" ] ) ;
	var id = getContainer( x ).id ;
	var cookieid = ( document.mainform.q_space.value.substring( 0 , 8 ) ) + "-" + /#([0-9]*)#/.exec(currsvcid)[1] + id ;
	var cook = getcookie( cookieid ) ;
     	if ( cook ) {
		var thedate = new Date( ) ;
		thedate.setTime( cook ) ;
		thedate = twodigs(thedate.getDate()) + "." + twodigs(thedate.getMonth()) + "." + thedate.getFullYear() ;
		alert( poll_message[ "votedone" ].replace( /%date/ , thedate ) ) ;
		return ; 
	}
	//on récupére la liste des options (class radio)
	var t = gebcn( id , "poll_options" ) ;
	var r = qsn_thenotes[ id ] ;
	var radio = getElementsByClassName( t , "poll_an_option" ) ;
	var radio_on = getElementsByClassName( t , "poll_option_on"  ) ;
	var n = radio_on.length ;
	if ( n == 0 ) {
		alert( poll_message[ "choiceneedtovote" ] ) ; 
		return false ;
	}
	var memberoptions = "" ;
	for ( var i = 0 ; i < n ; i++ ) memberoptions += ( ( i == 0 ) ? "" : "-" ) + radio_on[ i ].id ;
	//cookie pour ne pas pouvoir revoter.
	setcookie( cookieid, new Date().getTime(), 30 ) ;
	document.mainform.mission.value = "updatedataSNweb" ;
	q_ajaxsubmit( { noteid : id , theids : memberoptions.split("-") } ) ; 			
/*
	for ( var i=0 ; i<radio.length; i++) {	
		if (/poll_option_on/.test(radio[i].className ) ) { // si réponse selectionné
			var IdReponse = radio[i].id;
			var listReponse = gebcn( radio[ i ] , "poll_option_name" );
			var LaReponse = listReponse.innerHTML;
			document.mainform.mission.value = "updatedataSNweb" ;
			q_ajaxsubmit( { noteid : id , theid : IdReponse , thename : LaReponse } ) ; 			
			
			//ajout des personnes ayant voté ds le json 
			if ( r.multiplechoice == "true" ) {
				memberoptions += "-" + radio[i].id ;
			} else { // 1 seule option
				memberoptions =  "-" + radio[i].id ;
			}
		}
	}
*/
	r.members[ memberid ] = memberoptions ;
	if ( ! window.web_js_loaded ) qsn_notechanged( id , "viewnotechanged" ) ;
	
	//On supprime l'interface de vote et on affiche un remerciment
	hideshowblock(gebcn( ge(id) , "poll_resultsbtn" ) ,gebcn( ge(id) , "poll_vote_done" ));
}

function poll_initforweb( id ) {
	hideshowblock( gebcn( id , "poll_vote_done" ) , gebcn( id , "poll_resultsbtn" ) );
	var options = getElementsByClassName( id , "poll_an_option" ) ;
	var t ;
	for ( var i = 0 ; i < options.length ; i++ ) {
		t = options[ i ] ;
		t.className = "poll_option_off poll_an_option" ;
		t.onmouseover = function( ) { q_mouseoverbutton( this.rows[ 0 ].cells[ 0 ].getElementsByTagName( "DIV" )[ 0 ] ) ; } ;
		t.onmouseout = function( ) { q_mouseoutbutton( this.rows[ 0 ].cells[ 0 ].getElementsByTagName( "DIV" )[ 0 ] ) ; } ;
		t.onclick = function( ) { q_mouseoutbutton( this.rows[ 0 ].cells[ 0 ].getElementsByTagName( "DIV" )[ 0 ] ) ; poll_clickoption( this ) ; } ;
	}
}

/*
function -
function TOOLBAR
*/

function poll_toolbarversion() {
	return 1 ;
}

function poll_helpnote() {
//	window.open( "http://aide.quomodo.com/les_smartnotes-la_smartnote_sondage" );
	window.open( "http://" + qlub_help_pages[ "a_poll" ] , "quomodo help" ) ;
}

var poll_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "poll_js_loaded" ) ;


var rss_message = {
"deleteprompt" : "Etes-vous sûr de vouloir supprimer ce fil RSS ?",
"notetitleprompt" : "Entrez le titre de la note",
"exist" : "Ce fil RSS figure déjà dans la liste",
"howto" : "comment ça marche ?",
"chosenews" : "Choisissez votre groupe d'actualités",
"cancel" : "annuler",
"validate" : "ok" ,
"close" : "fermer",
"confirmdelete" : "Etes-vous sûr de vouloir supprimer ce flux RSS de votre liste : ",
"notyet" : "Cette fonction n'est pas encore disponible",
"plug" : "RSS_Affichez les infos de vos sites préférés avec leurs fils RSS." ,
"nourl" : "Veuillez rentrer une adresse pour le flux." , 
"norss" : "Veuillez renseigner au moins un flux RSS, ou cliquez sur annuler." , 
"taboptions" : "Options de la note" ,
"displaydesc" : "Afficher le contenu des articles" ,
"displaydate" : "Afficher la date de chaque article" ,
"nbfeed" : "Nb d'articles par page : ", 
"invalidfeed" : "Cette adresse ne correspond pas à un flux RSS. Merci de réessayer avec une autre adresse."
} ;

var rss_default_feeds = { 
"Billard" : [
 { name : "FFBillard (Billard) - Info Fédé", url : "http://www.ffbillard.com/index.php?option=com_rss&feed=RSS2.0&no_html=1" }
],
"Boxe" : [
 { name : "Sport.fr - Boxe", url : "http://www.sport.fr/rss/rss.aspx?sport=17" },
 { name : "Sport365 - Les Brèves - Boxe", url : "http://www.sport365.fr/rss/filinfo.xml?collection=1429" },
 { name : "Sport365 - Les Articles - Boxe", url : "http://www.sport365.fr/rss/filinfo.xml?collection=1365" },
 { name : "Sport24 - Boxe", url : "http://www.sport24.com/rss/288" },
 { name : "Eurosport - Boxe", url : "http://www.eurosport.fr/boxe/rss-flash.xml" }
]
,
"Judo" : [
 { name : "Sport365 - Les Brèves - Judo", url : "http://www.sport365.fr/rss/filinfo.xml?collection=1435" },
 { name : "Sport365 - Les Articles - Judo", url : "http://www.sport365.fr/rss/filinfo.xml?collection=1371" }
],
"Tennis" : [
 { name : "Sport.fr - Tennis", url : "http://www.sport.fr/rss/rss.aspx?sport=88" },
 { name : "Sport.fr - Roland Garros", url : "http://www.sport.fr/rss/rss3.aspx?sport=2571" },
 { name : "Sport365 - Les Brèves - Tennis", url : "http://www.sport365.fr/rss/filinfo.xml?collection=1348" },
 { name : "Sport365 - Les Articles - Tennis", url : "http://www.sport365.fr/rss/filinfo.xml?collection=140" },
 { name : "Sport24 - L'intégrale Tennis", url : "http://www.sport24.com/rssfeeds/sport24-tennis.xml" },
 { name : "Sport24 - Tennis - ATP", url : "http://www.sport24.com/rss/118" },
 { name : "Sport24 - Tennis - WTA", url : "http://www.sport24.com/rss/122" },
 { name : "Sport24 - Tennis - Coupe Davis", url : "http://www.sport24.com/rss/126" },
 { name : "Sport24 - Tennis - Fed Cup", url : "http://www.sport24.com/rss/128" },
 { name : "Sport24 - Tennis - Roland Garros", url : "http://www.sport24.com/rss/133" },
 { name : "Sport24 - Tennis - Open Australie", url : "http://www.sport24.com/rss/129" },
 { name : "Sport24 - Tennis - US Open", url : "http://www.sport24.com/rss/2186" },
 { name : "Sport24 - Tennis - Wimbledon", url : "http://www.sport24.com/rss/137" },
 { name : "Eurosport - Tennis", url : "http://www.eurosport.fr/tennis/rss-flash.xml" },
 { name : "L'équipe - Tennis", url : "http://www.lequipe.fr/Xml/Tennis/Titres/actu_rss_Tennis.xml" },
 { name : "France 2 - Tennis", url : "http://feeds.feedburner.com/France2-Sport-Tennis" },
 { name : "Le Figaro - Tennis", url : "http://www.lefigaro.fr/rss/figaro_tennis.xml " }
],
"Basket" : [
 { name : "Sport.fr - Basket France/Europe", url : "http://www.sport.fr/rss/rss.aspx?sport=12" },
 { name : "Sport.fr - Basket NBA", url : "http://www.sport.fr/rss/rss.aspx?sport=132" },
 { name : "Sport365 - Les Brèves - Basket", url : "http://www.sport365.fr/rss/filinfo.xml?collection=1347" },
 { name : "Sport365 - Les Articles - Basket", url : "http://www.sport365.fr/rss/filinfo.xml?collection=139" },
 { name : "Sport24 - L'intégrale Basket/NBA", url : "http://www.sport24.com/rssfeeds/sport24-basket.xml" },
 { name : "Sport24 - Basket/NBA - Pro A", url : "http://www.sport24.com/rss/150" },
 { name : "Sport24 - Basket/NBA - NBA", url : "http://www.sport24.com/rss/154" },
 { name : "Sport24 - Basket/NBA - Euroligue", url : "http://www.sport24.com/rss/157" },
 { name : "Sport24 - Basket/NBA - Euro 200", url : "http://www.sport24.com/rss/2103" },
 { name : "Eurosport - Basket", url : "http://www.eurosport.fr/basketball/rss-flash.xml" },
 { name : "L'équipe - Basket", url : "http://www.lequipe.fr/Xml/Basket/Titres/actu_rss_Basket.xml" },
 { name : "L'équipe - Handball", url : "http://www.lequipe.fr/Xml/Basket/Titres/actu_rss_Hand.xml" },
 { name : "L'équipe - Volley", url : "http://www.lequipe.fr/Xml/Basket/Titres/actu_rss_Volley.xml" },
 { name : "France 2 - Basket, Hand et Volley", url : "http://feeds.feedburner.com/France2-Sport-BasketHandVolley" },
 { name : "Le Figaro - Basket", url : "http://www.lefigaro.fr/rss/figaro_basket.xml" },
 { name : "Google news - Basket", url : "http://news.google.com/news?ned=fr&hl=fr&ned=fr&q=basket&ie=UTF-8&output=rss" }
],
"Football" : [
 { name : "Sport.fr - Football", url : "http://www.sport.fr/rss/rss.aspx?sport=31" },
{ name : "Sport.fr - Ligue 1", url : "http://www.sport.fr/rss/rss3.aspx?sport=4221" },
 { name : "Sport.fr - Ligue des champions", url : "http://www.sport.fr/rss/rss3.aspx?sport=147" },
 { name : "Sport.fr - Equipe de France", url : "http://www.sport.fr/rss/rss3.aspx?sport=975" },
 { name : "Sport.fr - Euro 2008", url : "http://www.sport.fr/rss/rss3.aspx?sport=1184" },
 { name : "Sport365 - Les Brèves - Football", url : "http://www.sport365.fr/rss/filinfo.xml?collection=34" },
 { name : "Sport365 - Les Articles - Football", url : "http://www.sport365.fr/rss/filinfo.xml?collection=33" },
 { name : "Sport24 - L'intégrale Football", url : "http://www.sport24.com/rssfeeds/sport24-football.xml" },
 { name : "Sport24 - Football - Ligue 1", url : "http://www.sport24.com/rss/60" },
 { name : "Sport24 - Football - Ligue 2", url : "http://www.sport24.com/rss/70" },
 { name : "Sport24 - Football - Coupe de France", url : "http://www.sport24.com/rss/78" },
 { name : "Sport24 - Football - Coupe de la Ligue", url : "http://www.sport24.com/rss/81" },
 { name : "Sport24 - Football - Championnats étrangers", url : "http://www.sport24.com/rss/84" },
 { name : "Sport24 - Football - Allemagne", url : "http://www.sport24.com/rss/995" },
 { name : "Sport24 - Football - Angleterre", url : "http://www.sport24.com/rss/996" },
 { name : "Sport24 - Football - Italie", url : "http://www.sport24.com/rss/1000" },
 { name : "Sport24 - Football - Espagne", url : "http://www.sport24.com/rss/999" },
 { name : "Sport24 - Football - Portugal", url : "http://www.sport24.com/rss/1002" },
 { name : "Sport24 - Football - Ligue des Champions", url : "http://www.sport24.com/rss/94" },
 { name : "Sport24 - Football - Coupe UEFA", url : "http://www.sport24.com/rss/101" },
 { name : "Sport24 - Football - Equipe de France", url : "http://www.sport24.com/rss/108" },
 { name : "Sport24 - Football - Euro 2008", url : "http://www.sport24.com/rss/4829" },
 { name : "Eurosport - Football", url : "http://www.eurosport.fr/football/rss-flash_sea70.xml" },
 { name : "L'équipe - Foot  ", url : "http://www.lequipe.fr/Xml/Football/Titres/actu_rss.xml" },
 { name : "L'équipe - Foot :transferts", url : "http://www.lequipe.fr/Xml/Football/Titres/actu_TRF_rss.xml" },
 { name : "France 2 - Football", url : "http://feeds.feedburner.com/France2-Sport-Football" },
 { name : "Le Figaro - Football", url : "http://www.lefigaro.fr/rss/figaro_football.xml " }
],
"Handball" : [
 { name : "Sport.fr - Handball", url : "http://www.sport.fr/rss/rss.aspx?sport=40" },
 { name : "Sport365 - Les Brèves - Handball", url : "http://www.sport365.fr/rss/filinfo.xml?collection=1434" },
 { name : "Sport365 - Les Articles - Handball", url : "http://www.sport365.fr/rss/filinfo.xml?collection=1370" },
 { name : "Sport24 - L'intégrale Handball", url : "http://www.sport24.com/rssfeeds/sport24-handball.xml" },
 { name : "Sport24 - Handball - Division 1", url : "http://www.sport24.com/rss/269" },
 { name : "Sport24 - Handball - Mondial 2007", url : "http://www.sport24.com/rss/31228" },
 { name : "L'équipe - Handball", url : "http://www.lequipe.fr/Xml/Basket/Titres/actu_rss_Hand.xml" },
 { name : "France 2 - Basket, Hand et Volley", url : "http://feeds.feedburner.com/France2-Sport-BasketHandVolley" }
],
"Hockey sur Glace" : [
 { name : "Sport24 - L'intégrale Hockey/NHL", url : "http://www.sport24.com/rss/290" },
 { name : "FFHockey (Hockey) - Info Fédé", url : "http://www.ffhockey.org/index2.php?option=com_rss&feed=RSS2.0&no_html=1" }
],
"Rugby" : [
 { name : "Sport.fr - Rugby", url : "http://www.sport.fr/rss/rss.aspx?sport=68" },
 { name : "Sport365 - Les Brèves - Rugby", url : "http://www.sport365.fr/rss/filinfo.xml?collection=10" },
 { name : "Sport365 - Les Articles - Rugby", url : "http://www.sport365.fr/rss/filinfo.xml?collection=1" },
 { name : "Sport24 - L'intégrale Rugby", url : "http://www.sport24.com/rssfeeds/sport24-rugby.xml" },
 { name : "Sport24 - Rugby - Top 14", url : "http://www.sport24.com/rss/169" },
 { name : "Sport24 - Rugby - H Cup", url : "http://www.sport24.com/rss/174" },
 { name : "Sport24 - Rugby - VI Nations", url : "http://www.sport24.com/rss/177" },
 { name : "Eurosport - Rugby  ", url : "http://www.rugbyrama.fr/z/rugby/rss.xml" },
 { name : "RugbyRama - Général", url : "http://www.rugbyrama.fr/z/rugby/rss.xml" },
 { name : "RugbyRama - Top 14", url : "http://www.rugbyrama.fr/z/rugby/top-14/2007-2008/rss.xml " },
 { name : "RugbyRama - Pro D2", url : "http://www.rugbyrama.fr/z/rugby/pro-d2/2007-2008/rss.xml" },
 { name : "RugbyRama - TriNation", url : "http://www.rugbyrama.fr/z/rugby/tri-nations/2007/rss.xml" },
 { name : "L'équipe - Rugby", url : "http://www.lequipe.fr/Xml/Rugby/Titres/actu_rss.xml" },
 { name : "France 2 - Rugby", url : "http://feeds.feedburner.com/France2-Sport-Rugby" },
 { name : "Le Figaro - Rugby", url : "http://www.lefigaro.fr/rss/figaro_rugby.xml" }
],
"Volleyball" : [
 { name : "Sport.fr - Volley", url : "http://www.sport.fr/rss/rss.aspx?sport=122" },
 { name : "Sport365 - Les Brèves - Volley", url : "http://www.sport365.fr/rss/filinfo.xml?collection=1442" },
 { name : "Sport365 - Les Articles - Volley", url : "http://www.sport365.fr/rss/filinfo.xml?collection=1378" },
 { name : "Sport24 - L'intégrale Volley", url : "http://www.sport24.com/rssfeeds/sport24-volley.xml" },
 { name : "Sport24 - Volley - Pro A", url : "http://www.sport24.com/rss/274" },
 { name : "L'équipe - Volley", url : "http://www.lequipe.fr/Xml/Basket/Titres/actu_rss_Volley.xml" },
 { name : "France 2 - Basket, Hand et Volley", url : "http://feeds.feedburner.com/France2-Sport-BasketHandVolley" }
],
"Athlétisme" : [
 { name : "Sport.fr - Athlétisme", url : "http://www.sport.fr/rss/rss.aspx?sport=4" },
 { name : "Sport365 - Les Brèves - Athlétisme", url : "http://www.sport365.fr/rss/filinfo.xml?collection=1428" },
 { name : "Sport365 - Les Articles - Athlétisme", url : "http://www.sport365.fr/rss/filinfo.xml?collection=1364" },
 { name : "Sport24 - L'intégrale Athlétisme", url : "http://www.sport24.com/rssfeeds/sport24-athletisme.xml" },
 { name : "L'équipe - Athlé", url : "http://www.lequipe.fr/Xml/Aussi/Titres/actu_rss_Athletisme.xml" },
 { name : "France 2 - Athlétisme", url : "http://feeds.feedburner.com/France2-Sport-Athletisme" }
],
"Cyclisme" : [
 { name : "Sport.fr - Cyclisme", url : "http://www.sport.fr/rss/rss.aspx?sport=27" },
 { name : "Sport.fr - Tour de France", url : "http://www.sport.fr/rss/rss3.aspx?sport=99" },
 { name : "Sport365 - Les Brèves - Cyclisme", url : "http://www.sport365.fr/rss/filinfo.xml?collection=1349" },
 { name : "Sport365 - Les Articles - Cyclisme", url : "http://www.sport365.fr/rss/filinfo.xml?collection=162" },
 { name : "Eurosport - Cyclisme", url : "http://www.eurosport.fr/cyclisme/rss-flash.xml" },
 { name : "L'équipe - Cyclisme", url : "http://www.lequipe.fr/Xml/Cyclisme/Titres/actu_rss.xml" },
 { name : "France 2 - Cyclisme", url : "http://feeds.feedburner.com/France2-Sport-Cyclisme" },
 { name : "Le Figaro - Cyclisme", url : "http://www.lefigaro.fr/rss/figaro_cyclisme.xml" }
],
"Danse" : [
 { name : "FFDCountry (Danse Country) - Info fédé", url : "http://www.ffdcountry.com/index.php?option=com_rss&feed=RSS2.0&no_html=1" }
],
"Golf" : [
 { name : "Sport.fr - Golf", url : "http://www.sport.fr/rss/rss.aspx?sport=37" },
 { name : "Sport365 - Les Brèves - Golf", url : "http://www.sport365.fr/rss/filinfo.xml?collection=1432" },
 { name : "Sport365 - Les Articles - Golf", url : "http://www.sport365.fr/rss/filinfo.xml?collection=1368" },
 { name : "Eurosport - Golf", url : "http://www.eurosport.fr/golf/rss-flash.xml" },
 { name : "L'équipe - Golf", url : "http://www.lequipe.fr/Xml/Tennis/Titres/actu_rss_Golf.xml" },
 { name : "Le Figaro - Golf", url : "http://www.lefigaro.fr/rss/figaro_golf.xml " },
 { name : "FFGolf (Golf) - Info Fédé", url : "http://www.ffgolf.org/rss.aspx?origine=rubrique&id=0" }
],
"Gymnastique" : [
 { name : "FFGym (Gymnastique) - Info Fédé", url : "http://www.ffgym.com/rss/feed/flash" }
],
"Natation" : [
 { name : "Sport365 - Les Brèves - Natation", url : "http://www.sport365.fr/rss/filinfo.xml?collection=1436" },
 { name : "Sport365 - Les Articles - Natation", url : "http://www.sport365.fr/rss/filinfo.xml?collection=1372" },
 { name : "Sport24 - Natation", url : "http://www.sport24.com/rss/292" },
 { name : "Eurosport - Natation", url : "http://www.eurosport.fr/natation/rss-flash.xml" },
 { name : "FFN (Natation) - Général", url: "http://www.ffnatation.fr/media/news/0_rss.xml" }
],
"Aérostation (montgolfieres)" : [
 { name : "FFAerostation (Mongolfière) - Général", url : "http://www.ffaerostation.org/index2.php?option=com_rss&feed=RSS2.0&no_html=1" }
],
"Equitation" : [
 { name : "FFE (Fédé Equitation) - Général :", url : "http://www.1cheval.com/rss/rss.php" },
 { name : "FFE (Fédé Equitation) - Monde equestre", url : "http://www.ffe.com/?cs=c1576be0fa6e93239e0ef75d0c5ab02f83d8411b4f88b4640a8ded180d257e0eb88ed04c335db4e7338c8a210c93b4fd" },
 { name : "FFE (Fédé Equitation) - Grand Nationa", url : "http://www.ffe.com/?cs=c1576be0fa6e93239e0ef75d0c5ab02f83d8411b4f88b4640a8ded180d257e0e7ea8b0e177da57032655ebc35f7698b0" },
 { name : "FFE (Fédé Equitation) - CFI", url : "http://www.ffe.com/?cs=c1576be0fa6e93239e0ef75d0c5ab02f83d8411b4f88b4640a8ded180d257e0e27c9b891aa86db001cb236d9eba25352" },
 { name : "FFE (Fédé Equitation) - JO", url : "http://www.ffe.com/?cs=c1576be0fa6e93239e0ef75d0c5ab02f83d8411b4f88b4640a8ded180d257e0e24766f646e2a07cac420514c1faf4acf" }
],
"Voile" : [
 { name : "Sport.fr - Voile", url : "http://www.sport.fr/rss/rss.aspx?sport=96" },
 { name : "Sport365 - Les Brèves - Voile", url : "http://www.sport365.fr/rss/filinfo.xml?collection=1441" },
 { name : "Sport365 - Les Articles - Voile", url : "http://www.sport365.fr/rss/filinfo.xml?collection=1377 " },
 { name : "Sport24 - Voile", url : "http://www.sport24.com/rssfeeds/sport24-voile.xml" },
 { name : "L'équipe - Voile", url : "http://www.lequipe.fr/Xml/Aussi/Titres/actu_rss_Voile.xml" },
 { name : "France 2 - Voile", url : "http://feeds.feedburner.com/France2-Sport-Voile" },
 { name : "Le Figaro - Voile", url : "http://www.lefigaro.fr/rss/figaro_voile.xml" },
 { name : "FFVoile (Voile) - Actualités", url : "http://www.ffvoile.net/ffv/web/actualites/rss/rss_ffvoile.asp" },
 { name : "FFVoile (Voile) - Petites annonces Emploi", url : "http://www.ffvoile.net/ffv/web/actualites/rss/rss_emploi.asp" },
 { name : "FFVoile (Voile) - Petites annonces Matériel", url : "http://www.ffvoile.net/ffv/web/actualites/rss/rss_materiel.asp" },
 { name : "FFVoile (Voile) - Actus Equipe de France", url : "http://www.ffvoile.net/ffv/web/actualites/rss/rss_edf.asp" }
],
"Automobile" : [
 { name : "Sport.fr - Sports Auto", url : "http://www.sport.fr/rss/rss.aspx?sport=5" },
 { name : "Sport365 - Les Brèves - Auto-Moto", url : "http://www.sport365.fr/rss/filinfo.xml?collection=1350" },
 { name : "Sport365 - Les Articles - Auto-Moto", url : "http://www.sport365.fr/rss/filinfo.xml?collection=1356" },
 { name : "Sport24 - L'intégrale Auto/Moto", url : "http://www.sport24.com/rss/220" },
 { name : "TF1 - Auto-Moto", url : "http://www.tf1.fr/xml/rss/0,,538,00.xml" },
 { name : "Eurosport - Auto-moto", url : "http://www.eurosport.fr/automoto/rss-flash.xml" },
 { name : "L'équipe - Général Auto-Moto", url : "http://www.lequipe.fr/Xml/Formule1/Titres/actu_rss.xml" }
],
"Formule 1" : [
 { name : "Sport.fr - Formule 1", url : "http://www.sport.fr/rss/rss.aspx?sport=35" },
 { name : "Sport.fr - Formule 1", url : "http://www.sport.fr/rss/rss3.aspx?sport=3811" },
 { name : "Sport24 - Formule 1", url : "http://www.sport24.com/rssfeeds/sport24-formule1.xml" },
 { name : "L'équipe - F1", url : "http://www.lequipe.fr/Xml/Formule1/Titres/actu_rss_F1.xml" },
 { name : "Le Figaro - Formule 1", url : "http://www.lefigaro.fr/rss/figaro_formule1.xml" }
],
"Formule 3000" : [
 { name : "Sport.fr - Formule 1", url : "http://www.sport.fr/rss/rss.aspx?sport=35" },
 { name : "Sport.fr - Formule 1", url : "http://www.sport.fr/rss/rss3.aspx?sport=3811" },
 { name : "Sport24 - Formule 1", url : "http://www.sport24.com/rssfeeds/sport24-formule1.xml" },
 { name : "L'équipe - F1", url : "http://www.lequipe.fr/Xml/Formule1/Titres/actu_rss_F1.xml" },
 { name : "Le Figaro - Formule 1", url : "http://www.lefigaro.fr/rss/figaro_formule1.xml" }
],
"Moto" : [
 { name : "Sport.fr - Moto", url : "http://www.sport.fr/rss/rss.aspx?sport=50" },
 { name : "Sport365 - Les Brèves - Auto-Moto", url : "http://www.sport365.fr/rss/filinfo.xml?collection=1350" },
 { name : "Sport365 - Les Articles - Auto-Moto", url : "http://www.sport365.fr/rss/filinfo.xml?collection=1356" },
 { name : "Sport24 - L'intégrale Auto/Moto", url : "http://www.sport24.com/rss/220" },
 { name : "Sport24 - Moto", url : "http://www.sport24.com/rssfeeds/sport24-moto.xml" },
 { name : "TF1 - Auto-Moto", url : "http://www.tf1.fr/xml/rss/0,,538,00.xml" },
 { name : "Eurosport - Auto-moto", url : "http://www.eurosport.fr/automoto/rss-flash.xml" },
 { name : "L'équipe - Général Auto-Moto", url : "http://www.lequipe.fr/Xml/Formule1/Titres/actu_rss.xml" },
 { name : "L'équipe - Moto", url : "http://www.lequipe.fr/Xml/Formule1/Titres/actu_rss_Moto.xml" }
],
"Rallye Auto" : [
 { name : "Sport.fr - Rallyes WRC", url : "http://www.sport.fr/rss/rss3.aspx?sport=4817" },
 { name : "Sport24 - Rallye", url : "http://www.sport24.com/rssfeeds/sport24-rallye.xml" },
 { name : "L'équipe - Rallye", url : "http://www.lequipe.fr/Xml/Formule1/Titres/actu_rss_Rallye.xml" },
 { name : "Le Figaro - Rallye", url : "http://www.lefigaro.fr/rss/figaro_rallye.xml" }

],
"Roller Skating" : [
 { name : "FFRS (RollerSkating) - Info Fédé  ", url : "http://www.ffrs.asso.fr/component/option,com_rss/feed,RSS2.0/no_html,1/" }
],
"Ski" : [
 { name : "Sport.fr - Ski", url : "http://www.sport.fr/rss/rss.aspx?sport=73" },
 { name : "Sport24 - Sports d'hiver", url : "http://www.sport24.com/rssfeeds/sport24-ski.xml" },
 { name : "L'équipe - Ski  ", url : "http://www.lequipe.fr/Xml/Aussi/Titres/actu_rss_Ski.xml" },
 { name : "FFS (Ski) - Infos Fédérales", url : "http://www.ffs.fr/site/rss.php" },
 { name : "FFS (Ski) - Modif Calendrier", url : "http://www.ffs.fr/site/rss2.php" }
],
"Surf" : [
 { name : "SurfingFrance (Surf) - Info Fédé", url : "http://www.surfingfrance.com/actualites/RSS" }
]
} ;


var rss_msgs_fr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "rss_msgs_fr_js_loaded" ) ;

var rss_templates_prepared = false ;
var rss_leftcol_prepared = false ;

//var rss_json_template = { version : 3, color : 1 , headerdisplay : "1" , header : { color: "0", text : "" }, title : "", keywords : [], pagesize : 5, rssfeeds : [] ,  rsstemp : [], displaycount : 5, rssItems : null , common : { width : 310 } } ;

var rss_json_template = { version : 5, color : "rgb(100%,100%,100%)"  , header : { display: "true", color: "c1", text : "" }, textstyles: { size : "1" , font : "0" , bold : "false" , italic : "false" , center : "false" }, title : "", keywords : [], pagesize : 5, rssfeeds : [] ,  rsstemp : [], displaycount : 5, rssItems : null , common : { width : 310 }, displaydesc : "false", displaydate : "true" } ;

var rss_oldjson_template = {
"4" :  { version : 4, color : 1  , header : { display: "true", color: "0", text : "" }, textstyles: { size : "1" , font : "0" , bold : "false" , italic : "false" , center : "false" }, title : "", keywords : [], pagesize : 5, rssfeeds : [] ,  rsstemp : [], displaycount : 5, rssItems : null , common : { width : 310 }, displaydesc : "false" } 
} ;

var rss_colordesc = { "qmc1" : "color" , "qmc2_qmc1" : "header.color" , "qmc3" : rss_qmc3} ; 
var rss_textdesc = { "qtxt1" : { "size" : "textstyles.size" , "font" : "textstyles.font" ,  "bold" : "textstyles.bold" , "center" : "textstyles.center" , "italic" : "textstyles.italic" }  };

var rss_leftcol_description = [ 
{ what : "rss options" , tabname : "taboptions" , visible : true , elems : [ 
	{ handler : "qsn_addselect" , params : { className : "rss_displaycount_elem" , jsonpath:"displaycount" , title:"nbfeed" , selects : [ { value : "5" , name : "5" } , { value : "10" , name : "10" } , { value : "15" , name : "15" } , { value : "20" , name : "20" } ]  } } ,
	{ handler : "qsn_addcheckboxtable" , params : { className : "rss_displaydesc_elem" , title:false , menuseparator: false, jsonpath : "displaydesc", checkboxes : [ { name : "displaydesc" , jsonpath : "displaydesc" } ] } },
	{ handler : "qsn_addcheckboxtable" , params : { className : "rss_displaydate_elem" , title:false , menuseparator: false, jsonpath : "displaydate", checkboxes : [ { name : "displaydate" , jsonpath : "displaydate" } ] } }			
	] } ,
{what : "notecolor" , tabname : "tabcolor" , visible : false , elems : [ 
	{ handler : "qsn_addqlubcolorblock" , params : { jsonpath: "color" , others : true ,  transparent:true , title:false , menuseparator: false , modifynote : "qsn_setcolors"  } }
	] } , 
{what : "bandeau" , tabname : "tabheader" , visible : false , elems : [    
	{ handler : "qsn_addheaderhideshow" , params : { notekind:"rss" , title:"" , jsonpath : "header.display" } }, 
	{ handler : "qsn_addheadercolor" , params : { notekind:"rss" , jsonpath : "header.color" } }
	] } , 
{what : "textstyles" , tabname : "tabtext" , visible : false , elems : [ 
	{ handler : "qsn_addfontfsizes"   , params : { jsonpath : "textstyles.size" , ncols : 2  } } , 
	{ handler : "qsn_addfontfamilies", params : { jsonpath : "textstyles.font" , ncols : 2  } } , 
	{ handler : "qsn_addtextoptions", params : { jsonpath : "textstyles" , ncols : 2 , opts : [ "bold" , "center" , "italic"  ] } }
	] }
] ;

var rss_timers = { };

function rss_upgradejson( r ) {
	if ( ! r.version ) r.version = 1 ;
	if ( r.version == rss_json_template.version ) return r ;
	if ( r.version < 3 ) r = rss_upgradejsontov3( r ) ;
	if ( r.version < 4 ) r = rss_upgradejsontov4( r ) ;
	r.version = rss_json_template.version ;
	if (! r.displaydesc) r.displaydesc = rss_json_template.displaydesc;
	return r ;
}

function rss_upgradejsontov3( r ) {
	r.headerdisplay = rss_json_template.headerdisplay ;
	r.header = rss_json_template.header ;
	r.color = 1 ;
	return r ;
}

function rss_upgradejsontov4( r ) {
	if ( r.headerdisplay) { 
		r.header.display = (r.headerdisplay == "1") ? "true" : "false";
		delete r.headerdisplay;
	}
	r.textstyles = { size : "1" , font : "0" , bold : "false" , italic : "false" , center : "false" } ;
	r.displaydesc  = false ;
	return r ;
}

function rss_upgradejsontov5( r ) {
	r.displaydate  = "true" ;
	return r ;
}

function rss_qmc3( r ) {
	return "/services/rss/images/rss48.png" ;
}

/*
function - 
function BASIC FUNCTIONS
*/

function trim(myString){
	return myString.replace(/^\s+/g,'').replace(/\s+$/g,'');
} 

function tofeedswoname(myArray){	
	var newArray = [];
	var myelem;
	while(myArray.length > 0){
		myelem = myArray.pop();
		if (myelem.visible) newArray.push(myelem.url); 
	}
	return newArray;
}

function rss_togglesearch(x){
	if ( qsn_currstate != "view" ) return ;
	var search = gebcn(getContainer(x), "rss_search");
	search.style.display = (search.style.display == "none") ? "block" : "none";
}

/*
function -
function ESSENTIALS
*/

function rss_template( id ) {
	if ( rss_templates_prepared ) return qsn_template( id , true ) ;
	qsn_installcontainer( "view" , "rss" , ge( "rss_notecontent" ).innerHTML ) ;
	var div = qsn_installcontainer( "edit" , "rss" , ge( "rss_notecontent_edit" ).innerHTML ) ;
	rss_templates_prepared = true ;
	return qsn_template( id , true ) ;
}

function rss_renderhtml( noteid ) {
	var div = getelement ( noteid ) ;
//	div.minWidth="250";
	var r = qsn_thenotes[ noteid ] ;
	
	if ( qsn_currstate == "edit" ) {
		rss_renderfeeds(div, r);
		if ( window.clubhost ) var club_url = clubhost ;
		else var club_url = window.location.host + "/" + window.clubprivatedomain ;
		club_url = "http://" + club_url ;
		ge("rss_ownfeed").innerHTML =  club_url + "/filinfo.rss";
		ge("rss_ownfeed").href =  club_url + "/filinfo.rss";
	} else {
		r.rsstemp = [];
		rss_getitems(div, r);
		rss_managerefresh(noteid);
		div.toresize = function () {
			var x = [] ;
			var divs = getElementsByClassName( div , "rss_div_resize" , true ) ;
			for ( var i = 0 ; i<divs.length ; i++ ) x.push( divs[ i ] ) ;
			x = x.concat( qsn_container_toresize( this ) ) ;
			return x ;
		} ;
		// on construit avec un feed vide pour seter son height pour régler les pb avec le footer
		var nofeeds = [ ] ;
		for ( var i = 0 ; i < r.displaycount ; i++ ) nofeeds.push ( null ) ;
		showblock( [ gebcn(div, "rss_loading"), gebcn(div, "rss_content") ] );
		rss_renderitems( div , nofeeds ) ; 
	}
	
	qsn_container_renderhtml( div , r ) ;
	qsn_settextproperties( noteid ) ;
	qsn_setcolors( noteid ) ;
}

function rss_displaysettings(){
	var r = qsn_thenotes[qsn_edittarget.id];
	qsn_initdisplaysetting() ;
	return false ;
}

function rss_suppressnote(id){
	r = qsn_thenotes[id];
	try{
		if ( qsn_suppressnote(id, true) ) clearInterval(rss_timers[id]);
	}
	catch(e){;}
}

function rss_saveedit(){
	var r = qsn_thenotes[ qsn_edittarget.id ];
	if ( ! r.rssfeeds || ! r.rssfeeds.length ) return alert( rss_message["norss"] ) ;
	qsn_container_saveedit() ;
	qsn_saveedit( true ) ;
}

/*
function -
function DRAG
*/

function rss_moveHandler( elem , ex , ey , ew , isGrow , xylimits ) {
	if ( isGrow ) rss_resize_divs( elem , 1 ) ;
	qsn_moveHandler( elem , ex , ey , ew , isGrow , xylimits ) ;
	if ( isGrow ) rss_resize_divs( elem ) ;
}

function rss_upHandler( elem , ex , ey , ew , isGrow , isMove , xylimits ) {
	if ( isGrow ) rss_resize_divs( elem ) ; //, ew ) ;
	qsn_upHandler( elem , ex , ey , ew , isGrow , isMove , xylimits ) ;
}

function rss_beginDrag( elem , e ) {
	xqsn_beginDrag( elem , e , rss_moveHandler , rss_upHandler ) ;
}

/*
function -
function RENDER
*/

function rss_resize_div_width( div , wref ){
	var themaxwidth = wref || div.offsetWidth ;
	if ( qsn_currstate == "edit" ) return 0.6 * themaxwidth ;
	//return Math.max( 0 , themaxwidth - 30 - 42 ) ; // pourquoi -42?
	return Math.max( 0 , themaxwidth - 30 - 10 ) ;
}

function rss_resize_divs( div , wref ){
	var divs = getElementsByClassName( div , "rss_div_resize" , true ) ;
	var themaxwidth = rss_resize_div_width( div , wref ) ;
	for ( var i = 0 ; i<divs.length ; i++ ) divs[ i ].style.width = Math.round( themaxwidth ) + "px" ;
}

function rss_renderfeeds(div, r){ //edit mode
	var thetable = gebcn(div, "rss_table");
	var n = thetable.rows.length ;
	for ( var i = 1 ; i < n ; i++ ) thetable.deleteRow( 1 ) ;	
	var newline;
	var mycell;
	var textnode;
	var myelem , aa ;

	for (var i = 0; i < r.rssfeeds.length ; i++){	
		// créer une nouvelle ligne 
		newline = thetable.insertRow( i+1 );
		newline.className = "rss_feed qmc1 text_contrast150 qtxt1 all" ;
		newline.style.height = "18px";
		newline.onmouseover = function(){this.className = "rss_feed qmc1 bg_contrast19__text_contrast150"; qsn_setcolors([this]);};
		newline.onmouseout  = function(){this.className = "rss_feed qmc1 bg_self__text_contrast150"; qsn_setcolors([this]);};
		
		//nom du flux RSS
		mycell = create_td(newline, {className : "rss_feedcell qmc1 bd_bw", style : {whiteSpace : "nowrap"}});
		textnode = document.createTextNode( r.rssfeeds[i].name );
		mycell.appendChild(textnode);
		
		// url du flux RSS 
		mycell = create_td(newline,  {className : "rss_feedcell qmc1 bd_bw"});
		aa = create_elem("A", { className : "qmc1 text_contrast150 qtxt1 all" , href: r.rssfeeds[i].url} );
		rss_setonclickurl( aa, r, i ) ;
		aa.innerHTML=r.rssfeeds[i].url.replace( "&" , "&amp;" );
		
		myelem= create_elem("DIV", { className : "rss_div_resize", style: {whiteSpace:"nowrap", overflow : "hidden", textOverflow : "ellipsis"} } );
		myelem.appendChild(aa);
		mycell.appendChild(myelem);
		
		//bouton de suppression du flux de la liste 
		mycell = create_td(newline, {className : "rss_feedcell qmc1 bd_bw", width:"16", align:"center"});
		myelem = create_elem("IMG", { className : "png", src: "/services/rss/images/delete16.png", style: { width : "16px", height : "16px" , cursor : "pointer"} } );
		rss_setonclicksuppressrow(r.rssfeeds[i].name, newline, myelem, r, i);
		mycell.appendChild(myelem);			
	}
	rss_resize_divs( div );
	qsn_setcolors( r.common.noteid ) ;
	qsn_settextproperties (r.common.noteid);
}

function rss_rendercount(div, count){
	gebcn( div , 'rss_count').innerHTML = '(' + count + ')';
}

function rss_timeprefix( item ) {
	if ( ! item.Time ) return "" ;
	var t = item.Time ;
	return twodigs ( t.getDate() ) + "." + twodigs ( t.getMonth() + 1 ) + " " + twodigs ( t.getHours() ) + ":" + twodigs ( t.getMinutes() ) + " - " ;
}

function rss_renderitems( div, items){ //view mode
	var noteid = div.id;
	var list = gebcn( div , 'rss_items');
	if ( ! list ) {
		// debugmail( "rss_renderitems, got null list" ) ;
		div = ge( noteid ) ;
		list = gebcn( div , 'rss_items');
		if ( ! list ) return debugmail( "rss_renderitems, could not fix null list" ) ;
	}
	if ( list.tagName == "UL" ) {
		var table = create_elem( "TABLE" , { cellSpacing : "0", cellPadding : "0", border : "0", width : "100%", className : "rss_items qmc1 text_contrast150__bd_bw"} ) ;
		list.parentNode.insertBefore( table , list ) ;
		rm( list ) ;
		list = table ;
	}
	var n = list.rows.length ;
	for ( var i = 0 ; i < n ; i++ ) list.deleteRow( 0 ) ;

	if ( !items ) { return; }
	
	var w = rss_resize_div_width( div ) ;
	for (var i = 0; i < items.length; i++){
		var item = items[ i ];
		var tr = list.insertRow( -1 );
		var td = create_td(tr, { className : "rss_item qmc1 bd_bw qtxt1 all"});
		if ( item ) {
			td.onmouseover = function(){this.className  = "rss_item qmc1 bg_contrast13__bd_bw qtxt1 all"; qsn_setcolors([this]);};
			td.onmouseout = function(){this.className  = "rss_item qmc1 bg_self__bd_bw qtxt1 all"; qsn_setcolors([this]);};

			var a = create_elem("A", { className : "rss_an_item qmc1 text_contrast150" , title : item.Site, href: item.Url, style: {textDecoration: "none", display: "block", cursor: "pointer"} } );
			a.innerHTML = ( ( ! qsn_thenotes[noteid].displaydate || qsn_thenotes[noteid].displaydate == "false" ) ? "" :  rss_timeprefix( item ) ) +  item.Title.replace( //g , "’" ) ;
			a.item = item;
			a.onmousedown = function ( event ) { q_stopPropagation( event ) ; } ;
			a.onclick = function ( event ) { rss_viewitem( this , event ) ; return false ; } ;
			
			var myelem= create_elem("DIV", { className : "rss_div_resize", style : { width :  w + "px"  } } );
			myelem.appendChild(a);
			
			if ( qsn_thenotes[noteid].displaydesc == "true" ) {
				var desc = create_elem("DIV", { className : "rss_an_item_desc qmc1 text_bw" , style: { whiteSpace:"normal",marginLeft:"10px"} } );
				desc.innerHTML = item.Content ;
				myelem.appendChild(desc);
			}
			td.appendChild(myelem);
			myelem.widthrule = function ( w ) { return Math.max( 0 , w - 30 - 42 ) ; } ;
		}else{
			td.appendChild( create_elem("A", { className : "rss_an_item qmc1 text_contrast150" , innerHTML : " ", style: {textDecoration: "none", display: "block", cursor: "pointer" } } ) );
		}
	}
	var pc = div.rssPageContainer;
	if ( pc ){
		visibleblock( [ gebcn( div , 'rss_pre') , gebcn( div , 'rss_pre_new') ] , ! pc.IsFirstPage() ) ;
		visibleblock( [ gebcn( div , 'rss_next') , gebcn( div , 'rss_next_new') ] , ! pc.IsLastPage() ) ;
	}else{
		hideblock ( [ gebcn( div , 'rss_pre') , gebcn( div , 'rss_next') , gebcn( div , 'rss_pre_new') , gebcn( div , 'rss_next_new') ] ) ;
	}
	qsn_setcolors( noteid ) ;
	qsn_settextproperties( noteid ) ;
//	rss_resize_divs( div );
}

/*
function -
function GET & SET
*/

function rss_init_presets() {
	var kind=q_spaceparam( "qlubtype" ) ;
	if ( kind && (/basket/i).test( kind ) ) kind = "Basket" ;
	if ( kind && kind == "football" ) kind = "Football" ;
	if ( kind && rss_default_feeds[kind] && rss_default_feeds[kind].length) {
		var select = ge ( "rss_preset" ) ;
		var n=select.options.length;
		for ( var i=n;i>0;i--) select.remove(i);//on laisse le premier element (titre)
		var feeds = rss_default_feeds[kind];
		for ( var i=0;i<feeds.length;i++) {
			var opt=document.createElement('option');	
			opt.text = feeds[i].name;
			opt.value = feeds[i].url;
			try{
				select.add(opt,null);// standards compliant
			} catch(e){
				select.add(opt); // IE only
			}
		}
		showblock( "rss_preset_div" ) ;
	} else {
		hideblock( "rss_preset_div" ) ;
	}
}

function rss_togglelinkpane( paneid , bvisible ) {
	if ( bvisible ) {
		rss_init_presets();
		var div = ge( "q_fullscreenmask" ).appendChild( ge( paneid ).cloneNode( true ) ) ;
		div.id = "qfsm" + paneid ;
		var y = qsn_edittarget;
		var id = y.id ;
		var l = ( ge( "q_author_stuff" ).offsetLeft + qsn_trueleft( id ) + Math.round( ( qsn_truewidth( id ) - 200 ) / 2 ) ) - q_windowscrollX() ;
		if ( l < 0 ) l = 50 ;
		if ( l > ( q_windowInnerWidth() - 300 ) ) l = q_windowInnerWidth() - 300 ;
		div.style.left = l + "px" ;
		var b = q_windowInnerHeight() - ( ( ge( "q_author_stuff" ).offsetTop + qsn_truetop( id ) + y.offsetHeight - 10 ) - q_windowscrollY() ) ;
		if ( b < 0 ) b = 20 ;
		if ( b > ( q_windowInnerHeight() - 300 ) ) b = q_windowInnerHeight() - 300 ;
		div.style.bottom = b + "px" ;
		showblock( [ "q_fullscreenmask" , div ] ) ;
		div.getElementsByTagName( "INPUT" )[ 0 ].focus() ;
	} else {
		hideblock( "q_fullscreenmask" ) ;
		rm( "qfsm" + paneid ) ;
	}
}

function rss_cancelinsert() {
	rss_togglelinkpane( 'rss_linkpaneweb' , false ); 
}

function rss_insertlink( x, linktype ) {
	var p = getContainer( x ) ;
	var v1 = p.getElementsByTagName( "INPUT" )[ 0 ].value ;
	var v2 = p.getElementsByTagName( "INPUT" )[ 1 ].value ;
	v2 = v2.replace( /^http:\/\// , "" ).replace( /^feed:\/\// , "" ) ;
	if ( v2.length==0 ) return alert( rss_message[ "nourl" ] ) ;
	v2 = "http://" + v2 ;
	rss_checkvalidrss( v1, v2 ) ;
}

function rss_addfeed( x , noCheck){
	rss_togglelinkpane(  'rss_linkpaneweb' , true );
	return true;
}

function rss_checkvalidrss( rssname, rssfeed ){
	rss_ajaxget("/cgi-bin/cgixml?url="+rssfeed , rss_checkvalidrss_done, [ rssname, rssfeed ] );
}

function rss_checkvalidrss_done( xml, args ){
	if ( ! xml ) return alert( rss_message["invalidfeed"] );

	var rss_conteneurs = [ "item" , "entry" ];
	var rss_conteneur ;
	for ( var i = 0 ; i < rss_conteneurs.length ; i++ ) {
		if ( xml.getElementsByTagName( rss_conteneurs[ i ] ).length > 0 ) {
			rss_conteneur = rss_conteneurs[ i ] ;
			break;
		}
	}
	if (  ! rss_conteneur ) return alert( rss_message["invalidfeed"] );
	var div = qsn_edittarget;
	var r = qsn_thenotes[ div.id ];
	r.rssfeeds.push( { name : args[ 0 ], url : args[ 1 ], visible : true });	
	rss_renderfeeds( div, r );	 
	rss_togglelinkpane( 'rss_linkpaneweb' , false ); 
}

function rss_getitems(div, r){
	div.rssPageContainer = div.rssContainer = null;
	var ar= [] ;
	for( var i=0; i<r.displaycount; i++) ar.push( null );
	
	hideshowblock( gebcn( div, "rss_content" ), gebcn( div, "rss_loading" ) );
	var rssChannel, request;
	var rssHandler = new RssHandler( div );
	rssfeedscopy = [].concat( r.rssfeeds ) ; 
	r.rsstemp = [].concat( tofeedswoname( rssfeedscopy ) );
	if ( r.rsstemp.length > 0 ){
		rssChannel = r.rsstemp.pop();
		rssRequest = new RssRequest( rssChannel, Function.createDelegate( rssHandler, rssHandler.HandleXML ) ) ;
		rssRequest.Request();
	}
	else if ( r.rsstemp.length <= 0 ){
		hideshowblock( gebcn( div, "rss_loading" ), gebcn( div, "rss_content" ) );
		//rss_rendercount(div, 0);	
		rss_renderitems( div, ar );
	}	
}

function rss_getcdata(element){
	var s = '' ;
	for (var i = 0; i < element.childNodes.length; i++){
		if ( element.childNodes[i].nodeType == 1 ) s += rss_getcdata(element.childNodes[i]);
		if ( element.childNodes[i].nodeName == '#cdata-section') s += element.childNodes[i].nodeValue;
		else if (element.childNodes[i].nodeName == '#text' && trim(element.childNodes[i].nodeValue) != "") s+= element.childNodes[i].nodeValue;
	 }
	return s;
}

function rss_viewitem( elem , e ) {	
	if ( qsn_currstate != "view" ) return ;
	var thehtml = create_elem( "DIV", { className : "rss_viewer" } );
	var theitemtitle = create_elem("DIV", { className : "rss_item_title" } );
	theitemtitle.appendChild( create_elem( "A", { href: elem.item.Url , target : "_blank", innerHTML : elem.item.Title.replace( //g , "’" ) } ) );
	
	var theitemtime = create_elem("DIV", {className : "rss_item_time", innerHTML : elem.item.Time.toLocaleString(), style : {padding : "3px 0 5px 3px"} });
	
	var theitemcontent = create_elem("DIV", {className : "rss_item_content qtxt1 all", innerHTML : elem.item.Content.replace( //g , "’" ) });
	
	thehtml.appendChild(theitemtitle);
	thehtml.appendChild(theitemtime);
	thehtml.appendChild(theitemcontent);
	q_fsm_reveal( { src : thehtml , title : elem.item.Site } ) ;
}

function rss_filter(items, keywords){
	if (!items || !items.length || !keywords || !keywords.length) return items;
	var temp = [];
	var i, j, k = 0;
	for (i = items.length - 1; i >= 0; i--){
		for (j = 0; j < keywords.length; j++){
			if (items[i].Title.toLowerCase().indexOf(keywords[j].toLowerCase()) >= 0 || items[i].Content.toLowerCase().indexOf(keywords[j].toLowerCase()) >= 0) break;
		}
		if (j < keywords.length) temp[k++] = items[i];
	}
	return temp;
}

function rss_sortbydate(items){
	if (!items)	return;

	var j,temp;
	var exchanged;
	for (var i = 0; i < items.length; i++){
		exchanged = false;
		for (j = 0; j < items.length - i - 1; j++){
			if (items[j].Time < items[j + 1].Time){
				temp = items[j];
				items[j] = items[j + 1];
				items[j + 1] = temp;
				exchanged = true;
			}
		}
		if (!exchanged) break;
	}
}

function rss_pre(x){
	if ( qsn_currstate != "view" ) return ;
	var div = getContainer(x);
	var pc = div.rssPageContainer;
	rss_renderitems(div, pc.GetPrePage());
}

function rss_next(x){
	if ( qsn_currstate != "view" ) return ;
	var div = getContainer(x);
	var pc = div.rssPageContainer;
	rss_renderitems(div, pc.GetNextPage());
}


function rss_hidecallback(){
	gebcn(qsn_edittarget, "rss_add_success").style.display = "none";
}

function rss_keywordize(x){
	x =  x.split(' ');
	y = [];
	for ( var i =0; i < x.length ; i++) if (x[i] != "") y.push(x[i]);
	return y;
}

function rss_search(x, empty){
	if ( qsn_currstate != "view" ) return ;
	var div = getContainer(x);
	var r = qsn_thenotes[div.id];
	if (empty) gebcn( div , 'rss_search_input').value  = "";
	gebcn(div, "rss_cancelbutton").style.display = (empty) ? "none" : "inline";
	gebcn(div, "rss_searchbutton").style.display = (empty) ? "inline" : "none";
	try{
		var txtKeywords = gebcn( div , 'rss_search_input').value;
		var keywords = rss_keywordize(txtKeywords);
		if (keywords.length > 0)  gebcn(div, "rss_filtered").style.display = "block";
		else gebcn(div, "rss_filtered").style.display = "none";
		var content = rss_filter(div.rssContainer, keywords);
		
		rss_sortbydate(content);
		// div.rssContainer = content;
		var pc;
		if (!div.rssPageContainer){
			pc = new PageContainer(content, r.displaycount);
			div.rssPageContainer = pc;
		}
		else{
			pc = div.rssPageContainer;
			pc.SetContent(content);
		}
		
		//rss_rendercount(div, pc.GetCount());	
		rss_renderitems(div, pc.GetFirstPage());
		}
	catch(e){ alert(e.message);}
	
	var rssHandler = new RssHandler(div);
	if ( r.rsstemp.length > 0 ){
		rssChannel = r.rsstemp.pop();
		rssRequest = new RssRequest(rssChannel, Function.createDelegate(rssHandler, rssHandler.HandleXML));
		rssRequest.Request();
	}
	else hideshowblock(gebcn(div, "rss_loading"), gebcn(div, "rss_content"));
}

/*
function -
function EVENTS HANDLERS
*/

function rss_setonclickurl( myelem2, r, i) {
	myelem2.onclick = function() { window.open(r.rssfeeds[i].url); return false; };
}

function rss_setonclicksuppressrow(name, newline, myelem, r, rownum){
	myelem.onclick = function(){ 
		if ( window.confirm( rss_message["confirmdelete"] + name) ){
			newline.style.display = "none"; 
			r.rssfeeds.splice(rownum,1);		
		}
		return false;
	};
}


function rsspresetlink(x){
	var s = x.options[x.selectedIndex].value ;
	ge( "rss_urlinput" ).value=s;
	if( s.length==0 ){
		ge( "rss_titleinput" ).value = s ;
	} else {
		ge( "rss_titleinput" ).value = x.options[x.selectedIndex].innerHTML ;
	}
}

/*
function -
function REFRESH
*/

function rss_managerefresh(noteid){
	if (rss_timers[noteid] != null) clearInterval(rss_timers[noteid]);
	rss_timers[noteid] = setInterval("rss_refresh('"+noteid + "')", 300000);
}

function rss_refresh(noteid){
	if ( qsn_currstate == "edit" || q_fsmpresent() ) return ;
	var div;
	var r;
	div = ge( noteid ) ;
	if ( isremoved( div ) ) return clearInterval(rss_timers[noteid]) ;
	hideshowblock(gebcn(div, "rss_content"), gebcn(div, "rss_loading"));	
	r = qsn_thenotes[div.id];
	rss_getitems(div, r);
	hideblock(gebcn(div, "rss_filtered"));
}
	
/*
function -
function SAVE
*/

function rss_savekeywords(){
	var txtKeywords = gebcn( qsn_edittarget , 'txt_keywords');
	var keywords = txtKeywords.value.split(' ');
	for (var i = keywords.length - 1; i >= 0; i--){
		if (keywords[i] == '') keywords.splice(i, 1);
	}
	
	var id = qsn_edittarget.id ;
	var r = qsn_thenotes[ id ] ;
	r.keywords = keywords;
	rss_save();
	
	var div = qsn_edittarget;
	var content = rss_filter(div.rssContainer, keywords);
	
	rss_sortbydate(content);

	var div = qsn_edittarget;
	pc = div.rssPageContainer;
	pc.SetContent(content);
	
	//rss_rendercount(qsn_edittarget, pc.GetCount());	
	rss_renderitems(qsn_edittarget, pc.GetFirstPage());
}

//save and do noting

function rss_save(){
	var id = qsn_edittarget.id ;
	qsn_notechanged(id , ( qsn_isnewnote )? "newnote" : "notechanged", rss_savecompleted) ;
	qsn_isnewnote = false;
}

function rss_savecompleted(){
	//do noting
}



/*
function -
function OBJECTS AND METHODS
*/

function RssHandler(div){
	this.Div = div;
}

RssHandler.prototype.HandleXML = function(xml) {
	if ( qsn_currstate == "edit" || q_fsmpresent() ) return ;
	var div = this.Div;
	if ( isremoved( div ) ) return ;
	var noteid = div.id;
	var r = qsn_thenotes[noteid];
	if ( ! r ) r = qsn_thenotes[q_idalias[noteid]];
	//if ( ! r ) return ;

	if ( xml ) {
		//determination des bon descripteurs :
		var rss_conteneurs = ["item" , "entry" ];
		var rss_conteneur ;
		var rss_title = "title";
		var rss_description = [ "description" , "content"  , "summary"];
		var rss_link = "link";
		var rss_date = [ "pubDate" , "updated" , "dc:date" , "issued" , "modified" ];	
		for ( var i = 0 ; i < rss_conteneurs.length ; i++ ) {
			if ( xml.getElementsByTagName( rss_conteneurs[ i ] ).length > 0 ) {
				rss_conteneur = rss_conteneurs[ i ] ;
				break;
			}
		}
		if ( rss_conteneur ) {
			var currmax = 0 ;
			var currindex = 0 ;
			for ( var i = 0 ; i < rss_description.length ; i++ ) {
				if ( xml.getElementsByTagName(rss_description[ i ]).length >= currmax ) {
					currindex = i ;
					currmax = xml.getElementsByTagName(rss_description[ i ]).length ;
				}
			}
			rss_description = rss_description[ currindex ] ;
			currmax = 0 ;
			currindex = 0 ;
			for ( var i = 0 ; i < rss_date.length ; i++ ) {
				if ( xml.getElementsByTagName(rss_date[ i ]).length >= currmax ) {
					currindex = i ;
					currmax = xml.getElementsByTagName(rss_date[ i ]).length ;
				}
			}
			rss_date = rss_date[ currindex ] ;
			
			var item, author, link, title, description, date, rssItem;
			try{
				if (xml.getElementsByTagName("title").length > 0) author = rss_getcdata(xml.getElementsByTagName("title")[0]) ;
				var items = xml.getElementsByTagName(rss_conteneur);
				var rssItems = [];
				for ( var i = 0; i < items.length; i++) {
					link = title = description = date = '';
					item = items[i];
					try { link = item.getElementsByTagName(rss_link)[0].firstChild.nodeValue; } catch( e ) {
						try  { link = item.getElementsByTagName(rss_link)[0].getAttribute("href"); }
						catch(e){}
					}
					try{ title = rss_getcdata(item.getElementsByTagName(rss_title)[0]); }catch( e ){}
					try{
						description = rss_getcdata(item.getElementsByTagName(rss_description)[0]);
						description = description.replace(/\r\n/,'<br />').replace(/\n/,'<br />');
					} catch( e ){}
					var res = item.getElementsByTagName(rss_date);
					if ( res && res.length && res[0].firstChild ) var date = rss_extractdate( res[0].firstChild.nodeValue ) ;
					else var date = new Date() ;
					rssItem = new RssItem(author, link ,title, description, date);
					rssItems.push(rssItem);
				}
				if ( !div.rssContainer) div.rssContainer = rssItems;
				else div.rssContainer = div.rssContainer.concat(rssItems);
				var content = rss_filter(div.rssContainer, r.keywords);
				rss_sortbydate(content);
				var pc;
				if (!div.rssPageContainer) {
					pc = new PageContainer(content, r.displaycount);
					div.rssPageContainer = pc;
				} else {
					pc = div.rssPageContainer;
					pc.SetContent(content);
				}
				//rss_rendercount(div, pc.GetCount());	
				rss_renderitems(div, pc.GetFirstPage());
			}
			catch( e ){ debugmail("in rss/HandleXML: " + e.message);}
		}
	}
	var rssHandler = new RssHandler(div);
	if ( r.rsstemp && r.rsstemp.length > 0 ){
		rssChannel = r.rsstemp.pop();
		rssRequest = new RssRequest(rssChannel, Function.createDelegate(rssHandler, rssHandler.HandleXML));
		rssRequest.Request();
	} else hideshowblock(gebcn(div, "rss_loading"), gebcn(div, "rss_content"));
};

function rss_extractdate( sdate ) {
	try {
		var date = q_isot2date( sdate ) ;
		if ( date != "Invalid Date" && date != new Date( null )  && ! isNaN( date ) ) return date ;
	} catch(e) {} ;
	var temp= sdate.replace(/^([0-9]{1,2})\/([0-9]{1,2})\/([0-9]{2,4})/g,'$2/$1/$3'); // transforme une date JJ/MM/AAAA en MM/JJ/AAAA pour new Date()
	temp = temp.replace( / [A-Z]+(\+|-| |)\d\d:\d\d$/ , "" ) ; // supprime EET-02:00
	var date = new Date(temp);
	if ( date == "Invalid Date" || date == new Date( null ) || isNaN( date ) ){
		try{
			var datetime = sdate.split(' ');
			var thedate = datetime[0].split(".");
			var month = thedate[1];
			thedate[1] =thedate[0];
			thedate[0] = month;
			date = new Date(thedate[0] + "/" + thedate[1] + "/" + thedate[2] + " " + datetime[1]);
			if ( date == "Invalid Date" || date == new Date( null ) ) date = q_isot2date( sdate ) ;
			if ( date == "Invalid Date" || date == new Date( null ) ) if ( sdate.substring( sdate.length - 3 ) == ":00" ) date = new Date( sdate.substring( 0 , sdate.length - 3 ) ) ;
		} catch(e){}
	}
	return date ;
}

function RssItem(site, url, title, content, time){
	this.Site = site;
	this.Url = url;
	this.Title = title;
	this.Content = content;
	this.Time = time;
}

/*Get Rss Data Start*/
if (!window.XMLHttpRequest) {
	window.XMLHttpRequest = function(){
		var progIDs = [ 'Msxml2.XMLHTTP', 'Microsoft.XMLHTTP' ];
		for (var i = 0; i < progIDs.length; i++){
			try {
				var xmlHttp = new ActiveXObject(progIDs[i]);
				return xmlHttp;
			}
			catch (ex)
			{
			}
		}
		return null;
	};
}

Function.createDelegate = function(object, method){
	return function(){method.apply(object,arguments);};
};

function RssRequest(url, callback){
 //   this.Url = '../rss/RssProxy.asp?url=' + url;
	this.Url = url ;
	this.Callback = callback;		
}

RssRequest.prototype.Request = function() {
	rss_ajaxget("/cgi-bin/cgixml?url="+this.Url , this.Callback);
};

/*Get Rss Data End*/

/*PageContainer Start*/
function PageContainer(content,pageSize){
	this.PageIndex = 0;
	this.Content = content;
	this.PageSize = pageSize;
}
PageContainer.prototype.GetPageIndex = function(){return this.PageIndex;};
PageContainer.prototype.GetCount = function(){ return (this.Content == null) ? 0 : this.Content.length ; };
PageContainer.prototype.GetPageNum = function(){return Math.ceil(this.GetCount() / this.PageSize) ; };
PageContainer.prototype.IsLastPage = function(){ return this.PageIndex == ( this.GetPageNum() - 1 ) || this.GetPageNum() == 0 ; };
PageContainer.prototype.IsFirstPage = function(){ return ! this.PageIndex ; };
PageContainer.prototype.GetPage = function(index){
	if (index > this.GetPageNum() - 1 || index < 0) return null;
	this.PageIndex = index;
	if (index < this.GetPageNum() - 1){
		var result = [];
		for (var i = 0 ; i < this.PageSize ; i ++) result[i] = this.Content[this.PageIndex * this.PageSize + i] ;
		return result;
	} else {
		var result = [];
		for (var i = 0 ; i < this.Content.length - this.PageSize * index ; i ++) result[i] = this.Content[this.PageIndex * this.PageSize + i] ;
		for (var i = this.Content.length - this.PageSize * index ; i < this.PageSize ; i ++) result[i] = null;
		return result;
	}
};
PageContainer.prototype.GetFirstPage = function(){return this.GetPage(0);};
PageContainer.prototype.GetLastPage = function(){return this.GetPage(this.GetPageNum() - 1);};
PageContainer.prototype.GetNextPage = function(){return this.GetPage(this.PageIndex + 1);};
PageContainer.prototype.GetPrePage = function(){return this.GetPage(this.PageIndex - 1);};
PageContainer.prototype.GetCurrentPage = function(){return this.GetPage(this.PageIndex);};
PageContainer.prototype.SetPageSize = function(pageSize) {this.PageSize = pageSize;};
PageContainer.prototype.SetContent = function(content){this.Content = content;};
/*PageContainer End*/

function ShowMiddle(div){
	var topWindow = window.top;
	var topDocument = topWindow.document;
	if (div == null) return;
	var top = Math.floor((topDocument.documentElement.clientHeight - div.offsetHeight) / 2) ; //- scrollYT;
	if (top < 0) top = 0;
	var left = Math.floor((topDocument.documentElement.clientWidth - div.offsetWidth) / 2) ; //- scrollXT;
	if (left < 0) left = 0;
	div.style.top = top + 'px';
	div.style.left = left + 'px';
}

function rss_ajaxget( url , callBackFunction, callBackArgs ) {
	//correction de l'url pour du à safari (remplace http par feed)
	var re = new RegExp("feed://" , "g" ) ;
	url = url.replace( re , "http://" ) ;
	var req=null;
	if ( ! req ) {
		if ( window.XMLHttpRequest ) {
	 		req = new XMLHttpRequest() ;
			//if ( req.overrideMimeType )  { req.overrideMimeType( 'text/plain' ) ; }
		} else if ( window.ActiveXObject ) {
			try { req = new ActiveXObject ( "Msxml2.XMLHTTP" ) ;} 
			catch (e )  {
				try { req = new ActiveXObject ( "Microsoft.XMLHTTP" ) ; } 
				catch (e )  {}
			}
		}
	}
	req.open( "GET" , url , true ) ;
	req.send ( null ) ;
	req.onreadystatechange = function () { 
		if ( req.readyState != 4 ) return;
		if ( req.status !=200 && req.status != 304 ) return ;
		callBackFunction( req.responseXML, callBackArgs );
	} ;
}

/*
function -
function SERVICE PAGES
*/

function rss_initforweb( noteid ) {
	rss_refresh( noteid ) ;
}

/*
function -
function TOOLBAR
*/

function rss_toolbarversion() {
	return 1 ;
}

/*
function -
function QWIZ
*/

function rss_mergeqwizdata( notejson, noteqwizkeys, qwiz_data ) {
	var v ;
	for ( var x in noteqwizkeys ) {
		v = noteqwizkeys[ x ] ;
		if ( ( x == "url" ) || ( x == "name" ) ) {
			if ( ! notejson[ "rssfeeds" ] ) notejson[ "rssfeeds" ] = [ { url : "" , name : "" , visible : true } ] ;
			notejson[ "rssfeeds" ][ 0 ][ x ] = qwiz_data[ v ] ;
		} else notejson[ x ] = qwiz_data[ v ] ;
	}
	return notejson ;
}

var rss_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "rss_js_loaded" ) ;


var slide_message = {
"lastimage" : "Il est impossible de supprimer la dernière image d'un diaporama.\n\nVous pouvez supprimer le diaporama." ,
"uploadtitle" : "Insérer des images" ,
"uploadprompt" : "Avant de choisir vos images, choisissez un album puis cliquez sur OK." ,
"fullscreen" : "Mode Plein écran" ,
"plug" : "Diaporama_La projection de diapos sur votre page web!" ,
"remove" : "supprimer" ,
"add" : "ajouter" ,
"photos" : "Photos" ,
"back" : "Retour"
}

var slide_msgs_fr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "slide_msgs_fr_js_loaded" ) ;


var slide_leftcol_prepared = false ;
var slide_templates_prepared = false ;

var slide_json_template = { version: 3 , lastphotoindex : 0, visible : true , color : "1",  tempo : 1 , reverse : false , common : { width : 300 } } ;

var slide_colordesc = { "qmc1" : "color" } ;
var slide_leftcol_description = [
{ what : "color" , tabname : "color" , visible : true , elems : [ { handler : "qsn_addqlubcolorblock" , params : { jsonpath : "color" , idprefix : "slide_color" , modifynote : "qsn_setcolors" , others : true  } } ] } ,
{ what : "photo" , tabname : "photos" , visible : true , elems : [ { handler : "slide_addphoto" , params : { jsonpath : "" } } ] } 
] ;	

var slide_timers = {} ;
var slide_tempos = [ 3000, 1800, 800 ] ;
var slide_speed_img = [ "speeddemi", "speednormal", "speeddouble" ];
var slide_edit_mode = "edit_normal"; // ou edit_supress

var slide_upload_request = {
	"callerid" : "" ,
	"uploadkind" : "image",
	"title" : "N/A" ,
	"prompt" : "N/A" ,
	"multiple" : true,
	"extensions" : ["jpg" , "jpeg" , "png" , "gif" , "tiff" , "tif" ] ,
	"namingdata" : { "wantname" : false },
	"formats" : "max900 max600 max400 max300 max200 max100",
	"callback" : "slide_new_pc_img_done", 
	"cancel": { "callback" : "slide_new_img_cancel" } , 
	"multiple_callback" : "slide_new_pc_img_done",
	"multiple_extensions" : "custom",
	"multiple_description" : "Images" ,
	"reveal": { "anim" : true },
	"resize" : true ,
	"resize_option" : { "ratio" :  "image" }
} ;

var traces = "";
// si pb de changement images c dans slide_setimg

function slide_template( id ) {
	if ( slide_templates_prepared ) return qsn_template( id , true ) ;
	var div = qsn_installcontainer( "view" , "slide" , ge( "slide_notecontent" ).innerHTML ) ;
	div.className = div.className.replace( /qmc. [^ ]+/g , "" ) ;
	div.style.borderWidth = "0px" ;
	var div = qsn_installcontainer( "edit" , "slide" , ge( "slide_notecontent_edit" ).innerHTML ) ;
	div.className = div.className.replace( /qmc. [^ ]+/g , "" ) ;
	slide_templates_prepared = true ;
	return qsn_template( id , true ) ;
}

function slide_upgradejson( r ) {
	if ( ( r.version ) && ( r.version == slide_json_template.version ) ) return r ;
	if ( r.version < 2 ) r.color = 1;
	if ( r.version < 3 ) {
		r.tempo = 1 ; 
		r.reverse = false ;
	}
	r.version = slide_json_template.version ;
	return r ;
}

function slide_pauseall () {
	for ( var id in slide_timers ) {
		var s = slide_timers [id] ;
		if ( s.timer ) slide_cleartimer( id ) ;
				// traces += "pause " + id + "\r";
	}
}

function slide_resumeall () {
	for ( var id in slide_timers ) {
		if ( ge( id ) ) {
			// empêcher run en edit mode
			if (qsn_currstate != "edit") slide_restartshow( ge (id) ) ; 
		}
	}
}

function slide_cleartimer( id ) {
	if ( ( slide_timers[ id ] == null ) || ( slide_timers[ id ] == undefined ) ) return ;
	if ( ! slide_timers[ id ].timer ) return ;
	if ( slide_timers[ id ] ) clearInterval( slide_timers[ id ].timer ) ;
	slide_timers[ id ].timer = null ;
}

function slide_init_timers ( noteid ) {
	if ( slide_timers[noteid] ) slide_cleartimer (noteid);
	else slide_timers[noteid] = { timer: null } ;
}

function slide_applynewnoterefresh( newid , oldid ) {
	slide_timers[ newid ] = q_cloneObject( slide_timers[ oldid ] ) ;
	slide_timers[ oldid ] = null ;
	slide_startshow ( ge( newid ) );
}

function slide_addnote( noteid ) {
	slide_init_timers ( noteid ) ;
	var template = qsn_template( noteid ) ;  //( qsn_currstate == "edit" ) ? "slide_notetemplate_edit" : "slide_notetemplate" ;
	var div = qsn_clonetemplate( noteid , template ) ;
	qsn_renderhtml( noteid ) ;
	q_addwindowblurhandlers( "slide_pauseall" ) ;
	q_addwindowfocushandlers( "slide_resumeall" ) ;
	return div ;
}


function slide_new_img_cancel( ) {
	if ( qsn_isnewnote ) qsn_canceledit( ) ;
}

function slide_launch_upload_from_html () {
	if ( ! qsn_edittarget ) return ;
	var id = qsn_edittarget.id ;
	if ( ! qsn_thenotes[ id ] ) return ;
//	qsn_canceledit (true);
	slide_launch_upload( id ) ;
}

function slide_launch_upload() {
	if ( ! window.rights_record ) return alert( common_message[ "membersonly" ] ) ;
	if ( slide_message[ "multiple_description" ] ) slide_upload_request.multiple_description = slide_message[ "multiple_description" ] ;
	slide_upload_request.prompt = slide_message[ "uploadprompt" ] ;
	slide_upload_request.title = slide_message[ "uploadtitle" ] ;
	slide_upload_request.noteid = qsn_edittarget.id ;
	qdyn_qorgload( "qu_reveal" , [ slide_upload_request ] , "qu" , { dynloadhandler : "qu_dynload" } ) ;
}

function slide_new_pc_img_done( xx ) {
	var id = slide_upload_request.noteid ;
	var r = qsn_thenotes[ id ] ;
	xx = xx.files ;
	for ( i=0 ; i<xx.length ; i++ ) {
		var x = xx[ i ];		
		if ( ! r.qalbum )  {
			r.qalbum = [{ original :"" , screen :"" , twothirdscreen :"" , halfscreen :"" , thirdscreen :"" , quarterscreen :"" , thumb :"" ,  width : "" , height : "" } ] ;
			r.qalbum[ 0 ].original = x.filename;
			r.qalbum[ 0 ].screen = x.formats.max900;
			r.qalbum[ 0 ].twothirdscreen = x.formats.max600;
			r.qalbum[ 0 ].halfscreen = x.formats.max400;
			r.qalbum[ 0 ].thirdscreen = x.formats.max300;
			r.qalbum[ 0 ].quarterscreen = x.formats.max200;
			r.qalbum[ 0 ].thumb= x.formats.max100;
			r.qalbum[ 0 ].width = x.imagewidth;
			r.qalbum[ 0 ].height = x.imageheight;
		}
		else {
			r.qalbum.push( {
			original : x.filename ,
			screen : x.formats.max900 ,
			twothirdscreen : x.formats.max600 ,
			halfscreen : x.formats.max400 ,
			thirdscreen : x.formats.max300 ,
			quarterscreen : x.formats.max200 ,
			thumb : x.formats.max100 ,	
			width : x.imagewidth ,
			height : x.imageheight
			} ) ;
		}
	}
	slide_renderhtml( id ) ;
/*
	if ( qsn_isnewnote == true ) {	
		qsn_addnote( id ) ;
		qsn_notechanged( id , "newnote" ) ;
		qsn_currstate = "view" ;
		qsn_isnewnote = false ; 
		// autorun dans refresh
	}
	} else {
		var div = ge( id ) ;
		qsn_notechanged( id , "notechanged" ) ;
		qsn_isnewnote = false ;
		var div = getelement ( id ) ;
		rm( id ) ;
		qsn_addnote( id ) ;
		var s = slide_timers [id] ;
		slide_restartshow( ge(id) );
	}
*/
}

function slide_renderhtml( noteid ) {
	var div = getelement ( noteid ) ;
	div.displayindex = 0 ;
	var r = qsn_thenotes[ noteid ] ;
	slide_init( div , r, noteid ) ;
	if ( qsn_currstate != "edit" && slide_edit_mode != "edit_supress") slide_startshow( ge (noteid) ) ;
	qsn_container_renderhtml( div , r ) ;
	if ( qsn_currstate == "edit" ) gebcn( div , "cancelokelem" ).style.width = "100%" ;
	qsn_setcolors( noteid ) ;
}

function slide_setnotecolor( x, c ) {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	r.color = c ? c : x.style.backgroundColor ;
	qsn_setcolors( qsn_edittarget.id ) ;
}

function slide_displaysettings() {
	qsn_initdisplaysetting() ;
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	if ( ! r.qalbum || ! r.qalbum.length ) slide_launch_upload() ;
}

function slide_patch_button ( elem, ee, mode) {
	// patch button class
	if (mode == "out" ) elem.style.color = rgbcontrastcolor150 ( getleftcolbackgroundcolor( ) ) ;
	 else elem.stylecolor = "#FFF" ;
}

function slide_supressphotos () {
	function createimg (i) {
		var d = document.createElement( "DIV" ) ;
		var img = document.createElement( "IMG" ) ;
		img.src = q_spaceabsoluteurl( r.common.ownerid ,  r.qalbum[ i ].thumb ) ;
		d.appendChild( img ) ;
		return d ;
	};
	function createlink( td , i ) {	
		td.appendChild ( createimg (nbimg) ) ;
		div = document.createElement( "DIV" ) ;
		td.appendChild( div ) ;
		td.style.cursor = "pointer" ;
		td.onmousedown = "q_stopPropagation( event )" ;
		td.onclick = function () { 
			if ( ( /qmc1 bg_contrast150/.test( this.className ) ) ) {
				this.className = this.className.replace( / qmc1 bg_contrast150 clubbackgroundcolorc1501/ , "" ) ;
				gebtn( this , "IMG" ).className = "" ;
			} else {
				this.className += " qmc1 bg_contrast150" ; 
				gebtn( this , "IMG" ).className = "delete" ;
			}
			qsn_setcolors( qsn_edittarget.id ) ;
		} ;
	} ;
	slide_edit_mode = "edit_supress";
	var noteid = qsn_edittarget.id;
	var div = getelement ( noteid ) ;
	var r = qsn_thenotes[ noteid ] ;
	var t = getElementByClassName( div , "slide_img_edit" ) ;
	showblock ( gebcn( div , "slide_supp" ) );
	var twidth = 600;
	ge(noteid).style.width = twidth + "px"; // 4 imgs par ligne
	var l = parseInt( ge(noteid).style.width ) ;
	ge(noteid).style.left = (q_windowInnerWidth() - 200)/2 - l/2 + "px";
	ge(noteid).style.backgroundColor = "white" ;
	var g = getElementsByClassName( div , "button" );
//	for ( var j=0; j<g.length; j++) g [ j ].style.color = q_blue ;
	var n = r.qalbum.length;
	while (t.childNodes.length>0) {
		t.removeChild(t.firstChild);
	}
	
	var nbl = Math.ceil(n/4) ;
	var table = document.createElement( "TABLE" ) ;
	table.border = "0" ;
	table.cellSpacing = 2;
	table.cellPadding = 5;
	table.width = "100%";
	table.style.borderCollapse = "collapse";
	var tr, tr2, td;
	var nbimg = -1;
	for( var i = 0 ; i < nbl ; i++ ) { 
		tr = table.insertRow( -1 ) ;
		for( var j = 0 ; j < 4 ; j++ ) { 
			td = tr.insertCell( -1 ) ;
			td.style.width = td.style.height = "100px";
			td.width = td.height="100";
			td.align = "center" ;
			td.style.verticalAlign = "middle";
			td.style.textAlign = "center";
			td.style.border = "1px dotted";
			td.style.borderColor = q_blue;
			
			if ( ++ nbimg < n ) {
				 createlink( td ,nbimg ) ;
/*
				 td.appendChild ( createimg (nbimg) ) ;
				div = document.createElement( "DIV" ) ;
				div.style.color = "red";
				div.appendChild ( createlink (nbimg) ) ;
				td.appendChild ( div) ;
*/
			} else td.innerHTML = " "  ;
		}
	}
	t.appendChild( table ) ;
	qsn_setcolors( noteid ) ;
}
	
function slide_entereditmode( id ) {
	slide_edit_mode = "edit_normal";
	var x = getelement( id ) ;
	if ( ! qsn_isnewnote ) {
		// garder le timer pour relancer en sortie de edit, soit dans slide_saveedit, soit dans cancel
		slide_timers[ id ].running = ( slide_timers[ id ].timer != null ) ;
		slide_cleartimer (id);
		rm( x ) ;
		qsn_thenotes[ qsn_backupid( id ) ] = q_cloneObject( qsn_thenotes[ id ] ) ;
		qsn_addnote( id ) ;
		qsn_edittarget = getelement( id ) ;
	} else qsn_edittarget = x ;
	qsn_setselected( qsn_edittarget , true ) ;
	qsn_showsettings( id ) ;
//	slide_displaysettings () ; //vh : qsn_showsettings appel déjà slide_displaysettings
	qsn_dimothers( id ) ;
	qsn_puttofront ( id ) ;
	initsky() ;
}

function slide_canceledit(  ) {
	if ( ! qsn_edittarget ) return ;
	var id = qsn_edittarget.id ;
	if ( ! qsn_thenotes[ id ] ) return ;
	if ( slide_edit_mode == "edit_supress" ) {
		slide_entereditmode( id );
		return;
	}
	qsn_canceledit (true);
	if ( slide_timers[ id ]  && slide_timers[ id ].running ) slide_restartshow ( ge(id) ) ;
}

function slide_suppressnote( x ) {
	clearInterval(slide_timers[ x ].timer);
	slide_timers[ x ].timer = null;
	qsn_suppressnote( x , true);
}

function slide_saveedit() {
	var id = qsn_edittarget.id ;
	var r = qsn_thenotes[ id ] ;
	// edit_normal save que couleur
	if ( slide_edit_mode == "edit_normal") {
		if ( ! qsn_isnewnote ) rm ( getelement ( id + "_bk" ) ) ;
		qsn_saveedit( true ) ;
		return;
	}
	
	if ( slide_edit_mode == "edit_supress") {
		var t = getElementByClassName( ge( id ) , "slide_img_edit" ) ;
		var imgs = t.getElementsByTagName( "IMG" );
		for ( var i = imgs.length - 1 ; i-- >0 ; ) 	if ( ( /delete/.test( imgs[ i ].className ) ) ) r.qalbum.splice( i , 1 ) ;
		qsn_saveedit( true ) ;
	}
}

function slide_setimg( div, r, w, h, ratio, ratio_value, thesrc) {
//	var img = gebcn( div , "slide_photoview" ) ;
	div.displayindex = ( div.displayindex + 1 ) % 2 ;
	var img = gebcn( div , "slide_photoview" + div.displayindex ) ;
	if ( qsn_currstate == "edit" && qsn_edittarget == div ) {
		var ww = parseInt( ge(div).style.width ) ;
		ge(div).style.width = ww + 24 + "px";
	}
	// img.src = q_spaceabsoluteurl( r.common.ownerid ,  thesrc ) ;
	q_hsetimgsrc( [ img , q_spaceabsoluteurl( r.common.ownerid , thesrc ) ] , slide_displayimg , [ div, w, h, ratio, ratio_value ] ) ;
}

function slide_displayimg( div, w, h, ratio, ratio_value ) {
	if ( ! div ) return ;
	if ( div.displayindex == undefined ) return ;
	var img = gebcn( div , "slide_photoview" + div.displayindex ) ;
	if ( ! img ) return ;
// 	img.width= w;
//	img.height= h;
	img.style.width= w + "px" ;
	img.style.height= h + "px" ;
	img.ratio = ratio;
	img.ratio_value = ratio_value;
	gebcn( div , "slide_photoview" + ( ( div.displayindex + 1 ) % 2 ) ).style.display = "none" ;
	img.style.display = "inline" ;
}

function slide_addphoto( target , js ) {
	s = '<table width="100%" cellspacing="10" border="0" cellpadding="0"><tbody><tr><td align="right">' ;
	s +='<a class="button" href="quomodo:ajouter photos" onmousedown="q_stopPropagation( event )" onclick="slide_launch_upload_from_html(); return false" onmouseover="slide_patch_button( this , event, \'over\' )" onmouseout="slide_patch_button( this , event, \'out\' )">' + slide_message[ "add" ] + '</a>' ;
	s +='</td><td>' ;
	s +='<a class="button" href="quomodo:supprimer photos" onmousedown="q_stopPropagation( event )" onclick="slide_supressphotos(); return false" onmouseover="slide_patch_button( this , event, \'over\' )" onmouseout="slide_patch_button( this , event, \'out\' )">' + slide_message[ "remove" ]  +'</a>' ;
	s += '</td></tr></tbody></table>' ;
	qsn_addleftcolelem( target , s ) ;
}

function slide_getsource ( div , r, notesize) {
	if ( ! r.qalbum || ! r.qalbum.length ) return ;
	var thesrc = "" ;
	var photoindex = r.lastphotoindex; 
	if ( ! r.qalbum[ photoindex ] ) photoindex = 0 ;
	var wo =  r.qalbum[ photoindex ].width;
	var ho =  r.qalbum[ photoindex ].height;
	
	var wcandidate , hcandidate, ratio, ratio_value ;
	var debug ;
	// si w et h originales plus petites que la note size : originale
	if (wo <= notesize && ho <= notesize ) {
		thesrc = r.qalbum[ photoindex ].original;
		wcandidate = wo ;
		hcandidate = ho ;
		debug = "original";
		slide_setimg ( div, r, wcandidate, hcandidate, "original", 0, thesrc);
		return ;
	} else {
	// sinon w OU h sont plus grandes que la note size
		if ( wo > ho ) {
			ratio = "horizontal" ;
			// reduire w à note size
			wcandidate = notesize;
			// déduire h
			hcandidate = Math.round (ho/wo*wcandidate);
			ratio_value = hcandidate / wcandidate;
		} else {
			ratio = "vertical" ;
			// reduire h à note size
			hcandidate = notesize;
			// déduire v
			wcandidate = Math.round (wo/ho*hcandidate);
			ratio_value = wcandidate / hcandidate ;
		}
	}		
	// chercher le format le plus proche, sur la hauteur ou la largeur selon le ratio
	if ( ratio == "vertical" ) {
		if (hcandidate >= 900) { 
			thesrc = r.qalbum[ photoindex ].screen;
			debug = "screen";
		} else if (hcandidate >= 600) {
			thesrc = r.qalbum[ photoindex ].twothirdscreen;
			debug = "twothirdscreen";
		} else if (hcandidate >= 400) {
			thesrc = r.qalbum[ photoindex ].halfscreen;
			debug = "halfscreen";
		} else if (hcandidate >= 300) {
			thesrc = r.qalbum[ photoindex ].thirdscreen;
			debug = "thirdscreen";
		} else {
			thesrc = r.qalbum[ photoindex ].quarterscreen;
			debug = "quarterscreen";
		}
	} else {
		if (wcandidate >= 900) { 
			thesrc = r.qalbum[ photoindex ].screen;
			debug = "screen";
		} else if (wcandidate >= 600) {
			thesrc = r.qalbum[ photoindex ].twothirdscreen;
			debug = "twothirdscreen";
		} else if (wcandidate >= 400) {
			thesrc = r.qalbum[ photoindex ].halfscreen;
			debug = "halfscreen";
		} else if (wcandidate >= 300) {
			thesrc = r.qalbum[ photoindex ].thirdscreen;
			debug = "thirdscreen";
		} else {
			thesrc = r.qalbum[ photoindex ].quarterscreen;
			debug = "quarterscreen";
		}
	}
	slide_setimg ( div, r, wcandidate, hcandidate, ratio, ratio_value, thesrc);
}

function slide_init( div , r , noteid) {
	// taille de la note
	var square = parseInt( div.style.width , 10);
	// if (square <250) square = 250; // pour reload, si slide_moveHandler est descendu en dessous de 250
	if (  qsn_currstate == "edit" && slide_edit_mode == "edit_normal") div.style.width = (square+30) + "px" ;
	else div.style.width = square + "px" ;
	var td = gebcn( div , "slide_photoview0" ).parentNode ;
	td.width = td.height = square ; 
	slide_getsource ( div , r, square);
	if ( qsn_currstate == "view" ) q_setimgsrc( gebcn( div , "slide_show_vitesse" ) , "/services/slide/images/" + slide_speed_img [ r.tempo ] + ".png" ) ;
}

function slide_setTempo( x, changetempo ) {
	var div = getContainer( x ) ;
	var noteid = div.id ;
	var r = qsn_thenotes[ noteid ] ;
	var s = slide_timers [ noteid ] ;
	var img = gebcn( div , "slide_show_vitesse" );
	if (changetempo) { if (++r.tempo > 2) r.tempo = 0; }
	q_setimgsrc( img , "/services/slide/images/" + slide_speed_img [ r.tempo ] + ".png" ) ;
	if (s.timer != null) slide_startshow( x ); 
	if ( document.mainform.pagemode && document.mainform.pagemode.value == "edit" ) qsn_notechanged( noteid , "notechanged" ) ;
}

function slide_photo_run ( id ) {
	var r = qsn_thenotes[ id ] ;
	if ( ! r ) return slide_cleartimer( id ) ;
	var div = ge ( id ) ;
	if ( isremoved( div ) ) return slide_cleartimer( id ) ;
	if ( qsn_currstate == "edit" || q_fsmpresent() ) return ;
	if ( r.qalbum.length == 1 ) return;
	var square = parseInt( div.style.width , 10);
	if ( r.reverse) slide_photo_prev ( r ) ;
	else slide_photo_next ( r );
	slide_getsource ( div , r, square);
}

function slide_photo_next ( r ) {
	if ( r.lastphotoindex < r.qalbum.length -1) r.lastphotoindex++;
	else r.lastphotoindex = 0;
}

function slide_photo_prev ( r ) {
	if ( r.lastphotoindex >0) r.lastphotoindex--;
	else r.lastphotoindex = r.qalbum.length -1;
}

function slide_startshow( x , reverse ) {
	var noteid = getContainer( x ).id ;
	var r = qsn_thenotes[ noteid ] ;
	var changed = false ;
	if ( reverse != undefined ) {
		changed = ( reverse != r.reverse ) ;
		r.reverse = reverse ;
	}
	var s = slide_timers [noteid] ;
	var div = ge ( noteid ) ;
	var square = parseInt( div.style.width , 10);
	if ( r.reverse ) slide_photo_prev ( r ) ;
	else slide_photo_next ( r ) ;
	slide_getsource ( div , r, square);
	slide_cleartimer ( noteid );
	s.timer = setInterval( function() { slide_photo_run ( noteid ); } , slide_tempos [r.tempo] );
	if ( changed && document.mainform.pagemode && document.mainform.pagemode.value == "edit" ) qsn_notechanged( noteid , "notechanged" ) ;
}

function slide_restartshow ( x ) {
	var noteid = getContainer( x ).id ;
	var r = qsn_thenotes[ noteid ] ;
	if ( slide_timers[ noteid ] )  {
		var s = slide_timers [noteid] ;
		slide_cleartimer ( noteid );
		s.timer = setInterval( function() { slide_photo_run ( noteid ); } , slide_tempos [r.tempo] );
	}
}

function slide_pause( x ) {
	var noteid = getContainer( x ).id ;
	slide_cleartimer ( noteid ) ;
}

function slide_beginDrag( elem , e ) {
	if ( qsn_currstate != "edit" ) xqsn_beginDrag( elem , e , slide_moveHandler, slide_upHandler ) ;
	else qsn_beginDragOnly ( elem , e , true ) ;
}

function slide_moveHandler( elem , ex , ey , ew , isGrow , xylimits ) {
	// if ( isGrow && ew < 250) ew = 250;
//	var img = gebcn( elem , "slide_photoview" ) ;
	var img = gebcn( elem , "slide_photoview" + elem.displayindex ) ;
	qsn_moveHandler( elem , ex , ey , ew , isGrow , xylimits ) ;
	if ( isGrow ) {
		// retaille le td
		img.parentNode.width = img.parentNode.height = ew ;
		if ( img.ratio == "vertical" ) {
			img.height = ew ;
			img.width = img.height * img.ratio_value ;
		}	
		if ( img.ratio == "horizontal" ) {
			img.width = ew ;
			img.height = img.width * img.ratio_value ;
		}		
		// sinon c "original", on laisse tel quel
		// ou pas
		// faut voir
	}
}

function slide_upHandler( elem , ex , ey , ew , isGrow , isMove , xylimits ) {
	var id = elem.id ;
	qsn_upHandler( elem , ex , ey , ew , isGrow , isMove , xylimits ) ;
	if ( isGrow ) {
		var div = ge( id ) ;
		var r = qsn_thenotes[ id ] ;
		var square = parseInt( div.style.width , 10) ;
		slide_getsource ( div , r, square ) ;
	}
}
function slide_mouseout( elem , ee ) {
	hideblock (gebcn (elem, "slide_buttons") );
	qsn_mouseout( elem , ee , true ) ;
}

function slide_showbuttons (elem) {
	var buttons = gebcn (elem, "slide_buttons") ;
	showblock ( buttons );
}

function slide_mouseover ( elem , ee ) {
	slide_showbuttons (elem) ;
	qsn_mouseover( elem , ee , true ) ;
}

function slide_initforweb( id ) {
// si c'est un ghost (non visible) on ne fait rien
	var r = qsn_thenotes[ id ] ;
	if ( ( r.spacedefaults.common.ghost ) && ( r.spacedefaults.common.ghost == "ghost" ) ) return ;

// mise en place des 2 images : nouvelle version du HTML
// deviendra obsolète lorsque toutes les pages existantes auront été re-webbées.
	var div = ge( id ) ;
	var img0 = gebcn( div , "slide_photoview0" ) ;
	if ( ! img0 ) {
		img0 = gebcn( div , "slide_photoview" ) ;
		img0.className = "slide_photoview0" ;
		var img1 = document.createElement( "IMG" ) ;
		img1.style.display = "none" ;
		img1.className = "slide_photoview1" ;
		img0.parentNode.appendChild( img1 ) ;
	}

	div.displayindex = 0 ;
	slide_init_timers( id ) ;	
	slide_init( ge( id ) , qsn_thenotes[ id ] , id ) ;
	slide_startshow( ge( id ) ) ;
	setTimeout( "q_addwindowfocushandlers( 'slide_resumeall' ) ; q_addwindowblurhandlers( 'slide_pauseall' ) ; " , 5000 ) ;
}

/*
function -
function SERVICE PAGES
*/

var slide_saved_jsontemplate ;//en cas de décor de note
/*
function -
function TOOLBAR
*/

function slide_toolbarversion() {
	return 1 ;
}

var slide_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "slide_js_loaded" ) ;

var team_message = {
"snname" : "Note Equipe" ,
"plug" : "Equipe_Affichez la fiche détaillée des membres d'une de vos équipes.",
"desc" : "La note Equipe permet de présenter les membres d'une équipe avec photos et infos personnalisables", 
"notetitleprompt" : "Cliquez ici pour donner un titre à la note équipe." ,
"newnoteprompt" : "Cliquez ici pour ajouter une description de l'équipe." ,
"cardfields" : "Champs de la fiche" ,
"cardfieldsinfo" : "Vous pouvez modifier certains titres des champs de la fiche selon le sport de l'équipe." ,
"changecardfields" : "valider ces titres" ,
"colon" : " :" ,
"confirmdeletecard" : "Voulez-vous vraiment supprimer la fiche '%s' ?" ,
"addmemberphoto" : "Ajouter la photo d'un membre" ,
"selectphoto" : "Veuillez sélectionner une photo." ,
"noplayer" : "(Aucun joueur)"
} ;

var team_cardfields = [ "Poste", "Numéro", "Poids", "Taille"] ;

var team_msgs_fr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "team_msgs_fr_js_loaded" ) ;


var team_templates_prepared = false ;
var team_leftcol_prepared = false ;

var team_json_template = { version : 1 , text : "" , color : "rgb(100%,100%,100%)" , header : { display: "true", color: "c1", text : "" } , textstyles: { size : "1" , font : "0" , bold : "false" , italic : "false" }, common: { left : 20 , top : 0 , width : 450 }, cardfields: [ "?", "?", "?", "?" ], cards : [ { firstname: "", name: "?", birthdate: "", comment: "", other1: "", other2: "", other3: "", other4: "", photo : {} } ] } ; 

var team_colordesc = { "qmc1" : "color" , "qmc2_qmc1" : "header.color" , "qmc3" : team_qmc3} ; 
var team_textdesc = { "qtxt1" : { "size" : "textstyles.size" , "font" : "textstyles.font" , "bold" : "textstyles.bold" , "italic" : "textstyles.italic" } };

var team_leftcol_description = [ 
{ what : "notecolor" , tabname : "tabcolor" , visible : true , elems : [ 
	{ handler : "qsn_addqlubcolorblock" , params : { jsonpath : "color" , others : true , transparent: true , title: false , menuseparator: false , modifynote : "qsn_setcolors" } }
	] } , 
{ what : "bandeau" , tabname : "tabheader" , visible : false , elems : [
	{ handler : "qsn_addheaderhideshow" , params : { notekind: "team" , title: "" , jsonpath : "header.display" } }, 
	{ handler : "qsn_addheadercolor" , params : { notekind: "team" , jsonpath : "header.color" } }
	] } , 
{ what : "textstyles" , tabname : "tabtext" , visible : false , elems : [ 
	{ handler : "qsn_addfontfsizes" , params : { jsonpath : "textstyles.size" , ncols : 2 } } , 
	{ handler : "qsn_addfontfamilies", params : { jsonpath : "textstyles.font" , ncols : 2 } } , 
	{ handler : "qsn_addtextoptions", params : { jsonpath : "textstyles" , ncols : 2 , opts : [ "bold" , "center" , "italic" ] } }
	] } ,
{ what : "cardfields" , tabname : "cardfields" , visible : false , elems : [
	{ handler : "qsn_addcustom" , params : { html : "team_leftcolcardfieldsoptions" } }
	] }
] ;

var team_upload_request = {
	"callerid" : "" ,
	"uploadkind" : "image",
	"title" : "N/A" ,
	"prompt" : "N/A" ,
	"multiple" : false,
	"extensions" : ["jpg" , "jpeg" , "png" , "gif" , "tiff" , "tif" ] ,
	"namingdata" : { "wantname" : true },
	"formats" : "screen halfscreen quarterscreen",
	"callback" : "", 
	"reveal": { "anim" : true },
	"resize" : true ,
	"resize_option" : { "ratio" : "image" } ,
	"transparency" : "image" ,
	"web" : false
} ;

var team_timers = { } ;

function team_qmc3( r ) {
	return "/services/team/images/team48.png" ;
}

function team_leftcolcardfieldsoptions( target , js ) {
	return "<div id=\"team_editcardfields_elem\"><div class=\"leftcoltext\" style=\"padding: 6px 0;\">" + team_message["cardfieldsinfo"] + "</div><input type=\"text\" value=\"\"/><br/><input type=\"text\" value=\"\"/><br/><input type=\"text\" value=\"\"/><br/><input type=\"text\" value=\"\"/><div style=\"text-align: center; margin-top: 7px\"><a class=\"button\" href=\"#\" onclick=\"team_replacecardfieldsoptions();return false\">" + team_message["changecardfields"] + "</a></div></div>" ;
}

function team_template( id ) {
	if ( team_templates_prepared ) return qsn_template( id , true ) ;
	qsn_installcontainer( "view" , "team" , ge( "team_notecontent" ).innerHTML ) ;
	var div = qsn_installcontainer( "edit" , "team" , ge( "team_notecontent_edit" ).innerHTML ) ;
	team_templates_prepared = true ;
	return qsn_template( id , true ) ;
}

/*
function -
function TIMERS
*/

function team_pauseall () {
	for ( var id in team_timers ) if ( team_timers [ id ] ) team_cleartimer( id ) ;
}

function team_resumeall () {
	if ( qsn_currstate == "edit" ) return ;
	for ( var id in team_timers ) if ( ge( id ) ) team_program( ge( id ) ) ;
}

function team_cleartimer( id ) {
	if ( ! team_timers[ id ] ) return ;
	clearTimeout( team_timers[ id ] ) ;
	team_timers[ id ] = null ;
}

function team_program( div , t ) {
	team_cleartimer( div.id ) ;
	team_timers[ div.id ] = setTimeout( function() { team_doanim_card( div ) ; } , t ? t : 3000 ) ;
}

/*
function -
function RENDER
*/

function team_renderhtml( noteid ) {
	var div = getelement( noteid ) ;
	div.minWidth = "200px" ;
	var r = qsn_thenotes[ noteid ] ;
	if ( qsn_currstate != "edit" ) {
		var t = gebcn( div , "team_text" ) ;
		t.innerHTML = r.text.replace( /(\n|\r)/g , "<br />" ) ;
		if ( team_rendercardslist( div, r ) ) {
			team_rendercardfieldsoptions( div, r, "view" ) ;
			team_renderonecard( gebcn( gebcn( div, "team_cardslist" ), "team_cardslist_item" ) ) ;
			if ( r.cards.length > 1 ) team_program( div ) ;
		}
	} else {
		var t = gebcn( div , "team_text" ) ;
		t.value = r.text ;
		team_blurdefault( t ) ;
		if ( r.cards.length == 0 ) r.cards = [ q_cloneObject( team_json_template.cards[ 0 ] ) ] ;
		for ( var i=0; i <r.cards.length; i++ ) team_create_editcard( div, r.cards[ i ] ) ;
		team_rendercardfieldsoptions( div, r, "edit" ) ;
		team_prepareimportmenu( div ) ;
		team_show_editcard( 0, div ) ;
	}
	qsn_container_renderhtml( div , r ) ;
	qsn_settextproperties( noteid ) ;
	qsn_setcolors( noteid ) ;
}

function team_rendercardslist( div, r ) {
	var l = gebcn( div, "team_cardslist" ) ;
	var c, d, n = 0 ;
	for ( var i=0; i<r.cards.length; i++ ) {
		c = r.cards[ i ] ;
//		if ( team_isemptycardrec( c ) ) continue ; // 10_05_19 vh : sinon s'il y a une fiche vide, la note ne s'affiche pas
		d = l.appendChild( create_elem( "div", { className: "team_cardslist_item " + ( ( ( i%2 ) == 0 ) ? "qmc1 bg_contrast13" : "" ) } ))  ; //, c.firstname + " " + c.name + " ►") ) ;
		d.cardindex = i ;
		d.setAttribute( "cardindex", i );
		d.innerHTML = "<table width='100%' cellspacing='0' cellpadding='0'><tr><td align='left' valign='middle'>" + ( c.firstname + " " + c.name ) + "</td><td align='right' valign='middle' class='team_cardlistarrow'>►</td></tr></table>" ;
		n++ ;
	}
	if ( n == 0 ) {
		l.innerHTML = team_message[ "noplayer" ] ;
		hideblock( gebcn( div, "team_viewcard" ) ) ;
	}
	return n ;
}

function team_rendercardfieldsoptions( div, r, mode ) {
	if ( mode == "edit" ) {
		var c = getElementsByClassName( div, "team_editcard" ) ;
		var cf, i , j ;
		for ( i=0; i < c.length; i++ ) {
			cf = getElementsByClassName( c[ i ], "team_cardfield" ) ;
			for ( j=0; j<cf.length; j++ ) cf[ j ].innerHTML = ( ( r.cardfields[ j ] == "?" ) ? team_cardfields[ j ] : r.cardfields[ j ] ) + team_message[ "colon" ] ;
		}
	} else {
		var cf = getElementsByClassName( div, "team_cardfield" ) ;
		for ( i=0; i<cf.length; i++ ) cf[ i ].innerHTML = ( ( r.cardfields[ i ] == "?" ) ? team_cardfields[ i ] : r.cardfields[ i ] ) + team_message[ "colon" ] ;
	}
}

function team_renderonecard( x, div ) { // x : event, noeud ou index
	var target, cardindex ;
	if ( typeof x == "number" ) {
		target = div ;
		cardindex = x ;
	} else if ( x.tagName ) {
		target = x ;
		cardindex = target.getAttribute( "cardindex" ) ;
	} else {
		target = getElementFromEvent( x ) ;
		target = getContainer ( target, "team_cardslist_item" ) ;
		cardindex = target.getAttribute("cardindex") ;
	}
	div = getContainer( target ) ;
	var cardlist = gebcn( div, "team_cardslist" ) ;
	var r = qsn_thenotes[ div.id ] ;
	var rec = r.cards[ cardindex ] || r.cards[ 0 ] ;
	var d = gebcn( div, "team_viewcard" ) ;
	if ( d.getAttribute("cardindex") != undefined ) {
		gebcn( getElementsByClassName( cardlist, "team_cardslist_item" )[ d.getAttribute( "cardindex" ) ], "team_cardlistarrow" ).style.visibility = "hidden" ;
	}
	d.setAttribute( "cardindex", cardindex ) ;
	gebcn( getElementsByClassName( cardlist, "team_cardslist_item" )[ d.getAttribute("cardindex") ], "team_cardlistarrow" ).style.visibility = "visible" ;
	for ( var p in rec ) {
		if ( p == "name" ) {
			q_innerHTML( gebcn( d, "team_viewcard_name" ), rec[ "firstname" ] + " " + rec[ "name" ] ) ;
		} else if ( p == "firstname" ) {
			continue ;
		} else if ( p == "photo" ) {
			var photo = gebcn( d, "team_viewcard_photo" ) ;
			if ( rec[ "photo" ].src ) {
				team_renderphoto( photo, rec[ "photo" ].src, rec[ "photo" ].width, rec[ "photo" ].height, 80 ) ;
			} else {
				photo.src = "/images/blank.gif" ;
				photo.style.width = "80px" ;
				photo.style.height = "90px" ;
			}
		} else {
			q_innerHTML( gebcn( d, "team_viewcard_" + p ), " " + rec[ p ] ) ;
		}
	}
}

function team_rendereditcardphoto( card, imgsrc, imgwidth, imgheight ) {
	team_renderphoto( gebcn( card, "team_editcard_photo" ), imgsrc, imgwidth, imgheight, 80 ) ;
}

function team_renderphoto( photo, imgsrc, imgwidth, imgheight, defaultwidth ) {
	var r = qsn_thenotes[ getContainer( photo ).id ] ;
	photo.imgwidth = imgwidth ;
	photo.imgheight = imgheight ;
	photo.imgsrc = imgsrc ;
	photo.src = q_spaceabsoluteurl( r.common.ownerid , imgsrc ) ;
	photo.style.width = defaultwidth + "px" ;
	photo.style.height = Math.round( defaultwidth * ( parseInt( imgheight, 10 ) / parseInt( imgwidth, 10 ) ) ) + "px" ;
}

/*
function -
function ANIM CARD
*/

function team_doanim_card( div ) {
	if ( isremoved ( div ) ) return ;
	if ( qsn_currstate == "edit" || q_fsmpresent() ) return team_program( div ) ;
	var d = gebcn( div, "team_viewcard" ) ;
	q_dim( d , 0 , 100 , function() { team_doanim_nextcard( div ) ; } ) ;
}

function team_doanim_nextcard( div ) {
	if ( isremoved ( div ) ) return ;
	if ( ! div.id || ! qsn_thenotes[ div.id ] ) return ;
	var d = gebcn( div, "team_viewcard" ) ;
	var i = ( ( parseInt( d.getAttribute("cardindex"), 10) + 1 ) < qsn_thenotes[ div.id ].cards.length ) ? parseInt( d.getAttribute("cardindex"), 10 ) + 1 : 0 ;
	team_renderonecard( i, div ) ;
	q_dim( d , 1 , 100 , function() { team_timers[ div.id ] = setTimeout( function() { team_doanim_card( div ) ; }, 3000 ) ; } ) ;
}

/*
function -
function EDIT CARD
*/

function team_create_editcard( div, rec ) {
	var template = gebcn( div, "team_editcard_template" ) ;
	var card = template.cloneNode( true ) ;
	template.parentNode.insertBefore( card, template ) ;
	card = team_setinfosof_editcard( card, rec ) ;
	team_updatemenuwith_editcard( div, -1, rec ) ;
}

function team_setinfosof_editcard( card, rec ) {
	card.className = "team_editcard" ;
	for ( var p in rec ) {
		if ( p != "photo" ) gebcn( card, "team_editcard_" + p ).value = rec[ p ] ;
		else {
			if ( rec[ "photo" ].src ) team_rendereditcardphoto( card, rec[ "photo" ].src, rec[ "photo" ].width, rec[ "photo" ].height ) ;
		}
	}
	return card ;
}

function team_getinfosof_editcard( x ) { // x = noeud, index ou -1 (current)
	var card = null ;
	if ( typeof x == "number" ) {
		var l = getElementsByClassName( qsn_edittarget, "team_editcard" ) ;
		if ( x == -1 ) card = l[ gebcn( qsn_edittarget, "team_selectcard" ).selectedIndex ] ;
		else card = l[ x ] ;
	} else card = x ;
	var rec = q_cloneObject( team_json_template.cards[ 0 ] ) ;
	for ( var p in rec ) {
		if ( p != "photo" ) rec[ p ] = gebcn( card, "team_editcard_" + p ).value ;
		else {
			var photo = gebcn( card, "team_editcard_photo" ) ;
			rec[ "photo" ] = { src: photo.imgimagesrc, width: photo.imgwidth, height: photo.imgimageheight } ;
		}
	}
	return rec ;
}

function team_get_editcard( x ) { // x = index ou -1 (current)
	var l = getElementsByClassName( qsn_edittarget, "team_editcard" ) ;
	if ( x == -1 ) return l[ gebcn( qsn_edittarget, "team_selectcard" ).selectedIndex ] ;
	else return l[ x ] ;
}

function team_getindexof_editcard( div, card ) {
	var c = getElementsByClassName( div, "team_editcard" ) ;
	var cardindex = 0 ;
	for ( var i=0; i < c.length; i ++ ) if ( c[ i ] == card ) cardindex = i ;
	return cardindex ;
}

function team_show_editcard( x, div ) {
	var menu = gebcn( div, "team_selectcard" ) ;
	if ( menu.options.length == 0 ) return team_add_editcard( ) ;
	if ( x == -1 ) x = menu.options.length - 1 ;
	menu.selectedIndex = x ;
	var c = getElementsByClassName( div, "team_editcard" ) ;
	for ( var i=0; i < c.length; i ++ ) c[ i ].style.display = ( i == x ) ? "" : "none" ;
}

function team_add_editcard( c ) {
	var div = qsn_edittarget ;
	if ( ! c ) c = q_cloneObject( team_json_template.cards[ 0 ] ) ;
	team_create_editcard( div, c ) ;
	team_rendercardfieldsoptions( div, qsn_thenotes[ div.id ], "edit" ) ;
	team_show_editcard( -1, div ) ;
}

function team_import_editcard( x ) {
	if ( x.selectedIndex == 0 ) return ;
	var m = members[ x.options[ x.selectedIndex ].value ] ;
	var rec = q_cloneObject( team_json_template.cards[ 0 ] ) ;
	rec.name = m.username ;
	if ( m.firstname ) rec.firstname = m.firstname ;
	if ( m.birthdate ) rec.birthdate = m.birthdate ;
	var currcard = team_get_editcard( -1 ) ;
	if ( team_isemptycardrec( team_getinfosof_editcard( currcard ) ) ) {
		team_setinfosof_editcard( currcard, rec ) ; // remplace la carte
		team_updatemenuwith_editcard( qsn_edittarget, team_getindexof_editcard( qsn_edittarget, currcard ), rec ) ;
	} else team_add_editcard( rec ) ; // ajoute une carte
	x.selectedIndex = 0 ;
}

function team_suppress_editcard( x ) {
	var div = getContainer( x ) ;
	var menu = gebcn( div, "team_selectcard" ) ;
	var cardindex = menu.selectedIndex ;
	var minfo = menu.options[ cardindex ].text ;
	if ( confirm( team_message[ "confirmdeletecard" ].replace( "%s", minfo ) ) ) {
		var card = getElementsByClassName( div, "team_editcard" )[ cardindex ] ;
		card.parentNode.removeChild( card ) ;
		q_removeChildren( menu ) ; // reconstruit le menu
		var c = getElementsByClassName( div, "team_editcard" ) ;
		for ( var i=0; i<c.length; i++ ) {
			menu.options[ menu.options.length ] = new Option( gebcn( c[ i ], "team_editcard_firstname" ).value + " " + gebcn( c[ i ], "team_editcard_name" ).value ) ;
		}
		team_show_editcard( 0, div ) ;
	}
}

function team_updatemenuwith_editcard( div, cardindex, rec ) {
	var menu = gebcn( div, "team_selectcard" ) ;
	if ( cardindex == -1 ) cardindex = menu.options.length ;
	menu.options[ cardindex ] = new Option( rec[ "firstname" ] + " " + rec[ "name" ] ) ;
}

function team_synchmenuwith_editcard( x ) {
	var card = getContainer( x, "team_editcard" ) ;
	var div = getContainer( card ) ;
	var cardindex = team_getindexof_editcard( div, card ) ;
	var menu = gebcn( div, "team_selectcard" ) ;
	menu.options[ cardindex ].text = gebcn( card, "team_editcard_firstname" ).value + " " + gebcn( card, "team_editcard_name" ).value ;
}

/*
function -
function EDIT NOTE
*/

function team_saveedit( ) {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	r.text = gebcn( qsn_edittarget , "team_text" ).value.replace( /\r\n/g , "\r") ;
	if ( r.text == team_message[ "newnoteprompt" ] ) r.text = "" ;
	/*
	var teamphoto = gebcn( qsn_edittarget, "team_editteamphoto" ) ;
	if ( teamphoto.imgsrc ) r.img = { src: teamphoto.imgsrc, width: teamphoto.imgwidth, height: teamphoto.imgheight } ;
	else r.img = { } ;
	*/
	var cards = [ ] ;
	var t = getElementsByClassName( qsn_edittarget, "team_editcard" ) ;
	for ( var i=0; i<t.length; i++ ) {
		var rec = q_cloneObject( team_json_template.cards[ 0 ] ) ;
		for ( var p in rec ) {
			if ( p != "photo" ) rec[ p ] = gebcn( t[ i ], "team_editcard_" + p ).value ;
			else {
				var cardphoto = gebcn( t[ i ], "team_editcard_photo" ) ;
				if ( cardphoto.imgsrc ) rec[ "photo" ] = { src: cardphoto.imgsrc, width: cardphoto.imgwidth, height: cardphoto.imgheight } ;
				else rec[ "photo" ] = { } ;
			}
		}
		cards[ cards.length ] = rec ;
	}
	r.cards = cards ;
	qsn_container_saveedit() ;
	qsn_saveedit( true ) ;
}

function team_displaysettings() {
	qsn_initdisplaysetting() ;
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	var cf = ge( "team_editcardfields_elem" ).getElementsByTagName( "input" ) ;
	for ( var i=0; i < cf.length; i++ ) cf[ i ].value = ( ( r.cardfields[ i ] == "?" ) ? team_cardfields[ i ] : r.cardfields[ i ] ) ;	
	return false ;
}

function team_replacecardfieldsoptions( ) {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	var cf = ge( "team_editcardfields_elem" ).getElementsByTagName( "input" ) ;
	for ( var i=0; i < cf.length; i++ ) {
		if ( cf[ i ].value == "" ) {
			r.cardfields[ i ] = "?" ;
			cf[ i ].value = team_cardfields[ i ] ;
		} else r.cardfields[ i ] = cf[ i ].value ;
	}
	team_rendercardfieldsoptions( qsn_edittarget, r, "edit" ) ;
}

function team_focusdefault( x ) {
	if ( x.value == team_message[ "newnoteprompt" ] ) x.value = "" ;
}

function team_blurdefault( x ) {
	x.value = x.value || team_message[ "newnoteprompt" ] ;
}

/*
function -
function EDIT IMAGES
*/

function team_editcardphoto( x ) {
	team_upload_request.title = team_message[ "addmemberphoto" ] ;
	team_upload_request.prompt = team_message[ "selectphoto" ] ;
	team_upload_request.callback = team_editcardphoto_done ;
	if ( qsn_isnewnote == false ) team_upload_request.noteid = getContainer( x ).id ;
	qdyn_qorgload( "qu_reveal" , [ team_upload_request ] , "qu" , { dynloadhandler : "qu_dynload" } ) ;
}

function team_editcardphoto_done( x ) {
	var div = qsn_edittarget ;
	var cardindex = gebcn( div, "team_selectcard" ).selectedIndex ;	
	var img = x.files[ 0 ] ;
	var card = getElementsByClassName( div, "team_editcard" )[ cardindex ] ;
	team_rendereditcardphoto( card, img.formats.quarterscreen, img.imagewidth, img.imageheight ) ;
}

/*
function team_editteamphoto( x ) {
	team_upload_request.title = team_message[ "addteamphoto" ] ;
	team_upload_request.prompt = team_message[ "selectphoto" ] ;
	team_upload_request.callback = team_editteamphoto_done ;
	if ( qsn_isnewnote == false ) team_upload_request.noteid = getContainer( x ).id ;
	qdyn_qorgload( "qu_reveal" , [ team_upload_request ] , "qu" , { dynloadhandler : "qu_dynload" } ) ;
}

function team_editteamphoto_done( x ) {
	var img = x.files[ 0 ] ;
	team_rendereditteamphoto( qsn_edittarget, img.formats.screen, img.imagewidth, img.imageheight ) ;
}
*/

/*
function -
function UTILES
*/

function team_mouseover( elem , ee ){
	team_pauseall();
	qsn_mouseover( elem , ee , true ) ;
}

function team_mouseout( elem , ee ){
	team_resumeall();
	qsn_mouseout( elem , ee , true ) ;
}

function team_prepareimportmenu( div ) {
	var sel = gebcn( div, "team_importcard" ) ;
	for ( var m in members ) {
		if ( m != "quomodo" ) sel.options[ sel.options.length ] = new Option( members[ m ].firstname + " " + members[ m ].username , m ) ;
	}
}

function team_isemptycardrec( rec ) {
	var temp = team_json_template.cards[ 0 ] ;
	for ( var p in temp ) {
		if ( p != "photo" ) {
			if ( temp[ p ] != rec[ p ] ) return false ;
		}
	}
	return true ;
}

function team_initforweb( id ) {
	team_program( ge( id ) ) ;
}

/*
function -
function TOOLBAR
*/

function team_toolbarversion() {
	return 1 ;
}

var team_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "team_js_loaded" ) ;


var vc_message = {
"newnoteprompt" : "Cette page a été visitée %n fois !" ,
"visible_guest" : "Cette note affiche le nombre de visites de la page web" ,
"plug" : "Compteur_Affichez le nombre de visites d'une page sur celle-ci." ,
"plug_qlub" : "Compteur_Affichez le nombre de visites sur votre page web." ,
"emptynote" : "(aucun message)" ,
"desc" : "(...)",
"tabcolor" : "Fond de la note" ,
"titlecolorbg" : "Fond" ,
"tabstyle" : "Style" ,
"textfont" : "Lettres" ,
"bold" : "G" ,
"italic" : "I" ,
"uppercase" :"majusc." ,
"tip_edit" : "modifier la smartnote compteur"
}

var vc_msgs_fr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "vc_msgs_fr_js_loaded" ) ;


var vc_templates_prepared = false ;
var vc_leftcol_prepared = false ;

var vc_json_template = { version: 7 ,  text : "" , textsize : 14 , textfont : "0" , textcolor : "-1" , textstyles: { bold : "false" , italic : "false" , uppercase : "false" } , textspacing : "1" , textalign : "0" , color : 1 , textmargin: 2 , textopacity : 1 } ;

var vc_oldjson_template = {
"6" : { version: 6 ,  text : "" , textsize : 14 , textfont : "1" , textcolor : "-1" , textbold : "0" , textitalic : "0" , textuppercase : "0" , textspacing : "1" , textalign : "0" , color : -1 , margin: 2 , opacity : 4 } 
} ;

var vc_colordesc = { "qmc1" : vc_qmc1 , "qmc2" : [ "textcolor" , "color" ] } ;
var vc_textdesc = { "qtxt1" : {"slider" : "textsize" , "font" : "textfont" , "bold" : "textstyles.bold" , "italic" : "textstyles.italic" , "uppercase" : "textstyles.uppercase"  , "spacing" : "textspacing" , "align" : "textalign" } , "qtxt2" : { "margin" : "textmargin" , "padding": "textmargin" } , "qtxt3" : { "opacity" : "textopacity" } } ;

function vc_qmc1( r ) {
	if ( r.textopacity == 4 ) return -1 ;
	return r.color ;
}

var vc_textsizemin = 7 ;

var vc_leftcol_description = [
	{ what : "textslider" , tabname : "qsn_textsize" , visible : true , elems : [ { handler : "qsn_addtextsizeslider" , params : { jsonpath : "textsize" } } ] } ,
	{ what : "textstyles" , tabname : "tabstyle"       , visible : false , elems : [ { handler : " qsn_addfontfamilies"   , params : { jsonpath : "textfont" , ncols : 2  } } ,
											  { handler : "qsn_addtextoptions"     , params : { jsonpath : "textstyles" , ncols : 3 , title : ""  , opts : [ "bold" , "italic" , "uppercase" ] } } ,
											  { handler : "qsn_addtextaligns"         , params : { jsonpath : "textalign" , ncols : 2 } } ,
											  { handler : "qsn_addtextspacings"     , params : { jsonpath : "textspacing" , ncols : 3 } } 
											] 
	} , 
	{ what : "textmargin" , tabname : "qsn_tabmargin" , visible : false , elems : [ { handler : "qsn_addmargins" , params : { jsonpath : "textmargin" , ncols : 1, modifynote : "vc_modifymargin" } } ] } ,
	{ what : "notecolor" , tabname : "tabcolor" , visible : false , elems : [
		{ handler : "qsn_addqlubcolorblock" , params : { jsonpath : "color" , others : true ,  transparent:false , title:false , menuseparator: false , modifynote : "qsn_modifynotecolor"  } } ,
		{ handler : "qsn_addopacities"     , params : { jsonpath : "textopacity" , ncols : 1  } } ] 
	} ,
	{ what : "textcolor" , tabname : "tabtextcolor" , visible : false , elems : [ { handler : "jqsn_addcolorblock" , params : { others : true ,  transparent:false , title:false , menuseparator: false , callback : "qsn_settextcolor"  } } ] } 
] ;	

function vc_upgradejson( r ) {
	if ( ! r.version ) r.version = 1 ;
	if ( r.version == vc_json_template.version ) return r ;
	if ( r.version < 2 ) r = vc_upgradejsontov2( r ) ;
	if ( r.version < 3 ) r = vc_upgradejsontov3( r ) ;
	if ( r.version < 4 ) r = vc_upgradejsontov4( r ) ;
	if ( r.version < 5) r = vc_upgradejsontov5( r ) ;
	if ( r.version < 6) r = vc_upgradejsontov6( r ) ;
	if ( r.version < 7) r = vc_upgradejsontov7( r ) ;
	r.version = vc_json_template.version ;
	return r ;
}
function vc_upgradejsontov2( r ) {
	r.textuppercase = "0" ;
	return r ;
}
function vc_upgradejsontov3( r ) {
	r.textspacing = "1" ;
	return r ;
}
function vc_upgradejsontov4( r ) {
	r.textalign = "0" ;
	return r ;
}
function vc_upgradejsontov5( r ) {
	r.color = -1 ;
	return r ;
}
function vc_upgradejsontov6( r ) {
	r.margin = "2" ;
	r.opacity = "4" ;
	return r ;
}

function vc_upgradejsontov7( r ) {
	r[ "textstyles" ] = { bold : String( r.textbold!="0" ) , uppercase : String( r.textuppercase!="0" ) , italic : String( r.textitalic!="0" ) } ;
	if ( parseInt( r.textfont , 10 ) > 0 ) r.textfont =  "" + ( parseInt( r.textfont , 10 ) - 1 ) ;
	r.textmargin = r.margin ;
	r.textopacity = r.opacity ;
	delete r.textbold ;
	delete r.textitalic ;
	delete r.uppercase ;
	delete r.margin ;
	r.version = vc_json_template.version;
	return r;
}

function vc_template( id ) {
	if ( vc_templates_prepared ) return qsn_template( id , true ) ;
	var div = qsn_installcontainer( "view" , "vc" , ge( "vc_notecontent" ).innerHTML ) ;
	div.className = div.className.replace( /qmc. [^ ]+/g , "" ) ;
	div.style.borderWidth = "0px" ;
	var div = qsn_installcontainer( "edit" , "vc" , ge( "vc_notecontent_edit" ).innerHTML ) ;
	div.className = div.className.replace( /qmc. [^ ]+/g , "" ) ;
	vc_templates_prepared = true ;
	return qsn_template( id , true ) ;
}

/*
function -
function RENDER
*/

function vc_renderhtml( noteid ) {
	var div = getelement( noteid ) ;
	var r = qsn_thenotes[ noteid ] ;
	vc_rendertext( div , r ) ;
	qsn_container_renderhtml( div , r ) ;
	qsn_settextproperties( noteid ) ;
	qsn_setcolors( noteid ) ;

	if ( qsn_currstate == "edit" ) gebcn( div, "textbackground" ).style.height = div.offsetHeight +  "px" ;
	else if ( ! window.q_makeweb ) vc_request( vc_reqcallback , div.id );
}

function vc_modifymargin( id ) {
	qsn_settextproperties( id ) ;
	gebcn( qsn_edittarget, "textbackground" ).style.height = ( qsn_edittarget.offsetHeight - 6 ) +  "px" ;
}

function vc_rendertext( div , r ) {
	var txt = gebcn( div , "text" ) ;
	if ( qsn_currstate != "edit" ) {
		var text0 = gebcn( txt, "textbackgroundtext" ) ;
		var text1 = gebcn( txt, "textforegroundtext" ) ;
		if ( r.text ) text0.innerHTML = text1.innerHTML = wiqi_text2HTML( r.text ) ;
		else text0.innerHTML = text1.innerHTML = vc_message[ "newnoteprompt" ] ;
		if ( window.q_makeweb ) hideblock( text1 ) ;
		else showblock( text1 ) ;
	}
	else txt.value = r.text || vc_message[ "newnoteprompt" ] ;
}

function vc_posttreatment( id ) {
	if ( qsn_currstate != "edit" ) 
		return ;
	var div = ge( id ) ;
	gebcn( div , "textbackground" ).style.height = ( div.offsetHeight - 6 ) + "px" ;	
}
/*
function -
function EDIT
*/

function vc_displaysettings() {
	qsn_initdisplaysetting() ;
	return false ;
}

function vc_saveedit() {
	var id = qsn_edittarget.id ;
	var r = qsn_thenotes[ id ] ;
	var x = gebcn( qsn_edittarget, "vc_textarea" ) ;
	r.text = ( x.value ) ? x.value : "" ;
	if ( ! qsn_isnewnote ) rm ( getelement ( id + "_bk" ) ) ;
	qsn_saveedit( true ) ;
}

function vc_newnote( ) {
	if ( qsn_currstate != "view" ) {
		alert ( qsn_message [ "notviewmode" ] ) ;
		return false ;
	}
	// We check if it's a unique note
	var jsonnewnote = qsn_fulljson_template( "vc" ) ;
	var id = qsn_makenewfulljson( "vc" , jsonnewnote ) ;
//	qsn_thenotes[ id ].spacedefaults.common.zindex = pm_currzindexmax() + 1 ;
	qsn_currstate = "edit" ;
	qsn_addnote( id ) ;
	qsn_entereditmode( id ) ;
}

function vc_richnotes( id ) {
	var decor = qsn_richnotes( id , true );
	decor.push("video") ;
	return decor;
}

function vc_focusdefault (  ) {
	alert("youpi")
	
	}


/*
function vc_ajaxget( url , callBackFunction, params ) {
	var req=null;
	if ( ! req ) {
		if ( window.XMLHttpRequest ) {
	 		req = new XMLHttpRequest() ;
			//if ( req.overrideMimeType )  { req.overrideMimeType( 'text/plain' ) ; }
		} else if ( window.ActiveXObject ) {
			try { req = new ActiveXObject ( "Msxml2.XMLHTTP" ) ;} 
			catch (e )  {
				try { req = new ActiveXObject ( "Microsoft.XMLHTTP" ) ; } 
				catch (e )  {}
			}
	        }
	}
	req.open( "GET" , url , true ) ;
	req.send ( null ) ;
	req.onreadystatechange = function () { 
		if(req.readyState != 4 ) return;
		if(req.status !=200 && req.status !=304) return;
		else { callBackFunction(req.responseXML, params);}
	} ;
}
*/

function vc_reqcallback (x, noteid) {
	gebcn(noteid, "textbackgroundtext").innerHTML = gebcn(noteid, "textforegroundtext").innerHTML = gebcn(noteid, "textforegroundtext").innerHTML.replace(/%n/g, x.total ) ;
	showblock( gebcn( noteid, "textforegroundtext" ) ) ;
}

function vc_request(callback, params){
	vc_ajaxsubmit( {mission:"getdata" , privatedomain : clubprivatedomain , page : currsvcid.replace( /[^0-9]/g , "" ) } , callback , params );
}

function vc_ajaxsubmit ( q_data , callBackFunction , params ) {
	var req = null;
	if ( window.XMLHttpRequest ) {
 		req = new XMLHttpRequest() ;
		if ( req.overrideMimeType ) req.overrideMimeType( 'text/xml' ) ;
	} else if ( window.ActiveXObject ) {
		try { req = new ActiveXObject ( "Msxml2.XMLHTTP" ) ; } 
		catch (e )  {
			try { req = new ActiveXObject ( "Microsoft.XMLHTTP" ) ; } 
			catch (e )  {}
		}
	}
	req.open ( "POST" , "/cgi-bin/cgicounter" , true ) ;
	req.setRequestHeader ( "Content-type", "application/x-www-form-urlencoded" ) ; 
	req.onreadystatechange = function() {
		if ( req.readyState != 4) return ;
		if ( req.status == undefined ) return badrequest() ;
		if ( req.status == 200) {
			var x = {} ;
			if ( req.responseText ) x = eval ( "(" + req.responseText + ")" ) ;
			if ( ! x.ajaxerror && callBackFunction ) callBackFunction( x , params ) ;
			req = null ;
		}
	} ;
	req.send ( reqAddData ( "data" , q_toplist ( q_data )  ) ) ;
}

function vc_initforweb( id ) {
	vc_request( vc_reqcallback , id );
}

/*
function -
function TOOLBAR
*/

function vc_toolbarversion() {
	return 1 ;
}

var vc_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "vc_js_loaded" ) ;

var video_message = {
"newnoteprompt" : "cliquez ici pour ajouter une légende" ,
"pclocalnotvalidate" : "Vous n'avez pas validé le choix de votre image.\n\nCelle-ci ne va pas être enregistrée." ,
"fermer" : "fermer" ,
"film" : "Vidéo" ,
"audiostream" : "Flux audio" ,
"audio" : "Audio" ,
"seconds" : " secondes" ,
"validateimage" : "Veuillez valider l'image" ,
"plug" : "Video_Stockez, visionnez et montrez vos vidéos sur votre espace.",
"selectavideo" : "Choisissez la vidéo dans votre ordinateur:" ,
"uploadtitle" : "Chargement d'une vidéo (mpg, mpeg, mp4, mov)" ,
"desc" : "(...)",
"errqt" : "Erreur Plugin Quicktime "
} ;
var video_msgs_fr_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "video_msgs_fr_js_loaded" ) ;


var video_templates_prepared = false ;
var video_leftcol_prepared = false ;
var video_json_template = { version: 3 , text : "" , video : { kind : "" } , color : 1 , textstyles:{ size : "2" , font : "1" , bold : "false" , center : "false" , italic : "false" } } ;

var video_colordesc =  { "qmc1" : "color" } ;
var video_textdesc = { "qtxt1" : { "size" : "textstyles.size" , "font" : "textstyles.font" ,  "bold" : "textstyles.bold" , "center" : "textstyles.center" , "italic" : "textstyles.italic" }  };

var video_leftcol_description = [
{ what : "notecolor" , tabname : "tabcolor" , visible : true , elems : [ 
	{ handler : "qsn_addqlubcolorblock" , params : { jsonpath : "color" , others : true ,  transparent:true , title:false , menuseparator: false , callback : "qsn_setcolors"  } } 
	] }, 
{ what : "textstyles" , tabname : "tabtext" , visible : false , elems : [ 
	{ handler : " qsn_addfontfsizes"   , params : { jsonpath : "textstyles.size" , ncols : 2  } } ,
	{ handler : " qsn_addfontfamilies"   , params : { jsonpath : "textstyles.font" , ncols : 2  } } ,
	{ handler : "qsn_addtextoptions"     , params : { jsonpath : "textstyles" , ncols : 2 , opts : [ "bold" , "center" , "italic"  ] } }
	] }
] ;

var video_request = {
	"callerid" : "" ,
	"uploadkind" : "video",
	"title" : "" ,
	"prompt" : "" ,
	"multiple" : false,
	"extensions" : [ "avi" , "divx" , "mkv" , "gvi" , "mov" , "mpg" , "mpeg" , "mp4" , "mp3" , "m4p" , "m4v" , "m3u" , "vp6", "vfw" , "wmv" ] ,
	"namingdata" : { "wantname" : true },
	"formats" : "",
	"callback" : "",
	"cancel": { "callback" : "qsn_canceledit", "args" : [] }
}

function video_upgradejson( r ) {
	if ( ( r.version ) && ( r.version == video_json_template.version ) ) return r ;
	if(r.version<2) r.color = 1;
	if(r.version<3) {
		r.textstyles = { size:r.textsize , font:r.textfont, bold : String( r.textbold !=0 ) , center : String( r.textcenter != 0 ) , italic : String( r.textitalic !=0 ) } ;
		r.textsize = null ;
		r.textfont = null ;
		r.textbold = null ;
		r.textcenter = null ;
		r.textitalic = null ;
	}
	r.version = video_json_template.version ;
	return r ;
}

function video_template( id ) {
	if ( video_templates_prepared ) return qsn_template( id , true ) ;
	qsn_installcontainer( "view" , "video" , ge( "video_notecontent" ).innerHTML ) ;
	var div = qsn_installcontainer( "edit" , "video" , ge( "video_notecontent_edit" ).innerHTML ) ;
	video_templates_prepared = true ;
	return qsn_template( id , true ) ;
}

var have_quicktime = 0 ; // ne pas utiliser true/false
function video_quicktime_missing () {
	if (navigator.plugins) {
		for (i=0; i < navigator.plugins.length; i++ ) {
			if (navigator.plugins[i].name.indexOf("QuickTime") >= 0) {
				have_quicktime = 1;
				break;
			}
		}
	}
	if ((navigator.appVersion.indexOf("Mac") > 0) && (navigator.appName.substring(0,9) == "Microsoft") && (parseInt(navigator.appVersion) < 5) ) have_quicktime = 1; 
	return have_quicktime == 0 ;
}

function video_checkaudiofield( noteid ) {
	var r = qsn_thenotes[ noteid ] ;
	if ( r.video && ( r.video.audio == undefined ) ) {
		var k = video_moviekind ( noteid ) ;
		r.video.audio = ( k ==  "audiostream" ||  k == "audio"  ) ;
	}
}

function video_addnote ( noteid ) {
	var template = qsn_template( noteid ) ;
	var div = qsn_clonetemplate( noteid , template ) ;
	video_checkaudiofield( noteid ) ;
	qsn_renderhtml( noteid ) ;
	return div ;
}

function video_moviekind( noteid ) {
	var r = qsn_thenotes[ noteid ] ;
	if ( ! r.video.duration ) return "unknown" ;
	if ( r.video.duration == 3579139 ) return "audiostream" ;
	return ( ( r.video.width == 150 ) && ( r.video.height == 0 ) ) ? "audio" : "film" ;
}

function video_setnotecolor( x, c ) {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	r.color= c ? c : x.style.backgroundColor ;
	qsn_setcolors( r.common.noteid ) ;
}

function video_renderhtml( noteid ) { 
	var div = getelement ( noteid ) ;
	var r = qsn_thenotes[ noteid ] ;
	var edit = false;
	if ( r.video.audio ) {
		if ( qsn_currstate == "edit" ) {
			var noteimg = gebcn( div , "video_noteimage_edit" );
			q_setimgsrc( noteimg , "/services/video/images/radio.png" ) ;
			edit = true;
		} 
	} 

	if ( qsn_currstate != "edit" ) {
		if ( r.video.duration ) {
			var kind = video_moviekind( noteid ) ;
			var s = video_message[ kind ] ;
			if ( kind != "audiostream" ) s += ", " + r.video.duration + video_message[ "seconds" ] ;
			gebcn( div , "video_infos" ).innerHTML = s ;
		} else gebcn( div , "video_infos" ).innerHTML = video_message[ kind ] ;
	}
	video_rendertext( div , r ) ;
	if ( ! edit ) {
		div.toresize = function () {
			var x = [] ;
			x.push( gebcn( this , "video_noteimage" ) ) ;
			x = x.concat( qsn_container_toresize( this ) ) ;
			return x ;
		} ;// vh 09_06_29 : bug sur IE image en % dans une table
		video_renderimg( div , r ) ;
	}
	if ( qsn_currstate == "edit" ) qsn_blurdefault ( gebcn( div , "text" ) ) ;
	qsn_container_renderhtml( div , r ) ;
	qsn_settextproperties( noteid ) ;
	qsn_setcolors( noteid ) ;
	q_changedwidth( div , parseInt( qsn_width( r.common.noteid ) , 10 ) ) ;// vh 09_06_29 : bug sur IE image en % dans une table
}

function video_rendertext( div , r ) {
	if ( r.text == undefined ) return ;
	var txt = gebcn( div , "text" ) ;
	if ( qsn_currstate != "edit" ) txt.innerHTML = wiqi_text2HTML( r.text ) ;
	else txt.value = r.text ;
}

function video_renderimg( div , r ) {
	if ( ! div ) div = qsn_edittarget ;
	if ( ! r ) r = qsn_thenotes[ div.id ] ;
	var noteimg = gebcn( div, "video_noteimage" ) ;
	if ( ( r.video ) && ( r.video.firstimage ) ) {
		if ( r.video.audio && r.video.firstimage == "/services/video/images/radio.png" ) q_setimgsrc( noteimg , r.video.firstimage ) ;
		else q_setimgsrc( noteimg , q_spaceabsoluteurl( r.common.ownerid , r.video.firstimage ) ) ;
	}
	if ( r.video.audio ) {
		noteimg.style.width = "70px" ;
		noteimg.style.top = "-8px" ;
	} else noteimg.style.top = "0px" ;
	// noteimg.style.width = r.video.audio ? "70px" : "100%" ;
	// noteimg.style.top = r.video.audio ? "-8px" : "0px" ;
}

function video_launch_upload() {
	video_request.callback = "video_new_video_done";
	var id = qsn_edittarget.id ;
	video_request.callerid = id ;
	video_request.prompt = video_message[ "selectavideo" ] ;
	video_request.title = video_message[ "uploadtitle" ] ;
	qdyn_qorgload('qu_reveal',[video_request],'qu');
}

function video_displaysettings() {
	qsn_initdisplaysetting() ;
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	if (( r.video.src == undefined ) || ( r.video.src == "" )) { // pas de vidéo
		hideblock( qsn_edittarget.id ) ;
		video_launch_upload() ;
//		hideblock ( ["video_eb_textsize", "video_eb_textstyle", "video_eb_textoptions"] ) ;
	} 
	var s = q_spacetype() ;
	if ( ( s == "qlub" ) || ( s == "fede" ) ) showblock( "video_helplink" ) ;
}

function video_showvideoinfos( id ) {
	var div = getelement( id ) ;
	var r = qsn_thenotes[ id ] ;
	gebcn ( div , "video_source" ).innerHTML = r.video.src.replace( /.*\/(.*)$/ , "$1" ) ;
	var audio = ( r.video.width == 150 ) && ( r.video.height == 0 ) ;
	visibleblock( gebcn ( div , "video_dimensions" ).parentNode , ( ! audio ) ) ;
	visibleblock( gebcn ( div , "video_duration" ).parentNode , ( ! audio ) ) ;
	if ( ! audio ) gebcn ( div , "video_dimensions" ).innerHTML = r.video.width + " x " + r.video.height + " pixels" ;
	if ( ! audio ) gebcn ( div , "video_duration" ).innerHTML = r.video.duration + video_message[ "seconds" ] ;
}

function video_saveedit() {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	var x = gebcn( qsn_edittarget, "video_textarea" ) ;
	r.text = ( x.value ) ? x.value : "" ;
	if ( r.video.kind == "pc_local" ) {
		if ( ! confirm( video_message["pclocalnotvalidate"] ) ) return false ;
		r.img = q_cloneObject( r.imgbk ) ;
		r.imgbk = null ;
	}
	if ( ( qsn_edittarget ) && ( gebcn( qsn_edittarget , "text" ) ) ) {
		if ( r.text == video_message[ "newnoteprompt" ] ) r.text = '' ;
	}
	qsn_saveedit( true ) ;
}

function video_newnote( ) {
	var id = qsn_makenewjson( "video" ) ;
	qsn_buildnewPosition( qsn_thenotes[ id ] ) ;
	qsn_thenotes[ id ] = q_cloneObject( video_json_template , qsn_thenotes[ id ] ) ;
	qsn_currstate = "edit" ;
	qsn_thenotes[ id ].color = qsn_defaultcolor () ;
	qsn_addnote( id ) ;
	qsn_entereditmode( id ) ;
}

function video_new_video_done( x ) {
	var r = qsn_thenotes[ qsn_edittarget.id ] ;
	r.imgbk = null ;
	r.video.src = x.files[ 0 ].filename ;
	r.video.firstimage = x.files[ 0 ].firstimagefilename ;
	r.video.width = x.files[ 0 ].videowidth ;
	r.video.height = x.files[ 0 ].videoheight ;
	r.video.duration = x.files[ 0 ].videoduration ;
	r.video.size = x.files[ 0 ].filesize ;
	r.video.kind = "pc" ;
	var k = video_moviekind ( qsn_edittarget.id ) ;
	r.video.audio = ( k ==  "audiostream" ||  k == "audio"  ) ;
	if ( r.video.audio ) r.video.firstimage = "/services/video/images/radio.png" ;
	showblock( qsn_edittarget.id ) ;
	video_renderimg( qsn_edittarget , r ) ;
}

function video_entereditmode( id ) {
	var x = getelement( id ) ;
	if ( ! qsn_isnewnote ) {
		var img ;
		img = x.getElementsByTagName( "img" )[ 0 ] ;
		if ( img ) img.style.display = "none" ;
		var h = gebcn ( x , "text" ).offsetHeight ;
		if ( img ) img.style.display = "inline" ;
		x.style.display = "none" ;
		x.id = id + "_bk" ;
		qsn_thenotes[ id + "_bk" ] = q_cloneObject( qsn_thenotes[ id ] ) ;
		qsn_addnote( id ) ;
		qsn_edittarget = getelement( id ) ;
		if ( h < 32 ) h = 32 ;
		gebcn ( qsn_edittarget , "text" ).style.height = "" + h + "px" ;
	} else qsn_edittarget = x ;
	
	qsn_showlinks( qsn_edittarget , false ) ;
	qsn_setselected( qsn_edittarget , true ) ;
	qsn_showsettings( id ) ;
	qsn_dimothers( id ) ;
	qsn_puttofront ( id ) ;
	initsky() ;
}

function video_showwin(URLStr, name, left, top, width, height) {
	var styleStr = 'toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=no,copyhistory=no,width='+width+',height='+height+',left='+left+',top='+top+',screenX='+left+',screenY='+top;
	return window.open(URLStr, name, styleStr, true);
}

function video_myshowwin(aurl,name,larg_wind,haut_wind, positionner, wantmini) {
	if ( wantmini == undefined ) wantmini = false;
	var haut_max = window.screen.availHeight - 40;
	var haut_screen = window.screen.availHeight;
	var larg_max = window.screen.availWidth;
	var larg_screen = window.screen.availWidth;
	var pos_left = 0;
	if (haut_wind > haut_max) haut_wind = haut_max;
	if (larg_wind > larg_max) larg_wind = larg_max;
	if ( wantmini && haut_wind < 100) haut_wind = 400;
	if ( wantmini && larg_wind < 100) larg_wind = 400;
	pos_top = 0;
	pos_left = 0;
	if (positionner) {
		pos_left = larg_screen - larg_wind;
		if (pos_left <= 0) pos_left = 50; else pos_left = pos_left/2;
		pos_top = haut_screen - haut_wind;
		if (pos_top <= 0) pos_left = 50; else pos_top = pos_top/2;
	}
	return video_showwin(aurl, name, pos_left, pos_top, larg_wind, haut_wind);
}

// ccc globales pour afficheur
// ccc v 24/04/08
var video_kind; // vidéo ou audio
var video_autostart;
var video_loop;
var video_play_src;
var video_play_title;
var video_play_w;
var video_play_h;
var video_play_movieid;
var video_play_backcolor;
var video_play_color;
var video_play_txt;
var video_r ;

function video_get_quicktime () {
	var url = "/services/video/video_get_quicktime_" + window.opener.q_lang + ".html";
	document.title = video_message[ "errqt" ] ;
	document.body.style.background = "#FFFFFF";
	window.location.href = url ;
	window.resizeTo (400,200);
}
function video_showvideo( x, v , newwin ) {
	var div = getContainer( x ) ;
	var r = qsn_thenotes[ div.id ] ;
//	var k = video_moviekind ( div.id ) ;
	// couleur de fond de la win
	var c = parseInt( r.color, 10 ) ;
	if ( c == -1 ) c = "#000";
	else c = ( c < 10 ) ? getsncontextualbackgroundcolors( 7 )[ c - 1 ] : r.color ;
	video_play_backcolor = c ;
	// couleur text audio
	if (  c =="#000" ) video_play_color = "#CCC";
	else video_play_color = rgbcontrastcolor150( c ) ;
	if ( r.video.audio  ) {
		video_kind = "audio" ; 
		video_autostart = "true";
		video_loop = "false" ;
		video_play_w = 180 ;
		video_play_h = 200;
		video_play_txt = r.text ;
		video_r = r;
		
	} else {
		video_kind = "video" ; 
		video_autostart = "true";
		video_loop = "false";
		video_play_w = r.video.width ;
		video_play_h = r.video.height ;
		
	}
	video_play_src = q_spacebaseurl( r.common.ownerid ) + encodeURI( r.video.src );
	var rr = r.video.src ;
	video_play_title = rr.substr ( rr.lastIndexOf("/") + 1 );
	video_play_movieid = "movie_" + div.id ;
	
	if ( /\.wmv$/i.test( rr ) ) video_myshowwin( video_play_src , "", video_play_w + 40, video_play_h + 55, 1) ;
	else video_myshowwin("/services/video/video_play.html", "", video_play_w + 40, video_play_h + 55, 1) ; 
	return false;	
}

var gArgCountErr =	'The "%%" function requires an even number of arguments.' +	'\nArguments should be in the form "attributeName", "attributeValue", ...';
var gTagAttrs = null ;
var gQTGeneratorVersion = 1.0 ;

function AC_QuickTimeVersion() {
	return gQTGeneratorVersion;
}

function _QTComplain(callingFcnName, errMsg) {
	errMsg = errMsg.replace("%%", callingFcnName);
	adminalert(errMsg);
}

function _QTAddAttribute(prefix, slotName, tagName) {
	var value;
	value = gTagAttrs[prefix + slotName];
	if ( null == value ) value = gTagAttrs[slotName];
	if ( null != value ) {
		if ( 0 == slotName.indexOf(prefix) && (null == tagName) ) tagName = slotName.substring(prefix.length); 
		if ( null == tagName ) tagName = slotName;
		return '' + tagName + '="' + value + '"';
	} else return "";
}

function _QTAddObjectAttr(slotName, tagName) {
	// don't bother if it is only for the embed tag
	if ( 0 == slotName.indexOf("emb#") ) return "";
	if ( 0 == slotName.indexOf("obj#") && (null == tagName) ) tagName = slotName.substring(4); 
	return _QTAddAttribute("obj#", slotName, tagName);
}

function _QTAddEmbedAttr(slotName, tagName) {
	// don't bother if it is only for the object tag
	if ( 0 == slotName.indexOf("obj#") ) return "";
	if ( 0 == slotName.indexOf("emb#") && (null == tagName) ) tagName = slotName.substring(4); 
	return _QTAddAttribute("emb#", slotName, tagName);
}

function _QTAddObjectParam(slotName, generateXHTML) {
	var paramValue;
	var paramStr = "";
	var endTagChar = (generateXHTML) ? ' />' : '>';
	if ( -1 == slotName.indexOf("emb#") ) {
		// look for the OBJECT-only param first. if there is none, look for a generic one
		paramValue = gTagAttrs["obj#" + slotName];
		if ( null == paramValue ) paramValue = gTagAttrs[slotName];
		if ( 0 == slotName.indexOf("obj#") ) slotName = slotName.substring(4); 
		if ( null != paramValue ) paramStr = '<param name="' + slotName + '" value="' + paramValue + '"' + endTagChar;
	}
	return paramStr;
}

function _QTDeleteTagAttrs() {
	for ( var ndx = 0; ndx < arguments.length; ndx++ ) {
		var attrName = arguments[ndx];
		delete gTagAttrs[attrName];
		delete gTagAttrs["emb#" + attrName];
		delete gTagAttrs["obj#" + attrName];
	}
}

// generate an embed and object tag, return as a string
function _QTGenerate(callingFcnName, generateXHTML, args) {
	if ( args.length < 4 || (0 != (args.length % 2)) ) {
		_QTComplain(callingFcnName, gArgCountErr);
		return "";
	}
	gTagAttrs = new Object();
	gTagAttrs["src"] = args[0];
	gTagAttrs["width"] = args[1];
	gTagAttrs["height"] = args[2];
	gTagAttrs["classid"] = "clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B";
		//Impportant note: It is recommended that you use this exact classid in order to ensure a seamless experience for all viewers
	gTagAttrs["pluginspage"] = "http://www.apple.com/quicktime/download/";

	// set up codebase attribute with specified or default version before parsing args so
	//  anything passed in will override
	var activexVers = args[3] ;
	if ( (null == activexVers) || ("" == activexVers) ) activexVers = "6,0,2,0";
	gTagAttrs["codebase"] = "http://www.apple.com/qtactivex/qtplugin.cab#version=" + activexVers;

	var attrName, attrValue;

	for ( var ndx = 4; ndx < args.length; ndx += 2) {
		attrName = args[ndx].toLowerCase();
		attrValue = args[ndx + 1];

		// "name" and "id" should have the same value, the former goes in the embed and the later goes in
		//  the object. use one array slot 
		if ( "name" == attrName || "id" == attrName ) gTagAttrs["name"] = attrValue;
		else gTagAttrs[attrName] = attrValue;
	}

	// init both tags with the required and "special" attributes
	var objTag =  '<object '
					+ _QTAddObjectAttr("classid")
					+ _QTAddObjectAttr("width")
					+ _QTAddObjectAttr("height")
					+ _QTAddObjectAttr("codebase")
					+ _QTAddObjectAttr("name", "id")
					+ _QTAddObjectAttr("tabindex")
					+ _QTAddObjectAttr("hspace")
					+ _QTAddObjectAttr("vspace")
					+ _QTAddObjectAttr("border")
					+ _QTAddObjectAttr("align")
					+ _QTAddObjectAttr("class")
					+ _QTAddObjectAttr("title")
					+ _QTAddObjectAttr("accesskey")
					+ _QTAddObjectAttr("noexternaldata")
					+ '>'
					+ _QTAddObjectParam("src", generateXHTML);
	var embedTag = '<embed '
					+ _QTAddEmbedAttr("src")
					+ _QTAddEmbedAttr("width")
					+ _QTAddEmbedAttr("height")
					+ _QTAddEmbedAttr("pluginspage")
					+ _QTAddEmbedAttr("name")
					+ _QTAddEmbedAttr("align")
					+ _QTAddEmbedAttr("tabindex");

	// delete the attributes/params we have already added
	_QTDeleteTagAttrs("src" , "width" , "height" , "pluginspage" , "classid" , "codebase" , "name" , "tabindex" , "hspace" , "vspace" , "border" , "align" , "noexternaldata" , "class" , "title" , "accesskey");

	// and finally, add all of the remaining attributes to the embed and object
	for ( var attrName in gTagAttrs ) {
		attrValue = gTagAttrs[attrName];
		if ( null != attrValue ) {
			embedTag += _QTAddEmbedAttr(attrName);
			objTag += _QTAddObjectParam(attrName, generateXHTML);
		}
	} 
	return objTag + embedTag + '></em' + 'bed></ob' + 'ject' + '>';
}

// return the object/embed as a string
function QT_GenerateOBJECTText() {
	return _QTGenerate("QT_GenerateOBJECTText", false, arguments);
}

function QT_GenerateOBJECTText_XHTML() {
	return _QTGenerate("QT_GenerateOBJECTText_XHTML", true, arguments);
}

function QT_WriteOBJECT()
{
	document.writeln(_QTGenerate("QT_WriteOBJECT", false, arguments));
}

function QT_WriteOBJECT_XHTML()
{
	document.writeln(_QTGenerate("QT_WriteOBJECT_XHTML", true, arguments));
}

/*
function video_initforweb( id ) {
	video_showbuttons ( id ) ;
}
*/

/*
function -
function TOOLBAR
*/

function video_toolbarversion() {
	return 1 ;
}

function video_helpnote() {
//	window.open( "http://aide.quomodo.com/les_smartnotes-les_smartnotes_video" ) ; 
	window.open( "http://" + qlub_help_pages[ "a_video" ] , "quomodo help" ) ;
}

var video_js_loaded = true ;
if ( window.qdyn_loaded ) qdyn_loaded ( "video_js_loaded" ) ;

