if (typeof(LK) == 'undefined'){
	LK = {}
}
YLS = YAHOO.lang.substitute;
LK.json_encode = YAHOO.lang.JSON.stringify
LK.object_id = 0
LK.objects = []
$.datepicker.setDefaults({dateFormat:'yy-mm-dd'})

$(function(){
	var ver
	if ($.browser.msie){
		ver = parseInt($.browser.version)
		if ( ver < 7){
			//$(document).pngFix()
		}
		if (ver == 7){
			LK.ie7 = true
		}
	}
	LK.modal = ($.browser.mozilla || $.browser.safari)?0:1
	$('div._custom_class_format_tableau').find('table').each(function(){
		$(this).find('td[colspan]').addClass('titre')
		$(this).find('tr:odd').addClass('odd') //.css('background-color', '#f3d997')
		//$(this).find('td').not('[colspan]').css('background-color', 'transparent')

	})
	
	//jQuery.ajaxSettings.traditional = true;
	LK.email_format = /^['_a-z0-9-]+(\.['_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/i
	LK.exec_delay = 200 * ($.browser.msie?2:1)
	LK.delayed_content = {};

	$('a.show').live('click', function(ev){
		LK.execute({test:'upload_photos', fn:function(){LK.upload_photos()}})
		return
		LK.slideshow(this)
		ev.stopPropagation()
		return false
	})
	var a

	a =	$('#contenu_std').find('div.struct_elem.abrege')
	//alert(a.length)
	a.filter('.abrege_1').find('.text_container:eq(0)').my_more({limite:250, marqueur:LK.msg__.marqueur_continue})
	a.filter('.abrege_2').find('.text_container:eq(0)').my_more({limite:500, marqueur:LK.msg__.marqueur_continue})
	
	a = $('<div></div>')
		.appendTo('body')
		.css('padding', 10)
		.height(10)


	if (a.height() != 10){

		$.fn.old_css = $.fn.css;
		$.fn.css = function(param1, param2){
			var obj = {};
			if (typeof(param1) == "string"){
				if (param2 == undefined){
					return(this.old_css(param1))
				}
				obj[param1] = param2;

			} else {
				obj = param1;
			}
			var dims = {}
			var list_ids = ''
			this.each(function(){
				list_ids += '#' + this.id
			})

			$.each(obj, function(param, val){
				var px
				//alert(param)
				try {
					if (param.match(/height/i)){
						px = ('' + val).match(/[0-9]+(?:px)?/)[0]
						if (px){
							
							dims.height = px;
							//if (list_ids.match(/publ/))
							//alert('demande H = ' + px )
						} 
					}
					if (param.match(/width/i)){
						px = ('' + val).match(/[0-9]+(?:px)?/)[0]
						if (px){
							
							dims.width = px;
						} 
					}
				} catch(err){
					//alert('oups ' + param)
				}
			})

			try {
				this.old_css(obj);
			} catch(err){
					//alert('err')
				}
			if (dims.height || dims.width){
							
			this.each(function(){
					var correction;
					if (dims.height){
						dims.height = parseInt(dims.height)
						correction = dims.height-$(this).height();
						
						//dbg(this.nodeName + '#' + this.id + '.' + this.className + '---->>> correction = ' + correction)
						if (correction > 0){
							$(this).old_css('height', dims.height + (correction))
						}
						//if(this.className.match(/_win/))
						//	alert(this.id + '.' + this.className + ' ' + dims.height + '/' + $(this).height())
					}
					if (dims.width){
						dims.width = parseInt(dims.width)
						$(this).old_css('width', dims.width + (dims.width-$(this).width()))
					}

				})
			}
		return this;
		}}
	a.remove();

	
	LK.convertir_contenu = function($obj){
		var id_contenu, id_structure, contenu_contextuel
		
		id_contenu = parseInt($obj.closest('.editable').attr('data-cont'))
		if (isNaN(id_contenu)){
			id_contenu = null
		}
		
		var editable = $obj.closest('.editable')
		
		
		id_structure = parseInt($obj.closest('.struct_elem').attr('data-str_id'))
		if (isNaN(id_structure)){
			alert(LK.msg__.structure_inconnue)
			return
		}
		
		
		
		
		var buttons = {}, temp
		buttons[LK.msg__.annuler] = function(){
			$(this).dialog('close')
		}
		buttons[LK.msg__.convertir] = function(){

			// vérifier si conversion de contextuel a non contextuel
			// car si c'est le cas, on doit créer un nouveau contenu
			var nouveau_type = $(this).find('.radio_container').find('input:checked').val(), non_texte
			var specs_nouveau 
			var specs_actuel 

			// choisi un type non dispo...
			if ((non_texte = nouveau_type != 'texte') && (!nouveau_type || !LK.widget_list[nouveau_type])){
				alert(LK.msg__.oops_nouveau_type + ' (' + nouveau_type + ')')
				return
			}

			var specs_texte = {classe:'text_container',contextuel:false,contextuel_optionnel:false}
			if (non_texte){
				specs_nouveau = LK.widget_list[nouveau_type]
			} else {
				specs_nouveau = specs_texte
			}
			if (content_type != 'texte'){
				specs_actuel = LK.widget_list[content_type]
			} else {
				specs_actuel = specs_texte
			}

			/////// dans le cas de calendrier, offrir choix de contextuel ou non
			var def_contextuel_ou_non = $.Deferred()
			
		

			// pour calendrier, deux choix: contextuel ou non
			if (non_texte){
				if (specs_nouveau.contextuel_optionnel){
					LK.choisir_si_contextuel(def_contextuel_ou_non)
				} else {
					def_contextuel_ou_non.resolve(specs_nouveau.contextuel)
				
				}
			} else {
				def_contextuel_ou_non.resolve(false)
			}
			
			///////// dans cas de tableau importé, demander quel type de tableau
			/// on va chercher les types dans le fichier de config tableaux.ini
			var choisir_params = $.Deferred()
			var contextuel_nouveau
			
			def_contextuel_ou_non.promise()
			.done(function(val_contextuel_nouveau){// <------ param reçu de def précédent
				contextuel_nouveau = val_contextuel_nouveau
				
				if (contextuel_nouveau){
					set_contextual_widget_params(nouveau_type, choisir_params) // choisir_params = deferred à resoudre avec les bons params
				} else {
					choisir_params.resolve(contextuel_nouveau)
				}
				
			})
			
			
			choisir_params.promise()
			.done(function(params){
				// si le nouveau type nécessite un contenu qui n'existait pas avant, il faut en créer un

				if (!id_contenu && (!non_texte || !contextuel_nouveau)){
					if (confirm(LK.msg__.nouveau_contenu_requis)){
						LK.ajouter_contenu({force_type:nouveau_type, id_structure:id_structure, id_document:LK.id_document})
						.fail(function(data){
							LK.alert_msg(data)
						})
						.done(function(id, widget){
							widget = (widget == ''?'texte':widget)
							if (nouveau_type != widget){
								alert(LK.msg__.oops_nouveau_type +  ' (' + widget + ')')
							}
							window.location.reload()
						})
					}
					return
				}



				LK.xhr({data:{
					context:'gestion_contenus',
					op:'convert',
					id_document:LK.id_document,
					id_contenu:id_contenu,
					id_structure:id_structure,
					widget:nouveau_type,
					contextuel:contextuel_nouveau?1:0,
					contexte:LK.get_contexte($obj),
					params:LK.json_encode(params)
				}})
				.always(function(data){
					LK.alert_msg(data)
				})
				.done(function(data){
					if (contextuel_nouveau){
						editable.attr('class', editable.attr('class').replace(/cont\d+/, '')).removeAttr('data-cont')
					} 

					editable
						.find('.editable_ctrls')
						.siblings()
						.remove()


					var className
					if (LK.widget_list[nouveau_type])
						className = LK.widget_list[nouveau_type].classe
					else
						className = 'text_container'

					data.rendered_content = data.rendered_content || ''
					var container
					editable.append(container = $('<div/>', {'class':'editable_marker ui-corner-all'}))

					if (data.rendered_content.length){
						container.html(data.rendered_content)
					} else {
						container.append($('<div/>').addClass(className))
					}

					$('#convert_dialog').dialog('close')
				})

			})


			}
			$('<div id="convert_dialog"></div>').dialog({
				title: LK.msg__.convert_dial_title,
				modal:true,
				autoOpen:false,
				buttons:buttons,
				close:function(){
					$(this).dialog('destroy').remove()
				}

			})
			.css('font-size', 12)
			.dialogShadow('ombre ui-corner-all')
			.closeOn('change_mode')
			.append(LK.infoWindow(LK.msg__.convert_info))
			.append($('<div></div>').text(LK.msg__.choisir_type_contenu))
			.append(temp = $('<div class="radio_container" style="margin-left:30px"></div>')
						.append('<br/><label style="margin-right:10px"><input type="radio" name="conv" value="texte"/>' + LK.msg__.texte + '</label>')



			)
			$.each(LK.widget_list, function(type, params){
				temp
				.append('<br/><label style="margin-right:10px"><input type="radio" name="conv" value="' + type + '"/>' + params.description + '</label>')
			})
		
		
		var content_type = LK.find_content_type($obj)
		.done(function(data){ // recoit widget, contexte_widget, id_contenu (tous = 0 si vides)
			content_type = data.contexte_widget || data.widget || 'texte'
			
			if (!data.id_contenu){
				
				contenu_contextuel = true
			}
			
			

			$('input', '#convert_dialog .radio_container')
				.removeAttr('checked')
				.filter('[value="' + content_type + '"]')
				.attr('checked', 'checked')
			//$('#convert_dialog').find('.radio_container').val(content_type)
			$('#convert_dialog').dialog('open')
		})
		
	}
	
	///*********** fonctions pour laisser usager choisir options de configuration de contenus contextuels
	var set_contextual_widget_params = function(type, def){
		if (type == 'tableau'){
			choisir_type_tableau(def)
		} else {
			def.resolve({})
		}
	}
	var choisir_type_tableau = function(def){
		var buttons = {}
		buttons[LK.msg__.annuler] = function() {
			$(this).dialog('close')
		}
		buttons[LK.msg__.soumettre] = function(){
			var type = dial.find('input:checked').val()
			if (!type){
				alert(LK.msg__.faire_choix)
				return
			}
			
			def.resolve({type:type})
			dial.dialog('close')
		}

		var id = 'choisir_type_tableau' + LK.uniqueId()
		if($('#' + id).length == 0){
			$('<div>',{id:id}).dialog({
				title:LK.msg__.type_de_tableau,
				width:500,
				autoOpen:false,
				buttons:buttons,
				zIndex:100,
				close:function(){
					$(this).dialog('destroy').remove()
				}
			})
			.dialogShadow('ombre ui-corner-all')
			.disableSelection()
			.closeOn('change_mode')
		} else{
			$('#' + id).dialog('option', 'buttons', buttons)
		}
		var dial = $('#' + id)
		LK.xhr({data:{
				context:'widgets',
				op:'get_types_tableau2'
			}})
		.always(function(data){
			LK.alert_msg(data)
		})
		.done(function(data){
			LK.template('templ_std_radio')
			.done(function(t){
				$.tmpl(t, {
					label:LK.msg__.choix_type_contenu,
					label_attr:{style:'margin-bottom:15px;display:block'},
					items:data.liste
				})
				.appendTo(dial)
			})
		})
		

		
		dial.dialog('open')

	}
	//**********************************************
	LK.choisir_si_contextuel = function(def){

		var buttons = {}
		buttons[LK.msg__.fermer] = function() {
			$(this).dialog('close')
		}
		buttons[LK.msg__.soumettre] = function(){
			var to_ret = true
			if (dial.find('input:checked').val() != 'contextuel'){
				to_ret = false
			} else 
			def.resolve(to_ret)
			dial.dialog('close')
		}
		
		var id = LK.uniqueId()
		if($('#' + id).length == 0){
			$('<div>',{id:id}).dialog({
				title:LK.msg__.choix_type_contenu,
				width:600,
				minWidth:600,

				autoOpen:false,
				buttons:buttons,
				zIndex:100,
				close:function(){
					def.reject()
					$(this).dialog('destroy').remove()
				}
			})
			.dialogShadow('ombre ui-corner-all')
			.disableSelection()
			.closeOn('change_mode')
		} else{
			$('#' + id).dialog('option', 'buttons', buttons)
		}
		var dial = $('#' + id)
		dial.append($('<div>',{css:{margin:'15px 0'}}).text(LK.msg__.choisissez_version))
			.append($('<label/>',{css:{marginLeft:25,display:'block'}}).text(LK.msg__.contenu_contextuel).prepend($('<input/>',{name:'choix', type:'radio',value:'contextuel',checked:'checked',css:{marginRight:10}})))
			.append($('<div/>',{'class':'field_info'}).text(LK.msg__.info_contenu_contextuel))
			.append($('<label/>',{css:{marginLeft:25,display:'block',marginTop:15}}).text(LK.msg__.contenu_non_contextuel).prepend($('<input/>',{name:'choix', type:'radio',value:'non_contextuel',css:{marginRight:10}})))
			.append($('<div/>',{'class':'field_info'}).text(LK.msg__.info_non_contextuel))
		
		
		dial.dialog('open')
	
	}
	
	LK.get_contexte = function($obj){
		var contexte = {}
		$.each(['division','classe','equipe'], function(ind,val){
			val = 'contexte_' + val
			contexte[val] = $obj.closest('[data-' + val + ']').customdata(val) || null
		})
		return contexte
	}
	var tOut, tOut2, $obj, $menu_item

	//================== réagir à window resize
	if (!LK.no_menu_version) {
		
		$('<div id="height_ref">')
		.appendTo('body')
		.css({
			height:"100%",
			position:'absolute',
			display:'block',
			top:0,
			left:0,
			width:5
		})
		LK.width = 0;
		LK.height = 0;
	
			$(window).resize(function(){
			if (tOut)
				clearTimeout(tOut);
			if (tOut2)
				clearTimeout(tOut2)
			tOut = setTimeout(function(){
				$.adjust_all();
				tOut = null;
			}
			, 10)
			// nouvelle vérification pour remplir l'espace laissé vide par la disparition des "scrollbars" quand l'écran est réduit
			if ($(window).width() < LK.width || $(window).height() < LK.height)
				tOut2 = setTimeout(function(){
					$.adjust_all();
					tOut2 = null;
				}
				, 30)
			// retenir pour le prochain passage
			LK.width = $(window).width();
			LK.height = $(window).height();
		})
		$('#menu_left').attach('store', {
			attach:'#height_ref',
			match_height:true,
			diffHeight:function(){
				return -$('#page_top').outerHeight()- $('#menu_left').outerHeight() + $('#menu_left').height()}
		}).show()

		$('#main_content').attach('store', {
			attach:'#menu_left',
			context:{
				obj:{
					leftX:1
				}
			},
			match_height:'#menu_left',
			diffHeight:function(){
				return $('#menu_left').outerHeight() - $('#menu_left').height()
			},
			match_width:'#page_top',
			diffWidth:function(){
				return -$('#menu_left').outerWidth()
			}
		}).show();
		$('#contenu_std').attach('store', {
			attach:'#main_content',
			match_height:true,
			diffHeight:-$('#main_content,#contenu_std').heightDiff()
		})
		$('#b_login')
		.css({
			position:'absolute'
		})
		.attach('store', {
			attach:'#menu_left',
			context:{
				obj:{
					topX:1,
					top:-160,
					leftX:.35
				}
			}
		}).show()
	} else{ // // tout ce qui est ci-dessus éliminé dans version sans menu
		$('body').css('overflow', 'auto')
	}
	if(LK.page_status != 'brouillon' && !LK.no_menu_version){
		$('<div id="admin_id" class="ombre ui-corner-all"></div>')
			.appendTo('body')
			//.attach('store', {attach:'#page_top', context:{obj:{topX:0.7}, bulle:{topX:1}}})
			.click(function(){
				if ($(this).html().search('hel Ra') != -1 && $('#debug_out').length){
					$('#debug_out').dialog('open')
				}
			})
	}
	LK.show_login_status(); // faire paraitre menu admin si le visiteur est enregistré
	var menu_reduit
	$(window).resize(function(){

		var last_menuitem = $('#menu_left').find('li').last()
		if ( $(window).height() < 561 && !menu_reduit){
			$('#menu_left > ul > li').slice(0, 5).hide()
			$('#menu_left').find('li:visible').first().parent().prepend($('<li>', {id:'visibilite_menu'}).disableSelection().append($('<a>').text(LK.msg__.visibilite_menu).prepend($('<span>', {'class':'marqueur_rond'}))))
			menu_reduit = true
		} else if ($(window).height() > 650 && menu_reduit){
			$('#menu_left > ul > li').show()
			$('#visibilite_menu').remove()
			menu_reduit = false
		}
	})

	$(window).trigger('resize');


	// events communs à toutes les pages
	LK.tickle = function(icon, delai){
		if (!$.browser.webkit){
			return
		}
		setTimeout(
			function(){
				/*
				if (icon.text().length){
					icon.text('')
				} else {
					icon.html('&nbsp;')
				}*/
				icon.show()
				setTimeout( function(){
					icon.hide()
					return
					if (icon.text().length){
						icon.text('')
					} else {
						icon.html('&nbsp;')
					}
				}, 100)

			}, delai)
	}
	// ===================clic dans menu de gauche
	LK.jj_remove = function(){
		$("div[id^=jjmenu]").remove();
	}
	$('#menu_left').click(function(ev){
		if (LK.page_status == 'brouillon') 
			window.close();
		$obj = $(ev.target);
		$menu_item = $obj.closest('li');
		if ($menu_item.is('#adm_edit_contenu')){
			
			$('body').trigger('change_mode')
			// d'abord vérifier si le html contient les repères identifiant les section éditables
			if (!LK.editable_cree){ // si reperes non créés, les créer
				var special_css = {}
				if (LK.ie7){
					special_css = {textIndent:0, margin:0,position:'static',clear:'none'}
				}
				$('.editable').each(function(){
					var a, menu
					var section = $(this).closest('.struct_elem')
					if (section.attr('data-str_type') == 'suite' && section.has('.struct_elem').length == 0){
						var struct_modifiable = true
					}
					var hor_class // passe, futur, parait ou rien
					if (LK.montrer_tout){
						hor_class = section.customdata('hor')
					}
					hor_class = hor_class || ''

					$(this).wrapInner($('<div>', {'class':'editable_marker ui-corner-all'}))
					.prepend( a =
						$('<div>', {'class':'editable_ctrls ' + hor_class})
							.append($('<span>', {'class':"close_editables ui-icon ui-icon-close"}).css(special_css))
							.append($('<span>', {'class':"edit_link ui-icon ui-icon-pencil hide_noedit"}).css(special_css))
							.append($('<span>', {'class':"edit_acces_link ui-icon ui-icon-person"}).css(special_css))
							//.append(menu = $('<span>', {'class':"ui-icon ui-icon-wrench menu_section"}))
							)
					if (LK.perm_admin || true){
						a.append(menu = $('<span>', {'class':"ui-icon ui-icon-wrench menu_section"}).css(special_css))
					}else{
						menu = null
					}
						 //+ (LK.perm_convert?'<span class="convert ui-icon ui-icon-transferthick-e-w"></span>':'')

					if (struct_modifiable && LK.perm_insertion_contenu){
						
						a
							.append($('<span>', {'class':"ui-icon ui-icon-circle-plus ajout_section hide_noedit"}).css(special_css))
							.append($('<span>', {'class':"ui-icon ui-icon-trash efface_section hide_noedit"}).css(special_css))
							.append($('<span>', {'class':"ui-icon ui-icon-circle-arrow-n monte_section hide_noedit"}).css(special_css))
							.append($('<span>', {'class':"ui-icon ui-icon-circle-arrow-s baisse_section hide_noedit"}).css(special_css))
							//+ '<span class="ui-icon ui-icon-arrowrefresh-1-e defilement_section"></span>'


					}
					a
						.append($('<span>', {'class':"sablier regle_parution hide_noedit"}))
						.append($('<span>', {'class':"ui-icon ui-icon-grip-dotted-vertical dummy", css:{display:'none'}}))
						.append($('<div>', {css:{clear:'both'}}))
					if(menu){
						menu.jjmenu('click', [
							{title:'<span class="ui-icon ui-icon-zoomout"></span><span style="margin-left:5px">' + LK.msg__.abreger + '</span>',

								type:'sub',
								src:[
									{title:LK.msg__.abreger_250,
										action:{
											type:'fn',
											callback:function(){
												LK.jj_remove()
												var struct = $(triggerElement).closest('div.struct_elem')
												if (!struct.find('div.editable_marker').children().first().is('.text_container')){
													LK.alert(LK.msg__.contenu_non_textuel)
													return
												}
												LK.xhr({data:{
													context:'abreger_contenu',
													op:'abreger',
													abrege:1,
													id_structure:struct.customdata('str_id')
												}})
												.done(function(data){
													struct
													.addClass('abrege_1')
													.find('div.editable:eq(0)')
													.find('div.text_container')
													.my_more({limite:250, marqueur:LK.msg__.marqueur_continue})
													LK.alert_msg(data)
												
												}).fail(function(data){LK.alert_msg(data)})
											
											}
										}
									},
									{title:LK.msg__.abreger_500,
										action:{
											type:'fn',
											callback: function(){
												LK.jj_remove()
												var struct = $(triggerElement).closest('div.struct_elem')
												if (!struct.find('div.editable_marker').children().first().is('.text_container')){
													LK.alert(LK.msg__.contenu_non_textuel)
													return
												}
												LK.xhr({data:{
													context:'abreger_contenu',
													op:'abreger',
													abrege:2,
													id_structure:struct.customdata('str_id')
												}})
													.done(function(data){
														struct
															.addClass('abrege_1')
															.find('div.editable:eq(0)')
															.find('div.text_container')
															.my_more({limite:500, marqueur:LK.msg__.marqueur_continue})
														LK.alert_msg(data)
													})
													.fail(function(data){
														LK.alert_msg(data)
													})
												
											
											}
										}
									},
									{
										title:LK.msg__.ne_pas_abreger,
										action:{
											type:'fn',
											callback:function(){
												LK.jj_remove()
												var struct = $(triggerElement).closest('div.struct_elem')
												if (!struct.find('div.editable_marker').children().first().is('.text_container')){
													LK.alert(LK.msg__.contenu_non_textuel)
													return
												}
												LK.xhr({data:{
													context:'abreger_contenu',
													op:'abreger',
													abrege:0,
													id_structure:struct.customdata('str_id')
												}})
												.done(function(data){
														struct
															.removeClass('abrege_1 abrege_2')
															.find('div.editable:eq(0)')
															.find('div.text_container')
															.my_more(false)
													LK.alert_msg(data)
												})
												.fail(function(data){
													LK.alert_msg(data)
													})
												
											}
										}
									},
									{title:LK.msg__.abreger_info,
										action:{
											type:'fn',
											callback:function(){
												LK.jj_remove()
												LK.show_info({msg:LK.msg__.abreger_info_text, pos:{my:'center', at:'center', of:triggerElement}})
											}
										}

									}
								]
							},
							{
								title:'<span class="ui-icon ui-icon-scissors"></span><span style="margin-left:5px">' + LK.msg__.formater_contenu + '</span>',
								action:{
									type:'fn',
									callback:function(){
										var obj = $(triggerElement).closest('div.struct_elem')
										var id_structure = obj.customdata('str_id')

										LK.deb.add('id_structure = ' + id_structure + '; trig. class = ' +triggerElement.className )
										LK.execute({test:'formater_contenu', fn:function(){LK.formater_contenu(id_structure, obj)}})
									}
								}
							},
							{
								getByFunction:function(){
									if (LK.perm_convert){
										return [{
											title:'<span class="convert ui-icon ui-icon-transferthick-e-w"></span><span style="margin-left:5px">' + LK.msg__.convertir + '</span>',
											action:{
												type:'fn',
												callback: function(){
													$('#jjmenu_main').hide()
													LK.convertir_contenu($(triggerElement))
												}
											}
										}]
									}else{
										return [{
											title: '<span class="convert ui-icon ui-icon-transferthick-e-w"></span><span style="color:#aaa; margin-left:5px">' + LK.msg__.convertir + '</span>',
											callback: function(){
												$('#jjmenu_main').hide()
												alert(LK.msg__.operation_non_permise)
											}
										}]
									}
								}
							},
							{
								getByFunction:function(){
									if (LK.perm_defilement){
										return [{
											title:'<span class="ui-icon ui-icon-arrowrefresh-1-e"></span><span style="color:#couleur_defilement#;margin-left:5px">' + LK.msg__.defilement + '</span>',
											action:{
												type:'fn',
												callback:function(){
													$('#jjmenu_main').hide()
													var id_struct = $(triggerElement).closest('.struct_elem').customdata('str_id')
													LK.execute({test:'defilement_contenu', fn:function(){LK.defilement_contenu.acces({id_structure:id_struct})}})

												}
											}
										}]
									} else  {
										return [{
											title: '<span class="convert ui-icon ui-icon-transferthick-e-w"></span><span style="color:#aaa; margin-left:5px">' + LK.msg__.defilement + '</span>',
											callback: function(){
												$('#jjmenu_main').hide()
												alert(LK.msg__.operation_non_permise)
											}
										}]
									}
								}
							},
							{
								getByFunction:function(){
									if (LK.perm_admin){
										return [{
											title:'<span class="ui-icon ui-icon-newwin"></span><span style="margin-left:5px">' + LK.msg__.ajuster_dispo + '</span>',
											action:{
												type:'fn',
												callback:function(){
													$('#jjmenu_main').hide()
													LK.layout_obj.adjust()
												}
											}
										}]
									} else {
										return [{
											title: '<span class="convert ui-icon ui-icon-transferthick-e-w"></span><span style="color:#aaa; margin-left:5px">' + LK.msg__.ajuster_dispo + '</span>',
											callback: function(){
												$('#jjmenu_main').hide()
												alert(LK.msg__.operation_non_permise)
											}
										}]
									}
								}
							}
						],
						{couleur_defilement:function(){
								if ($(triggerElement).closest('.editable').find('.text_container').length){
									return '#000'
								}else{
									return '#888'
								}
						}},
						{xposition:'mouse', yposition:'mouse'}
						)
						menu.jjmenu('rightClick', [
							{
								title:LK.msg__.menu_info_contexte,
								action:{
									type:'fn',
									callback:function(){
										
										var contexte = [], obj,trigger = $(triggerElement)
										$.each(['division','classe','equipe'],function(ind,val){
											obj = trigger.closest('[data-contexte_' + val + ']')
											if (obj.length){
												contexte.push(LK.msg__[val] + ' = ' + LK.liste_contexte(val).get_desc(obj.attr('data-contexte_' + val)))
											}
										})
										if (contexte.length){
											LK.alert('<p>' + LK.msg__.info_contexte + '</p><p>' + contexte.join('<br/>') + '</p>')
										} else {
											LK.alert(LK.msg__.aucun_contexte)
										}
										
									}
								}
							}
						])
					}
				})
				$('li.content_title').jjmenu('rightClick', [
					{title: 'Changer titre',
						action:{
							type:'fn',
							callback:function(){
								$('body').trigger('click')
								var id_contenu = $(triggerElement).customdata('content_id')
								var title = $(triggerElement).children('a').text()
								var id_structure = $(triggerElement).customdata('ref_structure')
								LK.change_title({id_contenu:id_contenu, title:title, id_structure:id_structure})
							}
						}
					}
				])
				$('div.editable_ctrls').parents().addClass('min_edit_height')
				$('.editable_ctrls')
				.live('mouseenter', function(ev){
					$(ev.target).next().addClass('show_editable')
				})
				.live('mouseleave', function(ev){
					$(ev.target).next().removeClass('show_editable')
				})
				.live('click', LK.click_editable_ctrl = function(ev){
					var icon
					$(this).stop(1,1)
					if (!$(this).is('.maximized')){
						$(this).addClass('maximized', 500)
						icon = $(this).find('.dummy')
						if ($.browser.webkit){
							LK.tickle(icon, 501)
						}
						if (LK.maximized_ctrl && LK.maximized_ctrl.not($(this)).length){
							LK.maximized_ctrl.stop(true, true).removeClass('maximized', 500)
						}
					} 
					LK.maximized_ctrl = $(this)
				})
					
				LK.editable_cree = true;
				LK.editable_visible = true;
			} else{ // si les repères existent
				LK.toggle_edit_link_visibility()
			}
			if (LK.editable_visible){
				LK.xhr({data:{
					context:'permissions',
					op:'get_liste_editables',
					id_document:LK.id_document
				}})
				.done(function(data){
					if (LK.liste_editable != data.liste_editable){
						LK.liste_editable = data.liste_editable;
						if (LK.liste_editable == '.editable'){
							$('.editable').removeClass('noedit')
						} else{
							$('.editable').addClass('noedit')
							.filter(LK.liste_editable)

							.removeClass('noedit');
						}

					}
					if (LK.liste_editable == ''){
						alert(LK.msg__.rien_editable_pour_vous)
					}
				})
				.fail(function(data){
					LK.alert_msg(data, LK.msg__)
				})
			}

		} else if ($menu_item.is('#adm_edit_structure')){
			$('body').trigger('change_mode')
			LK.editer_structure()
		}else if ($menu_item.is('#admin_acces')) {
			window.location='./admin.php'
		} else if ($menu_item.is('#adm_publicite')){
			window.location = './publicite.php'
		} else if ($obj.is('#b_login')){
			LK.login()
		} else if ($obj.closest('#visibilite_menu').length){
			var items = $('#menu_left > ul > li').slice(1)
			if (items.first().is(':visible')){
				items.show().slice(0, 5).hide()
			} else{
				items.show().slice(-5).hide()
			}
		}
	})
	//=============== clic dans fenêtre principale
	$('#contenu_std').click(function(ev){
		$obj = $(ev.target);
		var id, id_structure
		if ($obj.is('.edit_link')){
			if($obj.closest('.editable').is('.noedit')){
				return
			}
			if(id = $obj.closest('.editable').customdata('cont')){
				id_structure = $obj.closest('.struct_elem').customdata('str_id')
				LK.load('edit_contents')
				.done(function(){
					LK.edit_contents(id, id_structure)
				})
				
			} else { // pas de contenu... vérifier si contenu contextuel réglé
				id = $obj.closest('.struct_elem').attr('data-str_id')
				LK.xhr({data:{
						context:'contenu_contextuel',
						op:'get_widget_data',
						id_structure:id
						
					}})
				.always(function(data){
					LK.alert_msg(data)
				})
				.done(function(data){
					data.contexte = LK.get_context($obj)
					data.contexte_herite = LK.get_context_herite($obj)
					//LK.prop(data, 'data')
					//LK.prop(data.contexte, 'contexte')
					//LK.prop(data.contexte_herite, 'herité')
					LK.edit_widget(data)
				})
				

			}
		} else if ($obj.is('.close_editables')){
			LK.last_section_clicked = $obj.parent().next()
			LK.last_section_clicked.LKdata('original_pos',LK.last_section_clicked.offset().top)

			LK.toggle_edit_link_visibility()
			
			return
		} else if ($obj.is('.editable_ctrls')){
			LK.tickle($obj.find('.dummy'), 100)
		}else if ($obj.is('.menu_section')){
			return true
		} else if ($obj.is('.edit_acces_link')){
			LK.show_access($obj.closest('.editable'))
		}else if ($obj.is('.convert') && !$obj.closest('.editable').is('.noedit')){

		} else if ($obj.is('.ajout_section')){
			LK.ajouter_section($obj)
		}else if ($obj.is('.efface_section')){
			LK.enlever_section($obj)
		} else if ($obj.is('.monte_section')){
			var prev = $obj.closest('.struct_elem').prevAll('.struct_elem').first()
			if (!prev.length){
				alert(LK.msg__.ne_peut_monter_cet_element)
				return
			}
			if (prev.find('.struct_elem').length || $obj.closest('.struct_elem').find('.struct_elem').length){
				alert(LK.msg__.contient_autres)
				return
			}
			
			LK.xhr({data:{
				context:'edite_structure_sur_page',
				op:'monter',
				section:$obj.closest('.struct_elem').attr('data-str_id'),
				prev:prev.attr('data-str_id')
			}})
			.done(function(data){
				$obj.closest('.struct_elem').hide('blind', function(){
					//var prev = $(this).prevAll('.struct_elem').first()
				
					prev.add(this).absorbe_separateurs()
					prev.insertAfter(this)
					prev.add(this).ejecte_separateurs()
					$(this).show('blind')
					return

				})
				
				LK.alert_msg(data)
			})
			.fail(function(data){
				LK.alert_msg(data)
			})
		}else if ($obj.is('.baisse_section')){
			var suiv = $obj.closest('.struct_elem').nextAll('.struct_elem').first()
			if (!suiv.length){
				alert(LK.msg__.ne_peut_descendre_cet_element)
				return
			}
			if (suiv.find('.struct_elem').length || $obj.closest('.struct_elem').find('.struct_elem').length){
				alert(LK.msg__.contient_autres)
				return
			}
			LK.xhr({data:{
					
				context:'edite_structure_sur_page',
				op:'descendre',
				section:$obj.closest('.struct_elem').attr('data-str_id'),
				suiv:suiv.attr('data-str_id')
			}})
			.done(function(data){
				$obj.closest('.struct_elem').hide('blind', function(){
					//var next = $(this).nextAll('.struct_elem').first()
					suiv.add(this).absorbe_separateurs()
					suiv.after(this)
					suiv.add(this).ejecte_separateurs()
					$(this).show('blind')
					return
					
				})
				LK.alert_msg(data)
			})
			.fail(function(data){
				LK.alert_msg(data)
			})
		}else if ($obj.is('.sablier')){
			LK.menu_contenus_caches()
		}else if ($obj.closest('a.entrer_commentaire').length){
			var source = $obj.closest('.editable')
			if (source.length){
				source = source[0].className.match(/\bcont([0-9]+)\b/)[1]

			}else
				source = '?'
			if (!LK.commentaires){
				$.getScript('./include/commentaires.js', function(){
					setTimeout(function(){
						LK.commentaires(source)
					}, LK.exec_delay)
				})
			} else
				LK.commentaires(source)
		}else if ($obj.is('.nom_contact')){
			var id_contact = parseInt($obj.customdata('id'))
			var id_equipe = parseInt($obj.customdata('id_equipe'))
			if (!isNaN(id_contact) && !isNaN(id_equipe)){
				LK.show_un_instant($obj)
				LK.show_contact_info(id_contact, id_equipe)
			} 
		}

	})
	
	//================ clic sur autres éléments
	$('body').click(function(ev){
		var src, dest, a
		$obj = $(ev.target)
		if ($obj.closest('#menu_left').length) return true;
		if ($obj.closest('#page_top').length){
			if ( ev.pageX < 20 && ev.pageY < 20){
				LK.login()
			} else if (LK.id_visiteur && ev.pageX > 870 && ev.pageX < 930 && ev.pageY < 60){ //@note était id_editeur
				window.location = './index.php?no=43'
			} 
		}
		if ($obj.is('#contenu_std')){
			return
		} 
		if ($obj.is('#b_logout'))
			LK.logout();
		if ($obj.closest('#deconnexion_visiteur').length){
			LK.logout()
			/*
			$.getJSON('./PHP/login_visiteur.php', {op:'logout'}, function(data){
				if (data.result ==1 ){
					LK.update_statut_visiteur({id:null, nom:'', statut:''})
				}
				LK.alert_msg(data)
			})
			*/
		}else if ($obj.closest('#connexion_visiteur').length){
			LK.login()
		} else if ($obj.is('.late_render')){
			LK.download_content($obj.closest('.editable'), $obj)
		}else if ($obj.closest('a.tv').length){
			$obj = $obj.closest('a.tv')
			ev.stopImmediatePropagation()
			ev.stopPropagation()
			src = $obj.attr('href')
			var html = YLS('<object height="190" width="320"><param name="movie" value="{src}" /><param name="allowFullScreen" value="false" /><param name="allowscriptaccess" value="always" /><embed allowfullscreen="false" allowscriptaccess="always" height="190" src="{src}" type="application/x-shockwave-flash" width="320" wmode="opaque"></embed></object>', {src:src})
			
			$obj.closest('div.text_container').find('object').after($(html)).remove()
			return false
		} else if ($obj.closest('a.radio').length){
			var html
			$obj = $obj.closest('a.radio')
			ev.stopImmediatePropagation()
			ev.stopPropagation()
			src = $obj.attr('href')
			html = YLS('<object classid="CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95" codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701" height="60" standby="Loading Microsoft Windows Media Player components..." type="application/x-oleobject" width="180"> <param name="fileName" value="{src}" /> <param name="animationatStart" value="true" /> <param name="transparentatStart" value="true" /> <param name="autoStart" value="true" /> <param name="showControls" value="true" /> <param name="ShowAudioControls" value="true" /> <param name="ShowStatusBar" value="true" /> <param name="loop" value="false" /> <embed autosize="-1" autostart="true" bgcolor="darkblue" designtimesp="5311" displaysize="4" height="60" loop="false" name="mediaPlayer" pluginspage="http://microsoft.com/windows/mediaplayer/en/download/" showcontrols="true" showdisplay="0" showstatusbar="-1" showtracker="-1" src="{src}" type="application/x-mplayer2" videoborder3d="-1" width="180" wmode="opaque"></embed> </object>', {src:src})
			/*
			dest = $obj.closest('div.text_container').find('param[name="fileName"]')
			alert(dest.length)
			dest.attr('value', src)
			dest.parent().find('param[name="autoStart"]').attr('value', 'true')
			dest.parent().find('embed').attr('src', src).attr('autostart', 'true')

			var html = dest.parent().parent().html()

			dest.parent().after($(html)).remove()
			*/
			$obj.closest('div.text_container').find('object').after($(html)).remove()
			//$obj.closest('div.text_container').find('object')[0].controls.play()
			return false
		} else if ($obj.closest('a.show').length) {
			//alert('toto')
			$obj = $obj.closest('a.show')
			ev.preventDefault()
			ev.stopImmediatePropagation()
			ev.stopPropagation()
			src = $obj.attr('href')
			html = src.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&amp;/g, '&').replace(/&quot;/g, '"').replace(/<cke:embed/, '<embed').replace(/<\/cke:embed/, '</embed').replace(/^http:\/\//,'')
			//alert(html)
			var titre = $obj.text()
			var titre2 = $obj.attr('title') || ''
			if (titre2.length){
				titre = titre2
			}
			var container = $obj.closest('div.show')
			if (container.length == 0){
				container = $obj.closest('div.text_container')
			}
			container.find('span.titre_show').text(titre)
			container.find('embed[flashvars]').after($(html).attr('wmode', 'opaque')).remove()
			return false
		}else if ($obj.closest('a.jeu').length){
			$obj = $obj.closest('a.jeu')
			ev.stopImmediatePropagation()
			ev.stopPropagation()
			src = $obj.attr('href')
			//alert('jeu')
			LK.xhr({data:{
				context:'jeu',
				op:'get_code',
				url:$obj.attr('href')
			}})
			.done(function(data){
				var new_obj , a
				if ($.browser.msie){
					new_obj =
					'<OBJECT id=flash_game codeBase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000 width=620 height=450><PARAM NAME="_cx" VALUE="16404"><PARAM NAME="_cy" VALUE="11906"><PARAM NAME="FlashVars" VALUE=""><PARAM NAME="Movie" VALUE="{url}"><PARAM NAME="Src" VALUE="{url}"><PARAM NAME="WMode" VALUE="opaque"><PARAM NAME="Play" VALUE="0"><PARAM NAME="Loop" VALUE="-1"><PARAM NAME="Quality" VALUE="High"><PARAM NAME="SAlign" VALUE=""><PARAM NAME="Menu" VALUE="-1"><PARAM NAME="Base" VALUE=""><PARAM NAME="AllowScriptAccess" VALUE=""><PARAM NAME="Scale" VALUE="ShowAll"><PARAM NAME="DeviceFont" VALUE="0"><PARAM NAME="EmbedMovie" VALUE="1"><PARAM NAME="BGColor" VALUE=""><PARAM NAME="SWRemote" VALUE=""><PARAM NAME="MovieData" VALUE=""><PARAM NAME="SeamlessTabbing" VALUE="1"><PARAM NAME="Profile" VALUE="0"><PARAM NAME="ProfileAddress" VALUE=""><PARAM NAME="ProfilePort" VALUE="0"><PARAM NAME="AllowNetworking" VALUE="all"><PARAM NAME="AllowFullScreen" VALUE="false">'
					 + '<embed src="{url}"quality="high" name="flash_game" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" height="450" width="620" wmode="opaque"/>'
					+ '</OBJECT>'
				}else{
					new_obj =
						'<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" id="flash_game" height="450" width="620" wmode="opaque">'
						+'<param name="movie" value="{url}">'
						+ '<param name="quality" value="high">'
						+ '<embed src="{url}" quality="high" name="flash_game" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" height="450" width="620" wmode="opaque">'
						+ '</object>'
				}

				$obj.closest('div.text_container').find('p.object').html(YLS(new_obj, data))

				LK.alert_msg(data)
			})
			.fail(function(data){
				LK.alert_msg(data)
			})
			
			return false

		} else if ($obj.is('a.mdp_requis')){
			LK.entrer_mdp($obj)
		}else if ($obj.is('a.verrouiller_contenu')){
			LK.verrouiller_contenu($obj)
		} else if ($obj.is('a[data-type="popup"]')){
			
			LK.load('popup_runtime')
			.done(function(){
				new LK.popup_runtime($obj)
			})
			/*
			var texte_visible = $obj.parent().closest('.popup')
			var popup_text_container = texte_visible.parent().closest('.popup')
			var css = {}
			if (popup_text_container.attr('data-width')){
				css.width = popup_text_container.attr('data-width')
			}
			if (popup_text_container.attr('data-height')){
				css.height = popup_text_container.attr('data-height')
			}
			if (popup_text_container.attr('data-align')){
				css.textAlign = popup_text_container.attr('data-align')
			}
			var temp_div = $('<div/>').append(popup_text_container.children().not('.popup').clone())
			LK.show_info({msg:temp_div.html(), pos:{my:'left',at:'right',of:$obj,collision:'fit'},css:css})
			*/
		} else if ($obj.is('a[data-code_galerie]')){
			var photo_section = $obj.closest('div.photo_wrapper')
			var photos = photo_section.children('div.photos')
			var titre = photo_section.children('div.photo_titre')
			titre.text($obj.attr('data-titre_galerie'))
			var code = $obj.attr('data-code_galerie')
			code =code.replace(/width *= *"\d+"/, 'width="' + photos.width() + '"').replace(/height *= *"\d+"/, 'height="' + photos.height() + '"').replace(/<cke:/, '<')
			if (LK.IE){
				photos.children().remove()
				setTimeout(function(){photos.html(code)})
				setTimeout(function(){
					photos.trigger('mouseover')
				},1000)
			} else {
				photos.html(code)
			}
		} else if ($obj.is('div.choix_langue')){
			LK.xhr({data:{
					context:'login_visiteur',
					op:'changer_lang'
					
				}})
			.always(function(data){
				LK.alert_msg(data)
			})
			.done(function(data){
				$.cookie('langue', data.lang)
				window.location.reload()
			})

		}
		if (!$obj.closest('.jj_menu_item').length){
			LK.jj_remove()
		}
		
	})
LK.menu_contenus_caches = function(){
	var buttons = {};
	buttons[LK.msg__.fermer] = function() {
		$(this).dialog('close')
	}

	if($('#contenus_caches').length == 0){
		$('<div id="contenus_caches"></div>').dialog({
			title:LK.msg__.horaire_parution,
			width:500,
			autoOpen:false,
			buttons:buttons,
			zIndex:100
		})
		.dialogShadow('ombre ui-corner-all')
		.disableSelection()
		.closeOn('change_mode')
	} else{
		$('#contenus_caches').dialog('option', 'buttons', buttons)
	}
	var dial = $('#contenus_caches').html('')
	dial.append($('<div>', {css:{margin:'10px 0'}}).text(YLS(LK.msg__.elements_caches, LK)))
	dial.append($('<div>', {css:{margin:'10px 0'}}).text(YLS(LK.msg__.elements_paraissent, LK)))
	if (LK.elements_caches){
		dial.append($('<a>', {href:'#'}).text(LK.msg__.afficher_tout)
			.click(function(){
				LK.xhr({data:{
					context: 'visibilite_contenus',
					op:'tout_montrer'
				}})
				.done(function(data){
					window.location = window.location.href.replace(/#*$/, '')
					LK.alert_msg(data)
				})
				.fail(function(data){
					LK.alert_msg(data)
				})
			})
		)
	}

	dial.dialog('open')

}
LK.icone_origine_droit = function(id){

  var list = {
	no_perm:'close',
	cont:'document',
	doc:'folder-collapsed',
	autre_doc:'suitcase',
	statut:'person',
	inconnu:'help'
	}
	return list[id] || list.inconnu
}

LK.find_content = function($obj){
	return $obj.closest('.editable').children('.editable_marker').children(':first')
}
LK.find_content_type = function($obj){
	var def = $.Deferred()
	var id_structure = $obj.closest('.struct_elem').attr('data-str_id')
	if (isNaN(parseInt(id_structure))){
		alert('structure introuvable')
		def.reject()
		return def.promise()
	}
	LK.xhr({
		data:{
			context:'gestion_contenus',
			op:'get_content_type',
			id_structure: id_structure
		}
	})
	.always(function(data){
		LK.alert_msg(data)
	})
	.done(function(data){
		def.resolve(data)
		})

	return def.promise()
	
	var to_ret = 'texte'
	$obj = LK.find_content($obj)
	if (!$obj.length)
		return null;
	if ($obj.hasClass('text_container')) // valeur la plus fréquente
		return 'texte'
	$.each(LK.widget_list, function(ind, val){
		if ($obj.hasClass(val.classe)){
			to_ret = ind;
			return false;
		}
		//alert('pas ' + ind + ' car classe (' + $obj[0].className + ') <> ' + val.classe)
	})
	return to_ret // valeur de défaut en cas de problème
}
LK.set_content_type = function($obj, type){
	$obj = LK.find_content($obj)
	if ($obj.length == 0)
		return
	if (!LK.all_widget_classes){
		LK.all_widget_classes = '';
		$.each(LK.widget_list, function(ind, val){
			LK.all_widget_classes += val.classe + ' '
		})
	}
	if (LK.widget_list[type]){
		$obj
			.removeClass(LK.all_widget_classes)
			.addClass(LK.widget_list[type].classe)
	}
}

LK.show_access = function($obj){
	
	var msg = LK.msg__
	var id_contenu = $obj.customdata('cont')// $obj[0].className.match(/\bcont([0-9]+)\b/)
	if (!id_contenu){
		alert(msg.aucun_contenu)
		return
	}
	//id_contenu = id_contenu[1]
	LK.current_contenu = id_contenu
	LK.xhr({data:{
		context:'permissions_contenus',
		op:'get_list',
		id_document:LK.id_document,
		id_contenu:id_contenu
	}})
	.done(function(data){
		if ($('#liste_acces').length==0){
			var buttons = {}
			buttons[LK.msg__.fermer] = function(){
				$(this).dialog('close')
			}
			$('<div id="liste_acces"></div>').dialog({
				title: LK.msg__.titre_liste_acces,
				width:300,
				buttons:buttons,
				autoOpen:false,
				height:500,
				maxHeight:700,
				resizable:true,
				modal:1,
				close:function(){
					$('#acces_legende').fadeOut()
				}
			})
			.closeOn('change_mode')
			.dialogShadow('ombre ui-corner-all')
			.css({
				overflow:'auto',
				height:500
			})

		}


		$('#liste_acces').html(
			$('<div class="titre"></div>').text( data.tag_contenu))


		$('<div class="ligne_acces"></div>')
			.append(LK.spanIcon('script') + LK.spanIcon('pencil'))
			.append($('<a style="margin-left:10px;color:red;font-size:11px" href="#">' + msg.legende + '</a>')
					.click(function(){
						var contenu;
						var msg=LK.msg__
						if ($('#acces_legende').length==0){
							$('<div id="acces_legende" class="ui-corner-all"></div>')
								.appendTo('body')
								.css({
									position:'absolute',
									top:150,
									left:Math.round($(window).width()*.66-200),
									height:350,
									width:400,
									backgroundColor:'white',
									border: '3px ridge #666',
									zIndex:10000,
									overflow:'hidden'
								})
								.addShadow('ombre ui-corner-all')
								.click(function(ev){
									if ($(ev.target).closest('.titre').length==0)
										$(this).fadeOut();
								})
								.draggable({
									handle:'.titre',
									drag:function(){
										$(this).fixShadow()
									}
								})
								.resizable()
							.append($('<div class="titre"></div>').html(msg.legende_titre).css('cursor', 'move'))
							.append(contenu=$('<div style="padding:10px"></div>')
								.append($('<div></div>').html(msg.legende_col))
								.append($('<div></div>').html(LK.spanIcon('script') + '- ' + msg.legende_col_publication))
								.append($('<div></div>').html(LK.spanIcon('pencil') + '- ' + msg.legende_col_edition))
								.append($('<div style="margin:5px 0"></div>').html(msg.legende_explication))
							)
							$.each(msg.legende_expl, function(type, text){
								contenu.append(
									$('<div style="margin:3px 0;"></div>').append(LK.spanIcon(LK.icone_origine_droit(type)))
										.append('<div>' + text + '</div>')
								)

							})
							contenu.append($('<div style="padding:5px 0;"></div>').html(msg.legende_expl_nom_biffe))


						}
						$('#acces_legende').fadeIn();
					})
			)
			.appendTo('#liste_acces')
		$.each(data.liste, function(ind, orig){
			var nom_editeur, ligne
			ligne = $('<div>', {'class':'ligne_acces', 'data-id':orig.id})
				.append(LK.spanIcon(LK.icone_origine_droit(orig.publier)) + LK.spanIcon(LK.icone_origine_droit(orig.edit)) + (orig.interdit?'<span style="font-style:overstrike">':'') + '<span class="nom_editeur"></span>'+ (orig.interdit?'</span>':'' ))
				.appendTo('#liste_acces')
			ligne.find('.nom_editeur').text(orig.nom)
			if (LK.perm_admin){

				ligne	.css('cursor', 'pointer')
						.find('.nom_editeur').jjmenu('click', [
						{
							title: LK.msg__.changer_acces,
							action:{
								type:'fn',
								callback:function(){
									LK.hide_jjmenu()
									if (!LK.perm_admin){
										alert('Réservé aux administrateurs')
										return
									}

									LK.execute({test:'editer_droits_contenus', fn:function(){
										var id, ligne = $(triggerElement).closest('div.ligne_acces'), nb = 0, tt_msg = '', perm_contenu
										LK.editer_droits_contenu(id = ligne.customdata('id'))
											.done(function(liste){
												var data
												$.each(liste, function(ind, val){
													if (val.id_editeur == parseInt(id)){
														data = val
														return false
													}
												})
												if (data){
													if (ligne.find('span.contenu_perm').length == 0){
														ligne.append($('<span>', {'class':'contenu_perm'}))
													}
													perm_contenu = ligne.find('.contenu_perm')
														.html(' (')
													if (data.perm_publier){
														perm_contenu.append(LK.spanIcon2('script'))
														nb++
													}
													if (data.perm_edit){
														perm_contenu.append(LK.spanIcon2('pencil'))
														nb++
													}
													if (data.expiration_perm_editer || data.expiration_perm_publier){
														perm_contenu.append(a = $(LK.spanIcon2('clock')))
														if (data.expiration_perm_publier){
															tt_msg = YLS(LK.msg__.droit_pub_expire_le, data)
														}
														if( data.expiration_perm_editer){
															tt_msg += (tt_msg?'<br/>':'') + YLS(LK.msg__.droit_edit_expire_le, data)
														}
														a.simpleTooltip({title:tt_msg})
														nb++
													}
													if (!nb){
														perm_contenu.append(LK.spanIcon2('closethick'))
													}
													perm_contenu.append(')')

												} else{
													ligne.find('.contenu_perm').html('')
												}
											})}
									}
									)

								}
							}
						}, {
							title:LK.msg__.montrer_tous_acces,
							action:{
								type:'fn',
								callback:function(){
										LK.hide_jjmenu()
										if (!LK.perm_admin){
											alert('Réservé aux administrateurs')
											return
										}
										var scrollPos = $('#liste_acces').scrollTop()
										LK.execute({test:'liste_acces_editeur', fn:function(){
												
												$('#liste_acces').dialog('widget').hide()
												LK.liste_acces_editeur(ligne.customdata('id'))
												.done(function(){
													$('#liste_acces').dialog('widget').show()
														$('#liste_acces').scrollTo(scrollPos)
												})
										}})


								}
							}
						}
					],
					{nom:function(){return $(triggerElement).text()}},
					{xposition:'mouse'}
				)
			}

		}
		)
		$('#liste_acces').dialog('open')

		LK.alert_msg(data);
	})
	.fail(function(data){
		LK.alert_msg(data)
	})
}

LK.adjust_scroll = function(){
	var orig_pos,aa
	try{
	if (LK.last_section_clicked){
		if ((orig_pos = LK.last_section_clicked.LKdata('original_pos'))){
			$('#main_content').scrollTo('-=' + Math.round(Math.abs(LK.last_section_clicked.offset().top - orig_pos)) + 'px',{axis:'y', duration:500})
			LK.last_section_clicked=null
		
		}
	}
	} catch(err){alert(err.message)}

}
LK.info_msg_gen = new LK.infoMsg({css:{zIndex:100, width:300,padding:5}})




})	


LK.set_mois_frontiere_saison = function(){
	if (!LK.saison){
		return false
	}
	try{
		var debut = $.datepicker.parseDate('yy-mm-dd', LK.saison.debut)
		var fin = $.datepicker.parseDate('yy-mm-dd', LK.saison.fin)
		var milieu = Math.ceiling((debut.getMonth() + fin.getMonth())/2)
		if ((LK.saison.an_debut = debut.getFullYear()) != (LK.saison.an_fin = fin.getFullYear())){
			LK.saison.frontiere = (milieu + 6) % 12 + 1
		} else {
			LK.saison.frontiere = 0
		}
		return true

	} catch(err){
		return false
	}

}

LK.go_main = function(){
	window.location="./index.php"
}
LK.logout = function(){
	LK.id_visiteur = 0; // c'est le marqueur d'état logged in ou out //@note était id_editeur
	$('#admin_id').html(LK.msg__.err_login_pas_reconnu)
	LK.show_login_status();
	LK.xhr({data:{
			context:'login_visiteur',
			op:'logout'
	}})
	.always(function(){
		$('body').trigger('login_chg')
	})
	.done(function(data){
			alert(LK.msg__.msg_plus_reconnu)
			LK.id_visiteur = 0
			LK.nom_visiteur = ''//@note était id_editeur
			LK.publiciste = 0
			LK.perm_structure = false
			LK.perm_admin = false
			LK.perm_inscription = false
			LK.perm_admin_inscription = false
			LK.superhero = false
			LK.perm_convert = false
			LK.docum_usager = false
			LK.type_usager = ''
			$('#admin_menu').remove()
			LK.show_login_status();
			LK.choix_db = '';
			$('#alt_db_warning').hide()
			
		})
	.fail(function(data){
		alert(LK.msg__.echec)
	})
}

;(function(){

	var dbi = {};
	LK.detection_boucle_infinie = function(tag, alarme, msg){
	
		if (dbi[tag] != undefined)
			dbi[tag].cur_val++;
		else
			dbi[tag] = {cur_val: 0, alarme:alarme || 0, msg: msg||'oups... boucle infinie détectée'};

		if (dbi[tag].cur_val > dbi[tag].alarme){
			alert(dbi[tag].msg + ' (' + tag + ')')
			return true;
		}
		return false
	}
})();



LK.editer_structure = function(data){
	
	// au premier appel, data est null, ce qui fera tout commencer par la vérification du brouillon.
	// les appels successifs à LK.editer_structure faits par la suite pourront ajuster
	// le paramètre data selon le besoin
	/*
	if (data == undefined){
		data = {
			id_document:LK.id_document,
			brouillon:'verifier'
		}
	}*/
	if (!LK.ed || !LK.ed.msg){ // si script pas chargé en mémoire... (LK.ed est défini dans le script de langue chargé ici)
		$.getScript(LK.edit_struct_script, function(){
			
			if (LK.detection_boucle_infinie('chargement de msgs pour edition de structure', 2, 'boucle infinie à: '))
				return;
			setTimeout(function(){LK.editer_structure()}, 100)  // réexécuter même fonction une fois script chargé
		})
		return;
	}
	

	if (!LK.ed.info)
		LK.ed.info = new LK.infoMsg({css:{width:300, padding:5,zIndex:100}})
	
	// note: si data n'est pas fourni, alors LK.ed.edit_structure est appelé sans paramètres, mais 
	// cette fonction imposera alors au visiteur de choisir quoi éditer et la présente fonction sera
	// rappelée avec une valeur assignée à data
	if (!data) {
		if (LK.ed.edit_structure){ // à condition qu'il ait été chargé

			LK.ed.edit_structure()
		}else // si script pas chargé, le charger d'abord
			$.getScript('./include/edit_structure2.js', function(){ //<<============== A CHG
				setTimeout(function(){
					LK.ed.edit_structure()
				}, LK.exec_delay)
		})
		return;
	}


	
	// si script de langue chargé, demander le contenu de structure à éditer pour la page courante
	// le script PHP vérifiera le niveau d'autorisation obtenu du dernier login
	
	data.context =	'edit_struct'
	data.op =		'lire_structure'
	
	LK.xhr({data:data
	})
		.done(function(data_retour){

			if (data_retour.no_doc){
				if (data_retour.can_add == 1){
					alert(LK.ed.msg.pouvez_ajouter_doc)
				}else {
					alert(LK.ed.msg.existe_pas_et_pouvez_pas_aj)
				}
				return;
			}
			switch (data_retour.mode){
				case 'brouillon':
					LK.choisir_brouillon(data_retour);
					break;
				case 'structure':
					// envoyer le contenu reçu au script d'édition de structure (
					if (LK.ed.edit_structure){ // à condition qu'il ait été chargé
						LK.ed.edit_structure(data_retour)
					} else // si script pas chargé, le charger d'abord
						$.getScript('./include/edit_structure2.js', function(){ //<<============== A CHG
							setTimeout(function(){
								LK.ed.edit_structure(data_retour)
							}, LK.exec_delay)
					})
			}
		})
		.fail(function(data_retour){
			LK.alert_msg(data_retour) // afficher msg d'erreur s'il y en a un
			if (data_retour.no_doc && data_retour.can_add){
				alert('créer?')
			}
			if(data_retour.non_autorise){ // si réponse = non permis pour cet usager (pas enregistré ou niveau insuffisant)

				alert(LK.msg__.niveau_insuffisant)
				LK.login() // le login nous retournera à ls présente fonction, idéalement avec une autorisation suffisante cette fois
					.done(function(){LK.editer_structure(data)})
			}
		})


}

//
// ATTENTION  EDITION DE STRUCTURE
// faire réagir l'usager en fonction du statut du brouillon trouvé dans la db
//
// A)  brouillon plus vieux que version publiée
//		opt 1 = écraser vieux brouillon et éditer page telle que publiée (c.a.d. telle que vue par visiteurs actuellement)
//		opt 2 = conserver vieux brouillon
//		opt 3 = annuler.
// B)	
// B) pas de brouillon trouvé, alors un brouillon est créé pour éviter que le site change <
//		avant qu'on ne soit satisfait de l'ensemble des changements
//
// C) brouillon plus jeune que version publiée.
//		opt 1- écraser brouillon avec la page publiée
//		opt 2- continuer d'éditer
//		opt 3- abandonner
//
//
LK.choisir_brouillon = function(data){
	alert('choix brouillon')
	if (LK.first_pass('choisir_brouillon')){
		// au premier passage, créer les boutons spécifiques aux dialogues
		LK.b_dialog({
			
		ecraser_brouillon:[LK.ed.msg.pub_bouton_ecraser,
							 function(){
								LK.editer_structure({id_document:LK.id_document, brouillon:'ecraser'})
								$(this).dialog('close')
		}],
		conserver_brouillon:[LK.ed.msg.pub_bouton_continuer, function(){
								LK.editer_structure({id_document:LK.id_document, brouillon:'conserver'})
								$(this).dialog('close')
		}]
		})

	}
	if (data.reponse_brouillon == 'nouv_brouillon') { //<============== OPTION B

		
		if ($('#avis_nouv_brouillon').length==0){
		

			$('<div id="avis_nouv_brouillon"></div>')
					.html(
					LK.ed.msg.message_nouv_brouillon1 +
					'<div style="font-size:77%;padding:10px;text-align:center">('+
					YLS(LK.ed.msg.message_nouv_brouillon2, LK.ed.msg.edit_buttons) +
					')</div>'
					)
					.dialog({
					title: LK.msg__.pour_information,
					buttons:LK.b_dialog(['cancel_close', 'ok_close']),
					width:350,
					modal:true
				})
				.dialogShadow('ombre')
		}
		$('#avis_nouv_brouillon').dialog('open')


	} else if (data.reponse_brouillon == 'publication par autre'){ // <<<<<<<=========== OPTION A
		if($('#dialogue_pub_par_autre').length == 0){
			$('<div id="dialogue_pub_par_autre"></div>')
				.html(YLS(YLS(
				"{pub_depuis_brouillon}" +
				"<div style='border:inset 2px #fafafa;padding:5px;margin:5px;'>"+
					"{pub_date_de_publication}: {date_publie}<br/>" +
				   "{pub_date_brouillon}: {date_cree}"+
				   "</div>"+
				 "{pub_desc_options}"

				, $.extend({}, data.data, LK.ed.msg))
				, data.data))
			.dialog({
				title:LK.msg__.attention,
				width:500,
				buttons:LK.b_dialog(['ok_cancel', 'ecraser_brouillon', 'conserver_brouillon']),
				modal:true
			})
			.dialogShadow('ombre')
		}else
			$('#dialogue_pub_par_autre').dialog('open')

	}else if  (data.reponse_brouillon  == 'ok'){//============= C
		if($('#dialogue_brouillon_ok').length == 0){
			$('<div id="dialogue_brouillon_ok"></div>')
			.html(LK.ed.msg.pub_desc_options)
			.dialog({
				title:LK.msg__.attention,
				width:500,
				buttons:LK.b_dialog(['cancel_close', 'ecraser_brouillon', 'conserver_brouillon']),
				modal:true,
				open:function(){$(this).dialogButtonFocus(3)}
			})

			.dialogShadow('ombre')
		}else
			$('#dialogue_brouillon_ok').dialog('open')




	}
	
}


// demander id et mdp. en cas de succes, appeler fnct_succes avec
LK.login = function(fnct_succes, fnct_echec){
	var mdp
	if($('#login').length == 0){
		// créer boutons
		var buttons = {}, b_ok
		// bouton OK
		b_ok = buttons[LK.msg__.ok] = function(){
			var err = false;
			// retirer espaces superflus de tous les champs
			$('input', '#login')
			.trim()
			.removeClass('err_input')

			// si id pas assez long...
			if ($('#login_id').val().length < 4){
				$('#login_id').addClass('err_input');
				err = true;
			}
			// si mdp pas assez long
			if ($('#login_mdp').val().length <4){
				$('#login_mdp').addClass('err_input');
				err = true;
			}
			if (err) return;
			// réessayer de soumettre demande de modification de structure de page
			LK.xhr({data:
					{
						context:		'login_visiteur',
						op:				'login',
						id:				$('#login_id').val(),
						mdp:			mdp = LK.MD5($('#login_mdp').val()),
						alt_db:			$('#alt_dbase').is(':checked')?1:0
					}})
				.done(function(data){
					if (data.doit_changer){
						LK.execute({test:'chg_mdp', fn:function(){LK.changer_mdp({id:data.id, mdp:mdp})}})
						return
					}
					alert('ok')
					LK.accept_login(data)
					if (fnct_succes) fnct_succes(); // exécuter la fonction passée en paramètre pour reprendre avec autorisation validée
					//if (LK.superhero) LK.deb.activate().show()
					
					
				})
				.fail(function(data){
					LK.alert_msg(data, LK.msg__)
					LK.show_login_status()
					if (fnct_echec){
						fnct_echec();
					}
				})
				.always(function(){
					$('body').trigger('login_chg')
				})
		}
		// bouton 'annule' ferme le dialogue
		buttons[LK.msg__.annuler] = function(){
			$(this).dialog('close');
			if (fnct_echec) fnct_echec();
		}

		$('<div id="login"></div>')
		.appendTo('body')
		.dialog({
			autoOpen:false,
			title:LK.msg__.titre_login,
			buttons:buttons,
			open:function(){
				$('input', '#login').removeClass('err_input');
			},
			close:function(){
				$('#login_mdp').val('')
			}
		})
		.dialogShadow('ombre')
		.html(YLS('<p>{identifiez_vous}</p><label>{id}<input id="login_id" type="text"/></label><br/><br/><label>{mdp}<input id="login_mdp" type="password"/></label><div style="margin-top:15px"><a href="#" style="margin-right:15px" class="perdu">{perdu_mdp}</a><a href="#" class="changer">{chg_mdp}</a></div>', LK.msg__))
		.find('input').css('marginLeft', 15)
		$('#login').click(function(ev){
			var $obj = $(ev.target)
			if ($obj.is('a.perdu')){

				LK.execute({test:'chg_mdp', fn:function(){
						LK.perdu_mdp()
				}})

			}else if ($obj.is('a.changer')){
				if (!LK.id_visiteur){//@note était id_editeur
					alert(LK.msg__.ouvrez_session)
					return
				}
				$('#login').dialog('close')
				LK.execute({test:'chg_mdp', fn:function(){
					LK.chg_mdp_demande_usager()
				}})
			}
		})

		$('#login_mdp').keypress(function(ev){
			if (ev.which == 13){
				b_ok()
			}
		})
	}
	
	if (LK.superhero && $('#alt_dbase').length == 0)
		$('<div style="text-align:center;margin:8px auto;"><label>' + LK.msg__.base_donnees_pratique + '<input style="margin-left:8px;" id="alt_dbase" type="checkbox" value="1"/></label></div>').appendTo('#login')
	if (LK.choix_db)
		$('#alt_dbase').attr('checked', 'checked')
	else
		$('#alt_dbase').removeAttr('checked')
	$('#login').dialog('open');
	$('#login_id').get(0).focus()
}
LK.accept_login = function(data, params){
	params = params || {}
	$('#login').dialog('close')

	LK.id_visiteur = data.id
	LK.nom_visiteur = data.nom
	
	$.each([
		'publiciste',
		'perm_structure',
		'perm_admin',
		'perm_inscription',
		'perm_admin_inscription',
		'superhero',
		'perm_convert',
		'perm_insertion_contenu',
		'perm_edit_classes',
		'perm_defilement',
		'docum_usager',
		'type_usager',
		'choix_db'
	], function(ind, val){
		LK[val] = data[val]
	})
	
	$('#admin_menu').remove()

	LK.show_login_status(params);
	$('#alt_db_warning').html(LK.choix_db?'ALT_DB':'')
}

LK.show_login_status = function(params){
	params = $.extend({and_admin_menu:true, force:false, inscriptions:false},params)
	
	if (!params.force && !params.inscriptions){
		if (!LK.id_document) return;
		if (LK.page_status == 'brouillon') return;
	}
	if(LK.id_visiteur){
		
		
		if (params.and_admin_menu && !params.inscriptions) {
			LK.show_admin_menu();
		} 
		$('#admin_id')
		.html(YLS(LK.msg__['vous_etes_identifie_' + (LK.perm_admin?'admin':'visiteur')], 
			{nom: '<strong>' + LK.nom_visiteur + '</strong>',
				log_out: '<a id="b_logout" href="#">' + LK.msg__.log_out + '</a>'
			}
		))
		.fadeIn();
	} else{
		$('#admin_id').fadeOut();
		if (!params.inscriptions){
			LK.hide_admin_menu()
			LK.toggle_edit_link_visibility(false);
		}
	}
}
LK.toggle_edit_link_visibility = function(set){
	var $set = $([]);
	if (!LK.editable_cree) return; // s'ils n'ont pas été ajoutés au document, rien à faire
	if (typeof(set) == 'undefined')
		LK.editable_visible = !LK.editable_visible // changer d'état
	else
		LK.editable_visible = set;

	var first_done
	if (LK.editable_visible){
		//$('.edit_link').siblings().andSelf().hide() // cacher les liens d'accès à l'édition si visibles...
		$('.edit_link').parent().slideDown() // cacher les liens d'accès à l'édition si visibles...
		$('div.editable_ctrls').parents().addClass('min_edit_height')
		
	} else{
		$('.show_editable').removeClass('show_editable')
		$('div.min_edit_height').removeClass('min_edit_height')
		//$('.edit_link').siblings().andSelf().show() // ... les montrer si cachés
		$('.edit_link').each(function(){
			$(this).parent()
				.addTo($set)
				.slideUp(
					first_done?
							function(){}:
							function(){
								$set.hide();
								setTimeout(function(){LK.adjust_scroll()},100)
							}
						)
			first_done = true;
			}) // ... les montrer si cachés
	}

}


LK.show_admin_menu = function(){
	var a
	if (LK.page_status == 'brouillon')
		return;
	if($('#admin_menu').length == 0){
		
		if (LK.id_document == LK.docum_usager){
			$('#menu_left')

				.append(
						$('<div id="admin_menu"></div>')
							.append($('<ul id="MenuBarAdmin" class="MenuBarVertical"/>')
								.append('<li id="adm_edit_contenu"><a href="#">Edit</a></li>')
								.append('<li><a href="./index.php">Retour</a></li>')
						)
				)
		} else {
			if (LK.docum_usager != '-'){
				$('#menu_left')

					.append(
							$('<div id="admin_menu"></div>')
								.append($('<ul id="MenuBarAdmin" class="MenuBarVertical"/>')
									.append('<li><a href="./index.php?no=' + LK.docum_usager + '">Votre page</a></li>')
							)
					)
			} else {
				$('#menu_left')

					.append(
							$('<div id="admin_menu"></div>')
								.append($('<ul id="MenuBarAdmin" class="MenuBarVertical"/>')
									.append('<li id="adm_edit_contenu"><a href="#">' + LK.msg__.adm_edit_contenu + '</a></li>')
									.append('<li id="adm_edit_structure"><a href="#">' + LK.msg__.adm_edit_structure + '</a></li>')
									.append('<li id="adm_publicite" style="display:none"><a href="#">' + LK.msg__.adm_publicite +'</a></li>')
							.append($('<li id="adm_menu"><a href="#" class="MenuBarItemSubmenu">' + LK.msg__.adm_admin + '</a></li>')
								.append($('<ul/>')
									.append('<li id="admin_acces"><a href="./admin.php">' + LK.msg__.admin_acces + '</a></li>')
								)
					))
					)
			}
		}

		
		LK.MenuBarAdmin = new Spry.Widget.MenuBar("MenuBarAdmin", {imgRight:"SpryAssets/SpryMenuBarRightHover.gif"});
		
	} 
	
	$('#adm_publicite').toggle(LK.publiciste?true:false)
	$('#adm_edit_structure').toggle(LK.perm_structure)
	$('#adm_menu').toggle(LK.perm_admin)

	$('#admin_menu').fadeIn();
}
LK.hide_admin_menu = function(){
	$('#admin_menu').fadeOut();
}

LK.alert_msg = function(donnees, msgs){
	var to_ret = false
	LK.msg__ = LK.msg__ || {}
	if (msgs == undefined)
		msgs = LK.msg__;
	if (!donnees){
		return
	}
	if (donnees.msg){
		alert((msgs[donnees.msg] || LK.msg__[donnees.msg] || donnees.msg ) + (donnees.ref?'  (' + donnees.ref + ')':''))
		to_ret = true
	}
	if (donnees.msg == 'ouvrez_session'){
		LK.login()
	}
	return to_ret
}


;
$(function(){
	var button_list = {
	};
	var a;
	// créer quelques boutons standard...
	button_list.ok_close = {}
	button_list.ok_close[LK.msg__.ok] = function(){
		$(this).dialog('close');
	}

	button_list.cancel_close = {}
	button_list.cancel_close[LK.msg__.annuler] = function(){
		$(this).dialog('close');
	}



	var set_list = {}

	// retourne faux la première fois, et toujours vrai ensuite
	LK.first_pass = function(tag){
		var to_ret
		to_ret = set_list[tag];
		set_list[tag] = 1;
		return (!to_ret);
	}

	LK.b_dialog = function(id, spec){ // spec = [tag, function] (array et NON objet)
		var to_ret = {};
		if (id && spec){
			button_list[id] = {};
			button_list[id][spec[0]] = spec[1];
			return;
		}
		if(typeof(id == 'object')){
			$.each(id, function(id, spec){
				LK.b_dialog(id,spec)
			})
		}
		if (typeof(id) == 'string') id = [id];
		if ($.isArray(id)){
			$.each(id, function(ind, b_id){
				if (button_list[b_id])
					$.extend(to_ret, button_list[b_id])
			})
		}
		return to_ret;
	}

});



LK.infoMsg = function(params){
	this.config = {attach: {attach: $('#page_top'),context: {obj:{leftX:.5, topX:1}, bulle:{leftX:.5, topX:0}}},
					css: {position:'absolute',
							display:'none',
							width:150,
							height: 'auto',
							minHeight:20,
							maxHeight:100,
							overflow:'hidden',
							border:'solid 1px #3250a3',
							zIndex:999999,
							paddingRight:5,
							paddingLeft:5
							},
					addClass:'info_msg_default',
					animTimeIn:1000,
					animTimeOut:3000,
					time:3000,
					maxMsg:2
	}
	$.extend(true, this.config, params);


	//this.
	var this_ = this;
	this.infoDiv = $('<div/>')
						.css(this.config.css)
						.addClass(this.config.addClass)
						.appendTo('body')
						.click(function(){
									   if (this_.going) {
										   clearTimeout(this_.going);
										   this_.going = null;
									   }
									   if (this_.coming) this_.coming = false;
									   if (this_.there){
										   clearTimeout(this_.there);
										   this_.there = null;
									   }
									   $(this).fadeOut(200);
									   })

	this.tOut = null; // non null = fenêtre affichée (animation d'entrée complétée)
	this.coming = false;
	this.there = false;
	this.going = false;

	this.coming_start = 0;
	this.there_start = 0;
	this.going_start = 0;
}

LK.infoMsg.prototype.start_going = function(){
	var this_ = this;
	if (this.coming) {
		clearTimeout(this.coming);
		this.coming = null;
	}
	if (this.there) {
		clearTimeout(this.there);
		this.there = null;
	}
	this.going_start = (new Date()).getTime();
	this.going = true;
	this.infoDiv.fadeOut(this.config.animTimeOut, function(){this_.going = null});
}
LK.infoMsg.prototype.start_there = function(){
	var this_ = this;
	if (this.there) clearTimeout(this.there);
	this.there = setTimeout(function(){this_.there = null;this_.start_going()}, this.config.time)
}

LK.infoMsg.prototype.finishedComing = function(){
	if (!this.coming) return;
	this.coming = false;
	this.start_there();
}

LK.infoMsg.prototype.show = function(msg, time){
	var c = this.config;

	if (!this.there && !this.coming) this.infoDiv.html('');
	this.infoDiv
		.prepend($('<div/>').html(msg))
		.children().slice(c.maxMsg).remove()
		.end().end()
		.attach('', this.config.attach)
	var this_ = this;
	var timeIn = c.animTimeIn;
	var coming_start = (new Date()).getTime(); // par défaut, animation commence maintenant
	var was_going = false;
	if (this.going) {
		was_going = true;
		this.infoDiv.stop();
		clearTimeout(this.going);
		this.going = false;
		timeIn = timeIn * (1-((new Date()).getTime()-this.going_start)/c.animTimeOut);
		coming_start = coming_start + timeIn - c.animTimeIn;
	}
	// si n'est pas déjà complètement ouverte ni en train de s'ouvrir, alors l'ouvrir ou compléter ouverture en cours
	if (!this.there && !this.coming) {
		this.coming_start = coming_start;
		this.coming = true;
		if (!was_going) {
			this.infoDiv.show('slide', {direction: 'up'}, timeIn, function(){this_.finishedComing()})
		} else
			this.infoDiv.fadeTo(timeIn, 1, function(){this_.finishedComing()}); // si était en train de disparaître, faire un fadeIn au lieu d'un slide
		return;
	}
	if (this.there) {
		this.start_there();
	}
}
LK.infoMsg.prototype.hide = function(){
	if (this.going) return;
	if (this.coming) {
		clearTimeout(this.coming);
		this.coming = false;
		this.infoDiv.stop(true, true)
		this.infoDiv.fadeOut(200);
		return;
	}
	if (this.there){
		clearTimeout(this.there);
		this.there = false;
		this.start_going();
	}

}
LK.infoMsg.prototype.hideNow = function(){
	if (this.coming) {
		clearTimeout(this.coming);
		this.coming = false;
	}
	if (this.there){
		clearTimeout(this.there);
		this.there = false;
	}
	if (this.going)
		this.going = false;
this.infoDiv
	.stop(true, true)
	.hide();

}

// data = {id, appendTo, tabs: [{label, id}, ...]}
LK.tab_structure = function(data){
	var $obj, $ul
	if (($obj = $('#' + data.id)).length == 0){
		$obj = $('<div id="' + data.id + '" ></div>')
	}
	$obj.appendTo($(data.appendTo));
	$obj.append(
		$ul = $('<ul/>')
		);
	$.each(data.tabs, function(ind, tab){
		$ul.append($('<li>').append('<a href="#' + tab.id + '">' + tab.label + '</a>'))
		$obj.append($('<div id="' + tab.id + '" class="ui-tabs-hide"></div>'))
	})
	return $obj
}

//+++++++++++++++++ creation si n'existe pas de toutes sortes de choses'
/*
LK.afficher_contenu = function(id){
	var obj, data,dest
	// si la fenetre d'affichage n'existe pas, la créer
	if ($('#aff-contenu-flottante').length == 0){
		$('<div id="aff-contenu-flottante"></div>')
			.appendTo('body')
			.append('<div class="handle"></div>')
			.append($('<div class="next_tag_up"></div><div class="next_tag_down"></div>'))
			.append('<div class="contenu"></div>')
			.resizable({
				alsoResize:'#aff-contenu-flottante .contenu'
			})
			.draggable({
				handle:'.handle'
			})
			.closeOn('change_mode')
			.css({
				left:$(window).width()-$('#aff-contenu-flottante').outerWidth(),
				zIndex:5
			})
	}
	if (typeof(id) == 'object'){
		obj = id.closest('.elem_structure')
		data = obj.LKdata('dbdata')
		if (data.contexte_widget){
			dest = $('.contenu', '#aff-contenu-flottante')
				.html('')
			$.each()
		}
	}

	// accepte une ligne de la liste (ou enfant de), un no ou un .elem_structure (ou enfant de)
	// aller chercher le contenu (s'il n'existe pas, le télécharger)
	// paramètre renvoyé = ligne.LKdata() car contient plus que seulement le contenu
	LK.get_contenu(id, function(ligne_data){

		var cont = ligne_data && ligne_data.contenu
		if(!cont || (!cont.contenu_langue && !cont.contenu_autre_langue)){
			$('.contenu', '#aff-contenu-flottante').html(LK.ed.msg.pas_de_contenu)
		} else
			$('.contenu', '#aff-contenu-flottante').html(cont.contenu_langue + '<HR/>' + cont.contenu_autre_langue)
	})
	return $('#aff-contenu-flottante')
	
	
}

LK.get_contenu = function(id, callback){
	var $ligne, $obj, cont
	// 1) trouver la ligne de la liste
	if (!isNaN(parseInt(id))){  // on a envoyé un no
		$ligne = $('#contenu_' + id);
	} else if (($obj = $(id).closest('.elem_structure')).length){
		$ligne = $('#contenu_' + $obj.LKdata('dbdata').id_contenu)
	} else
		$ligne = $(id).closest('.contenu');

	if (!$ligne.length) return null;
	var ligneId = $ligne.attr('id');

	if (!LK.mem_contenus[ligneId])
		LK.mem_contenus[ligneId] = {id_contenu:LK.num_part(ligneId)}

	if (cont=LK.mem_contenus[ligneId].contenu){
		if (callback){
			callback(LK.mem_contenus[ligneId])
		}
		return cont
	} 


	LK.xhr({data:{
		context:'contenu',
		op:'get',
		id_contenu:LK.mem_contenus[ligneId].id_contenu
		}})
		.done(function(data){

			$ligne.addClass('downloaded');
			LK.mem_contenus[ligneId].contenu = {
					contenu_langue: data['contenu_' + LK.msg__.lang],
					contenu_autre_langue:data['contenu_' + LK.msg__.autre_lang]
				}
			if (callback)
				callback(LK.mem_contenus[ligneId]);
			
		})
		.fail(function(data){
			LK.alert_msg(data)
			if (callback)
				callback(null)
		})



}
*/
LK.decorate = function($obj, class_name){
	$obj.prepend( $('<span class="button_decoration ' + class_name + '"></span>'))
}

LK.db = function(message){
	if ($('#debug_out').length == 0){
		$('<div id="debug_out"></div>')
			.dialog({
				title:'debug info',
				width:800,
				height:500,
				autoOpen:true,
				buttons:{
					'Vider': function(){
						$(this).html('')
					},
					'Fermer': function(){
						$(this).dialog('close')
					}
				}
			})
		$('#page_top').click(function(){
			$('#debug_out').dialog('open')
		})
	} else {
		$('#debug_out').dialog('open')
	}
	$('<div></div>')
		.append(message)
		.appendTo('#debug_out')
}
LK.spanIcon = function(icon){
	return '<span class="ui-icon ui-icon-' + icon + '" style="float: left; margin-right: 0.3em;"></span>'
}
LK.spanIcon2 = function(icon){
	return '<span class="ui-icon ui-icon-' + icon + '" style="display:inline; padding-right: 15px;"></span>'
}
LK.show_msg = {}
LK.show_msg.show = function(msg){
	if ($('#msg_div').length == 0){
		$('<div id="msg_div" class="msg_div ui-corner-all click-hide"></div>')
			.appendTo('body')
			.css({
				position:'absolute',
				backgroundColor:'white',
				padding:20,
				border:'ridge 2px #aaaaaa',
				zIndex:999999,
				minWidth:200
			})
			.attach('store', {center:true})
			.addShadow('ombre')
	}
	$('#msg_div')
		.text(msg || 'oups... oublié de mettre fichier de messages à jour')
		.show();
		

}
LK.show_msg.hide = function(){
	$('#msg_div').fadeOut();
}

LK.ajouter_contenu = function(params){ //{def:.., force_widget:(texte ou nom de widget)
	params = params || {}
	params.def = $.Deferred()
	
	$.getScript('./include/ajouter_contenu_script.js', function(){
		setTimeout(function(){
				
				LK.ajouter_contenu(params)
			
		}, LK.exec_delay)
	})
	return params.def.promise()
}
LK.ajouter_widget = function(callback){
	$.getScript('./include/ajouter_widget_script.js', function(){
		setTimeout(function(){
			LK.ajouter_widget(callback)
		}, LK.exec_delay)	
	})

}
LK.categ_fncts = function(params){
	params.def = $.Deferred()
	$.getScript('./include/categories_script.js', function(){
		setTimeout(function(){
			LK.categ_fncts(params)
				
		}, LK.exec_delay)	
	})
	return params.def.promise()
}


LK.traite_liste_icones = {google_calendar:'calendar', contacts_equipe:'contact', tableau:'script', horaires:'clock', liste_joueurs:'person',sondage:'comment'}
LK.traite_liste = function(cont){
	var a
	if (!cont ||  cont.length==0)
		return ''
	var to_ret = $('<div></div>')
		.attr({
			id:cont.id,
			'class':cont.cl
		})
		.LKdata('no', LK.num_part(cont.id))

	if (cont.list){
		to_ret.append(
		$('<div></div>')
			.html(cont.data.desc== ' '?'?':cont.data.desc)
			.addClass('title')
			.prepend('<span class="ui-icon ui-icon-folder-open" style="float:left;margin-right:.3em"></span>')
			//.append('<div class="bas"></div>')

		)
		$.each(cont.list, function(ind, val){
			to_ret.append(LK.traite_liste(val))
		})

	}else {
		to_ret
			.html((cont.data.widget?'*':'') + cont.data.desc)
			.prepend($('<span>',{
					'class':'ui-icon ui-icon-' + (LK.traite_liste_icones[cont.data.widget] || 'document') ,
					css:{
						"float":'left',
						marginRight:'.3em'
					}
				})
				)
		if (cont.data.used == '0'){

			to_ret.addClass(cont.data.br_ou_archive=='0'?'br_ou_archive':'unused')
		}
	}
			//.append('<div class="bas"></div>')
	return to_ret
}

LK.properties_table = function(objectname, object, except) {
	var str = ("<table border=1 bgcolor=wheat><tr>");
	var prop, a;
	str += ("<td style='font-size: 18pt; font-weight: bold' colspan=2 align=center>");
	str += ("Properties of the <strong>"+objectname+"</strong> object</td></tr>");
	if (except)
		str += '<tr colspan=2 align=center><td>Excepté ' + except + '</td></tr>';
	try {
		for (prop in object) {
			if (except)
				a=except.match('(^|,)' + prop + '($|,)');
			else
				a = false;

			str += "<tr><th>"+prop+"</th><td>"+
			(a?'sauté':object[prop])+"</td></tr>" ;

			}

	}
	catch(err){
		str += "<tr><th>"+prop+"</th><td>***ERREUR***</td></tr>"
	}

	str += ("</table><p>");
	return(str)
	}

LK.infoWindow = function(msg, params){
	var a;
	var default_css = {
		margin:'5 auto',
		padding:5,
		'float':'right',
		height:'auto',
		width:'auto',
		cursor:'pointer'
	}
	params = params || {};
	$.extend(default_css, params.css)
	//alert(default_css.textAlign)
	
	return $('<div class="info-window ui-state ui-state-highlight info ui-corner-all" ></div>')
		.disableSelection()
		.css(default_css)
		.append($(LK.spanIcon('info'))
			.simpleTooltip({title:LK.msg__.tt_min_max_msg})
			.css('cursor','pointer')

		)
		.LKdata({adjust_width: function(get){
					var $infowin = $(this.this_)
					var new_width = $infowin.parent().width()-$infowin.outerWidth()+$infowin.width();
					if (get) return new_width;
					if ($infowin.LKdata('visible'))
						$infowin.width(new_width)
				},
				visible:true,
				set_msg:function(msg){a.html(msg)},
				callback: params.callback||function(){},
				close:function($obj){$obj.LKdata('forceClose', true);$($obj).trigger('click')}

			}
		)
		.append(a=$('<span class="info_win_msg">'+msg+'</span>'))

		.click(function(ev){
					var $infowin = $(ev.target).closest('.info-window')
					var icon = $infowin.find('span.ui-icon:first').hide()
					var this_ = $(this)

					var data = this_.LKdata();
					if (data.visible == undefined) data.visible = true;
					data.visible = !data.visible;
					if (this_.LKdata().forceClose){
						this_.LKdata().forceClose = false;
						data.visible = false;
					}
					if (data.visible){
						var final_width = this_.LKdata().adjust_width(true)
						this_.fadeOut(function(){
							this_
								.width(final_width)
								.height('auto')
								.children(':eq(1)').show().end()
							.show('slow', function(){
								icon.fadeIn(function(){this_.LKdata().callback()});
							})
							.css({
								padding:'5 auto',
								margin:5
							})
						})

					}else {
						this_.hide('slow', function(){
							this_.children()
								.eq(1).hide().end()
								.eq(0).fadeIn(function(){this_.LKdata().callback()})
							this_.width(12).height(12).fadeIn()
								.css({
									margin:0,
									padding:1
								})
						})

					}
					
				}

	)

	

}
LK.wrap_tag = function(tag, obj){
	var to_ret = ''
	if (tag == '' || !tag){
		return obj
	}
	if (typeof(obj) == 'string')
		return '<' + tag + '>' + obj + '</' + tag + '>'
	if (typeof(obj) == 'object'){
		$.each(obj, function(ind, val){
			to_ret += '<' + tag + '>' + val + '</' + tag + '>'
		})
		return to_ret
	}
	return obj

}
LK.build_ul = function(arr){
	return LK.wrap_tag('ul', LK.wrap_tag('li', arr))
}

LK.extend_select = function(ev, params){ // params = {obj: obj cliqué, anchor_class: classname (defaut= anchor), select_class: classname}
	var $tag = params.obj, $anchor, $set;
	var anchor_class = anchor_class || 'anchor'
	if (ev.ctrlKey){
		$tag.toggleClass(params.select_class)
		$tag
			.addClass(anchor_class)
			.siblings().removeClass(anchor_class)
		return true
	}

	if(ev.shiftKey){
		if ($tag.parent().children('.' + anchor_class).length == 0)
			$tag.parent().children(':first').addClass(anchor_class)

		if (($anchor = $tag.prevAll('.' + anchor_class)).length){
			$set = $tag.prevAll().andSelf().not($anchor.prevAll()).addClass(params.select_class)
			$tag.siblings().not($set).removeClass(params.select_class)
		} else {
			$anchor = $tag.parent().children('.' + anchor_class + ':first')
			$set = $tag.nextAll().andSelf().not($anchor.nextAll()).addClass(params.select_class)
			$tag.siblings().not($set).removeClass(params.select_class)
		}
		return true
	}
	$tag
		.addClass(params.select_class + ' ' + anchor_class)
		.siblings().removeClass(params.select_class + ' ' + anchor_class)
	return false
}
LK.trim = function(string)
{
return string.replace(/(^\s*)|(\s*$)/g,'');
};

LK.num_part = function(str){
	var no = str.match(/[0-9]+/) + ''
	if (isNaN(no))
		return '';
	return no
}

LK.widget = LK.widget || {}
LK.delay = 500
;(
	LK.get_widget_list = function(){

			setTimeout(function(){
			LK.xhr({data:{
					context:'widgets',
					op:'get_list'
			}})
			.always(function(data){
				LK.alert_msg(data);
			})
			.done(function(data){
				LK.delay=0;
				LK.widget_list = data.liste
			})
			
			}, LK.delay);
	}
	

)()

LK.process_widget = function (tag, data){
	if (typeof(LK.widget_list) != 'object' || LK.widget_list[tag] == undefined){
		alert(LK.msg__.manque_ressource)
		return;
	}
	LK.no_load_msg = LK.widget_list[tag].lang
	
	
	if (!LK.widget[tag]){
		if (LK.detection_boucle_infinie('chargement liste widgets (' + tag + ')',2)){
			return;
		}
		LK.no_load = setTimeout(function(){alert('Défaut de chargement script ' + LK.no_load_msg)}, 8000)
		$.getScript(LK.no_load_msg, function(){ // chargement du script de langue du widget
			
			LK.no_load_msg = LK.widget_list[tag].script
			$.getScript(LK.no_load_msg, function(){ // chargement du script du widget
				setTimeout(function(){
					LK.process_widget(tag, data)
				}, LK.exec_delay)
			})
		})
		return;
	}
	if (LK.no_load) {
		clearTimeout(LK.no_load)
		LK.no_load = null;
	}
	LK.widget[tag](data)

}

LK.getIframeDoc = function(id) {
    var oIframe = document.getElementById(id);
    var oDoc = oIframe.contentWindow || oIframe.contentDocument;
    if (oDoc.document) {
        oDoc = oDoc.document;
    }
    return oDoc;
}
LK.is_array = function(input){
    return typeof(input)=='object'&&(input instanceof Array);
  }

LK.err_ = function(val){
	this.v = val;
}
LK.err_.prototype.val = function(val){
	if (val == undefined)
		return this.v
	else
		this.v = val;
}
LK.err_.prototype.isErr = function(){
	return this.v==undefined?false:true
}
LK.err_.prototype.setIfNull = function(val){
	if (this.v == undefined){
		this.v = val;
	}
}

LK.num_field = function($list, options){ // opts = {min, max, def}
	var to_ret = true;
	$list.each(function(){
		var val
		val = $(this).val();
		if (val.length == 0){
			if (options.def != undefined){
					$(this).val(val=options.def)
			}
		}
		val = parseInt(val);
		if (isNaN(val) || (options.min != undefined && val < options.min) || (options.max != undefined && val > options.max)){
			$(this).addClass('err_input');
			to_ret = false;
		} else
			$(this).val(val)
	})
	return to_ret;
}

LK.validate_field = function($list, fnct){ // options = une fonction ou {fnct: <validation fnct>; default}
	var to_ret = true;
	$list.each(function(){
		if (!fnct($(this))){
			$(this).addClass('err_input');
			to_ret = false;
		}
	})
	return to_ret;
}
LK.set_content = function (tag, content){ // tag = #docX ou .contY
	
	
	if (content){
		var dest = $(tag)
		dest.each(function(){
			var dest = $(this)
			if ($('.editable_marker:first').length){
				dest = dest.find('.editable_marker')
			}
			dest.html(content)
			// verifier si le contenu est suivi d'autres contenus au meme niveau. Si oui, alors tenir compte du style "float"
			var autres_suivent = (dest.closest('.editable').nextAll().find('.editable').length)
			if (dest.children(':first').css('float').match(/right|left/) && autres_suivent){
				//alert('pas dernier')
				dest.closest('.editable').next('.flow_ctrl').css('clear', 'none')
			} else {
				dest.closest('.editable').next('.flow_ctrl').css('clear', 'both')
				//alert(dernier)
			}
		})
	}
	//alert(cont)
}

LK.download_content = function(tag, obj){
	
	var cont = $(tag).attr('class').match(/\bcont([0-9]+)\b/)
	//alert('download' + cont)
	
	if (!cont || !cont.length){
		cont = 0
	} else{
		cont = cont[1]
	}
	

	LK.xhr({data:{
			context:'widgets',
			op:'late_render',
			id_contenu:cont,
			contexte:LK.get_context(tag),
			id_struct: obj.closest('.struct_elem').attr('data-str_id'),
			doc_selector:'#' + obj.closest('.editable').attr('id')

		
	}})
	.done(function(data){
		var html = data.rendered_content;
		if (data.tag)
			LK.set_content(data.tag, html);
		LK.alert_msg(data)
	})
	.fail(function(data){
		var html
		if (data.msg){
			html = '<div>' + LK.msg__[data.msg] || data.msg + '</div>'

		} else
			html = '?'
		
		if (data.tag)
			LK.set_content(data.tag, html);
		LK.alert_msg(data)
	})

	
}

LK.init_script_load_tests = function(){
	
	/*structure = 
	 *	<valeur testée>:
	 *		<lang (optionnel)>: 'nom d'un fichier de messages à inclure (nom complet avec path pointant vers une langue particulière);
	 *		<lang_file (optionnel)>: nom d'un fichier sans path. Il faut trouver un fichier de ce nom dans une langue
	 *		
	*/
	LK.script_load_tests = {
		edit_lists:{lang:	LK.edit_lists_msgs,
						script: './include/edit_lists.js'
					},
		edit_sondages:{lang:	LK.widget_list.sondage.lang_UI,
						script:	'./widgets/sondage/edit_sondages.js',
						loaded: false
					},
		rapport_assiduite:{lang:LK.rapport_assiduite_msgs,
								script: './include/rapport_assiduite.js',
								loaded:false
						},
		liste_classes:{lang_file:'liste_classes.js',
						script:'./include/liste_classes.js'
					},
		joueurs_divisions:{lang_file:'joueurs_divisions.js',
							script: './include/joueurs_divisions.js',
							loaded:false
						},
		ajustements_manuels:{lang_file:'ajust_manuels_division.js',
								script:'./include/ajust_manuels_division.js',
								loaded:false
						},
		groupes_classes:{lang_file:'groupes_classes.js',
							script:'./include/groupes_classes.js'
						},
		joueurs_niveaux:{lang_file:'joueurs_niveaux.js',
							script:'./include/joueurs_niveaux.js'
						},
		joueurs_classes:{lang_file:'joueurs_classes.js',
							script:'./include/joueurs_classes.js'
						},
		joueurs_equipes:{lang_file:'joueurs_equipes.js',
							script:'./include/joueurs_equipes.js'
						},
		joueurs_equipes_repartition:
						{lang_file:'joueurs_equipes_repartition.js',
							script:'./include/joueurs_equipes_repartition.js'
						},
		joueurs_equipes_repartition_HCR:
						{lang_file:'joueurs_equipes_repartition_HCR.js',
							script:'./include/joueurs_equipes_repartition_HCR.js'
						},
		liste_documents:{lang_file:'liste_documents.js',
							script:'./include/liste_documents.js'
						},
		liste_menus:{lang_file:'liste_menus.js',
							script:'./include/liste_menus.js'
						},
		defilement_contenu:{lang_file: 'defilement_contenu.js',
							script:'./include/defilement_contenu.js'
						},
		formater_contenu:{lang_file: 'formater_contenu.js',
							script:'./include/formater_contenu.js'
		},
		upload_photos:{lang_file:'gestion_photos.js',
							script:['./include/gestion_photos.js', './include/jquery.Jcrop.min.js'],
							css:'jquery.Jcrop'
						},
		importer_preinscr:{lang_file:'importer_preinscr.js',
							script: './include/importer_preinscr.js',
							css:'importer_preinscriptions'
						},
		assigner_nos_pratique:{lang_file:'assigner_nos_pratique.js',
							script: './include/assigner_nos_pratique.js'
						},
		assigner_positions:{lang_file:'assigner_positions.js',
							script: './include/assigner_positions.js'
						},
		edite_equipes:{lang_file:'edit_equipes.js',
							script:'./include/edite_equipes.js'
						},
		tableau_structure:{lang_file: 'tableau_structure.js',
							script:'./include/tableau_structure.js',
							preload:['edite_saisons','periodes_inscription', 'questions_inscription']
						},
		editer_droits_contenus:{lang_file:'edite_permissions.js',
							script:'./include/edite_permissions.js'},
		chg_mdp:{lang_file: 'chg_mdp.js',
							script:'./include/chg_mdp.js'},
		liste_acces_editeur:{lang_file: 'liste_acces_editeur.js',
							script:'./include/liste_acces_editeur.js'},
		courriels:{lang_file:'courriels.js',
							script:'./include/courriels.js'},
		change_contact_info:{
			lang_file: 'change_contact_info.js',
			script: './include/change_contact_info.js'
		},
		gcal_matchs:{
			lang_file: 'calendriers_matchs.js',
			script: './include/calendriers_matchs.js'
		},
		themes:{
			lang_file: 'themes.js',
			script: './include/themes.js'
		},
		themes_edit:{
			lang_file: 'themes_edit.js',
			script:'./include/themes_edit.js'
		},
		liste_membres:{
			lang_file:'liste_membres.js',
			script:'./include/liste_membres.js',
			preload:['fenetre_details', 'update_ctrl']
		},
		fenetre_details:{
			lang_file:'fenetre_details.js',
			script:'./include/fenetre_details.js'
		},
		famille:{
			lang_file:'famille.js',
			script:'./include/famille.js'
		},
		adresse_membre:{
			lang_file: 'adresse_membre.js',
			script:'./include/adresse_membre.js'
		},
		update_ctrl:{
			script:'./include/update_ctrl.js'
		},
		info_base_membre:{
			lang_file:'info_base_membre.js',
			script:'./include/info_base_membre.js'
		},
		contact_info:{
			lang_file:'contact_info.js',
			script:'./include/contact_info.js'
		},
		code_usager:{
			lang_file:'changer_code_usager.js',
			script:'./include/changer_code_usager.js'
		},
		trf_adresse:{
			lang_file:'trf_adresse.js',
			script:'./include/trf_adresse.js'
		},
		inscriptions_fn:{
			lang_file:'inscriptions_fn.js',
			script:'./include/inscriptions_fn.js',
			preload:['entree_de_mesures', 'imageareaselect']
		},
		inscription_retour:{
			lang_file:'inscription_retour.js',
			script:'./include/inscription_retour.js',
			preload:'inscriptions_fn'
		},
		inscription_nouveau:{
			lang_file:'inscription_nouveau.js',
			script:'./include/inscription_nouveau.js',
			preload:'inscriptions_fn'
		},
		inscription_majeur:{
			lang_file:'inscription_majeur.js',
			script:'./include/inscription_majeur.js',
			preload:'inscriptions_fn'
		},
		edite_saisons:{
			lang_file:'edit_saisons.js',
			script:'./include/edit_saisons.js'
		},
		noms_equipes:{
			lang_file: 'noms_equipes.js',
			script:'./include/noms_equipes.js'
		},
		periodes_inscription:{
			lang_file: 'periodes_inscription.js',
			script:'./include/periodes_inscription.js'
		},
		entree_de_mesures:{
			lang_file:'entree_de_mesures.js',
			script:'./include/entree_de_mesures.js'
		},
		fileuploader:{
			script:'./include/fileuploader.js',
			css:'fileuploader'
		},
		ajaxfileupload :{
			script:'./include/ajaxfileupload.js'
		},
		imageareaselect:{
			script:'./include/jquery.imgareaselect.min.js,./include/jquery.imgareaselect.pack.js',
			css:'imgareaselect-default'
		},
		inscription_benevole:{
			lang_file:'inscription_benevole.js',
			script:'./include/inscription_benevole.js'
		},
		tableau_bord_inscriptions:{
			lang_file: 'tableau_bord_inscriptions.js',
			script:'./include/tableau_bord_inscriptions.js'
		},
		validation_courriel:{
			lang_file:'validation_courriel.js',
			script:'./include/validation_courriel.js'
		},
		ckedit:{
			script:'./include/ckedit.js'
		},
		popup_runtime:{
			script:'./include/popup_runtime.js',
			preload:'entities'
		},
		entities:{
			script:'./include/entities.js'
		}
	}
}

LK.load = function(list, def){
	if (!LK.script_load_tests){
		LK.init_script_load_tests()
	}
	//alert('load ' + list)

	def = def || $.Deferred()
	if ($.isArray(list)){
		var defs = []
		$.each(list, function(ind,val){
			defs.push(LK.load(val))
		})
		$.when.apply(this,defs)
		.done(function(){
			def.resolve()
		})
		return def.promise()
	}
	var a = LK.script_load_tests[list]
	if (a == undefined){
		LK.script_load_tests[list] = {
			lang_file:list + '.js',
			script:'./include/' + list + '.js'
		}
		a = LK.script_load_tests[list]
	}
	if (a.loaded){
		def.resolve()
		return def.promise()
	}
	
	if (a.preload && !a.preloaded){
		if (!$.isArray(a.preload)){
			a.preload = a.preload.split(',')
		}
		var def_preload = []
		$.each(a.preload, function(ind, preload){
			//alert('preload ' + preload)
			def_preload.push(LK.load(preload))
		})
		//alert('nombre de conditions de preload = ' + def_preload.length)
		$.when.apply(this,def_preload)
			.done(function(){
				a.preloaded = true
			//	alert('fini preloader ')
				LK.load(list, def)
			
			})
		return def.promise()
	}
	

	$.when(LK.load_css_group(a))
	.done(function(){
		$.when(LK.load_language(a))
		.done(function(){

			$.when(LK.load_scripts(a))
			.done(function(){

				a.loaded = true
				def.resolve()
			})
		})
	})
	return def.promise()
}

LK.edit_widget = function(params){
	var def = $.Deferred()
	//if (!LK.widget_list || )
	if (!params || !typeof(params.widget) == 'string' || params.widget == '' || !LK.widget_list || !LK.widget_list[params.widget]){
		alert(LK.msg__.type_contenu_inconnu)
		return
	}
	if (!LK['contexte_edit_' + params.widget]){
		LK.load_language({lang_file:YLS('context_edit_{widget}.js', params)}, LK.msg__.non_parametrable)
		.done(function(){
			LK.load_scripts({script:YLS('./widgets/{widget}/context_edit.js',params)})
			.done(function(){
				params.def = def
				LK[params.widget + '_context_edit'](params)
			})
		})
	} else {
		params.def = def
		LK[params.widget + '_context_edit'](params)
	}
	
	return def.promise()
}
LK.load_css_group = function(group){
	if (group.css_loaded || !group.css){
		return true
	}
	var def = $.Deferred()
	if (!$.isArray(group.css)){
		group.css = [group.css]
	}
	var defs = []
	$.each(group.css, function(ind,css){
		defs.push(LK.load_css(css))
	})
	$.when.apply(this,defs)
	.done(function(){
		def.resolve()
	})
	
	return def.promise()
}
LK.load_language = function(group, err_msg){
	var def_lang, def_lang_file, def = $.Deferred()
	$.when((function(){
		
		var def_lang = $.Deferred()
		var defs
		if (!group.lang || group.lang_loaded){
			return true
		}
		if (!$.isArray(group.lang)){
			group.lang = group.lang.split(',')
		}
		defs = []
		
		$.each(group.lang, function(ind, lang){
			var def_lang = $.Deferred()
			defs.push(def_lang.promise() )
			$.getScript(lang, function(){
				def_lang.resolve()
			})
		})
		$.when.apply(this,defs)
		.done(function(){
			group.lang_loaded = true
			//setTimeout(function(){
				def_lang.resolve()
		//	}, LK.exec_delay)
		})
		return def_lang.promise()
	})(),
	(function(){
		var def_lang_file = $.Deferred()
		if (group.lang_file_loaded || !group.lang_file){
			return true
		}
		if (!$.isArray(group.lang_file)){
			group.lang_file = group.lang_file.split(',')
		}
		var defs = []
		$.each(group.lang_file, function(ind, lang_file){
			var def_lang_file = $.Deferred()
			defs.push(def_lang_file.promise())
			LK.xhr({data:{
				context:'include_lang',
				op:'get_name',
				script:lang_file
			}})
			.done(function(data){
				if (!data.script){
					alert(err_msg || 'Fichier manquant: ' + lang_file)
					return;
				}
				$.getScript(data.script, function(){
					def_lang_file.resolve()
				})
			})
		})
		$.when.apply(this,defs)
		.done(function(){
			group.lang_file_loaded = true
		//	setTimeout(function(){
				def_lang_file.resolve()
			//}, LK.exec_delay)
			
		})
		return def_lang_file.promise()
	})()

	)
	.done(function(){
		def.resolve()
	})
	
	
	return def.promise()
}

LK.load_scripts = function(group){
	var def = $.Deferred()
	if (!group.script){
		def.resolve()
		return def.promise()
	}
	if (!$.isArray(group.script)){
		group.script = group.script.split(',')
	}
	if (group.script.length == 0){
		def.resolve()
		return def.promise()
	}
	
	var ajax_fnct = function(url, def){
		var this_def
		if (!def){
			this_def = new $.Deferred()
		}
		$.ajax({
			url:url,
			dataType:'script',
			success:function(){
				if (this_def){
					this_def.resolve()
				} else	if (def){
					def.resolve()
				}
			},
			error:function(obj, text){
				alert('Erreur chargement ' + url + ' (' + text + ')')
			}

		})
		if (this_def){
			return this_def.promise()
		}
	}
	
	if (group.sequential){
		var script = group.script.shift()
		ajax_fnct(script)
		.done(function(){
			if (group.delay){
				setTimeout(function(){
					LK.load_scripts(group)
					.done(function(){
						def.resolve()
					})
				
				}, group.delay)
			} else {
				LK.load_scripts(group)
				.done(function(){
					def.resolve()
				})
				
			}
		})
		return def.promise()
	}
	
	var defs = []
	var delay = 0
	$.each(group.script, function(ind,script){
		var def = $.Deferred()
		defs.push(def.promise())
		if (group.delay){
			setTimeout(function(){
				ajax_fnct(script,def)
				
			}, delay)
			delay += group.delay
		} else {
			ajax_fnct(script, def)
		}
		/*
		$.getScript(script, function(){
			def.resolve()
		})*/
	})
	$.when.apply(this, defs)
	.done(function(){
		//setTimeout(function(){
			def.resolve()
	//	}, LK.exec_delay)
	})
	return def.promise()
}
LK.execute = function(params){
	var a;
	if (!params.fn){
		params.fn = function(){}
	}
	if (!LK.widget_list){ // si liste de widgets pas encore chargée, alors attendre un peu et retenter execution de la fonction
		if (LK.detection_boucle_infinie('load_widget_list', 2)){
			return
		} else{
			setTimeout(function(){LK.execute(params)}, 500)
			return;
		}
	}
	if (!LK.script_load_tests){
		LK.init_script_load_tests()
	}
	
	//LK.db(LK.properties_table('dfsdf', LK.script_load_tests))
	if (!(a = LK.script_load_tests[params.test]).loaded){
		if (a.css && !a.css_loaded){
			if (!$.isArray(a.css)){
				a.css = [a.css]
			}
			var list_css = []
			$.each(a.css, function(ind,val){
				list_css.push(LK.load_css(val))
			})
			$.when.apply(this, list_css)
				.done(function(){
					a.css_loaded = true
					LK.execute(params)
				})
				.fail(function(){
					alert('défaut chargement css')
				})
			return
		}
		var preloads = [], preload
		if ((preload = a.preload) && !a.preloaded){
			if (!$.isArray(preload)){
				preloads.push(preload)
			} else {
				preloads = preload
			}
			var nb_preloaded = 0
			$.each(preloads, function(ind, preload){
				LK.execute({
					test:preload, 
					fn:function(){
						if (++nb_preloaded >= preloads.length){
							a.preloaded = true;LK.execute(params)
						}
					}
				})
			})
			
			return false
		}
		if (a.lang_file){
			LK.xhr({data:{
				context:'include_lang',
				op:'get_name',
				script:a.lang_file
			}})
			.done(function(data){
				if (data.script || a.script){
					LK.getScripts({scripts: [data.script, a.script], css:a.css, callback:function(){
							a.loaded = true
							params.fn()
						}})

					LK.alert_msg(data)
				}
			})
			.fail(function(data){
				LK.alert_msg(data)
			})
		} else if (a.lang) {
			$.getScript(a.lang, function(){
				if (a.script){
					setTimeout(function(){
						$.getScript(a.script, function(){
							setTimeout(function(){
								a.loaded = true;
								params.fn()
							}, LK.exec_delay)
						})
					}, LK.exec_delay)
				}
			})
		} else if (a.script){
			setTimeout(function(){
				$.getScript(a.script, function(){
					setTimeout(function(){
						a.loaded = true;
						params.fn()
					}, LK.exec_delay)
				})
			}, LK.exec_delay)
			
		}
	} else{
		params.fn();
	}

	return false
}
LK.load_editeur = function(params){
	var def = $.Deferred()
	if (typeof(CKEDITOR) == 'object'){
		def.resolve()
		return def.promise()
	}
	LK.show_info_center(LK.msg__.chargement_module_un_instant)
	params = params || {}
	if (LK.ckmsg == undefined || LK.ckmsg.lang != LK.lang){
		LK.load_language({lang_file:'ckeditor_msgs.js'})
		.done(function(){
			LK.ckmsg.lang = LK.lang
			LK.load_editeur(params)
			.done(function(){
				def.resolve()
				LK.hide_info()
			})
		})
		return def.promise()
	}
	LK.ckToolbars = {
		Full:[
    {name: 'document',    items : [ 'Source','-','Save','NewPage','DocProps','Preview','Print','-','Templates' ]},
    {name: 'clipboard',   items : [ 'Cut','Copy','Paste','PasteText','PasteFromWord','-','Undo','Redo' ]},
    {name: 'editing',     items : [ 'Find','Replace','-','SelectAll','-','SpellChecker', 'Scayt' ]},
    {name: 'forms',       items : [ 'Form', 'Checkbox', 'Radio', 'TextField', 'Textarea', 'Select', 'Button', 'ImageButton', 'HiddenField' ]},
    '/',
    {name: 'basicstyles', items : [ 'Bold','Italic','Underline','Strike','Subscript','Superscript','-','RemoveFormat' ]},
    {name: 'paragraph',   items : [ 'NumberedList','BulletedList','-','Outdent','Indent','-','Blockquote','CreateDiv','-','JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock','-','BidiLtr','BidiRtl' ]},
    {name: 'links',       items : [ 'Link','Unlink','Anchor' ]},
    {name: 'insert',      items : [ 'Image','Flash','Table','HorizontalRule','Smiley','SpecialChar','PageBreak' ]},
    '/',
    {name: 'styles',      items : [ 'Styles','Format','Font','FontSize' ]},
    {name: 'colors',      items : [ 'TextColor','BGColor' ]},
    {name: 'tools',       items : [ 'Maximize', 'ShowBlocks','-','About' ]},
	{name: 'popup',			items : [ 'MyButton', 'Bouton_photos', 'Bouton_separ_hor']},

]
	}
	var scripts = [
				'./ckeditor/adapters/jquery.js'
	]
	var init_load = ['./ckeditor/ckeditor.js']
	if (LK.htmlentities == undefined){
		init_load.push('./include/entities.js')
	}
	
	if (!params.editeur_seulement && typeof(CKFinder) == 'undefined'){
		scripts.push('./ckfinder/ckfinder.js')
	}
	
	
	$('body').one('ck_editor_loaded',function(){
			
			LK.load_scripts({script:scripts, sequential:1})
			.done(function(){
				if (params.callback){
					params.callback()
				}

				def.resolve()

				if (!params.editeur_seulement){
					CKFinder.setupCKEditor( null, './ckfinder/' );
				}
			})
	})

	LK.load_scripts({script:init_load})
	

	return def.promise()
}

LK.getScripts = function(params){
	var def = $.Deferred()
	var def_script = $.Deferred()
	var def_css = $.Deferred()
	
	if (params.callback == undefined){
		params.callback = function(){}
	}
	if (!$.isArray(params.scripts)){
		params.scripts = [params.scripts]
	} else{
		params.scripts = params.scripts.toString().split(',')
	}
	if (params.css){
		LK.load_css(params.css)
		.done(function(){
			def_css.resolve()
		})
	} else {
		def_css.resolve()
	}
	var nb = params.scripts.length

	$.each(params.scripts, function(ind, script){
		$.ajax({
			async: false,
			type: "GET",
			url: script + '?' + Math.random(),
			data: null,
			success: function(data, status){
				if (--nb <= 0){
					params.callback()
					def_script.resolve()
				}
			},
			dataType: 'script'
			});
	})
	$.when(def_script, def_css)
	.done(def.resolve())
	return def.promise()
}

LK.data_to_page = function(data, mapping){
	$.each(mapping, function(ind, map_def){
		var val
		if (data[map_def.ind] != undefined){
			val = data[map_def.ind]
		} else if (data[map_def.defaut] != undefined){
			val = data[map_def.defaut]
		} else return
		switch(map_def.type){
			case 'text':
				$(map_def.sel).val(val)
				break;
			case 'checkbox':
				if (val == '1'){
					$(map_def.sel).attr('checked','checked')
				} else {
					$(map_def.sel).removeAttr('checked')

				}
				break;
			case 'select':
				if (!val || val == 'null'){
					$(map_def.sel).val([])
					break;
				}
				var vals = val.match(/[^,]+/g)
				$(map_def.sel).val(vals)
		}

	})
}
LK.page_to_data = function(data, mapping){
	$.each(mapping, function(ind, map_def){
		
		switch(map_def.type){
			case 'text':
				data[map_def.ind] = $(map_def.sel).val()
				break;
			case 'checkbox':
				data[map_def.ind] = ($(map_def.sel).is(':checked')?'1':'0')
				break
			case 'select':
				data[map_def.ind] =	$(map_def.sel).val()
		}

	})
}

LK.CSS_loaded = []
LK.load_css = function(id, callback) {
	var def = $.Deferred()
	var cssLink;
	var seed = LK.IE?'':'?5';
	if (LK.CSS_loaded[id] != null) {
		if (callback) callback();
		def.resolve()
		return def;
	}
	LK.CSS_loaded[id] = true;
	//if (seed = LK.seeds.css[id]) seed = '?' + seed;
	cssLink = $("<link/>").appendTo($('head'));

	var filename
	
	if (!/\.css$/.test(id)){
		filename = './css/' + id + '.css' + seed
	} else {
		filename = id + seed
	}
	
	//setTimeout(function(){
	cssLink.attr({rel: "stylesheet",
					  type: "text/css",
					  href: filename,
					  media: 'screen',
					  onload: function(){def.resolve();if (callback) callback()}
					  })
	return def
	//$(document.body).toggleClass('forceReflow')
				//		}, 0);
}

LK.dialog_bind_enter = function($obj, rang){
	$($obj).keypress(function(ev){
		if (ev.which==13){
			$(this).closest('.ui-dialog-content').nextAll('.ui-dialog-buttonpane').find('button').eq(rang).trigger('click')
		}
	})
}
LK.update_statut_visiteur = function(update){
	if (!LK.show_login_visiteurs){
		$('#statut_visiteur').hide()
		return
	}
	if (!LK.statut_visiteur){
		LK.statut_visiteur = {id:null, nom:'', statut:''}
	}
	if (update){
		$.extend(LK.statut_visiteur, update)
	}
	if ($('#statut_visiteur').length == 0){
		$('<div id="statut_visiteur"  class="ui-corner-all"></div>')
			.appendTo('body')
	}

	if (LK.statut_visiteur.id != undefined){
		$('#statut_visiteur')
			.html(LK.statut_visiteur.nom +
				'<span id="deconnexion_visiteur" style="margin-left:5px"><a href="#">' +
				LK.msg__.log_out +
				'</a></span>'
		).show()
	} else {
		$('#statut_visiteur').html('<a id="connexion_visiteur" href="#">' + LK.msg__.login + '</a>').show()
	}

}
LK.insert_tableaux = function(){
	var nb_pub
		//return
	var ie7 = ($.browser.msie && $.browser.version <= 7)
	try{

	//alert(LK.insertion_tableaux.length)
	if (!LK.insertion_tableaux || (nb_pub = LK.insertion_tableaux.length) == 0)
		return
	var a = $('tr.proch', 'table')

	a.each(function(){
		var nb_col = $(this).find('td').length, insert

		var pub_index =  Math.min(Math.floor(Math.random()*nb_pub), nb_pub-1)

		if (!ie7){
			$(this).after($('<tr style="height:95px"></tr>')
				.append($('<td ></td>')
					.attr('colspan', nb_col)
					.css({borderTop:'solid 1px #666',
							borderBottom:'solid 1px #666'
					})

					.append($('<div></div>')
					.css({
						textAlign:'center',
						minHeight:30,
						maxHeight:90,
						overflow:'hidden'
					})
					.html(LK.insertion_tableaux[pub_index])
					))
			)
		} else {

			var table = $(this).closest('table')
			var table2 = table.clone().insertAfter(table)

			$(this).nextAll().remove()
			table2.find('tr.proch').prevAll().andSelf().not(table2.find('tr').slice(0,2)).remove()
			table2.width(table.outerWidth())


			table.after(insert=$('<div></div>')
					.css({
						textAlign:'center',
						minHeight:30,
						height:90,
						display:'block',
						overflow:'hidden'
					})
					.html(LK.insertion_tableaux[pub_index]))
			
			insert.height(90)
			//if (LK.superhero){
				//trouver le tab du plus haut niveau
				var deb = new Date()
				var tab = table.closest('.ui-tabs')
				var tab_parent
				while ((tab_parent = tab.parent().closest('.ui-tabs')).length){
					tab = tab_parent
				}
				var fin = new Date()
				//LK.alert(fin.getTime() - deb.getTime())
				tab.bind('tabsselect', function(){
					setTimeout(function(){
						if (table.is(':visible')){
							
							insert.width(table.width()).height(90)
						} 
					})
				})
			//}
			
			

			table.before($('<div>')
				.append($('<span style="font-size:10;font-style:italic;text-decoration:underline;color:red;cursor:pointer"></span>')
						.text('Ouille! Vous utilisez Internet Explorer version 7 ou antérieure! Cliquez ici si le tableau ci-dessous semble mal formatté!')
						.click(function(){
							$(this).siblings().slideToggle()
						})
					)

				.append('<div style="display:none;font-size:12;margin:5px">Dans certaines conditions, les tableaux des horaires pourraient voir leur format complètement chamboulé par un bogue connu qui a été corrigé dans la version 8. <b>Il faut utiliser des logiciels à jour!</b> <a href="http://www.microsoft.com/windows/internet-explorer/worldwide-sites.aspx">Cliquez ici pour mettre à jour votre fureteur.</a> Mieux encore, <a href="http://www.mozilla.com">passez à Firefox</a>! (que des avantages - plus rapide, plus beau (le site est tellement plus beau avec tous les fureteurs autres que Internet Explorer!) - meilleure sécurité, etc etc! Vos marque-pages seront même tous transférés!)</div>')
				)

		}

	})
	} catch(err){alert(err.message)}


}
LK.insert_contacts = function(){
	var nb_pub, insert
		//return
	var ie7 = ($.browser.msie && $.browser.version <= 7)
	//alert((ie7?'IE7 ':'pas IE7 ') + document.compatMode)
	try{

		//alert(LK.insertion_tableaux.length)
		if (!LK.insertion_contacts || (nb_pub = LK.insertion_contacts.length) == 0)
			return
		var a = $('.contacts_equipe', '#main_content')

		a.each(function(){


			var pub_index =  Math.min(Math.floor(Math.random()*nb_pub), nb_pub-1)

			if (!ie7){
				$(this).prepend($('<div></div>')
						.css({
							'float':'right',
							minHeight:30,
							maxHeight:200,
							maxWidth:350,
							overflow:'hidden'
						})
						.html(LK.insertion_contacts[pub_index])
						)
						.append('<div style="clear:both"></div>')

			}else {
				if (document.compatMode == 'BackCompat'){
					return;
				}
				$(this).prepend($('<div></div>')
						.css({
							'float':'right',
							minHeight:30,
							maxHeight:200,
							maxWidth:350,
							overflow:'hidden'
						})
						.html(LK.insertion_contacts[pub_index])
						)
						.append('<div style="clear:both"></div>')
			}
		})




	} catch(err){alert(err.message)}


}

//************************ LOGIN
;(function(){
	var msg

	/*
	LK.lang = 'en'

	LK.change_lang = function(selector, no_chg){
		if (!no_chg){
			LK.lang = (LK.lang=='en'?'fr':'en')
			LK.ident_msgs = msg[LK.lang]
		}

		$(selector).find('.lang').each(function(){
			var cl = $(this)[0].className.match(/lang ([^ ]+)/)

			if (LK.is_array(cl) && LK.ident_msgs[cl[1]]){
				$(this).html(YLS(LK.ident_msgs[cl[1]], LK.ident_msgs))
			}
		})
		$('.continuer_comme_visiteur, #ident_user').attr('title', LK.ident_msgs.allez_un_effort)
	}

*/
	LK.fini_identifier = function(){
		if ($('#ident_user').LKdata().data && $('#ident_user').LKdata().data.post_processing){
			$('#ident_user').LKdata().data.post_processing()
		}
		$('#ident_user').dialog('close')

	}
	


	LK.alert = function(text, width){
		text = text || '---'
		if($('#alert').length == 0){
			var buttons = {};
			buttons[LK.msg__.fermer] = function() {
				$(this).dialog('close')
			}
			$('<div id="alert"></div>').dialog({
				title:'Message',
				width:300,
				minWidth:200,
				minHeight:100,
				maxHeight:600,
				autoOpen:false,
				buttons:buttons,
				zIndex:99999900
			})
			.dialogShadow('ombre ui-corner-all')
			.disableSelection()
			.closeOn('change_mode')
			.css({
				textAlign:'center'
			})
		}
		if (width){
			$('#alert').dialog('option', 'width', width)
		}

		if ($.type(text) == 'string'){
			$('#alert')
				.html(text)
		} else{
			$('#alert').html('').append(text)
		}
		$('#alert').dialog('open')

	}
	LK.alert_list = function(params){ // envoyer {msg, items (obj ou array)}
			LK.template('templ_alert_liste')
			.done(function(){
				LK.alert($('#templ_alert_liste').tmpl(params))
				//$('<div>',{css:{position:'absolute',width:500,height:500,backgroundColor:'white'}}).show().append(a).appendTo('body')
			})
	}
	LK.show_contact_info = function(id, id_equipe){
		LK.xhr({data:{
			context:'contacts',
			op:'get_info_for_display',
			id:id,
			id_equipe:id_equipe
		}})
		.done(function(data){
			LK.hide_un_instant()
			if($('#contact_info').length == 0){
				var buttons = {};
				buttons[LK.msg__.fermer] = function() {
					$(this).dialog('close')
				}
				if (data.perm_modifier){
					buttons[LK.msg__.editer] = function(){
						var dial = $(this)
						LK.execute({test:'change_contact_info', fn:function(){
								dial.dialog('close')
								LK.change_contact_info.fnct(id)
						}})
					}
				}

				$('<div id="contact_info"></div>').dialog({
					title:LK.msg__.contact_info,
					width:400,
					minWidth:300,
					height:250,
					minHeight:200,
					autoOpen:false,
					buttons:buttons,
					close:function(){
						$(this).dialog('destroy').remove()
					},
					zIndex:100
				})
				.dialogShadow('ombre ui-corner-all')
				.disableSelection()
				.closeOn('change_mode')
			}
			if (data.courriel.length){
				data.courriel = '<a href="mailto:' + data.courriel + '">' + data.courriel + '</a>'
			}
			$('#contact_info')
			.html('<div style="text-align:center;font-size:18px;font-weight:bold;margin:10px 0">' + data.nom + '</div>')
			.append('<div style="margin:10px 0"><span style="font-weight:bold">' + LK.msg__.courriel + '</span>: ' + data.courriel + '</div>')
			.append('<div style="margin:10px 0"><span style="font-weight:bold">' + LK.msg__.tel_jour + '</span>: ' + data.tel_jour + '</div>')
			.append('<div style="margin:10px 0"><span style="font-weight:bold">' + LK.msg__.tel_soir + '</span>: ' + data.tel_soir + '</div>')
			.append('<div style="margin:10px 0"><span style="font-weight:bold">' + LK.msg__.cell + '</span>: ' + data.cell + '</div>')
			if (data.info){
				$('#contact_info').append($('<div>').text(data.info))
			}
			$('#contact_info').dialog('open')

			LK.alert_msg(data)
		})
		.fail(function(data){
			LK.hide_un_instant()
			LK.alert_msg(data)
		})
	}
	var params_choix_equipe
	LK.choix_equipe = function(params){
		
		var a
		params_choix_equipe = params
		if (!LK.liste_saisons){
			LK.xhr({data:{
					context:'choix_equipe',
					op:'get_lists'
			}})
			.done(function(data){
				alert('toto')
				LK.liste_saisons = data.liste_saisons
				LK.liste_niveaux = data.liste_niveaux
				LK.liste_noms = data.liste_noms
				LK.choix_equipe(params)
				LK.alert_msg(data)
			})
			.fail(function(data){
				LK.alert_msg(data)
			})
			$('#choix_equipes').html('')

			return
		}
		
		if($('#choix_equipe').length == 0){
		
			var buttons = {};
			buttons[LK.msg__.fermer] = function() {
				$(this).dialog('close')
			}
			buttons[LK.msg__.ok] = function(){
				var a
				$(this).LKdata('choix', a = {
					saison: $('select.choix_saison > option:selected').val(),
					niveau: $('select.choix_niveau > option:selected').val(),
					equipe: $('select.choix_equipe > option:selected').val()
				
				})
				a.context = 'choix_equipe'
				a.op = 'validate'
				LK.xhr({data:a})
					.done(function(data){
						$('#choix_equipe').dialog('close')
						if (params_choix_equipe.post_process){
							params_choix_equipe.post_process($.extend($('#choix_equipe').LKdata('choix'), {id_equipe: data.id_equipe}))
						}
						LK.alert_msg(data)
					})
					.fail(function(data){
						LK.alert_msg(data)
					})
			}
			$('<div id="choix_equipe"></div>').dialog({
				title:LK.msg__.choisir_equipe,
				width:300,
				height:300,
				autoOpen:false,
				buttons:buttons
			})
			.dialogShadow('ombre ui-corner-all')
			.closeOn('change_mode')
		}

		if ($('#choix_equipe').find('select').length == 0){
			$('#choix_equipe')
				.append(LK.msg__.choisir_saison + ': ')
				.append(a = $('<select class="choix_saison"></select>'))
			a.append($('<option>').text(LK.msg__.saison_courante).val(0))
			
			$.each(LK.liste_saisons, function(ind, val){
				var b
				a.append(b=$('<option>').text((val.statut == '1'?'*':'') + val.nom_saison))
				b.val(val.id)
			})

			$('#choix_equipe')
				.append('<div style="margin-top:5px"></div>')
				.append(LK.msg__.choisir_niveau)
				.append(a = $('<select class="choix_niveau"></select>'))
			$.each(LK.liste_niveaux, function(ind, val){
				a.append($('<option>').text(val))
			})

			$('#choix_equipe')
				.append('<div style="margin-top:5px"></div>')
				.append(LK.msg__.choisir_une_equipe)
				.append(a = $('<select class="choix_equipe"></select>'))
			$.each(LK.liste_noms, function(ind, val){
				a.append($('<option>').text(val))
			})
		}
		try{
			var obj = YAHOO.lang.JSON.parse(params.selection)
			if (obj.saison != undefined){
				$('select.choix_saison:first', '#choix_equipe').val(obj.saison)
			}
			if (obj.equipe != undefined){
				$('select.choix_equipe:first', '#choix_equipe').val(obj.equipe)
			}
			if (obj.niveau != undefined){
				$('select.choix_niveau:first', '#choix_equipe').val(obj.niveau)
			}
		} catch(err){}
		



		$('#choix_equipe')
		.dialog('open')

	}
	LK.imprim = function(params){ // {html:.., titre:..}
		var imprim = window.open('','','width=800,height=600,titlebar=yes,menubar=yes')
		imprim.document.write(params.html)
		if (params.titre){
			imprim.document.title = params.titre
		}
	}
	LK.destroy_dialog = function(dial){
		$(dial).dialog('destroy').remove()
	}
/*
$('ul:first', '#onglets_edition_contenu').live('click', function(){
	$.getJSON('./PHP/verif_session.php', {op:'verif'}, function(data){
		if (data.result == 1){
			alert(data.id)
		}
		LK.alert_msg(data)

	})
})
*/

	LK.show_info = function(params){
		var css = params.css || {}, div
		$('#show_info').remove()
		var body = params.body || $('body')
		div = $('<div>', {id:'show_info'}).addClass('fenetre_info').css(css)
			.appendTo(body)
			.click(function(){
				$(this).fadeOut()
			})
			.disableSelection()
			
			
		
		div
			.html(params.msg)
			.append($('<div>', {css:{marginTop:5, fontSize:10, color:'#666',zIndex:999999999}, 'class':'field_info'}).text(LK.msg__.clic_ferme))
			.position(params.pos)
		LK.expand_contents(div)
		.done(function(){
			div.show()
		})
			
	}
	LK.hide_info = function(){
		$('#show_info').remove()
	}
	LK.expand_contents = function($obj){
		var def = new $.Deferred()
		var tasks = []
		if ($('div.popup_tableau_ages', $obj).length){
			;(function(){
				var a
			
				tasks.push(a = new $.Deferred())
				LK.xhr({data:{
						context:'tableau_structure',
						op:'get_tableau_ages'

					}})
				.done(function(data){
					$('div.popup_tableau_ages', $obj).after(data.tableau).remove()
				})
				.fail(function(data){

				})
				.always(function(data){
					LK.alert_msg(data,msg)
					a.resolve()
				})
			})()
		}
		
		$.when.apply(this, tasks)
		.done(function(){
			def.resolve()
		})
		return def.promise()
	}
	LK.display = function(html){
		if($('#display').length == 0){
			var buttons = {};
			buttons[LK.msg__.fermer] = function() {
				$(this).dialog('close')
			}

			$('<div id="display"></div>').dialog({
				title:'Affichage info',
				width:600,
				minWidth:600,
				height:600,
				minHeight:600,
				autoOpen:false,
				buttons:buttons,
				resizeStart:function(){
					$(this).children().hide();
				},
				resizeStop:function(){
					$(this).children().show().eq(1).fill()
				},
				zIndex:100
			})
			.dialogShadow('ombre ui-corner-all')
			.disableSelection()
			.closeOn('change_mode')
		}

		$('#display').html(html)
		.dialog('open')

	}

	LK.validation_group = function(list){
		var this_ = this
		this.omis = ''
		this.list = $([])
		
		if (list){
			this.add(list)
		}
	}
	LK.validation_group.prototype.add = function(input){
		var this_ = this
		$(input).not(this.omis).each(function(){
			var valid = $(this).LKdata('validation')
			if (!valid){
				valid = new LK.validation($(this))
			}
			if (valid){
				$(this).addTo(this_.list)
			}
		})
		return input
	}
	LK.validation_group.prototype.reset = function(){
		this.list.each(function(){
			$(this).LKdata('validation').reset()
		})
	}
	LK.validation_group.prototype.validate = function(){
		var to_ret = true,this_ = this
		this.list.each(function(){
			if (this_.if_visible && !$(this).is(':visible')){
				return
			}
			to_ret = $(this).LKdata('validation').validate() && to_ret
		})
		return to_ret
	}
	LK.validation_group.prototype.validate_visible = function(visible_seulem){
		var to_ret = true,this_ = this, visible_seulem
		if (visible_seulem == undefined){
			visible_seulem = true
		}
		this.list.each(function(){
			var visible =  $(this).is(':visible')
			if ((visible_seulem && !visible) || (!visible_seulem && visible)){
				return 
			}
			to_ret = $(this).LKdata('validation').validate() && to_ret
		})
		return to_ret
	}
	LK.validation_group.prototype.getVals = function(){
		var vals = {}
		this.list.each(function(){
			var val = $(this).LKdata('validation')
			vals[val.fld_name] = val.$fld.val()
		})
		return vals
	}
	LK.validation_group.prototype.omettre = function(selector){
		if (this.omis.length && selector.length){
			this.omis += ','
		}
		this.omis += selector
	}
	LK.validation = function(fld){
		var type_opts, i, regexp, separ = ',', a
		this.$fld = $(fld)
		this.fld_name = this.$fld.attr('data-fld') || this.$fld.attr('name')
		this.err_class = 'err_input'
		this.default_val = this.$fld.customdata('default')
		type_opts = this.$fld.customdata('valid')
		if (this.$fld.customdata('separ') != undefined){
			separ = this.$fld.customdata('separ')
		}
		this.options = {}
		this.normalize = true
		if (!type_opts){
			this.val_type = 'no_validation'
		} else{

			if (/^num_interval\((\d*\.)?\d+ *, *(\d*\.)?\d+\)/.test(type_opts)){
				this.val_type = 'num_interval'
				var type_opts_components = type_opts.match(/(\d*\.)?\d+/g)
				this.min_val = Number(type_opts_components[0])
				this.max_val = Number(type_opts_components[1])
				type_opts = type_opts.replace(/^num_interval\((\d*\.)?\d+ *, *(\d*\.)?\d+\)/, 'num_interval')
			}
			
			if (type_opts.substr(0, 1) == separ){
				type_opts = type_opts.substr(1)
			}
			
			type_opts = type_opts.split(separ)
			this.val_type = type_opts[0]
			if (this.val_type != 'regexp'){
				for (i=1; i< type_opts.length; i++){
					this.options[type_opts[i]] = true
				}
			} else{
				this.regexp_str = type_opts[1]
				this.RegExp = new RegExp(type_opts[1], type_opts[2])
				for (i=3; i< type_opts.length; i++){
					this.options[type_opts[i]] = true
				}
			}
			
			if (this.options.no_normalize){
				this.normalize = false
			}
		}

		this.$fld.LKdata('validation', this)
	}
	LK.validation.prototype.reset = function(){
		this.$fld.removeAttr(this.err_class)
	}
	LK.validation.prototype.getVal = function(){
		return this.$fld.val()
	}

	LK.validation.prototype.validate = function(){
		var to_ret = false
		this.$fld.trim()
		var val = this.$fld.val(), a
		if (this.err_class) this.$fld.removeClass(this.err_class)

		if (val.length == 0){
			if (this.options.opt){
				return true
			}
			

			if (this.default_val){
				this.$fld.val(val = this.default_val)
			}
		}

		if (this.options.toUpper){
			this.$fld.val(this.$fld.val().toUpperCase())
		}
		if (this.options.toLower){
			this.$fld.val(this.$fld.val().toLowerCase())
		}
		if (this.options.noSpaces){
			this.$fld.val(this.$fld.val().replace(/ /g, ''))
		}
		switch (this.val_type){
			case 'color':
				if (val == '') {
					to_ret = true
					break
				}
				to_ret = /^(#?[0-9a-f]{6}|#?[0-9a-f]{3}|aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow)$/i.test(val)
				if (to_ret && this.normalize){
					if ( /^(#?[0-9a-f]{6}|#?[0-9a-f]{3})$/i.test(val)){
						if (!/#.*/.test(val)){
							val = '#' + val
						}
						this.$fld.val(val.toUpperCase())
					} else{
						this.$fld.val(val.toLowerCase())
					}
				}
				break
			case 'num_interval':
				a = Number(val)
				if (isNaN(a)){
					to_ret = false
				} else {
					to_ret = (a >= this.min_val && a <= this.max_val)

				}
				break
			case 'css_dim':
				this.$fld.val(val = val.toLowerCase())
				to_ret = /^\d{1,3}(px|%)?$/.test(val)
				if (to_ret && this.normalize){
					if (/^\d+$/.test(val)){
						this.$fld.val(val + 'px')
					}
				}
				break
			case 'oblig':
				to_ret = val.length
				break
			case 'date':
				to_ret =  /\d{4}-\d\d-\d\d/.test(val)
				if (to_ret){
					try{
						$.datepicker.parseDate('yy-mm-dd', val)
					} catch(err){
						to_ret = false
					}
				}
				break
			case 'courriel':
				to_ret = LK.email_format.test(val)
				break
			case 'tel':
				a = val.replace(/[^0-9]/g, '')
				if (a.length >= 10){
					to_ret = true
					if (this.normalize){
						a = '(' + a.substr(0,3) + ') ' + a.substr(3, 3) + '-' + a.substr(6, 4) + (a.length>10?' #' + a.substr(10):'')
						this.$fld.val(a)
					}
				}
				break
			case 'code_postal':
				val = val.toUpperCase()
				if (val.length == 6){
					val = val.substr(0,3) + ' ' + val.substr(3)
				}
				if (val.length == 7 && /^[A-Z]\d[A-Z] \d[A-Z]\d$/.test(val)){
					to_ret = true
					if (this.normalize){
						this.$fld.val(val)
					}
				}
				break
			case 'heure':
				to_ret = false
				if (!/^\d{1,2}:\d{1,2}$/.test(val)){
					break
				}
				var h = parseInt(val.match(/^\d+/)[0])
				if (h < 0 && h > 23){
					break
				}
				var m = parseInt(val.match(/\d+$/)[0])
				if (m < 0 || m > 59){
					break
				}
				to_ret = true
				if (this.normalize){
					if (val.length == 5) break
					h = val.match(/^\d+/)[0]
					m = val.match(/\d+$/)[0]
					if (h.length == 1){
						h  = '0' + h
					}
					if (m.length == 1){
						m = '0' + m
					}
					this.$fld.val(h + ':' + m)
				}
				break
			case 'int':
				to_ret = /^-?\d+$/.test(val)
				break
			case 'unsigned':
				to_ret = /^\d+$/.test(val)
				break;
			case 'regexp':
				//alert('rege sur ' + val + ' de longueuer ' + val.length + '  -> ' + this.RegExp.source)
				to_ret = this.RegExp.test(val)
				
				if (to_ret){
					if (this.options.upper){
						this.$fld.val(val.toUpperCase())
					}
				}
				break
			case 'num':
				to_ret = !isNaN(val)
				break
			default:
				to_ret = true
		}
		if (this.options.oblig && this.$fld.val().length == 0){
				to_ret = false
			}
		if (this.err_class && !to_ret){
			this.$fld.addClass(this.err_class)
		}
		//alert('validate ' + this.val_type  + ' = ' +  val + ' result = ' + (to_ret?'ok':'erreur'))
		return to_ret
	}
	LK.majorite = 18
	LK.is_majeur = function(naissance){
		var date_majeur = new Date(naissance.getFullYear() + LK.majorite, naissance.getMonth(),naissance.getDate())
		return date_majeur.getTime() < (new Date()).getTime()
	}
	LK.ajouter_section = function($obj){

		var buttons = {};
		buttons[LK.msg__.fermer] = function() {
			$(this).dialog('close')
		}
		buttons['OK'] = function(){
			var select = $(this).find('input:checked')
			if (select.length != 1){
				alert(LK.msg__.faire_choix)
				return
			}
			var section = $obj.closest('.struct_elem').attr('data-str_id')
			var avant = (select.val() =='avant'?1:0)
			LK.xhr({data:{
				context:'edite_structure_sur_page',
				op:'ajout_section',
				section:section,
				avant:avant
			}})
			.done(function(data){
				var a, insertion_pt
				var elem = $('<div>', {'class':'struct_elem', 'data-str_id':data.id_structure})
					.append($('<div>', {
									id:'doc' + (++LK.last_doc),
									'class':'editable cont' + data.id_contenu,
									'data-cont':data.id_contenu
								})
							.append(a = $obj.closest('.editable_ctrls').clone(true).removeClass('maximized'))
							.append(
								$('<div>', {'class':'editable_marker ui-corner-all'})
										.append($('<div>', {'class':'text_container'}))
				))
					.append($('<div>', {'class':'flow_ctrl', css:{clear:'both'}}))


				insertion_pt = $obj.closest('.struct_elem')

				insertion_pt.absorbe_separateurs()
				if (a = insertion_pt.LKdata('sep_haut')){
					elem.LKdata('sep_haut', insertion_pt.LKdata('sep_haut').clone())
					elem.LKdata('sep_haut').attr('data-attach', data.id_structure)
				}
				if (a =insertion_pt.LKdata('sep_bas')){
					elem.LKdata('sep_bas', insertion_pt.LKdata('sep_bas').clone())
					elem.LKdata('sep_bas').attr('data-attach', data.id_structure)
				}
				insertion_pt.add(elem).ejecte_separateurs()

				alert('ok')
				setTimeout(function(){a.trigger('click')}, 100)
				dial.dialog('close')

					LK.alert_msg(data, msg)
			})
			.fail(function(data){
				alert('problème ajout section ' + section)
				LK.alert_msg(data, msg)
			})
		
		}
		if($('#choix_avant_apres').length == 0){
			$('<div id="choix_avant_apres"></div>').dialog({
				title:LK.msg__.ajouter_section,
				autoOpen:false,
				buttons:buttons,
				modal:true,
				zIndex:100
			})
			.dialogShadow('ombre ui-corner-all')
			.disableSelection()
			.closeOn('change_mode')
			.append($('<label>').text(LK.msg__.ajouter_avant).prepend($('<input>', {type:'radio', name:'choisir_avant_apres', checked:1, value:'avant'})))
			.append($('<label>').text(LK.msg__.ajouter_apres).prepend($('<input>', {type:'radio', name:'choisir_avant_apres', value:'apres'})))
		} else{
			$('#choix_avant_apres').dialog('option', 'buttons', buttons)
		}

		var dial = $('#choix_avant_apres')
		.dialog('open')


	}
	LK.enlever_section = function(obj){
		var buttons = {};
		buttons[LK.msg__.fermer] = function() {
			$(this).dialog('close')
		}
		buttons['EFFACER'] = function(){
			var choix = $(this).find('input:checked'), this_ = this
			if (choix.length == 0){
				alert(LK.msg__.faire_choix)
				return
			}
			var section = obj.closest('.struct_elem').attr('data-str_id')
			if (section == undefined){
				alert('section indéfinie...')
				return
			}
			var id_contenu = obj.closest('.editable').attr('data-cont')
			LK.xhr({data:{
				context:'edite_structure_sur_page', 
				op:'retirer_section',
				mode:choix.val(),
				section:section,
				id_contenu:id_contenu
			}})
			.done(function(data){
				$(this_).dialog('close')
				obj.closest('.struct_elem').hide('blind', function(){
					$(this).absorbe_separateurs().remove()
				})
				LK.alert_msg(data, msg)
			})
			.fail(function(data){
				LK.alert_msg(data, msg)
			})
		}
		if($('#enlever_section').length == 0){
			$('<div id="enlever_section"></div>').dialog({
				title: LK.msg__.enlever_section,
				autoOpen:false,
				buttons:buttons,
				resizeStart:function(){
					$(this).children().hide();
				},
				resizeStop:function(){
					$(this).children().show().eq(1).fill()
				},
				zIndex:100
			})
			.dialogShadow('ombre ui-corner-all')
			.disableSelection()
			.closeOn('change_mode')
			.append($('<label>').text(LK.msg__.enlever_et_effacer).prepend($('<input>', {type:'radio', name:'mode_effacement', checked:1, value:'effacer'})))
			.append($('<br>'))
			.append($('<label>').text(LK.msg__.enlever_conserver).prepend($('<input>', {type:'radio', name:'mode_effacement', checked:1, value:'conserver'})))
		} else{
			$('#enlever_section').dialog('option', 'buttons', buttons)
		}

		$('#enlever_section')
		.dialog('open')

	}
	LK.hide_jjmenu = function(un_instant){
		if (un_instant){
			LK.show_un_instant('#jjmenu_main')
		}
		$("div[id^=jjmenu]").remove()
	}
	
	LK.show_un_instant = function(obj){
		var div
		if ((div = $('#temp_un_instant')).length == 0){
			div = $('<div>', {id:'temp_un_instant'}).appendTo('body')
				.click(function(){
					$(this).fadeOut()
				})
		} else{
			$('#temp_un_instant').show()
		}
		div.text(LK.msg__.un_instant).prepend($('<span>', {'class':'ui-icon ui-icon-clock'}))
		if ($(obj).length){
			div.css($(obj).offset())
		} else{
			div.css({top:$(window).height/2, left:$(window).width/2})
		}

	}
	LK.hide_un_instant = function(){
		var def = $.Deferred()
		$('#temp_un_instant').fadeOut(null, function(){def.resolve()})
		return def.promise()
		
	}
	LK.my_round= function(nb, dec){
		dec = dec || 0
		dec = Math.pow(10, dec)
		return Math.round(nb * dec)/dec
	}
	LK.load_CKFinder = function(params){
		var def = $.Deferred()
		params = params ||{}
		if (typeof(CKFinder) == 'undefined'){
			LK.getScripts({
				scripts:['./ckfinder/ckfinder.js'],
				callback:function(){
					
					setTimeout(function(){
						
					def.resolve()
					LK.finder = new CKFinder();
					LK.finder.basePath = './ckfinder/'
					if (params.callback){
						params.callback()
					}}, 100)
				}
			})

		} else{
			def.resolve()
			if (params.callback){
				params.callback()
			}
		}
		return def.promise()
	}
	LK.debug_ = function(mode){

		var this_ = this
		if (mode == undefined){
			mode = true
		}

		if (!LK.superhero || !mode){
			this.active = false
		} else{
			this.active = false
		}
		this.h = 500
		this.w = 800
		if ($('#debug_win').length == 0){
			this.win = $('<div>', {
				id:'debug_win',
				css:{
					position:'absolute',
					backgroundColor:'white',
					padding:15,
					border:'ridge #666 3px',
					top:10,
					left:100,
					overflow:'hidden',
					zIndex:9999999,
					width:65,
					height:35
				}
			})
			.appendTo('body')
			.hide()
			this.win
				.show()
				.draggable()
				.resizable({
					stop:function(){
						this_.liste.show()
						this_.liste.fill(40)
					}
				})
				.append(this.ctrl = $('<div>', {'class':'ctrl', css:{display:'none'}})
					.append($('<button>').text('Minim.').button().click(function(ev){
						this_.reduce()
					}))
					.append($('<button>').text('clr').button().click(function(ev){
						this_.liste.html('')

					}))
					.append($('<button>', {css:{marginLeft:20}}).text('PHP log').button().click(function(){
						window.open('./logs/err.php', '_blank')
					}))

				)
				.append(this.ctrl2 = $('<div>', {'class':'ctrl2'})
					.append($('<button>').text('Maxim.').button().click(function(ev){
						this_.expand()
					}))
					

				)
				.append(this.liste = $('<div>', {
					css:{
						overflow:'auto'
					}
				}))

		}
		if (!this.active){
			this.win.hide()
		}
	}
	var dbg = LK.debug_.prototype
	dbg.expand = function(){
		if (!this.active) return
		this.win.height(this.h)
		this.win.width(this.w)
		this.ctrl.show()
		this.ctrl2.hide()
		this.liste.scrollTo(this.liste.children(':last'))
		this.liste.show().fill()
	}
	dbg.reduce = function(){
		var this_ = this
		this.h = this.win.height()
		this.w = this.win.width()
		this.win.height(35)
		this.win.width(100)
		this.ctrl.hide()
		this.ctrl2.show()
		this.liste.hide()
		
	}
	dbg.add = function(str){
		if (!this.active) return
		this.odd = !this.odd
		this.liste.append($('<div>', {css:{margin:'5px 0',overflow:'hidden'}, 'class':'hor_line ' + (this.odd?' odd':'')}).text(str))
	}
	dbg.show = function(){
		this.win.show()
	}
	dbg.hide = function(){
		this.win.hide()
	}
	dbg.activate = function(){
		this.active = true
		this.show()
	}
	dbg.deactivate = function(){
		this.active = false
		this.hide()
	}
	$(function(){
		LK.deb = new LK.debug_()
	})

	LK.change_title = function(params){ // {id_contenu, title, id_structure}
		var buttons = {}, vals = {}, xhr_params
		buttons[LK.msg__.annuler] = function() {
			$(this).dialog('close')
		}
		buttons[LK.msg__.sauvegarder] = function(){
			var nb_err = 0
			dial.find('input').each(function(){
				if ($(this).trim().val().length == 0){
					$(this).addClass('err_input')
					nb_err++
				}
			})
			if (nb_err){
				return
			}
			vals = dial.find('input').vals()
			
			
			vals.context =		'gestion_contenus',
			vals.op =			'set_titres'
			vals.type_element =	xhr_params.type_element
			vals.id =			xhr_params.id
			
			if (!LK.bilingue){
				vals['titre_' + LK.autre_lang] = vals['titre_' + LK.lang]
			}
			
			LK.xhr({data:vals})
			.always(function(data){
				LK.alert_msg(data, msg)
			})
			.done(function(data){
				var nb_onglets
				// si c'est un contenu qui a changé, alors changer tous les onglets avec ce contenu
				var nouv_titre = vals['titre_' + LK.lang]
				if (vals.type_element == 'contenu'){
					nb_onglets = $('li.content_title[data-content_id=' + vals.id + '] > a').text(nouv_titre).length
					dial.dialog('close')
					if (nb_onglets > 1){
						LK.alert(YLS(LK.msg__.note_chg_multiples, {nb:nb_onglets}))
					}
				} else {
					$('li.content_title[data-ref_structure=' + vals.id + '] > a').text(nouv_titre)
				}
				dial.dialog('close')
			})
		}
		var id = LK.uniqueId()
		var dial = $('<div/>',{id:id}).dialog({
				autoOpen:false,
				width:500,
				zIndex:100,
				close:function(){
					$(this).dialog('destroy').remove()
				}
			})
			.dialogShadow('ombre ui-corner-all')
			.disableSelection()
			.closeOn('change_mode')
		var div
		dial
			.html('')
			.dialog('option', 'buttons', buttons)
			.dialog('option', 'title', LK.msg__.chg_titre_onglet)
			
		.keypress(function(ev){
			if (ev.which == 13){
				buttons[LK.msg__.sauvegarder]()
			}
		})
		
		LK.xhr({data:{
			context:'gestion_contenus',
			op:'get_titres',
			id_contenu:params.id_contenu || 0,
			id_structure:params.id_structure || 0

			}})
		.always(function(data){
			LK.alert_msg(data,msg)
		})
		.done(function(data){
			dial
			.append(div = $('<div/>', {css:{margin:10}})
			.append($('<label/>',{css:{display:'block'}}).text(LK.msg__['nouveau_titre_' + LK.lang]).append(vals.titre = $('<input>', {type:'text', name:'titre_' + LK.lang, size:25, maxlength:25})))
			)
		
			if (LK.bilingue){
				dial
				.append($('<label/>',{css:{display:'block',marginTop:15}}).text(LK.msg__['nouveau_titre_' + LK.autre_lang]).append(vals.titre = $('<input>', {type:'text', name:'titre_' + LK.autre_lang, size:25, maxlength:25})))
			}
			dial.find('input').each(function(){
				$(this).val(data[$(this).attr('name')])
			})
			xhr_params = data
			dial.dialog('open')
		})
		

		

	}
	
	LK.slideshow = function(trigger){
		var $obj = $(trigger), orig_config, config, a
		orig_config = $obj.customdata('config')
		if (orig_config){
			try {
				config = $.parseJSON(orig_config)
			} catch(err){
				if (LK.perm_admin){//@note était id_editeur
					alert(LK.msg__.configuration_illisible)
				} else{
					alert(LK.msg__.non_disponible)
					return
				}
				config = null
			}
		} else{
			if (!LK.perm_admin){//@note était id_editeur
				alert(LK.msg__.non_disponible)
				return
			}
		}
		if (LK.perm_admin){//@note était id_editeur
			if (!LK.galleriffic_charge){
				if (LK.detection_boucle_infinie('galleriffic')){
					return;
				}
				
				$.getScript('./include/jquery.galleriffic.js', function(){
					
					$.getScript('./include/jquery.opacityrollover.js', function(){
						LK.galleriffic_charge = true
						LK.slideshow(trigger)
						
					})
				})
				return
			}

			if($('#slideshow').length == 0){
				$('<div id="slideshow"></div>').dialog({
					title:'',
					autoOpen:false,
					width:750,
					zIndex:100
				})
				.dialogShadow('ombre ui-corner-all')
				.disableSelection()
				.closeOn('change_mode')
				.append($('<div>', {'class':'controls'}))
				.append($('<div>', {'class':'loading'}))
				.append($('<div>', {'class':'slideshow'}))
				.append($('<div>', {'class':'caption'}))
				.append(a = $('<div>', {'class':'thumbs'}))
				.LKdata('thumbs', a)
			} else{
			}
			var dial = $('#slideshow')

			var th = dial.LKdata('thumbs')
			th	.html('')
				.append($('<ul>', {'class':'thumbs noscript'})
				.append($('<li>')
					.append($('<a>', {'class':'thumb', href:'./documents/files/diapos/photos hockey/album/slides/_mg_4559.JPG'})
						.append($('<img>', {src:'./documents/files/diapos/photos hockey/album/thumbs/_mg_4559.JPG'}))
					)
				)
				.append($('<li>')
					.append($('<a>', {'class':'thumb', href:'./documents/files/diapos/photos hockey/album/slides/_mg_4564.JPG'})
						.append($('<img>', {src:'./documents/files/diapos/photos hockey/album/thumbs/_mg_4564.JPG'}))
					)
				)
			)

			dial.LKdata().thumbs
				.galleriffic({
					delay:                     3000, // in milliseconds
					numThumbs:                 20, // The number of thumbnails to show page
					preloadAhead:              40, // Set to -1 to preload all images
					enableTopPager:            false,
					enableBottomPager:         true,
					maxPagesToShow:            7,  // The maximum number of pages to display in either the top or bottom pager
					imageContainerSel:         'div.slideshow', // The CSS selector for the element within which the main slideshow image should be rendered
					controlsContainerSel:      'div.controls', // The CSS selector for the element within which the slideshow controls should be rendered
					captionContainerSel:       'div.caption', // The CSS selector for the element within which the captions should be rendered
					loadingContainerSel:       '', // The CSS selector for the element within which should be shown when an image is loading
					renderSSControls:          true, // Specifies whether the slideshow's Play and Pause links should be rendered
					renderNavControls:         true, // Specifies whether the slideshow's Next and Previous links should be rendered
					playLinkText:              'Play',
					pauseLinkText:             'Pause',
					prevLinkText:              'Previous',
					nextLinkText:              'Next',
					nextPageLinkText:          'Next &rsaquo;',
					prevPageLinkText:          '&lsaquo; Prev',
					enableHistory:             false, // Specifies whether the url's hash and the browser's history cache should update when the current slideshow image changes
					enableKeyboardNavigation:  true, // Specifies whether keyboard navigation is enabled
					autoStart:                 false, // Specifies whether the slideshow should be playing or paused when the page first loads
					syncTransitions:           false, // Specifies whether the out and in transitions occur simultaneously or distinctly
					defaultTransitionDuration: 1000, // If using the default transitions, specifies the duration of the transitions
					onSlideChange:             undefined, // accepts a delegate like such: function(prevIndex, nextIndex) { ... }
					onTransitionOut:           undefined, // accepts a delegate like such: function(slide, caption, isSync, callback) { ... }
					onTransitionIn:            undefined, // accepts a delegate like such: function(slide, caption, isSync) { ... }
					onPageTransitionOut:       undefined, // accepts a delegate like such: function(callback) { ... }
					onPageTransitionIn:        undefined, // accepts a delegate like such: function() { ... }
					onImageAdded:              undefined, // accepts a delegate like such: function(imageData, $li) { ... }
					onImageRemoved:            undefined  // accepts a delegate like such: function(imageData, $li) { ... }

				})


			
dial.dialog('open')
	
			

		} else{
			
		}

	}
	LK.nettoyer = function(html, non_permis){
		if (non_permis == undefined){
			non_permis = [
				'.editable',
				'.editable_marker > div',
				'.editable_marker',
				'.editable_ctrls',
				'.struct_elem',
				'.ui-widget',
				'.text-container',
				'.calendar-container',
				'.contacts_equipe',
				'.schedule_container',
				'.late_render',
				'.liste_joueurs',
				'.calendar_container',
				'.table_container'
			].join(',')
		}
		var div = $('<div>', {css:{display:'none'}}).appendTo('body')
		div.append(html)
		var purge = $.unique(div.find(non_permis))
		purge.append($('<span>',{'class':'unwrap'}))
		div.find('.unwrap').unwrap().remove()
		div.find('[id]').removeAttr('id')
		to_ret = div.html()
		div.remove()
		return to_ret


		var i = $('<iframe>', {display:'none'}).appendTo('body')
		var a //
		var b = i.contents().find('body')
		
		a = $((i[0].contentDocument)?i[0].contentDocument.body:i[0].Document.body)
		alert(a.length)
		a.append(html)
		var purge = $.unique(a.find(non_permis))
		purge.append($('<span>',{'class':'unwrap'}))
		a.find('.unwrap').unwrap().remove()
		var to_ret = a.html()
		i.remove()
		return to_ret
	}
LK.interchange = function(obj1, obj2){
			var temp1 = $.extend({}, obj1)

			$.each(obj1, function(ind, val){
				delete obj1[ind]
			})
			$.extend(obj1, obj2)
			$.each(obj1, function(ind, val){
				delete obj2[ind]
			})
			$.extend(obj2, temp1)

	}
	LK.choisir_saison = function(params){
		params = params || {}
		var to_ret = {}
		$.getJSON('./PHP/get_saisons.php', {
			op:'get_saisons'
		}, function(data){
			
			var liste, do_return = true
			if (data.result){
				liste = data.liste

				if (liste.proch && liste.courante){
					var buttons = {};
					buttons[LK.msg__.annuler] = function() {
						to_ret.cancel = true
						$(this).dialog('close')
					}
					if($('#choisir_saison').length == 0){
						$('<div id="choisir_saison"></div>').dialog({
							title:LK.msg__.choisir_saison,
							
							autoOpen:false,
							buttons:buttons,
							
							zIndex:100
						})
						.dialogShadow('ombre ui-corner-all')
						.disableSelection()
						.closeOn('change_mode')

					} else{
						$('#choisir_saison').dialog('option', 'buttons', buttons)
					}
					var dial = $('#choisir_saison')
						.append($('<div>', {css:{margin:10}})
							.append($('<a>')
								.text(LK.msg__.saison_courante + ': ' + data.liste.courante.nom_saison)
								.click(function(){
									LK.saison_choisie = $.extend({courante:true}, data.liste.courante)
									to_ret = $.extend({courante:true}, data.liste.courante)
									dial.dialog('close')
								})
							)
						)
						.append($('<div>', {css:{margin:10}})
							.append($('<a>')
								.text(LK.msg__.saison_proch + ': ' + data.liste.proch.nom_saison)
								.click(function(){
									LK.saison_choisie = $.extend({proch:true}, data.liste.proch)
									to_ret = $.extend({proch:true}, data.liste.proch)
									dial.dialog('close')
								})
							)
						)
						.dialog('option', 'close', function(){
							dial.dialog('destroy').remove()
							if (!to_ret.cancel && params.callback){
								params.callback(to_ret)
							}
						})

					dial.dialog('open')
					do_return = false
				} else if (liste.proch){
					LK.saison_choisie = $.extend({proch:true}, data.liste.proch)
					to_ret = $.extend({proch:true}, data.liste.proch)
				} else if (liste.courante){
					LK.saison_choisie = $.extend({courante:true}, data.liste.courante)
					to_ret = $.extend({courante:true}, data.liste.courante)
				} else {
					to_ret.error = LK.msg__.aucune_saison
					do_return = false
				}
				if (do_return){
					if (params.callback){
						params.callback(to_ret)
					}
				}

			}
			LK.alert_msg(data)
		})
		
	}

	LK.err_msg = function(params){
		this.params = params || {}
		this.init()
		if (msg){
			this.div.html(msg)
		}
	}
	var err_msg = LK.err_msg.prototype
	err_msg.init = function(){
		var this_ = this
		var css = this.params.css || {}
		this.div = $('<div>',{'class':'err_', css:css}).appendTo('body').hide()
			.draggable({
				start:function(){
					this_.no_close = true
				}
			})
			.click(function(){
				
				this_.div.fadeOut(function(){
					this_.div.remove()
				})
			})
		this.div.append(this.liste = $('<div>'))
		this.div.append(this.instructions = $('<div>', {css:{textAlign:'center',color:'#666',fontSize:10}}).text(LK.msg__.clic_ferme))
	}
	err_msg.show = function(){
		this.div.show()
		if (this.params.pos){
			this.div.position(this.params.pos)
		} else{
			this.div.css({top:($(window).height()-this.div.height())/2, left:($(window).width()-this.div.width())/2})
		}
	}
	err_msg.hide = function(){
		this.div.hide()
	}

	LK.entrer_mdp = function(obj){
		var mdp, no_mdp, a_ok
		no_mdp = obj.customdata('no_mdp')

		obj.hide().after(mdp = $('<input>',{type:'text',size:10,maxlength:8}))
		mdp.after(a_ok = $('<a>', {href:'#'}).text(LK.msg__.ok).click(function(){
			var val
			if ((val = mdp.trim().val()).length == 0){
				mdp.hide()
				$(this).hide()
				obj.show()
			} else{
				$.getJSON('./PHP/valider_mdp_contenu.php', {
					mdp:LK.MD5(val),
					no_mdp:no_mdp
				}, function(data){
					if (data.result){
						obj.closest('div').html(LK.msg__.rechargez_page_pour_contenu)
					} else{
						LK.alert_msg(data)
					}
				})
			}
		}))
		mdp.keypress(function(ev){
			if (ev.which == 13){
				a_ok.trigger('click')
			}
		})
		mdp[0].focus()
	}
	LK.verrouiller_contenu = function(obj){
		$.getJSON('./PHP/verrouiller_contenu.php', {
			no:obj.customdata('no_mdp')
		}, function(data){
			if (data.result){
				obj.after($('<span>').text(LK.msg__.contenu_sera_cache))
				obj.remove()
			}
			LK.alert_msg(data, msg)
		})
	}
	LK.uniqueIdNo = 0
	LK.uniqueId = function(){
		return 'LKID' + (++LK.uniqueIdNo)
	}
	LK.prep_section = function(parent, params){
		var section
		if (section = $('#' + params.id_section).length) return section
	
		parent.append(section = $('<div>', {id:params.id_section}))
		if (params.titre)
			section.append($('<div>', {'class':'titre'}).html(params.titre))
		if (params.info)
			section.append($('<div>', {'class':'info'}).html(params.info))
		section.append($('<div>', {'class':'ctrl'}))
			.append('<hr/>')
			.append($('<div>', {'class':'liste'}))
		return section
	}
	LK.tb_headings = function(params, msg){
		if ($.type(params) == 'string'){
			params = params.split(',')
		}
		var to_ret = '';
		$.each(params, function(ind, val){
			var txt = msg[val] || ''
			to_ret += '<th>' + txt.replace('<', '&lt;').replace('>', '&gt;') + '</th>'
		})
		return to_ret
	}
	LK.array_to_obj = function(arr){
		var obj = {}
		$.each(arr, function(ind, val){
			obj[val[0]] = val[1]
		})
		return obj
	}
	LK.esc = function(str){
		return str.replace('"', '\\"')
	}
	LK.xhr = function(params){ // params = {mode:<default = 'get'>, data: {context:.., op:.., etc}, type:<default = json>}
		
		if (typeof(params) != 'object') return;
		params = $.extend({mode:'get', type:'json', data:{}}, params)
		if (params.data.op == undefined){
			params.data.op = ''
		}
		var fn
		if (params.mode == 'post'){
			fn = $.post
		} else{
			fn = $.get
		}
	
		var def = $.Deferred()
		fn('./PHP/process_request.php', params.data, function(data){
			if (data == undefined || data == null){
				alert('Réponse invalide; contexte: ' + params.data.context + '; op: ' + params.data.op)
				return
			}
			if (data.result){
				def.resolve(data)
			} else{
				def.reject(data)
			}
			
		}, params.type)
		return def.promise()
	}
	LK.join_statements = function(ops){
		$.each(ops, function(ind, val){
			if ($.isArray(val)){
				ops[ind] = 'setTimeout(function(){' + val[0] + '},' + val[1] + ')'
			}
		})
		return ops.join(';')
		
	}
	
	LK.editer_membres = function(){
		LK.execute({test:'liste_membres', fn:function(){LK.editer_membres()}})
	}
	;(function(){
		// items = [{title, fn}, ...]; options = {[ev]} où ev est l'événement (clic) pour faire ouvrir le menu au curseur
		// pour chaque ouverture, créer un objet sans le stocker dans une variable
		LK.context_menu = function(obj, items, options){
			var this_ = this
			this.obj = obj
			this.items = items
			this.options = options || {}
			if ($('#mypopup_menu').length == 0){
				this.div = $('<div/>', {id:'mypopup_menu'}).appendTo('body').hide().bind('contextmenu',false)
				this.div.click(function(ev){
					var $obj = $(ev.target).closest('div')
					if ($obj.is('[data-no]')){
						
						var item = this_.items[parseInt($obj.customdata('no'))]
						if (item.context){
							item.fn.call(item.context, this_.obj)
						} else{
							item.fn(this_.obj)
						}
							
					}
				})
				$('#mypopup_menu').LKdata('just_created',1)
				$('body').bind('mouseup.mypopup_menu', function(){
					setTimeout(function(){
						if ($('#mypopup_menu').LKdata('just_created')  && this_.options.ev && this_.options.ev.type == 'mouseup'){
							$('#mypopup_menu').LKdata('just_created',0)
							return
						}
						$('#mypopup_menu').remove()
						$('body').unbind('mouseup.mypopup_menu')
					})
				})
				
			} else{
				this.div = $('#mypopup_menu').LKdata('just_created',1)
			}
			this.update()
			this.display()
			
		}
	
		var cm = LK.context_menu.prototype
		cm.update = function(){
			var this_ = this
			this.div.html('')
			$.each(this.items, function(ind, val){
				if (!val) return
				var line
				this_.div.append(line = $('<div/>', {'data-no':ind}).text(val.title || '?????'))
				if (val['class']){
					line.addClass(val['class'])
					//alert(val['class'])
				}
				if (val.icon){
					if (typeof(val.icon) == 'string'){
						line.prepend($('<span>', {'class':'ui-icon ui-icon-' + val.icon, css:{marginRight:6}}))
					} else if (typeof(val.icon) == 'object'){
						if (val.icon.primary){
							line.css('paddingLeft', 20)
							.addClass(val.icon.primary)
						}
					}
				}
				
			})
			
		}
		cm.display = function(){
			var obj, remove_obj = false
			if (this.options.ev){
				var ev = this.options.ev
				obj = $('<div/>', {css:{position:'absolute', width:1, height:1, top:ev.pageY, left:ev.pageX}}).appendTo('body')
						
				remove_obj = true
			} else {
				obj = this.obj
			}
			this.div.position({my:'left', at:'right', of:obj, collision:'fit'})
				.show()
			if(remove_obj){
				obj.remove()
			}
		}
	
	})()
	
	
	LK.templates_charges = {}
	LK.template_list = function(noms){
		var fini = false
		var def = $.Deferred()
		if (typeof(noms) == 'string'){
			noms = noms.split(',')
		}
		var reponses = []
		var premier_nom = noms[0]
		$.each(noms, function(ind, nom){
			reponses.push(LK.template(nom, true))
		})
		//return $.when.apply(this, reponses)
		$.when.apply(this,reponses)
			.done(function(){
				var deja_note = {},recharger = []
				$.each(noms, function(ind,nom){
					var a_charger = $('#' + nom).customdata('uses')
					if (a_charger){
						a_charger = a_charger.split(',')
						$.each(a_charger,function(ind,nom){
							if ($.template[nom] != undefined){
								return
							}
							
							if (LK.templates_charges[nom]){
								def.reject(nom)
								fini = true
								return false
							}
							if (!deja_note[nom]){
								deja_note[nom] = 1
								recharger.push(nom)
							}
						})
						if (fini){
							return false
						}
					}
				})
				if (fini){
					
				}
				if (recharger.length){
					
					LK.template_list(recharger)
						.done(function(){
							def.resolve(premier_nom)
						})
						.fail(function(){
							alert('Échec chargement template = ' + noms)
							def.reject()
						})
				} else{
					def.resolve(premier_nom)
				}
			})
			.fail(function(){
				alert('Échec chargement template(s) = ' + noms)
				def.reject()
			})
			
		return def.promise()
	}
	
	LK.template = function(nom, from_template_list){
		if (from_template_list == undefined){
			return LK.template_list(nom)
		}
		var def = $.Deferred()
		
		if ($.template[nom]){
			setTimeout(function(){def.resolve(nom)})
			return
		}
		$.ajax({
			url: './include/' + nom + '.txt?' + Math.random(),
			dataType:'text',
			success:function(data){
				$('body').append(data)
				LK.templates_charges[nom] = 1
				$('#' + nom).template(nom)
				def.resolve(nom)
			},
			error:function(){
				def.fail(nom)
			}
		})
		return def
	}
	LK.show_info_center = function(msg, params){
		params = params || {}
		var obj
		if (params.obj){
			obj = params.obj
			delete params.obj
		}
		params = $.extend({msg:msg, pos:{my:'center',at:'center',of:$('body')}},params)
		if (obj){
			params.pos.of = obj
		}
		LK.show_info(params)
	}
	LK.spry_menu = function(params){ // {dest, items, id}
		LK.template('templ_vertical_menu')
		.done(function(){
			$.tmpl('templ_vertical_menu', {items: params.items, id: params.id}).appendTo(params.dest)
			new Spry.Widget.MenuBar(params.id, {imgRight:"SpryAssets/SpryMenuBarRightHover.gif"})
	})
		
	}
	LK.getLangScript = function(script, callback){
		var def = $.Deferred()
		$.getScript("./PHP/getScript.php?name=" + script)
			.done(function(){
				if (typeof(callback) == 'function'){
					callback()
				}
				def.resolve()
				
		})
		return def.promise()
	}
	LK.fld_list = function(tables, champs){
		if (!LK.tables){
			LK.tables = {}
		}
		if (!LK.fld_labels){
			LK.fld_labels = {}
		}
		var def = $.Deferred()
		
		if (!$.isArray(tables)){
			tables = tables.split(',')
		}
		
		var to_load = []
		
		
		$.each(tables, function(ind, table){
			if (!LK.tables[table]){
				to_load.push($.getScript('./include/db_flds_' + table + '.js'))
		//	}
		//	if (!LK.tables[table]){
				to_load.push(LK.getLangScript('fld_labels_' + table + '.js'))
			}
			
		})
		

		$.when.apply(this, to_load)
			.then(function(){
				var fld_data = {}
				var fld_labels = {}
				
				if (champs == undefined){
					$.each(tables, function(ind, table){
						$.extend(fld_data, LK.tables[table])
						$.extend(fld_labels, LK.fld_labels[table])
					})
				
					def.resolve(fld_data, fld_labels)
					return
				}
				if (!$.isArray(champs)){
					champs = champs.split(',')
				}
				$.each(tables, function(ind, table){
					$.each(champs, function(ind,champ){
						if (LK.tables[table][champ]){
							fld_data[champ] = LK.tables[table][champ]
						}
						if (LK.fld_labels[table][champ]){
							fld_labels[champ] = LK.fld_labels[table][champ]
						}
					})
				})
				
				def.resolve(fld_data, fld_labels)

			})
		return def.promise()
		
		$.when((function(){
			var tables_not_loaded = []
			var list_not_loaded = {}
			if (!LK.tables){
				tables_not_loaded = tables
			} else{
				$.each(tables, function(ind, table){
					if (!LK.tables[table]){
						tables_not_loaded.push(table)
					}
				})
			}
			$.each(tables_not_loaded, function(ind, table){
				list_not_loaded[table] = ind
			})
			
			var def = $.Deferred()
			$.each(tables_not_loaded, function(ind, table){
				$.getScript('./include/db_flds_' + table + '.js', function(){
					tables_not_loaded.splice(list_not_loaded[table])
					if (tables_not_loaded.length == 0){
						def.resolve()
					}
				})
				
			})
			return def.promise()
		})(),
			(function(){
				var labels_not_loaded = [], list_labels_not_loaded = {}
				if (!LK.flds_labels){
					labels_not_loaded = tables
				} else{
					$.each(tables, function(ind, table){
						if(!LK.flds_labels[table]){
							labels_not_loaded.push(table)
						}
					})
				}
				$.each(labels_not_loaded, function(ind, table){
					list_labels_not_loaded[table] = ind
				})
				var def = $.Deferred()
				$.each(labels_not_loaded, function(ind, table){
					
					LK.xhr({data:{
							context:'include_lang',
							op:'get_name',
							script:'fld_labels_' + table + '.js'
					}})
					.done(function(data){
						$.getScript(data.script, function(){
							labels_not_loaded.splice(list_labels_not_loaded[table])
							if (labels_not_loaded.length == 0){
								def.resolve()
							}
						})
					})
					.fail(function(){
						def.reject()
					})
				})
				return def.promise()
			})()
		)
		.then(function(){
			if (champs == undefined){
				def.resolve()
				return
			}
			var to_ret = []
			$.each(champs, function(ind, champ){
				
				if (LK.tables[tables][champ]){
					to_ret.push(LK.tables[tables][champ])
				}
			})
			def.resolve(to_ret)
		})
		return def.promise()
	}
	LK.select2Array = function(obj, liste){
		var to_ret = []
		if(typeof(liste) == 'string'){
			liste = liste.replace(' ','').split(',')
		}
		$.each(liste, function(ind, val){
			if (!obj[val]) return
			to_ret.push(obj[val])
		})
		
		return to_ret
	}
	LK.array_append = function(base, ajout){
		$.each(ajout, function(ind, val){
			base.push(val)
		})
		return base
	}
	LK.text_only = function(obj){
		var to_ret = {}
		$.each(obj, function(ind, val){
			if (typeof(val) == 'string'){
				to_ret[ind] = val
			}
		})
		return to_ret
	}
	
	LK.rendre_obligatoire = function(fld_data, flds){
		if (!$.isArray(flds)){
			flds = flds.split(',')
		}
		$.each(flds, function(ind, fld){
			var separ, valid
			if (fld_data[fld]){
				valid = fld_data[fld].specs['data-valid']
				if (!valid){
					return
				}
				separ = fld_data[fld].specs['data-separ'] || ','
				var regex = new RegExp('(^|' + separ + ')opt($|' + separ + ')')
				fld_data[fld].specs['data-valid'] = valid.replace(regex, '')
			}
		})
		
	}
	LK.rendre_optionnel = function(fld_data, flds){
		if (!$.isArray(flds)){
			flds = flds.split(',')
		}
		$.each(flds, function(ind, fld){
			var separ, specs, valid
			if (fld_data[fld]){
				valid = fld_data[fld].specs['data-valid']
				if (!valid){
					fld_data[fld].specs['data-valid'] = 'opt'
					return
				}
				separ = fld_data[fld].specs['data-separ'] || ','
				var regex = new RegExp('(^|' + separ + ')opt($|' + separ + ')')
				if (!regex.test(specs)){
					fld_data[fld].specs['data-valid'] += separ + 'opt'
				}
			}
		})
		
	}
	LK.verifier_mdp = function(val){
		var buttons = {}, err, default_opt
		var def = new $.Deferred()
		buttons[LK.msg__.annuler] = function() {
			$(this).dialog('close')
		}

		default_opt = buttons[LK.msg__.soumettre] = function(){
			if (val == $(this).find('input').val()){
				def.resolve()
				$(this).dialog('close')
			}
			err.show('blind')
		}
		var id = LK.uniqueId()
		if($('#' + id).length == 0){
			$('<div>',{id:id}).dialog({
				title:LK.msg__.verification_mdp,
				width:400,
				autoOpen:false,
				buttons:buttons,
				modal:true,
				zIndex:100,
				close:function(){
					$(this).dialog('destroy').remove()
					def.reject()
				}
			})
			.dialogShadow('ombre ui-corner-all')
			.disableSelection()
			.closeOn('change_mode')
		} else{
			$('#' + id).dialog('option', 'buttons', buttons)
		}
		var dial = $('#' + id)
		dial.append($('<label>').text(LK.msg__.svp_reentrez).append($('<input>',{type:'password',size:10})))
			.append(err = $('<div>', {css:{marginTop:10, display:'none', textAlign:'center'}, 'class':'coins_ronds ui-state ui-state-error'}).text(LK.msg__.valeurs_different))
		dial.dialog('open')
			.keypress(function(ev){
				if (ev.which == 13){
					default_opt.call(dial)
				}
			})
		return def.promise()
	}
	;(function(){
		LK.liste_items = function(liste, params){
			this.liste = liste
			this.numeric_values = params.numeric_values || false
			this.null_value = params.null_value
			if (this.numeric_values){
				this.numeric_suffix = params.numeric_suffix || '_'
			} 
		}
		var a = LK.liste_items.prototype
		
		a.select = function(param){
			var selected
			param = param || {}
			var obj = $('<select>', param.select_attr).LKdata('LKobj', this)
			if (param.aucun){
				obj.append($('<option>', {value:param.aucun}).text(''))
			}
			selected = param.selected
			
			if (param.selected != undefined){
				if (this.numeric_suffix != undefined){
					selected = selected + this.numeric_suffix
				}
			}
			$.each(this.liste, function(val, text){
				var attr = {value:val}
				if (selected == val){
					attr.selected = 'selected'
				} 
				obj.append($('<option>', attr).text(text))
			})
			return obj
		}
		a.val = function(obj){
			if (obj.is('select')){
				obj = obj.find('option:selected')
			}
			var val = obj.val()
			if (val == this.null_value){
				return null
			}
			if (this.numeric_values){
				return parseInt(val)
			}
			return val
		}
		
		a.get_desc = function(val){
			if (this.numeric_values && this.numeric_suffix){
				val = val + this.numeric_suffix
			}
			return this.liste[val] || val
		}
		
	})()
	;(function(){
		LK.liste_divisions_ = function(){
			
			this.load()
		}
		var ld = LK.liste_divisions_.prototype
		ld.load = function(){
			var this_ = this
			this.def = $.Deferred()
			LK.xhr({data:{
					context:'gestion_divisions',
					op:'liste_divisions'
					
				}})
			.always(function(data){
				LK.alert_msg(data,msg)
			})
			.done(function(data){
				var liste = {}
				$.each(data.liste, function(ind, val){
					liste[val.id + '_'] = val.description
				})
				this_.liste = new LK.liste_items(liste, {numeric_values:1})
				this_.def.resolve()
				this_.is_loaded = true
			})
			

		}
		ld.loaded = function(){
			return this.def.promise()
		}
		ld.get_desc = function(val){
			if (!this.is_loaded){
				return '???'
			} else {
				return this.liste.get_desc(val)
			}
		}
		ld.get_val = function(val){
			var t = typeof(val)
			
			if (t == 'number' || t == 'string'){
				return val + this.liste.numeric_suffix
			}
			if (t == 'object'){
				if (val.contexte_division != undefined){
					return val.contexte_division + this.liste.numeric_suffix
				}
				if (val.division != undefined){
					return val.division + this.liste.numeric_suffix
				}
				
			} else {
				return val + this.liste.numeric_suffix
			}
			
		}
		ld.fill_select = function(obj,val){
			var this_ = this, selected
			obj.disable()
			$.when(this.loaded)
			.done(function(){
				var select_val
				if (val){
					select_val = this_.get_val(val)
				}
				$.each(this_.liste.liste, function(val,txt){
					var opt
					obj.append(opt = $('<option/>').val(val).text(txt))
					if (select_val && select_val == val){
						selected = opt
					}
				})
			})
			obj.enable()
			if (selected){
				setTimeout(function(){selected.attr('selected','selected')},100)
			}
		}
		
		LK.liste_classes_ = function(){
			
			this.load()
		}
		var lc = LK.liste_classes_.prototype
		lc.load = function(){
			var this_ = this
			this.def = $.Deferred()
			LK.xhr({data:{
					context:'gestion_classes',
					op:'get_liste_classes'
					
				}})
			.always(function(data){
				LK.alert_msg(data,msg)
			})
			.done(function(data){
				var liste = {}
				$.each(data.liste, function(ind, val){
					liste[val.id + '_'] = val.classe
				})
				this_.liste = new LK.liste_items(liste, {numeric_values:1})
				this_.def.resolve()
				this_.is_loaded = true
			})
			

		}
		lc.loaded = ld.loaded
		lc.get_desc = ld.get_desc
		lc.fill_select = ld.fill_select
		lc.get_val = function(val){
			var t = typeof(val)
			
			if (t == 'number' || t == 'string'){
				return val + this.liste.numeric_suffix
			}
			if (t == 'object'){
				if (val.contexte_classe != undefined){
					return val.contexte_classe + this.liste.numeric_suffix
				}
				if (val.classe != undefined){
					return val.classe + this.liste.numeric_suffix
				}
				
			} else {
				return val + this.liste.numeric_suffix
			}
		}
		
	})()
	LK.liste_divisions = new LK.liste_divisions_
	LK.liste_classes = new LK.liste_classes_
	

	
	LK.liste_contexte = function(div_ou_cl){
		if (div_ou_cl == 'division'){
			return LK.liste_divisions
		} else if (div_ou_cl == 'classe'){
			return LK.liste_classes
		} else {
			return {
				get_desc:function(val){
					return val
				},
				loaded:function(){
					var def = $.Deferred()
					def.resolve()
					return def.promise()
				},
				is_loaded:true
			}
		}
	}
	LK.get_context = function(obj){
		return {
			division : $(obj).closest('[data-contexte_division]').attr('data-contexte_division')||null,
			classe: $(obj).closest('[data-contexte_classe]').attr('data-contexte_classe')||null,
			equipe: $(obj).closest('[data-contexte_equipe]').attr('data-contexte_equipe')||null
		}
	}
	LK.get_context_herite = function(obj){
		var struct = obj.closest('.struct_elem')
		var to_ret = {},ref
		$.each(['division','classe','equipe'],function(ind,type){
			var select = YLS('[data-contexte_{type}]', {type:type})
			if (struct.is(select)){
				ref = struct.parent()
			} else {
				ref = struct
			}
			to_ret[type] = ref.closest(select).customdata('contexte_' + type)||null
		})
		
		return to_ret
	}
	LK.fill_contexte = function(obj, contexte){
		var cont = {}
		$.each(['division','classe','equipe'],function(ind,val){
			cont[val] = contexte[val] || contexte['contexte_' + val] || ''
		})
		
		$.when(LK.liste_divisions.loaded, LK.liste_classes.loaded)
		.done(function(){
			obj.text(LK.liste_divisions.get_desc(cont.division) + ' ' + LK.liste_classes.get_desc(cont.classe) + ' ' + cont.equipe)
		})
	}
	;(function(){
		LK.contexte = function(division,classe,equipe){
			
			if (typeof(division == 'object')){
				this.division = division.division || division.contexte_division || null
				this.classe = division.classe || division.contexte_classe || null
				this.equipe = division.equipe || division.contexte_equipe || null
			} else {
				this.division = division || null
				this.classe = classe || null
				this.equipe = equipe || null
			}
		}
		var c = LK.contexte.prototype
		c.trouve = function(obj){
			this.division = $(obj).closest('[data-contexte_division]').attr('data-contexte_division'),
			this.classe = $(obj).closest('[data-contexte_classe]').attr('data-contexte_classe'),
			this.equipe = $(obj).closest('[data-contexte_equipe]').attr('data-contexte_equipe')
		}
		c.text_to_obj = function(obj){
			var this_ = this
			$.when(LK.liste_divisions.loaded, LK.liste_classes.loaded)
			.done(function(){
				obj.text(LK.liste_divisions.get_desc(this_.division) + ' ' + LK.liste_classes.get_desc(this_.classe) + ' ' + this_.equipe)
			})
			
		}
		$.fn.set_division_text = function(div){
			var this_=this
			if (typeof(div) == 'object' && div != null){
				div = div.division || div.contexte_division || null
			}
			var txt
			LK.liste_divisions.loaded()
			.done(function(){
				
				if (!div){
					txt = 'x'
				} else {
					txt = LK.liste_divisions.get_desc(div)
				}
				$(this_).text(txt)
			})
			return this
		}
		$.fn.set_classe_text = function(classe){
			var this_ = this
			if (typeof(classe) == 'object' && classe){
				classe = classe.division || classe.contexte_division || null
			}
			var txt
			LK.liste_classes.loaded()
			.done(function(){
				if (!classe){
					txt = 'x'
				} else {
					txt = LK.liste_classes.get_desc(classe)
				}
				$(this_).text(txt)
			})
			return this
			
		}
		$.fn.set_context = function(division,classe,equipe){
			var this_ = this
			
			if (!division && !classe && (!equipe || equipe == '')){
				return this.text('---')
				
			}
			
			$.when(LK.liste_divisions.loaded, LK.liste_classes.loaded)
			.done(function(){
				
				if (!division){
					division = 'x'
				} else {
					division = LK.liste_divisions.get_desc(division)
				}
				
				if (!classe){
					classe = 'x'
				} else {
					classe = LK.liste_classes.get_desc(classe)
				}
				
				this_.text(division + '-' + classe + ' - ' + (equipe || 'x'))
			})
			return this
		}
		$.fn.division_options = function(val){
			LK.liste_divisions.fill_select(this, val)
			return this
		}
		$.fn.classe_options = function(val){
			LK.liste_classes.fill_select(this,val)
			return this
		}
	})()
	LK.prop = function(obj, desc){
		desc = desc || 'obj'
		LK.db(LK.properties_table(desc,obj))
	}

	LK.display_flds = function(params){ // params = {data, flds, labels, specs:['(label:)?nom_champ(style)?], dest,line_css}
		var line_css = params.line_css || {}
		$.each(params.specs, function(ind,field_spec){
			if (field_spec == ''){
				params.dest.append('<hr/>')
				return
			} 
			var specs = {}
			var style = field_spec.match(/\((.+)\)/)
			
			if (style && style[1]){
				specs.style = style[1]
			} 
			field_spec = field_spec.replace(/\(.+\)/, '')
			
			var spec = field_spec.match(/((.+):)?(.+)/)
			if (!spec || !spec[3] || !spec[3].length){
				alert('invalide: ' + field_spec)
				return
			}
			var fld = spec[3]
			if (!params.data[fld]){
				return
			}
			var fld_data = fld = params.data[fld]
			var label = ''
			if (spec[2]){
				label = spec[2]
				if (/(^|;)mailto(;|$)/.test(label)){
					fld = '<a href="mailto:' + fld + '">' + fld + '</a>'
				}
				label = label.replace(/(^|;)mailto(;|$)/, '')
				
				if (/(^|;)title(;|$)/.test(label)){
					specs.title = fld_data
					label = label.replace(/(^|;)title(;|$)/, '')
				}
				if (label.length){
					label = params.labels[label] || label
					label += ':&nbsp;'
				}
			}
			
			params.dest.append($('<div/>', $.extend({css:line_css}, specs)).html(label + fld ))

		})
	}
	LK.myMD5 = function(l,ll){
		var lll = LK.MD5(ll + LK.MD5(l) + ll)
		var lO = 10 * (ll/10 - Math.floor(ll/10))
		return (lll.substring(lll.length-10 * (ll/10 - Math.floor(ll/10))+1) + lll).substr(0,lll.length)
	}
	LK.extract = function(obj, flds, prefix_source, prefix_dest){
		if (!flds){
			return obj
		}
		prefix_source = prefix_source || ''
		prefix_dest = (prefix_dest  != undefined ? prefix_dest : prefix_source)
		if (typeof(flds) == 'string'){
			flds = flds.split(',')
		}
		var to_ret = {}
		$.each(flds, function(ind,fld){
			var val = obj[prefix_source + fld]
			if (val != undefined){
				to_ret[prefix_dest + fld] = val
			}
		})
		return to_ret
	}
})()


