application.widgetNames = {
	SIMPLETEXT : 'SimpleText',
	MULTIVALUEDSIMPLETEXT : 'MultiValuedSimpleText',
	MULTILINETEXT : 'MultiLineText',
	LEXIQUE : 'Lexique',
	EXCLUSIVELEXIQUE : 'ExclusiveLexique',
	TREE : 'Tree',
	DATE : 'Date',
	IMAGE : 'Image',
	STATE : 'State',
	CONTACT : 'Contact',
	GEOG : 'Geog',
	URLVALIDE : 'UrlValide',
	COMMUNE: 'Commune'
};

application.Widget = function(widgetName, columnRank) {
	
	this.widget = null;
	this.columnRank = columnRank;
	this.widgetName = widgetName;
	
	if (this.widgetName) {
		this.widget = "application.Widget." + widgetName;
	}
};

application.Widget.prototype = {
	getSmallValue: function(rowRank) {
		var value = eval(this.widget + ".getSmallValue(" + rowRank + "," + this.columnRank + ")");
		return (value == null) ? "" : value;
	},
	
	makeViewBox: function(rowRank) {
		var content = eval(this.widget + ".makeViewBox(" + rowRank + "," + this.columnRank + ")");
		$("#showBoxContent").html(content);
	},
	
	makeEditBox: function(rowRank) {
		var content = eval(this.widget + ".makeEditBox(" + rowRank + "," + this.columnRank + ")");
		$("#editBoxContent").html(content);
		
	},
	
	getValue: function(rowRank) {
		var value = eval(this.widget + ".getValue(" + rowRank + "," + this.columnRank + ")");
		return value;
	}
};

application.Widget.SimpleText = {
	getSmallValue: function(rowRank, columnRank) {
		var row = application.getRow(rowRank);
		var column = application.display.table.columnList[columnRank];
		
		return row.getValue(column.attributeName);
	},
	
	makeViewBox: function(rowRank, columnRank) {
		var value = application.display.table.getValue(rowRank, columnRank);
		return application.display.template.widget_drawTextView(value);
	},
	
	makeEditBox: function(rowRank, columnRank) {
		var value = application.display.table.getValue(rowRank, columnRank);
		return application.display.template.widget_drawSimpleTextEditor(value);
	},
	
	getValue: function(rowRank, columnRank) {
		return {value:$('#editorValue').val(), type:''};
	}
	
};

application.Widget.MultiValuedSimpleText = {
	getSmallValue: function(rowRank, columnRank) {
		var row = application.getRow(rowRank);
		var column = application.display.table.columnList[columnRank];
		
		var values = row.getValue(column.attributeName);
		if (typeof(values) == 'object' && values.length)
			return values[0];
		else if (typeof(values) == 'string')
			return values; 
		else
			return '';
	},
	
	makeViewBox: function(rowRank, columnRank) {
		var values = application.display.table.getValue(rowRank, columnRank);
		return application.display.template.widget_drawMultiValueView(values);
	},
	
	makeEditBox: function(rowRank, columnRank) {
		var values = application.display.table.getValue(rowRank, columnRank);
		return application.display.template.widget_drawMultiValuedSimpleTextEditor(values);
	},
	
	getValue: function(rowRank, columnRank) {
		var values = [];
		var i=0;
		while (document.getElementById('editorValue_' + i)) {
			var value = document.getElementById('editorValue_' + i).value;
			if (value && value.length > 0) 
				values.push(value);
			i++;
		}
		return {value:values, type:''};
	}
};

application.Widget.MultiLineText = {
	getSmallValue: function(rowRank, columnRank) {
		var row = application.getRow(rowRank);
		var column = application.display.table.columnList[columnRank];
		
		var value = '';
		if (row) {
			value = row.getValue(column.attributeName);
			if (!value) value = '';
			if (value.indexOf("\n") > 0)
				value = value.split("\n")[0];
		}
		return value;
	},
	
	makeViewBox: function(rowRank, columnRank) {
		var value = application.display.table.getValue(rowRank, columnRank);
		return application.display.template.widget_drawTextView(value);
	},
	
	makeEditBox: function(rowRank, columnRank) {
		var value = application.display.table.getValue(rowRank, columnRank);
		return application.display.template.widget_drawMultiLineTextEditor(value);
	},
	
	getValue: function(rowRank, columnRank) {
		return {value:$('#editorValue').val(), type:''};
	}
};

application.Widget.Lexique = {
	getSmallValue: function(rowRank, columnRank) {
		var row = application.getRow(rowRank);
		var column = application.display.table.columnList[columnRank];
		
		var values = [];
		if (row) {
			values = row.getValue(column.attributeName);
			if (!values) values = '';
			if (typeof(values) == 'object' && values.length && values.length > 1) //if array
				values = values[0];
		}
		return values;
	},
	
	makeViewBox: function(rowRank, columnRank) {
		var row = application.getRow(rowRank);
		var column = application.display.table.columnList[columnRank];
		
		if (row) {
			var values = row.getValue(column.attributeName);
			return application.display.template.widget_drawMultiValueView(values);
		}
		return '';
	},
	
	makeEditBox: function(rowRank, columnRank) {
		var values = application.display.table.getValue(rowRank, columnRank);
		var lexiqueValues = [{key:'',value:''}];
		
		var column = application.display.table.columnList[columnRank];
		if (column.lexiqueName) {
			var lexique = application.getLexique(column.lexiqueName);
			if (lexique) {
				lexiqueValues = lexique;
			}
		}
		
		return application.display.template.widget_drawLexiqueEditor(values,lexiqueValues);
	},
	
	getValue: function(rowRank, columnRank) {
		var keys = [];
		var values = [];
		var i=0;
		while (document.getElementById('editorValue_' + i)) {
			if (document.getElementById('editorValue_' + i).checked)
				keys.push(document.getElementById('editorValue_' + i).value);
			i++;
		}
		
		var column = application.display.table.columnList[columnRank];
		for (i=0; i<keys.length; i++) {
			var lexiqueEntry = application.getLexiqueItemFromKey(column.lexiqueName, keys[i]);
			values.push(lexiqueEntry.value);
		}
		
		return {value:values, type:''};
	}
};

application.Widget.ExclusiveLexique = {
	getSmallValue: function(rowRank, columnRank) {
		var row = application.getRow(rowRank);
		var column = application.display.table.columnList[columnRank];

		var value = row.getValue(column.attributeName);
		var valueToDisplay = value;

		var lexItem = application.getLexiqueItemFromKey(column.lexiqueName, value);
		if (lexItem && lexItem.value) {
			valueToDisplay = lexItem.value;
		}
		
		return valueToDisplay;
	},
	
	makeViewBox: function(rowRank, columnRank) {
		var value = application.display.table.getValue(rowRank, columnRank);
		var valueToDisplay = value;
		
		var column = application.display.table.columnList[columnRank];
		var lexItem = application.getLexiqueItemFromKey(column.lexiqueName, value);
		if (lexItem && lexItem.value) {
			valueToDisplay = lexItem.value;
		}
		
		return application.display.template.widget_drawTextView(valueToDisplay);
	},
	
	makeEditBox: function(rowRank, columnRank) {
		var value = application.display.table.getValue(rowRank, columnRank);

		var lexiqueValues = [{key:'',value:''}];
		
		var column = application.display.table.columnList[columnRank];
		if (column.lexiqueName) {
			var lexique = application.getLexique(column.lexiqueName);
			if (lexique) {
				lexiqueValues = lexique;
			}
		}

		return application.display.template.widget_drawExclusiveLexiqueEditor(value, lexiqueValues);
	},
	
	getValue: function(rowRank, columnRank) {
//		var keyValue = $('#editorValue').val();
//		
//		var column = application.display.table.columnList[columnRank];
//		
//		var lexiqueEntry = application.getLexiqueItemFromKey(column.lexiqueName, keyValue);
//		
//		return {value:lexiqueEntry.key, type:''};
		
		var values = [];
		var value = $('#editorValue').val();
		values.push(value);
		
		return {value:values, type:''};
		
	}
};

application.Widget.Tree = {
	getSmallValue: function(rowRank, columnRank) {
		var values = application.display.table.getValue(rowRank, columnRank);
		var displayValue = '';

		if (values) {
			if (typeof(values) == 'object' && values.length) //if array
				displayValue = values[0];
			else if (typeof(values) == 'string')
				displayValue = values;
		}
			
		if (displayValue.indexOf('/') > -1) {
			displayValue = displayValue.substr(displayValue.lastIndexOf('/')+1);
		}
		
		return displayValue;
	},
	
	makeViewBox: function(rowRank, columnRank) {
		var values = application.display.table.getValue(rowRank, columnRank);
		return application.display.template.widget_drawMultiValueView(values);
	},
	
	makeEditBox: function(rowRank, columnRank) {
		var values = application.display.table.getValue(rowRank, columnRank);
		var themeTree = application.getThemeTree();
		
		return application.display.template.widget_drawThemeTreeEditor(values, themeTree);
	},
	
	getValue: function(rowRank, columnRank) {
		var values = [];
		
		var selectedNodes = $.jstree._reference("#treeEditor").get_checked(null,true);
		for (var i=0; i<selectedNodes.length; i++) {
			var key = selectedNodes[i].id;
			var value = application.getThemePath(key);
			values.push(value);
		}
		
		return {value:values, type:''};
	}
};

application.Widget.Date = {
	getSmallValue: function(rowRank, columnRank) {
		var row = application.getRow(rowRank);
		var column = application.display.table.columnList[columnRank];
		
		var date = row.getDate().value;
		if (date) {
			var day = date.getDate();
			if (day < 10) day = "0" + day;
			var month = (date.getMonth()+1);
			if (month < 10) month = "0" + month;
			return day + "/" + month + "/" + date.getFullYear();
		} else
			return '';
	},
	
	makeViewBox: function(rowRank, columnRank) {
		var row = application.getRow(rowRank);
		var column = application.display.table.columnList[columnRank];
		if (row) {
			var date = row.getDate();
			return application.display.template.widget_drawDateView(date);
		}
		return '';
	},
	
	makeEditBox: function(rowRank, columnRank) {
		var date = application.display.table.getValue(rowRank, columnRank);

		var lexiqueValues = [{key:'',value:''}];
		
		var column = application.display.table.columnList[columnRank];
		if (column.lexiqueName) {
			var lexique = application.getLexique(column.lexiqueName);
			if (lexique) {
				lexiqueValues = lexique;
			}
		}

		return application.display.template.widget_drawDateEditor(date,lexiqueValues);
	},
	
	getValue: function(rowRank, columnRank) {
		var date = $("#dateEditor").datepicker("getDate");
		var type = $('#dateTypeEditor').val();
	
		return {value:date, type:type};
	}
};

application.Widget.Image = {
	getSmallValue: function(rowRank, columnRank) {
		var row = application.getRow(rowRank);
		var column = application.display.table.columnList[columnRank];
		
		var thumbUrl = row.getValue("thumbnailUrl");
		
		return application.display.template.widget_drawImageValue(thumbUrl);
		
	},
	
	makeViewBox: function(rowRank, columnRank) {
		var row = application.getRow(rowRank);
		var column = application.display.table.columnList[columnRank];
		
		var thumbUrl = row.getValue("thumbnailUrl");
		
		return application.display.template.widget_drawImageView(thumbUrl);
	},
	
	makeEditBox: function(rowRank, columnRank) {
		var row = application.getRow(rowRank);
		var metaId = row.getValue("id");
		return application.display.template.widget_drawImageEditor(metaId);
	},
	
	getValue: function(rowRank, columnRank) {
		return {value:$('#editorValue').val(), type:''};
	}
};

application.Widget.State = {
	getSmallValue: function(rowRank, columnRank) {
		var row = application.getRow(rowRank);
		var column = application.display.table.columnList[columnRank];
		
		var stateValue = row.data.state.value;
		var originValue = row.data.importSourceType.value;
		
		return application.display.template.widget_drawStateValue(stateValue, originValue);
	},
	
	makeViewBox: function(rowRank, columnRank) {
		//Nothing to do
	},
	
	makeEditBox: function(rowRank, columnRank) {
		//Nothing to do
	},
	
	getValue: function(rowRank, columnRank) {
		//Nothing to do
	}
};

application.Widget.Contact = {
	getSmallValue: function(rowRank, columnRank) {
		var row = application.getRow(rowRank);
		var contact = row.getContact();
		
		if (contact)
			return contact.value;
		else
			return '';
	},
	
	makeViewBox: function(rowRank, columnRank) {
		var row = application.getRow(rowRank);
		var column = application.display.table.columnList[columnRank];
		if (row) {
			var contact = row.getContact();
			return application.display.template.widget_drawContactView(contact);
		}
		return '';
	},
	
	makeEditBox: function(rowRank, columnRank) {
		var contact = application.display.table.getValue(rowRank, columnRank);

		var lexiqueValues = [{key:'',value:''}];
		
		var column = application.display.table.columnList[columnRank];
		if (column.lexiqueName) {
			var lexique = application.getLexique(column.lexiqueName);
			if (lexique) {
				lexiqueValues = lexique;
			}
		}

		return application.display.template.widget_drawContactEditor(contact,lexiqueValues);
	},
	
	getValue: function(rowRank, columnRank) {
		return {value:$('#editorValue').val(), type:$('#editorType').val()};
	}
};

application.Widget.Geog = {
	getSmallValue: function(rowRank, columnRank) {
		var values = application.display.table.getValue(rowRank, columnRank);
		var displayValue = '';

		if (values) {
			if (typeof(values) == 'object' && values.length) //if array
				displayValue = values[0];
			else if (typeof(values) == 'string')
				displayValue = values;
		}
			
		var lexiqueValue = application.getPlaceLabel(displayValue)
		if (lexiqueValue != '')
			displayValue = lexiqueValue;
		
		return displayValue;
	},
	
	makeViewBox: function(rowRank, columnRank) {
		var values = application.display.table.getValue(rowRank, columnRank);
		var displayValues = [];
		if (values) {
			for (var i=0; i<values.length; i++) {
				var newValue =  application.getPlaceLabel(values[i]);
				displayValues.push(newValue);
			}
		}
		return application.display.template.widget_drawMultiValueView(displayValues);
	},
	
	makeEditBox: function(rowRank, columnRank) {
		var values = application.display.table.getValue(rowRank, columnRank);
		var placeTree = application.getPlaceTree();
		
		return application.display.template.widget_drawPlaceTreeEditor(values, placeTree);
	},
	
	getValue: function(rowRank, columnRank) {
		var checked_ids = []; 
		
		$("#treeEditor").find(".jstree-checked").each(function(i, element){
			var selectedElement = $(element).attr("id");
			if (selectedElement) {
				checked_ids.push(selectedElement);
			}
		});
		
		return {value:checked_ids, type:''};
	}
};

application.Widget.UrlValide = {
	getSmallValue: function(rowRank, columnRank) {
		var isValide = application.display.table.getValue(rowRank, columnRank);
		return application.display.template.widget_drawValideValue(isValide);
	},
	
	makeViewBox: function(rowRank, columnRank) {
		//nothing to do
	},
	
	makeEditBox: function(rowRank, columnRank) {
		//nothing to do
	},
	
	getValue: function(rowRank, columnRank) {
		//nothing to do
	}
};

application.Widget.Commune = {
	getSmallValue: function(rowRank, columnRank) {
		var row = application.getRow(rowRank);
		var comName = row.getValue('nomCommune');
		var comCode = row.getValue('codeCommune');
		if (comName && comName.length > 0)
			return comName + " (" + comCode + ")";
		return "";
	},
	
	makeViewBox: function(rowRank, columnRank) {
		var row = application.getRow(rowRank);
		var comName = row.getValue('nomCommune');
		var comCode = row.getValue('codeCommune');
		var value = (comName && comName.length > 0) ? comName + " (" + comCode + ")" : "";
		
		return application.display.template.widget_drawTextView(value);
	},
	
	makeEditBox: function(rowRank, columnRank) {
		var row = application.getRow(rowRank);
		var comName = row.getValue('nomCommune');
		var comCode = row.getValue('codeCommune');
		
		return application.display.template.widget_drawCommuneEditor(comName, comCode, columnRank, rowRank);
	},
	
	getValue: function(rowRank, columnRank) {
		var content = $("#communeSelected").html();
		if (content) {
			var values = content.split(" - ");
			var row = application.getRow(rowRank);
			row.setValue('nomCommune',values[0]);
			return {value:values[1],type:''};
		}
		return null;
	}
};

