//**********************************************
//  Ajax Methods called to interfere with the DB
//**********************************************

//****************************************
//   Utility methods
//****************************************

var contextAppli   = "/itsourdate/";        //Need to add /itsourdate because of access under itsourdate/admin
var genericServlet = "invitation";
var genericService = "invitation?service=";

var ERROR_SERVICE_FAILURE = "La requête a échoué : erreur à l'exécution du service !";
var ERROR_NETWORK_FAILURE = "Problème réseau. L'opération a échoué !";
var ERROR_DISCONNECTED    = "Votre session a expiré, vous devez vous reconnecter.";

function getFirstElementValue(element, tagName)
//=============================================
{
  if( element )
  {
    var tag = element.getElementsByTagName(tagName);
    if( tag && tag.length > 0 && tag[0].firstChild )
    {
      return tag[0].firstChild.data;
    }
  }
  return '';
}

function createAndAppendXmlElement( tagName, text, parent, xmlDocument)
//=====================================================================
{
  if( text != "" )
  {
    var elem = xmlDocument.createElement(tagName);
    elem.appendChild( xmlDocument.createTextNode(text) );
		parent.appendChild(elem);
  }
}

function addRowToSortableTable(managerTable, tableId, rowIdPrefix, id, myData)
//============================================================================
{
	//=== create a new row 	<tr id="row_$dbid" onclick="managerTable.rowSelected(this);" onmouseover ="managerTable.rowRolledOver(this)">
	var newRow = document.createElement('tr');
	if (managerTable && id !='' ) {
    newRow.setAttribute('id', rowIdPrefix + id);
    newRow.onclick     = function(){ managerTable.rowSelected(this); };
    newRow.onmouseover = function(){ managerTable.rowRolledOver(this); };
    newRow.onmouseout = function(){ managerTable.rowLeaveMouseOver(this); };
  }
  
	var cell = new Array();
  for(var i=0; i<myData.length; i++)
	{
		cell[i] = document.createElement('td');
		
		var innerIndex = myData[i].indexOf("innerHTML|");
		if( innerIndex == -1 || innerIndex != 0 )
		  setTextContent( cell[i], myData[i] );
		else
		  cell[i].innerHTML = myData[i].substring(10, myData[i].length);  //10 is the length of "innerHTML|"
    
    newRow.appendChild( cell[i] );
	}
	
	//=== insert the row
	var theTable = document.getElementById(tableId);
	theTable.tBodies[0].appendChild(newRow);
	return newRow;
}

function setSizeOfTable(tableId, arrayOfSizes, unit)
//==================================================
{
	var firstRow = document.getElementById(tableId).tBodies[0].rows[0];
	//alert(firstRow)
	if( firstRow )
	{
    for(var i=0; i<arrayOfSizes.length; i++)
    {
    //alert( firstRow.cells[i].offsetWidth)
		  firstRow.cells[i].style.width = arrayOfSizes[i] + unit;
		//alert( firstRow.cells[i].offsetWidth)
    }
  }
}

function addFictifRowToSortableTable(tableId, arrayOfSizes, unit)
//===============================================================
{
	var newRow = document.createElement('tr');
	
	var theTable = document.getElementById(tableId);
	theTable.tBodies[0].appendChild(newRow);
	
	for(var i=0; i<arrayOfSizes.length; i++)
  {
    var cell = document.createElement('td');
    row.appendChild(cell);
		cell.style.width = arrayOfSizes[i] + unit;
  }
}

function fillTableFromAjax(loader, tableId, tagName, messageDiv, fillTable, managerTable, warningNotFound)
//========================================================================================================
{ 
  var theTableBody = document.getElementById(tableId).tBodies[0];

  //=== clear the tag table
  var nbRows = theTableBody.rows.length;
  for(var i=0; i<nbRows; i++)
    theTableBody.removeChild( theTableBody.rows[0] );

  //=== refill the table
  var xmlDoc = loader.req.responseXML.documentElement;
	
	var elemObj = xmlDoc.getElementsByTagName(tagName);
	var len = 0;
	if( elemObj )
    len = elemObj.length;
    
  if( len == 0 )
  {
    setTextContent( document.getElementById(messageDiv), warningNotFound);
  }
  else
  {
    var count = null;
    var elemNbRows =  xmlDoc.getElementsByTagName("nbRows");
    if( elemNbRows && elemNbRows[0] )
      count = parseInt( getFirstElementValue( elemNbRows[0], "count" ) );
      
    setTextContent( document.getElementById(messageDiv), "");
    fillTable(len, elemObj, managerTable, tableId, messageDiv, count);
  }
}

function executeAjax( requestUrl, execute, executeError)
//======================================================
{
	var loader = new Net.ContentLoader();
	loader.loadXMLDoc(requestUrl);

	if (loader.getStatus()) 	//request has been managed, look at its status
	{
		if( execute && execute != "" )  //may be "" when we need 3 arguements
      execute(loader);
		return loader;
	}
	else if( !loader.redirection )
	{
		if( loader.req.responseXML )
		{
			var errorTag = loader.req.responseXML.documentElement.getElementsByTagName("error");
      if( errorTag && errorTag.length >0 )
			{
				var errorText =errorTag[0].firstChild.data;
				if( errorText == "relog" )
				{
					alert(ERROR_DISCONNECTED);
					window.close();
				}
				else 
        {
          if( executeError )
            executeError(loader);
          else
            alert(ERROR_SERVICE_FAILURE);
				}
			}
		}
		else
			alert(ERROR_NETWORK_FAILURE);
			
		return loader;
	}
}

function postForm(requestURL, formName, callbackFunc)
//===================================================
{
  var formDescr = getFormContent(formName);

	//=== Update the database
	var loader = new Net.ContentLoader();
	
	//Use a POST method to post a form
	loader.saveXMLDoc(contextAppli + genericServlet, requestURL + formDescr, '', false);
	
  if (loader.getStatus()) 	//request has been managed, look at its status
  //=====================
	{
    if( callbackFunc )
      callbackFunc(loader);
		return true;
	}
	else if( !loader.redirection )
	{
		if( loader.req.responseXML )
		{
      if( loader.errorMnemo != "" )
      {
        if( callbackFunc )
          callbackFunc(loader);
        return true;
		  }
			if( loader.req.responseXML.documentElement.getElementsByTagName("error") &&
          loader.req.responseXML.documentElement.getElementsByTagName("error").length > 0 )
				alert(ERROR_SERVICE_FAILURE);
		}
		else
			alert(ERROR_NETWORK_FAILURE);
			
		return false;
	}
}

//****************************************
//   Generic Methods for form management
//****************************************

function ajaxFormUpdate(formName, serviceName, formDivName, buttonNumber, setFunction, clear)
//===========================================================================================
{
	var formDescr = getFormContent(formName);
	
	//=== Update the database
	
	var loader = new Net.ContentLoader();
	//Use a POST method to post a form
	loader.saveXMLDoc(genericServlet, "service=" + serviceName + "&" + formDescr);
	
  if (loader.getStatus()) 	//request has been managed, look at its status
  //======================
	{  	
		if( setFunction && setFunction != ' ')
			setFunction(loader);

		if( clear )
			clearFormContent(formName);
					
		if( formDivName != '' )
		{
			hide('closeButton' + buttonNumber);
			hide(formDivName);
			showInline('openButton' + buttonNumber);
		}
		return true;
	}
	else if( !loader.redirection )
	{
		if( loader.req.responseXML )
		{
      if( loader.errorMnemo != "" )
      {
        if( setFunction && setFunction != ' ')
          setFunction(loader);
        return true;
		  }
			if( loader.req.responseXML.documentElement.getElementsByTagName("error") )
				alert(ERROR_SERVICE_FAILURE);
		}
		else
			alert(ERROR_NETWORK_FAILURE);
			
		return false;
	}
}

function ajaxShowInForm(id, formName, serviceName, elementName, formDivName, buttonNumber, setFunction, extraData)
//================================================================================================================
{
	var loader = new Net.ContentLoader();
	loader.loadXMLDoc(genericService + serviceName +"&id=" + id);

	if (loader.getStatus()) 	//request has been managed, look at its status
	{  
		var xmlDoc=loader.req.responseXML.documentElement;
		var theElement = loader.req.responseXML.documentElement.getElementsByTagName(elementName)[0];
		setFormContent(formName, theElement);
		if( setFunction && setFunction != ' ')
			setFunction(loader, id, extraData);

		hide('openButton' + buttonNumber);
		show(formDivName);
		showInline('closeButton' + buttonNumber);
	}
	else if( !loader.redirection )
	{
		if( loader.req.responseXML )
		{
		  if( loader.req.responseXML.documentElement.getElementsByTagName("error") )
				alert(ERROR_SERVICE_FAILURE);
		}
		else
			alert(ERROR_NETWORK_FAILURE);
	}
}

//*********************************************
//   Generic Methods for form items management
//*********************************************

function ajaxGetElement(query)
//============================
{
	//=== Execute the query
	
	var loader = new Net.ContentLoader();
	loader.loadXMLDoc(query);

	if (loader.getStatus()) 	//request has been managed, look at its status
	{  	
		return loader.req.responseXML.documentElement;
	}
	else if( !loader.redirection )
	{
		if( loader.req.responseXML )
		{
			if( loader.req.responseXML.documentElement.getElementsByTagName("error") )
				alert(ERROR_SERVICE_FAILURE);
		}
		else
			alert(ERROR_NETWORK_FAILURE);
			
		return undefined;
	}
}
