CMS =
{
	// liste des statuts
	statusList: [],
	
	currentTab: 0,
	
	zoneCode: null,
	
	contextPath: "",
	
	// liste des champs
	fields: [],
	
	parameters: {},
	
	servicesURL: "/common/cms/query.jsp",
	
	publiName: null,
	uploadFormURL: null,
	xmlQueryURL: null,
	
	formContent: null,
	
	setParameter: function(param)
	{
		var p = param.split('=');
	
		CMS.parameters[p[0]] = p[1];
	},
	
	close: function(suffix)
	{
		EL('cms').style.display = 'none';
	
		EL('tb_display_' + suffix).onclick();
	},
	
	addEnterEvent: function(elt, func)
	{
		if( elt == null )
		{
			return null;
		}
		
		if( document.all )
		{
			elt.onkeydown = function() { if( event.keyCode == 13) func(event); };
		}
		else
		{
			elt.onkeydown = function(e) { if( e.keyCode == 13) func(e); };
		}
	},
	
	enableFormButtons: function()
	{
		var bar 	= document.getElementById('formButtons');
		
		CMS.enableButton(bar, 'cancel', true );
		CMS.enableButton(bar, 'valid', true );
	},
	
	disableFormButtons: function()
	{
		var bar 	= document.getElementById('formButtons');
		
		CMS.enableButton(bar, 'cancel', false );
		CMS.enableButton(bar, 'valid', false );
	},
	
	/**
	 * Indentifie un champs
	 */		
	registerField: function(f)
	{
		CMS.fields.push(f);
	
		if( f.className == 'Bw.Widgets.Textfield' )
		{
			CMS.addEnterEvent( f, function() { CMS.sendForm(); } );
		}
	},
	
	getField: function(name)
	{
		for(var i = 0; i < CMS.fields.length ; i ++ )
		{
			if( CMS.fields[i].getAttribute("name") == name )
			{
				return CMS.fields[i];
			}	
		}
		
		return null;
	},
	
	/**
	 * Recherche des champs
	 */		
	lookupFields: function(f)
	{
		if( typeof f == 'string' )
		{
			f = document.getElementById(f);
		}
		
		if( f == null )
		{
			return;
		}
		
		// parcours des fils
		for( var i = 0; i < f.childNodes.length ; i ++ )
		{
			if( f.childNodes[i].nodeType != 1 )
			{
				continue;
			}
			
			
			// si le champ est bien un BW on le stocke
			if( f.childNodes[i].className.indexOf('Bw') > -1 )
			{
				CMS.registerField(f.childNodes[i]);
			}
			
			
			// recherche dans ce fils
			CMS.lookupFields(f.childNodes[i]);
		}
	},
	
	/**
	 * Recharge le contenu d'un BW List
	 */
	reloadList: function(l, language)
	{
		if( typeof l == 'string' )
		{
			l = document.getElementById(l);
		}	
		
		if( l == null )
		{
			return;	
		}
		
		l.clear();
	
		var url  = null;
	
		if( l.getAttribute("src") == null )
		{
			l.setAttribute("src", l.getAttribute("source") );
	
			url = l.getAttribute("source");
		}
		else
		{
			url = l.getAttribute("src");
		}
		
		var language = document.getElementById('listLanguage');
		
		if( language != null )
		{
			language = language.getValue();
	
			var idx = url.indexOf("language=");
	
			if( idx > 0 )
			{
				var idx2 = url.indexOf("&", idx);
	
				if( idx2 > 0 )
				{
					url = url.substring(0, idx2);
				}
				else
				{
					url = url.substring(0, idx + "language=".length);
				}
	
				url += language;
			}
		}
		
		l.appendXML(url);
	
		CMS.manageButtons();
	},
	
	/**
	 * Actualise les boutons des button bar en fonction de a selection des Bw list
	 */
	manageButtons: function()
	{
		// draft buttons
		var list 	= document.getElementById('list_' + CMS.currentTab);
		var selection 	= list.getSelection();
		var bar 	= document.getElementById('buttons_' + CMS.currentTab);
			
		CMS.enableButton(bar, 'edit', (selection.length != 0) );
		CMS.enableButton(bar, 'online', (selection.length != 0) );
		CMS.enableButton(bar, 'trash', (selection.length != 0) );
		CMS.enableButton(bar, 'create', true );
		
		// ferme le formulaire
		CMS.hideForm();
	},
	
	
	/**
	 * Active ou désactive un bouton appartenant a une button bar selon le state
	 */
	enableButton: function(bar, name, state)
	{
		// parcours des fils de la button bar
		for(var i = 0 ; i < bar.childNodes.length; i ++ )
		{
			if( bar.childNodes[i].nodeType != 1 || bar.childNodes[i].className.indexOf('button') < 0 || bar.childNodes[i].getAttribute("name") != name )
			{
				continue;
			}	
			
			var button = bar.childNodes[i];
			
			if( state )
			{
				// activation du bouton
				button.className 	= "button";
				button.onclick 		= function() { eval( button.getAttribute("action") ) };
				button.onmouseover 	= function() { button.className = 'button over'; }
				button.onmouseout  	= function() { button.className = 'button'; }
			}
			else
			{
				// désactivation du bouton
				button.className 	= "button disabled";
				button.onclick 		= new Function("return false");
				button.onmouseover 	= new Function("return false");
				button.onmouseout  	= new Function("return false");
			}
			
			break;
		}
	},
	
	checkURL: function(s)
	{
		/*
		//var regex = "^([http?]+[/:/]+[\///])+(.+)?[/\./]+[a-z]{2,4}$";
		var regex = "^([http?]+[/:/]+[\///])+(.+)?[/\./]+[a-z]{2,4}\/?";
		
		var reg = new RegExp(regex);
		
		if( !reg.test(s) )
		{
			if( s.indexOf("http") < 0 && s.indexOf("www") == 0 )
			{
				s = "http://" + s;
				return CMS.checkURL(s);
			}
			
			return null;
		}
		*/
		
		return s;
		
	},
	
	checkInteger: function (s)
	{
		return (parseInt(s) == s);
	},
	
	checkNumber: function (s)
	{
		return (parseFloat(s) == s);
	},
	
	checkDate: function (s)
	{
		if( s.length != 10 )
		{
			return false;	
		}
		
		var parts = s.split("/");
		
		if( parts.length != 3 )
		{
			return false;	
		}
		
		if( !CMS.checkInteger(parts[0]) || !CMS.checkInteger(parts[1]) || !CMS.checkInteger(parts[2]) )
		{
			return false;	
		}
		
		if( parts[0] < 1 || parts[0] > 31 )
		{
			return false;	
		}
		
		if( parts[1] < 1 || parts[1] > 12 )
		{
			return false;	
		}
		
		if( parts[2] < 1 )
		{
			return false;	
		}
		
		return true;
		
	},
	
	/**
	 * Envoi du formulaire
	 */
	sendForm: function()
	{
		var data = new CMS.PostData();
		
		// vérification des champs obligatoire
		for( var i = 0; i < CMS.fields.length ; i ++ )
		{
			var field = CMS.fields[i];
			
			if( field.selfclassName == 'Bw.Widgets.Filefield' )
			{
				continue;
			}
		
			var value = field.getValue();
			
			if( field.selfclassName == 'Bw.Widgets.Datefield' )
			{
				value = field.field.getValue();
			}
			
			if( field.selfclassName == 'Bw.Widgets.Checkbox' )
			{
				value = ( field.getValue() ) ? "1" : "0";
			}
			
			if( field.getAttribute("mandatory") == 'true' && value == '' )
			{
				alert("Le champ " + field.getAttribute("caption") + " est obligatoire");
				field.focus();
				return;
			}
			
			if( field.getValue() != null && field.getValue().length > 0 && field.getAttribute("labelfield") != null && field.getAttribute("labelfield").length > 0 )
			{
				var labelField = data.properties[field.getAttribute("name") + "_label"];
				
				if( labelField.length == 0 )
				{
					alert("Merci de spécifier le champ " + field.getAttribute("labelfield"));
					field.focus();
					return;
				}
			}	
			
			if( value.length > 0 && field.getAttribute("fieldType") == 'url' )
			{
				value = CMS.checkURL(value);
				
				field.setValue(value);
				
				if( value == null )
				{
					alert("Adresse incorrecte pour le champ " + field.getAttribute("caption"));
					field.focus();
					return;
				}	
			}
			
			if( value.length > 0 && field.getAttribute("fieldType") == 'number' )
			{
				if( !CMS.checkNumber(value) )
				{
					alert("Le champ " + field.getAttribute("caption") + " n'est pas un nombre");
					field.focus();
					return;
				}	
			}
			
			if( value.length > 0 && field.getAttribute("fieldType") == 'integer' )
			{
				if( !CMS.checkInteger(value) )
				{
					alert("Le champ " + field.getAttribute("caption") + " n'est pas un nombre entier");
					field.focus();
					return;
				}	
			}
			
			if( value.length > 0 && field.getAttribute("fieldType") == 'date' )
			{
				if( !CMS.checkDate(value) )
				{
					alert("Le champ " + field.getAttribute("caption") + " n'est pas au bon format (jj/mm/aaaa)");
					field.focus();
					return;
				}	
			}
			
			if( value.length > 0 && field.getAttribute("fieldType") == 'email' )
			{
				var separ = null;
				
				if( value.indexOf(',') )
				{
					separ = ',';
				}
				else if( value.indexOf(';') )
				{
					separ = ';';
				}
				
				if( separ != null )
				{
					var mails = value.split(separ);
					
					for(var j = 0; i < mails.length ; j ++ )
					{
						var v = Valraiso.util.trim(mails[j]);
						
						if( !Valraiso.util.checkEmail(v)  )
						{
							alert("Adresse Email " + v + " incorrecte pour le champ " + field.getAttribute("caption"));
							field.focus();
							return;
						}	
					}
				}
				else
				{
					if( !Valraiso.util.checkEmail(value)  )
					{
						alert("Adresse Email incorrecte pour le champ " + field.getAttribute("caption"));
						field.focus();
						return;
					}	
				}
			}
		}	
		
		//recherche et envoi des champs File
		for( var i = 0; i < CMS.fields.length ; i ++ )
		{
			var field = CMS.fields[i];
			
			if( field.selfclassName != 'Bw.Widgets.Filefield' )
			{
				continue;
			}
			
			// si le champ n'a pas été envoyé on l'envoie !
			if( ! field.sent )
			{
				CMS.showLoading();
				
				if( field.send( function(){ CMS.sendForm() } ) )
				{
					// si l'envoi est bien parti on sors de la methode,
					// afin d'etre rappelé par le Bw file qd il aura fini d'envoyer le fichier
					return;
				}
				
				// si l'envoi n'est pas parti (champ file vide), on continue
			}
	
			if( field.getAttribute("mandatory") == 'true' && field.getValue() == '' )
			{
				CMS.hideLoading();
				alert("Le champ " + field.getAttribute("caption") + " est obligatoire");
				field.focus();
				return;
			}	
			
			var value = field.getValue();
			data.properties[field.getAttribute("name")] = value;
			
			if( field.mustDelete != null )
			{
				data.properties[field.getAttribute("name") + "_delete"] = field.mustDelete;		
			}
			
			if( field.modified )
			{
				data.properties[field.getAttribute("name") + "_modified"] = "true";
			}
		}	
		
		// parcours des champs pour stocker leur valeur
		for( var i = CMS.fields.length - 1 ; i >= 0; i -- )
		{
			var field = CMS.fields[i];
			
			var value = field.getValue();
			
			if( field.selfclassName == 'Bw.Widgets.Datefield' )
			{
				value = field.field.getValue();
			}
			
			if( field.selfclassName == 'Bw.Widgets.Checkbox' )
			{
				value = ( field.getValue() ) ? "1" : "0";
			}
			
			data.properties[field.getAttribute("name")] = (value != null ) ? value : "";
			
			if( field.getValue() != null && field.getValue().length > 0 && field.getAttribute("labelfield") != null && field.getAttribute("labelfield").length > 0 )
			{
				var labelField = data.properties[field.getAttribute("name") + "_label"];
				
				if( labelField == null || labelField.length == 0 )
				{
					CMS.hideLoading();
					alert("Merci de spécifier le champ " + field.getAttribute("labelfield"));
					field.focus();
					return;
				}
			}	
		}	
		
		data.properties["action"] = action;
		data.properties["publiName"] = CMS.publiName;
		
		var languageSelector = document.getElementById('formLanguage');
		
		if( languageSelector != null )
		{
			data.properties["language"] = languageSelector.getValue();
		}
	
		if( action == 'update' )
		{
			var list = document.getElementById('list_' + CMS.currentTab);
			var selection = list.getSelection();
			
			if( selection.length == 0 )
			{
				CMS.hideLoading();
				return;	
			}
			
			data.properties["ident"] = selection[0].value;
		}
		
		for(n in CMS.parameters)
		{
			if( data.properties[n] == null )
			{
				data.properties[n] = CMS.parameters[n];	
			}
		}
		
		CMS.beforeSend();
		
		// envoie des donnees
		var q = Bw.IO.Query.create();
		q.setHeader ("content-type", "application/x-www-form-urlencoded");
		q.setNoCache();
		var url  = CMS.uploadFormURL;
		
		setTimeout(function() { q.post( url, data.toString(), function() { CMS.sendResponse(q) } ); } , 10);
	},
	
	showLoading: function()
	{
		var l = document.getElementById('formLoading');
		
		l.style.visibility = "visible";	
		
		CMS.disableFormButtons();
	},
	
	hideLoading: function()
	{
		var l = document.getElementById('formLoading');
		
		l.style.visibility = "hidden";
		
		CMS.enableFormButtons();
	},
	
	
	/**
	 * Callback de l'envoi du formulaire
	 */
	sendResponse: function(q)
	{
		var error = true;
		var msg = q.getMessage();
		
		var result = msg.getNode("/response/result");
		
		CMS.hideLoading();
		
		
		if( result != null )
		{
			result = Bw.Xml.Helpers.getNodeValue(result);
			
			if( result == 'ok' )
			{
				error = false;
			}
		}
		
		if( error )
		{
			alert("Une erreur s'est produite pendant l'envoi de votre formulaire");
			return;	
		}
		
		CMS.hideForm();
		
		CMS.reloadList('list_' + CMS.currentTab);
	},
	
	loadFormContent: function()
	{
		var templateURL = CMS.FormTemplateURL + "?fields=true&name=" + CMS.publiName;
		
		var q = Bw.IO.Query.create();
		q.setNoCache();
		q.get(templateURL);
		
		EL('cmsForm').innerHTML = q.getText();
		
		CMS.formContent = EL('cmsForm').innerHTML;
	},
	
	/**
	 * Mode création
	 */
	create: function()
	{
		FCKeditor_OnComplete = function() {};
		
		CMS.loadFormContent();
		
		CMS.showForm();
		
		action = "create";
		
		for( var i = 0; i < CMS.fields.length ; i ++ )
		{
			var field = CMS.fields[i];
			
			var value = "";
			
			if( field.getAttribute("value") != null )
			{
				value = field.getAttribute("value");	
			}
			
			field.setValue(value);
		}
		
		var languageSelector = document.getElementById('listLanguage');
		
		if( languageSelector != null )
		{
			var lang = document.getElementById('formLanguage');
			
			if( lang != null )
			{
				lang.setValue(languageSelector.getValue());
			}
		}
		
		CMS.onCreate();
	},
	
	/**
	 * Mode édition
	 */
	edit: function(url, pubName, tableName, language, noloadform)
	{
		FCKeditor_OnComplete = function() {};
		
		CMS.publiName = pubName;
		action = "update";
	
		var list = document.getElementById('list_' + CMS.currentTab);
		
		if( !noloadform) CMS.loadFormContent();
		
		var selection = list.getSelection();
		
		if( selection.length == 0 )
		{
			return;	
		}
		
		var id = selection[0].value;
	
		url += "?action=get&ident=" + id + "&name=" + CMS.publiName;
		
		var dontShow = ( language != null );
	
		if( language == null)
		{
			language = CMS.getListLanguage();
		}
	
		if( language != null )
		{
			url += "&language=" + language;
		}
	
		var q = Bw.IO.Query.create();
		q.setNoCache();
		q.get(url, function() { CMS.editResponse(q, CMS.publiName, tableName, dontShow) } );
	},
	
	
	/**
	 * Callback du mode édition : une fois que les données sont chargées, on affiche le formulaire avec les valeurs
	 */
	editResponse: function(q, publiName, tableName, dontShow)
	{
		var msg = q.getMessage();
		
		if( !dontShow )
		{
			CMS.showForm();
		}
	
		setTimeout
		(
			function()
			{
				for( var i = 0; i < CMS.fields.length ; i ++ )
				{
					var field = CMS.fields[i];
	
					var value = CMS.msg_getNodeValue( msg, "/docs/doc/" + field.getAttribute("name") );
					
					if( (value == null || value.length == 0) && field.getAttribute("value") != null )
					{
						value = field.getAttribute("value");	
					}
					
					field.setValue(value);
				}	
	
				if( tableName != null )
				{
					var language = CMS.msg_getNodeValue( msg, "/docs/doc/" + tableName + ".languageid" );
	
					if( language != null )
					{
						var languageSelector = document.getElementById('formLanguage');
						languageSelector.setValue(language);
					}
				}
				
				CMS.onEdit();
			}
			, 300
		);
		
		
		
	},
	
	/**
	 * Change le statut d'un document
	 */
	changeStatus: function(status, newStatus)
	{
		var list = document.getElementById('list_' + status);
		
		var selection = list.getSelection();
		
		if( selection.length == 0 )
		{
			return;	
		}
		
		var id = selection[0].value;
		
		var url = CMS.uploadFormURL + "?publiName=" + CMS.publiName + "&action=status&ident=" + id + "&to=" + newStatus;
		
		var q = Bw.IO.Query.create();
		q.setNoCache();
		q.get(url, function() { CMS.changeStatusResponse(q, status, newStatus, CMS.publiName) } );
	},
	
	/**
	 * Callback du changement de statut
	 */
	changeStatusResponse: function(q, status, newStatus, publiName)
	{
		var error = true;
		
		var msg = q.getMessage();
		
		var result = msg.getNode("/response/result");
		
		if( result != null )
		{
			result = Bw.Xml.Helpers.getNodeValue(result);
			
			if( result == 'ok' )
			{
				error = false;
			}
		}
		
		if( error )
		{
			alert("Une erreur s'est produite pendant le changement de status");
			return;	
		}
		
		var list = document.getElementById('list_' + status);
		list.removeSelection();
	
		CMS.manageButtons();
	},
	
	/**
	 * Suppression d'un document
	 */
	remove: function()
	{
		var list = document.getElementById('list_' + CMS.currentTab);
		
		var selection = list.getSelection();
		
		if( selection.length == 0 )
		{
			return;	
		}
		
		if( !confirm("Etes-vous certain de supprimer la ligne sélectionnée ?") )
		{
			return;	
		}
		
		var id = selection[0].value;
		
		var url = CMS.uploadFormURL + "?publiName=" + CMS.publiName + "&action=delete&ident=" + id;
	
		var q = Bw.IO.Query.create();
		q.setNoCache();
		q.get(url, function() { CMS.removeResponse(q, CMS.publiName) } );
	},
	
	/**
	 * Callback de la suppression
	 */
	removeResponse: function(q, publiName)
	{
		var error = true;
		
		var msg = q.getMessage();
		
		var result = msg.getNode("/response/result");
		
		if( result != null )
		{
			result = Bw.Xml.Helpers.getNodeValue(result);
			
			if( result == 'ok' )
			{
				error = false;
			}
		}
		
		if( error )
		{
			alert("Une erreur s'est produite pendant la suppression");
			return;	
		}
		
		var list = document.getElementById('list_' + CMS.currentTab);
		list.removeSelection();
		
		CMS.manageButtons();
	},
	
	/**
	 * Cache le formulaire
	 */
	hideForm: function()
	{
		var form = document.getElementById('cmsForm');
		//form.style.display = 'none';	
		
		if( CMS.formContent == null )
		{
			CMS.formContent = form.innerHTML;
		}
		
		form.innerHTML = "";
		form.hide();
		form.bootstrapped = false;
		
		CMS.showList();
	},
	
	hideList: function()
	{
		var list = document.getElementById('cmsList');
		list.style.display = 'none';
		
		var list = document.getElementById('buttons_' + CMS.currentTab);
		list.style.display = 'none';
	},
	
	showList: function()
	{
		var list = document.getElementById('cmsList');
		list.style.display = 'block';
		
		var list = document.getElementById('buttons_' + CMS.currentTab);
		list.style.display = 'block';
	},
	
	/**
	 * Montre le formulaire
	 */
	showForm: function()
	{
		var form = document.getElementById('cmsForm');
	
		if( CMS.formContent == null )
		{
			CMS.formContent = form.innerHTML;
		}
		else
		{
			form.innerHTML = CMS.formContent;
		}
		
		CMS.fields = [];
		CMS.lookupFields('formcontent');
	
		CMS.hideList();
		form.show();
		CMS.enableFormButtons();
	},
	
	msg_getNodeValue: function(msg, node)
	{
		var node = msg.getNode(node);
		
		if( node == null )
		{
			return null;	
		}
		
		return  Bw.Xml.Helpers.getNodeValue(node);
	},
	
	PostData: function ()
	{
		this.properties = {};
		this.toString = function ()
		{
			var s = '';
			for (name in this.properties)
			{
				if (s != '') s += '&';
				var value = this.properties[name];
				
				value = '' + value ;
				
				if( typeof value != 'string' )
				{
					continue;
				}	
				
				value = value.replace(/%/g, "%25");
				value = value.replace(/&/g, "%26");
				
				s += (name + '=' + value);
			}
			
			return s;
		};
	},
	
	/**
	 * Launch the callback 'func' when 'bw' is loaded
	 */
	launchWhenBWisLoaded: function( bw, func)
	{
		if( typeof bw == 'string' )
		{
			bw = document.getElementById(bw);		
		}
		
		if( !bw.selfclassName )
		{
			setTimeout( function() { CMS.launchWhenBWisLoaded( bw, func); }, 500);
			return;
		}
		
		func();
	},
	
	/**
	 * Affiche ou cache le contenu de la corbeille
	 */
	toggleTrash: function()
	{
		var div = document.getElementById('trashContainer');
		
		if( div.style.display == 'none' )
		{
			div.style.display = 'inline';
		}
		else
		{
			div.style.display = 'none';
		}
	},
	
	
	refreshTab: function()
	{
		var notebook = document.getElementById('notebook');
		
		if( notebook == null )
		{
			return;
		}
		
		var idx = notebook.selectedTab + 1;
	
		CMS.reloadList('list_' + idx);
		
		CMS.currentTab = idx;
		
		CMS.manageButtons();
	},
	
	getListLanguage: function()
	{
		var language = document.getElementById('listLanguage');
		
		if( language == null )
		{
			return null;
		}
		
		return language.getValue();
	},
	
	updateLanguage: function(value)
	{
		if( action != "update" )
		{
			return;
		}
		
		CMS.edit(CMS.xmlQueryURL, CMS.publiName, null, value, true );
	},
	
	onCreate: function()
	{
		
	},
	
	beforeSend: function()
	{
	
	},
	
	onEdit: function()
	{
		
	}
}

CMS.statusList["draft"]  = 1;
CMS.statusList["online"] = 2;
CMS.statusList["trash"]  = 3;
