function getValue(sWidgetName)
{
	var getValueFunction = getValueMap[sWidgetName];
	if(getValueFunction == null)
		return null;
	else
		return getValueFunction(sWidgetName);
}

function setValue(sWidgetName, sValue, sError, sState)
{
	var setValueFunction = setValueMap[sWidgetName];
	if(setValueFunction != null)
		setValueFunction(sWidgetName, sValue, sError != null && sError != "", sState);
	if(sError != null && sError != "")
		addError(sError);
}

function getSimpleInput(sWidgetName, sValue)
{
	var aWidget = lookupWidget(sWidgetName);
	return aWidget.value;
}

function setSimpleInput(sWidgetName, sValue, bError, sState)
{
  var aWidget = lookupWidget(sWidgetName);
	if(sValue != widgetValueMap[sWidgetName])
		aWidget.value = sValue;
    aWidget.disabled = sState != "active";
	if(bError)
	  aWidget.className = "form-widget-error";
    else if(aWidget.disabled)
      aWidget.className = "form-widget-disabled"; 
    else
	  aWidget.className = null;
    	
}

function setCalendarInput(sWidgetName, sValue, bError, sState)
{
	setSimpleInput(sWidgetName, sValue, bError, sState);
	var aButton = lookupWidget(sWidgetName + "_button");
	if(sState != "active")
		aButton.src = "resources/icons/calendar_disabled.gif";
	else
		aButton.src = "resources/icons/calendar.gif";
}

function getSimpleSelect(sWidgetName)
{
	var aWidget = lookupWidget(sWidgetName);
	for (var i = 0; i < aWidget.options.length; i++)
	    if(aWidget.options[i].selected)
	        return aWidget.options[i].value;
	return null;
}

function setSimpleSelect(sWidgetName, sValue, bError, sState)
{
	var aWidget = lookupWidget(sWidgetName);
	if(sValue != widgetValueMap[sWidgetName])
	  for (var i = 0; i < aWidget.options.length; i++)
        aWidget.options[i].selected = (aWidget.options[i].value == sValue);
    aWidget.disabled = sState != "active";
	if(bError)
	  aWidget.className = "form-widget-error";
    else if(aWidget.disabled)
      aWidget.className = "form-widget-disabled"; 
    else
		aWidget.className = null;
}

function getCheckboxInput(sWidgetName, sValue)
{
	var aWidget = lookupWidget(sWidgetName);
	return aWidget.checked;
}

function setCheckboxInput(sWidgetName, sValue, bError, sState)
{
    var aWidget = lookupWidget(sWidgetName);
	if(sValue != widgetValueMap[sWidgetName])
		if(sValue == 'true')
			aWidget.checked = true;
		else
			aWidget.checked = false;
    aWidget.disabled = sState != "active";
	if(bError)
	  aWidget.className = "form-widget-error";
    else if(aWidget.disabled)
      aWidget.className = "form-widget-disabled"; 
    else
	  aWidget.className = null;
}

function getMultiCheckboxInput(sWidgetName)
{
	var aWidget = lookupWidget(sWidgetName);
	var aInputs = aWidget.getElementsByTagName("input");
	var aValues = new Array();
	var count = 0;
	for (var i = 0; i < aInputs.length; i++)
	    if(aInputs[i].checked)
	        aValues[count++] = aInputs[i].value;
	return aValues;
}

function setMultiCheckboxInput(sWidgetName, aValues, bError, sState)
{
	var aWidget = lookupWidget(sWidgetName);
	var aInputs = aWidget.getElementsByTagName("input");
	if(!areArraysEqual(aValues, widgetValueMap[sWidgetName]))
	{
		var aIndex = indexArray(aValues);
		for (var i = 0; i < aInputs.length; i++)
		{
	        aInputs[i].checked = aIndex[aInputs[i].value];
	    	aInputs[i].disabled = sState != "active";
			if(bError)
				aInputs[i].className = "form-widget-error";
		    else if(aWidget.disabled)
		    	aInputs[i].className = "form-widget-disabled"; 
		    else
				aInputs[i].className = null;
		}
	}
}

function updateCallBack(aRequest)
{
    if (aRequest.readyState == 4)
    {
        if (aRequest.status == 200)
        {
			var sResponseText = aRequest.responseText;
			sResponseText = sResponseText.replace(/\r|\n|\r\n/g, "");
			sResponseText = sResponseText.replace(/\s\s\s*/g, "");
			eval(sResponseText);
		}
    }
}

function widgetChanged(sWidgetName)
{
    var aCommandWidget = lookupWidget("command");
    if(aCommandWidget == null)
    	return;
    	
    // Actualiser la map des valeur
    for(var sProperty in widgetValueMap)
		widgetValueMap[sProperty] = getValue(sProperty);
    
    // Envoyer au serveur
	var aRequest = getHttpRequest();
	if(aRequest == null)
		return;
	aRequest.onreadystatechange = function() { updateCallBack(aRequest); };
	var uri = "/update." + docid + ".xhtml?command=" + aCommandWidget.value + "&return-uri=update";
	var sQuery = "";
	if(sWidgetName != null)
	{
		var aValue = getValue(sWidgetName);
		if(aValue != null && aValue.constructor == Array)
			for(var i = 0; i < aValue.length; i++)
				sQuery += sWidgetName + "=" + escape(aValue[i]) + "&";
		else
			sQuery = sWidgetName + "=" + escape(aValue) + "&";		
	}
	sQuery += "widget=" + escape(sWidgetName) + "&";
	aRequest.open("POST", uri, true);
	aRequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
	aRequest.setRequestHeader('charset','ISO-8859-1');
	setTimeout(function() { aRequest.abort();}, 5000);
	aRequest.send(sQuery);
}

function lookupWidget(sWidgetName)
{
    if (document.getElementById)
        return document.getElementById(sWidgetName);
    else if (document.all)
        return document.all[sWidgetName];
}

function submitForm(element, name) {
    while(element != null && element.tagName != null && element.tagName.toLowerCase() != "form") {
        element = element.parentNode;
    }
   	lookupWidget("forms_submit_id").value = name;
    element.submit()
}

function indexArray(aArray)
{
	var aIndex = new Array();
	for(var i = 0; i < aArray.length; i++)
	{
		var sKey = aArray[i];
		if (aIndex[sKey]) 
			aIndex[sKey]++;
		else
			aIndex[sKey] = 1;
	}
	return aIndex;
}

function areArraysEqual(aArray1, aArray2)
 {
	if((!aArray1[0]) || (!aArray2[0]))
		return false;
	if(aArray1.length != aArray2.length)
		return false;
	var aIndex = indexArray(aArray1);
	for(var i = 0; i < aArray2.length; i++)
	{
		var sKey = aArray2[i];
		if (aIndex[sKey])
		{
			if (aIndex[sKey] == 0)
				return false;
			else
				aIndex[sKey]--;
		}
 		else 
			return false;
	}
	return true;
}


function getHttpRequest()
{
	if (window.XMLHttpRequest)
	    return new XMLHttpRequest();
	else if(window.ActiveXObject)
	{
        var XMLHTTP = ["Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
	    for (var i = 0; i < XMLHTTP.length; i++)
	        try
	        {
		        return new ActiveXObject(XMLHTTP[i]);
	        }
	        catch (aException)
	        {
	        }
	}
	else
		return null;		
}

function addError(sError)
{
}

function removeSelectedListEntry(widgetName) {
	var widget = lookupWidget(widgetName);
	var selectionWidget = lookupWidget(widgetName + "_selection");
	var i;
  	for (i = widget.length - 1; i >= 0; i--) {
    	if (widget.options[i].selected) {
    		// add option to selection combobox
    		var newOption = document.createElement('option');
    		newOption.text = widget.options[i].text;
    		newOption.value = widget.options[i].value;
    		try {
    			selectionWidget.add(newOption, null);
    		} catch(exception) {
    			// hack for IE
    			selectionWidget.add(newOption);
    		}
    		
		  	// remove coresponding hidden input
		  	var input = lookupWidget(widgetName + '|' + widget.options[i].value);
		  	input.parentNode.removeChild(input);
		  	
    		// remove option from multivalue list
      		widget.remove(i);
    	}
  	}
}

function addSelectedListEntry(widgetName) {
	var widget = lookupWidget(widgetName);
	var selectionWidget = lookupWidget(widgetName + "_selection");
	var i;
  	for (i = selectionWidget.length - 1; i >= 0; i--) {
    	if (selectionWidget.options[i].selected) {
    		// add option to multivalue list
    		var newOption = document.createElement('option');
    		newOption.text = selectionWidget.options[i].text;
    		newOption.value = selectionWidget.options[i].value;
    		try {
    			widget.add(newOption, null);
    		} catch(exception) {
    			// hack for IE
    			widget.add(newOption);
    		}
    		
		  	// add coresponding hidden input
		  	var input = document.createElement("input");
		  	input.setAttribute("type", "hidden");
		  	input.setAttribute("name", widgetName);
		  	input.setAttribute("value", selectionWidget.options[i].value);
		  	input.setAttribute("id", widgetName + "|" + selectionWidget.options[i].value);
		  	lookupWidget(widgetName + "_values").appendChild(input);
		  	
    		// remove option from selection combobox
      		selectionWidget.remove(i);
      		
      		break;
    	}
  	}
}