
/*
 * WebCT95
 *
 * Copyright (C) 2003 Conseil Général du Val d'Oise. All Rights
 * Reserved.
 *
 * Developed by IDEALX S.A.S. and Business Decision
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 * 02111-1307, USA.
 */
function ElementSeparator(data, parent) {
	this.data = data;
	this.parent = parent;
	this.printEdit = function () {
		return "";
	};
	this.save = function (form) {
	};
	this.getXml = function () {
		var xml = "";
		if (this.data.pos > 0) {
			xml += "</separator>";
		}
		xml += "<separator rendered=\"" + this.data.rendered + "\">" + "<label>" + parent.printCDATA(this.data.label) + "</label>";
		return xml;
	};
	this.show = function () {
		var content = "";
		if (this.data.pos > 0) {
			content += "</table></fieldset>";
		}
		content += "<fieldset><legend>" + this.data.label + "</legend>" + "<table>";
		return content;
	};
	this.validate = function () {
		this.data.validate = true;
		return this.data.validate;
	};
}

function ElementText(data, parent, validator) {
	this.data = data;
	this.parent = parent;
	this.validator = validator;
	this.printEdit = function () {
		var validator = {nothing:"aucun", mail:"mail", date:"date", integer:"nombre"};
		if (!this.data.size) {
			this.data.size = 0;
		}
		if (!this.data.maxlength) {
			this.data.maxlength = 0;
		}
		var content = "<tr><td class=\"" + parent.classCell + parent.line + "\" colspan=\"" + parent.COLSPAN + "\">" + "<table>" + parent.printRequired(this.data) + "<tr>" + "<td class=\"" + parent.classInput + "\">taille d'affichage : </td>" + "<td><input type=\"text\" name=\"size\" value=\"" + this.data.size + "\" size=\"3\" maxlength=\"3\" class=\"" + parent.classInput + "\"/></td>" + "<td class=\"" + parent.classInput + "\">taille maximale : </td>" + "<td><input type=\"text\" name=\"maxlength\" value=\"" + this.data.maxlength + "\" size=\"3\" maxlength=\"3\" class=\"" + parent.classInput + "\"/></td>" + "</tr>";
		if (!this.validator) {
			content += "<tr>" + "<td class=\"" + parent.classInput + "\">contr\xf4leurs de type : </td>" + "<td><select name=\"validator\" class=\"" + parent.classInput + "\">";
			for (var i in validator) {
				var selected = (this.data.validator == i) ? "selected" : "";
				content += "<option value=\"" + i + "\" " + selected + ">" + validator[i] + "</option>";
			}
			content += "</select></td>" + "</tr>";
		} else {
			content += "<input type=\"hidden\" name=\"validator\" value=\"" + this.validator + "\"/>";
		}
		content += "</table></td></tr>";
		return content;
	};
	this.save = function (form) {
		this.data.required = (form.required[0].checked) ? true : false;
	//	window.alert(this.data.alignment);
		this.data.size = form.size.value;
		this.data.maxlength = form.maxlength.value;
		this.data.validator = form.validator.value;
	};
	this.getXml = function () {
		parent.setName(this.data);
		var xml = "<input type=\"" + this.data.type + "\" name=\"" + this.data.name + "\" size=\"" + this.data.size + "\" maxlength=\"" + this.data.maxlength + "\"/>";
		xml += parent.getXmlProperty("validator", this.data.validator);
		xml += parent.getXmlValue(this.data);
		return parent.getXmlElement(xml, this.data);
	};
	this.show = function (editable, version) {
		var content = "<tr>" + "<td class=\"" + this.parent.styleClass.input + "\">" + this.data.label + " : </td>";
		var value = this.parent.getValue(this.data.values, version);
		if (!editable) {
			var bold = (value.id == version && version > 1) ? "formsbold" : "";
			content += "<td class=\"" + this.parent.styleClass.input + " " + bold + "\">" + myEscape(value.value) + "</td>";
		} else {
			content += "<td><input type=\"text\" id=\"" + this.data.name + "\" name=\"" + this.data.name + "\" " + "size=\"" + this.data.size + "\" maxlength=\"" + this.data.maxlength + "\" " + "value=\"" + myEscape(value.value) + "\" class=\"" + this.parent.styleClass.input + "\"/>";
			if (this.data.validator == "date") {
				content += " <a title=\"Afficher le calendrier\" href=\"#\" onclick=\"fShowTable('" + this.data.name + "');\">" + "<img src=\"/assets/common/img/calendar/c_b.gif\" border=\"0\" alt=\"\"/>" + "</a>";
			}
			content += "</td>";
		}
		content += "</tr>";
		return content;
	};
	this.validate = function () {
		this.data.validate = true;
		this.data.error = "";
		parent.required(this.data);
		if (this.data.error == "") {
			if (!this.data.required && !parent.getValue(this.data)) {
				return this.data.validate;
			}
			switch (this.data.validator) {
			  case "mail":
				if (!this.validateMail()) {
					this.data.error += "Le champ \"" + this.data.label + "\" n'est pas une adresse \xe9lectronique valide.\n";
				}
				break;
			  case "date":
				if (!this.validateDate()) {
					this.data.error += "Le champ \"" + this.data.label + "\" n'est pas une date.\n";
				}
				break;
			  case "integer":
				if (!this.validateInteger()) {
					this.data.error += "Le champ \"" + this.data.label + "\" n'est pas un nombre.";
				}
				break;
			}
		}
		if (this.data.error != "") {
			this.data.validate = false;
		}
		return this.data.validate;
	};
	this.validateMail = function () {
		return is_email(parent.getValue(this.data));
	};
	this.validateDate = function () {
		return validateDate(parent.getValue(this.data), "dd/MM/yyyy");
	};
	this.validateInteger = function () {
		return !isNaN(parent.getValue(this.data));
	};
	this.create = function (type) {
		if(type=="mail"){
			return {type:type, label:"Courriel", size:35, maxlength:100};
		}
		return {type:type, label:"", size:35, maxlength:100};
	};
}
function ElementTextarea(data, parent) {
	this.data = data;
	this.parent = parent;
	this.printEdit = function () {
		if (!this.data.cols) {
			this.data.cols = 0;
		}
		if (!this.data.rows) {
			this.data.rows = 0;
		}
		var content = "<tr><td class=\"" + parent.classCell + parent.line + "\" colspan=\"" + parent.COLSPAN + "\">" + "<table>" + parent.printRequired(this.data) + "<tr>" + "<td class=\"" + parent.classInput + "\">Nombre de colonnes : </td>" + "<td><input type=\"text\" name=\"cols\" value=\"" + this.data.cols + "\" size=\"3\" maxlength=\"3\" class=\"" + parent.classInput + "\"/></td>" + "<td class=\"" + parent.classInput + "\">Nombre de lignes : </td>" + "<td><input type=\"text\" name=\"rows\" value=\"" + this.data.rows + "\" size=\"3\" maxlength=\"3\" class=\"" + parent.classInput + "\"/></td>" + "</tr>" + "</table></td></tr>";
		return content;
	};
	this.save = function (form) {
		this.data.required = (form.required[0].checked) ? true : false;
		this.data.cols = form.cols.value;
		this.data.rows = form.rows.value;
	};
	this.getXml = function () {
		parent.setName(this.data);
		var xml = "<input type=\"textarea\" name=\"" + this.data.name + "\" cols=\"" + this.data.cols + "\" rows=\"" + this.data.rows + "\"/>";
		xml += parent.getXmlValue(this.data);
		return parent.getXmlElement(xml, this.data);
	};
	this.show = function (editable, version) {
		var content = "<tr>" + "<td class=\"" + this.parent.styleClass.input + "\">" + this.data.label + " : </td>";
		var value = this.parent.getValue(this.data.values, version);
		if (!editable) {
			var bold = (value.id == version && version > 1) ? "formsbold" : "";
			content += "<td class=\"" + this.parent.styleClass.input + " " + bold + "\">" + myEscape(value.value) + "</td>";
		} else {
			content += "<td><textarea name=\"" + this.data.name + "\" class=\"" + this.parent.styleClass.input + "\" " + "cols=\"" + this.data.cols + "\" rows=\"" + this.data.rows + "\">" + value.value + "</textarea></td>";
		}
		content += "</tr>";
		return content;
	};
	this.validate = function () {
		this.data.validate = true;
		this.data.error = "";
		parent.required(this.data);
		if (this.data.error != "") {
			this.data.validate = false;
		}
		return this.data.validate;
	};
	this.create = function () {
		return {type:"textarea", cols:40, rows:5};
	};
}
function ElementUpload(data, parent) {
	this.data = data;
	this.parent = parent;
	this.printEdit = function () {
		var content = "<tr><td class=\"" + parent.classCell + parent.line + "\" colspan=\"" + parent.COLSPAN + "\">" + "<table>" + parent.printRequired(this.data) + "</table></td></tr>";
		return content;
	};
	this.save = function (form) {
		this.data.required = (form.required[0].checked) ? true : false;
	};
	this.getXml = function () {
		parent.setName(this.data);
		var xml = "<input type=\"upload\" name=\"" + this.data.name + "\"/>";
		xml += parent.getXmlValue(this.data);
		return parent.getXmlElement(xml, this.data);
	};
	this.show = function (editable, version) {
		var content = "<tr>" + "<td class=\"" + this.parent.styleClass.input + "\">" + this.data.label + " : </td>";
		var value = this.parent.getValue(this.data.values, version);
		content += "<td class=\"" + this.parent.styleClass.input + "\">";
		if (value.value != "") {
			content += "<a href=\"/media/media" + value.value + "\" class=\"" + parent.styleClass.link + "on\" target=\"_blank\">" + "<img src=\"" + value.logo + "\" border=\"0\"/> ouvrir</a>";
		} else {
			content += "aucun fichier";
		}
		content += "</td>";
		content += "</tr>";
		return content;
	};
	this.validate = function () {
		this.data.validate = true;
		this.data.error = "";
		if (!parent.isInBO && this.data.values.length == 0) {
			parent.required(this.data);
		}
		if (this.data.error != "") {
			this.data.validate = false;
		}
		return this.data.validate;
	};
}




function ElementItems(data, parent) {
	this.data = data;
	this.parent = parent;
	this.printEdit = function () {
		var content = "<tr><td class=\"" + parent.classCell + parent.line + "\" colspan=\"" + parent.COLSPAN + "\">" + "<table>" + parent.printRequired(this.data) + "<tr>" + "<td class=\"" + parent.classInput + "\">Liste des valeurs : </td>" + "<td><div id=\"" + parent.label + ".items\">" + this.printTable() + "</div></td>" + "</tr>" + "</table></td></tr>";
		return content;
	};
	this.printTable = function () {
		var content = "<table class=\"" + parent.classTable + "\" width=\"100%\">" + "<tr><td class=\"" + parent.classHead + "\">libell\xe9</td>" + "<td class=\"" + parent.classHead + "\">par d\xe9faut</td>" + "<td class=\"" + parent.classHead + "\">position</td>" + "<td class=\"" + parent.classHead + "\">Action</td>" + "</tr>";
		var line = 1;
		var path = parent.label + ".data.elements[" + this.data.pos + "].control";
		if (!this.data.data) {
			this.data.data = new Array();
		}
		for (var i in this.data.data) {
			var data = this.data.data[i];
			var checked = (data.selected) ? "checked" : "";
			content += "<tr>";
			if (data.edit) {
				content += "<td class=\"" + parent.classCell + line + "\">" + "<input type=\"text\" name=\"itemLabel\" value=\"" + data.label + "\" class=\"" + parent.classInput + "\" maxlength=\"100\"/></td>";
			} else {
				content += "<td class=\"" + parent.classCell + line + "\">" + data.label + "</td>";
			}
			content += "<td class=\"" + parent.classCell + line + "\">" + "<input type=\"radio\" " + checked + " class=\"" + parent.classRadio + " name=\"itemDefault\" onclick=\"" + path + ".select(" + i + ")\"/>" + "</td>" + "<td class=\"" + parent.classCell + line + "\">";
			if (i < this.data.data.length - 1) {
				content += "<a href=\"#\" onclick=\"" + path + ".move(" + i + ",1);return false;\">" + "<img src=\"/assets/common/img/tridown.gif\" border=\"0\"/></a> ";
			}
			if (i > 0) {
				content += "<a href=\"#\" onclick=\"" + path + ".move(" + i + ",-1);return false;\">" + "<img src=\"/assets/common/img/triup.gif\" border=\"0\"/></a>";
			}
			content += "</td>";
			if (data.edit) {
				content += "<td class=\"" + parent.classCell + line + "\">" + "<a href=\"#\" onclick=\"" + path + ".valid(" + i + ");return false;\" class=\"" + parent.classLink + "\">Valider</a> " + "<a href=\"#\" onclick=\"" + path + ".suppress(" + i + ");return false;\" class=\"" + parent.classLink + "\">Supprimer</a> " + "</td>";
			} else {
				content += "<td class=\"" + parent.classCell + line + "\">" + "<a href=\"#\" onclick=\"" + path + ".edit(" + i + ");return false;\" class=\"" + parent.classLink + "\">Modifier</a> " + "<a href=\"#\" onclick=\"" + path + ".suppress(" + i + ");return false;\" class=\"" + parent.classLink + "\">Supprimer</a> " + "</td>";
			}
			content += "</tr>";
			line = line % 2 + 1;
		}
		var label = "";
		var value = "";
		if (this.pos >= 0) {
			var data = this.data.data[this.pos];
			label = data.label;
			value = data.value;
		}
		content += "<tr>" + "<td class=\"" + parent.classCell + line + "\"><input type=\"text\" name=\"labelItem\" value=\"" + label + "\" class=\"" + parent.classInput + "\" maxlength=\"100\"/></td>" + "<td class=\"" + parent.classCell + line + "\"><br/></td>" + "<td class=\"" + parent.classCell + line + "\"><br/></td>" + "<td class=\"" + parent.classCell + line + "\">" + "<a href=\"#\" onclick=\"" + path + ".saveItem();return false;\" class=\"" + parent.classLink + "\">Ajouter</a>" + "</td>" + "</tr>";
		content += "</table>";
		return content;
	};
	this.select = function (pos) {
		for (var i in this.data.data) {
			var selected = (i == pos) ? true : false;
			if (selected && this.data.data[i].selected) {
				selected = false;
			}
			this.data.data[i].selected = selected;
		}
		this.showTable();
	};
	this.edit = function (pos) {
		for (var i in this.data.data) {
			var selected = (i == pos) ? true : false;
			this.data.data[i].edit = selected;
		}
		this.showTable();
	};
	this.valid = function (pos) {
		var data = this.data.data[pos];
		var form = parent.getForm();
		data.label = form.itemLabel.value;
		data.value = form.itemLabel.value;
		data.edit = false;
		this.showTable();
	};
	this.suppress = function (pos) {
		for (var i = pos; i < this.data.data.length - 1; i++) {
			this.data.data[i] = this.data.data[i + 1];
		}
		this.data.data.length--;
		this.showTable();
	};
	this.move = function (pos, sens) {
		var tmp = this.data.data[pos];
		this.data.data[pos] = this.data.data[pos + sens];
		this.data.data[pos + sens] = tmp;
		this.showTable();
	};
	this.saveItem = function () {
		var form = parent.getForm();
		var data = this.data.data[this.pos];
		if (!data) {
			data = new Object();
			this.data.data[this.data.data.length] = data;
		}
		data.label = form.labelItem.value;
		data.value = form.labelItem.value;
		this.showTable();
	};
	this.showTable = function () {
		document.getElementById(parent.label + ".items").innerHTML = this.printTable();
	};
	this.save = function (form) {
		this.data.required = (form.required[0].checked) ? true : false;
		if(form.alignment != undefined)
			this.data.alignment = (form.alignment[0].checked) ? 'v' : 'h';
	};
	this.getXml = function () {
		parent.setName(this.data);
		var xml = "<input type=\"" + this.data.type + "\" name=\"" + this.data.name + "\">";
		for (var i in this.data.data) {
			var data = this.data.data[i];
			xml += this.getXmlData(data);
		}
		xml += "</input>";
		xml += this.getXmlValue();
		return parent.getXmlElement(xml, this.data);
	};
	this.getXmlData = function (data) {
		var def = (data.selected) ? "default=\"true\"" : "";
		return "<data " + def + ">" +parent.printCDATA( data.label) + "</data>";
	};
	this.getXmlValue = function () {
		var form = parent.getForm();
		var value = form[this.data.name];
		switch (this.data.type) {
		  case "select":
			return parent.getXmlValue(this.data);
		  case "radio":
		  case "checkbox":
			var tab = new Array();
			var last = null;
			var out = new Object();
			for (var i in this.data.values) {
				var tmp = this.data.values[i];
				out[tmp.id] = parent.printValue(tmp.value, tmp);
				last = tmp.value;
			}
			if (!value) {
				return out;
			}
			if (!value.length) {
				if (value.checked) {
					tab[tab.length] = value.value;
				}
			}
			for (var i = 0; i < value.length; i++) {
				if (value[i].checked) {
					tab[tab.length] = value[i].value;
				}
			}
			if (tab.length > 0 && last != tab.join(",")) {
				parent.edited = true;
				out[parent.parent.getVersionId()] = parent.printValue(tab.join(","));
			}
			return parent.printAllValues(out);
		}
	};
	this.getValue = function () {
		var form = parent.getForm();
		var value = form[this.data.name];
		if (!value) {
			return "";
		}
		switch (this.data.type) {
		  case "select":
			return parent.getXmlValue(this.data);
		  case "radio":
		  case "checkbox":
			var tab = new Array();
			if (!value.length) {
				if (value.checked) {
					tab[tab.length] = value.value;
				}
			}
			for (var i = 0; i < value.length; i++) {
				if (value[i].checked) {
					tab[tab.length] = value[i].value;
				}
			}
			return tab.join(",");
		}
	};
	this.show = function (editable, version) {
		switch (this.data.type) {
		  case "select":
			return this.showSelect(editable, version);
		  case "radio":
			return this.showRadioCheckbox(editable, version, "radio");
		  case "checkbox":
			return this.showRadioCheckbox(editable, version, "checkbox");
		}
	};
	this.showSelect = function (editable, version) {
		var content = "<tr>" + "<td class=\"" + this.parent.styleClass.input + "\">" + this.data.label + " : </td>";
		var value = this.parent.getValue(this.data.values, version);
		if (!editable) {
			var bold = (value.id == version && version > 1) ? "formsbold" : "";
			var tmp = "";
			for (var i in this.data.data) {
				if (this.data.data[i].value == value.value) {
					tmp = this.data.data[i].label;
				}
			}
			content += "<td class=\"" + this.parent.styleClass.input + " " + bold + "\">" + tmp + "</td>";
		} else {
			content += "<td><select name=\"" + this.data.name + "\" class=\"" + this.parent.styleClass.input + "\">";
			for (var i in this.data.data) {
				var data = this.data.data[i];
				var selected = (data.label == value.value) ? "selected" : "";
				content += "<option value=\"" + data.value + "\" " + selected + ">" + data.label + "</option>";
			}
			content += "</select></td>";
		}
		content += "</tr>";
		return content;
	};
	this.showRadioCheckbox = function (editable, version, type) {
		var content = "<tr>" + "<td class=\"" + this.parent.styleClass.input + "\">" + this.data.label + " : </td>";
		var value = this.parent.getValue(this.data.values, version);
		var tab = value.value.split(",");
		if (!editable) {
			var bold = (value.id == version && version > 1) ? "formsbold" : "";
			var tmp = "";
			for (var i in this.data.data) {
				if (contains(tab, this.data.data[i].value)) {
					tmp = this.data.data[i].label;
				}
			}
			content += "<td class=\"" + this.parent.styleClass.input + " " + bold + "\">" + tmp + "</td>";
		} else {
			content += "<td class=\"" + this.parent.styleClass.input + "\">";
			for (var i in this.data.data) {
				var data = this.data.data[i];
				var checked = (contains(tab, data.value)) ? "checked" : "";
				content += "<input type=\"" + type + "\" class=\"radio\" name=\"" + this.data.name + "\" value=\"" + data.value + "\" " + checked + "/>" + data.label + " ";
			}
			content += "</td>";
		}
		content += "</tr>";
		return content;
	};
	this.validate = function () {
		this.data.validate = true;
		this.data.error = "";
		parent.required(this.data, this.getValue());
		if (this.data.error != "") {
			this.data.validate = false;
		}
		return this.data.validate;
	};
}






function ElementInfo(data, parent) {
	this.data = data;
	this.parent = parent;
	this.printEdit = function () {
		if (!this.data.value) {
			this.data.value = "";
		}
		var content = "<tr><td class=\"" + parent.classCell + parent.line + "\" colspan=\"" + parent.COLSPAN + "\">" + "<table>" + "<tr>" + "<td class=\"" + parent.classInput + "\">Commentaire : </td>" + "<td><textarea name=\"value\" class=\"" + parent.classInput + "\" cols=\"30\" rows=\"5\">" + this.data.value + "</textarea></td>" + "</tr>" + "</table></td></tr>";
		return content;
	};
	this.save = function (form) {
		this.data.value = form.value.value;
	};
	this.getXml = function () {
		parent.setName(this.data);
		var xml = "<input type=\"info\" name=\"" + this.data.name + "\">" + parent.printCDATA(this.data.value) + "</input>";
		xml += parent.getXmlValue(this.data);
		return parent.getXmlElement(xml, this.data);
	};
	this.show = function (editable, version) {
		var content = "<tr>" + "<td class=\"" + this.parent.styleClass.input + "\">" + this.data.label + " : " + this.data.value + "</td>" + "</tr>";
		return content;
	};
	this.validate = function () {
		this.data.validate = true;
		this.data.error = "";
		return this.data.validate;
	};
}


