/**
 * LIBRAIRIE DE FONCTIONS UTILITAIRES JAVASCRIPT HARVEST
 */

var DEBUG_ENABLED = false;
/**
 * Fonction permettant d'afficher dans un div dédié (id=debug) un message.
 */
function debug(outputString)
{
  var dateC = new Date();
  var strDate = dateC.toString();

  if (DEBUG_ENABLED)
  {
	  // creation si le div debug n'existe pas
	  var debugDiv = $('debug');
	  if (!debugDiv)
	  {
		  debugDiv = document.createElement('div');
		  debugDiv.id = 'debug';
		  debugDiv.style.backgroundColor= '#CCDDCC';
		  debugDiv.style.overflow='auto';
		  debugDiv.style.left='0px';
		  debugDiv.style.top='0px';
		  debugDiv.style.width='500px';
		  debugDiv.style.height='400px';
		  var bodyElement = document.getElementsByTagName('body')[0];
		  bodyElement.appendChild(debugDiv);
		  $Click('debug', function(event){
			  	var elt = Event.element(event);
			  	if (elt)
			  	{
					  Element.hide(elt);
			  	}
			  }
			);
	  }

	  // insertion ds le doc

  		new Insertion.Bottom('debug',  '<br />' + strDate+' : '+ outputString );
		//Element.show('debug');
  }
}

//fonction pour IE afin de l'élément est éditable
function isSelectAllowed(evt)
{
	if(evt.srcElement.isContentEditable==true)
	{
		return true;
	}
	return false;
}

function getKeyCode(event)
{
	if(!event)
	{
		event = window.event;
	}
	return event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
}

/**
 * Modifie la valeur d'une input dans un formulaire.
 * Si l'input n'existe pas, la créé.
 */
function setFormParameter(formToUse, parameterName, inputType, parameterValue)
{
	var newHiddenInput = getFormElement(formToUse, parameterName);
	if(newHiddenInput == null)
	{
		newHiddenInput = document.createElement('input');
		newHiddenInput.setAttribute("type", inputType);
		newHiddenInput.name = parameterName;
		newHiddenInput.id = parameterName;
		formToUse.appendChild(newHiddenInput);
	}
	newHiddenInput.value = parameterValue;
}

/**
 * Cette fonction est un raccourci pour gérer un click souris sur un élément.
 */
function $Click(elt,myFunction)
{
	if ($(elt)!=null )
	{
		Event.observe($(elt) , 'click', myFunction);
	}
}

/**
 * Différentes extensions Harvest à la classe String
 */
Object.extend(
	String.prototype,
{
	/**
	 * LTrim: Returns a String containing a copy of a specified string without leading spaces
	 */
	leftTrim : function()
	{
		return this.replace(new RegExp("^[\\s]+", "gm"), "");
	},

	/**
	 * RTrim: Returns a String containing a copy of a specified string without trailing spaces
	 */
	rightTrim : function()
	{
		return( this.replace(new RegExp("[\\s]+$", "gm"), "") );
	},

	trim : function()
	{
		return this.rightTrim().leftTrim();
	},

	/**
	 * Returns true if this string begins with the prefix at the specified index
	 */
	startsWith : function(prefix, toffset)
	{
		var ta = this.toArray();
		var pa = prefix.toArray();

		toffset = (!toffset)?0:toffset;
		var to = toffset;
		var po = 0;
		var pc = prefix.length;

		// Note: toffset might be near -1>>>1.
		if((toffset < 0) || (toffset > this.length - pc))
		{
			return false;
		}
		while(--pc >= 0)
		{
			if(ta[to++] != pa[po++])
			{
		   	return false;
			}
		}
		return true;
	},

	/**
	 * Returns true if this string ends with suffix
	 */
	endsWith : function(suffix)
	{
		return this.startsWith(suffix, this.length - suffix.length);
	}
});

/**
 * Raccourci permettant d'ajouter un événement sur un element
 */
function addEvent(obj, evType, fn){
	Event.observe(obj, evType, fn, false);
}

/**
 * Raccourci permettant de supprimer un événement sur un element
 */
function removeEvent(obj, evType, fn, useCapture){
	Event.stopObserving(obj, evType, fn, useCapture);
}


/**
 * Fonction chargée d'afficher un message d'erreur
 */
function displayErrors(description)
{
	showMessageDialog("Erreur", description, "error");
}


var formCtrler;

/**
 * Méthode utilitaire pour pouvoir appeler une méthode d'une référence d'objet
 * dans certains cas.
 * Quand la méthode retournée est appellée, la méthode methodName est appelée
 * sur l'instance d'objet object.
 */
function createMethodReference(object, methodName)
{
	return function ()
	{
		object[methodName].apply(object, arguments);
	};
}

/**
 * Cette fonction pose un evt onClick sur le composant portant l'id 'compId'
 * Sur le click, il lance la validation  du formulaire puis déclenche la requête
 * (correspondant au form.action).
* @param compId Id du composant sur lequel on doit poser l'événement.
* @param formId Id du formulaire sur lequel on doit effectuer la validation (optionnel)
* Si ce paramètre n'est pas précisé, il prend la valeur du premier formulaire trouvé dans le document.
* @param options liste de paramètres complémentaires à transmettre lors de l'envoi de requête (optionnel).
 */
function validateOnClick(compId, formId, options, listenOnce)
{
	if(listenOnce)
	{
		var observers = Event.observers;
		var newObservers = new Array();

		for(var i=0; i<observers.length; i++)
		{
			var observerInfo = observers[i];
			if(observerInfo[0] != $(compId))
			{
				newObservers.push(observerInfo);
			}
			else
			{
				Event.stopObserving(compId, 'click', observerInfo[2]);
			}
		}
		Event.observers = newObservers;
	}

	if (formCtrler==null)
	{
		formCtrler	 = new FormController($('formulaire'));
	}

  $Click(compId, function()
  {
	  strFormId = document.forms[0];
		formCtrler.validate();
		if (/*formCtrler.isDirty()==true && */formCtrler.hasErrors())
		{
			errList = formCtrler.getErrors();
			var resultString = '';
			for (var  i=0;i<errList.length;i++)
			{
				resultString +=errList[i].getMessage()+'<br />';
			}
        	displayErrors(resultString);
		}
 		else
		{
			getOavRequest().sendFormRequest(null, strFormId, options);
		}
	}
	);
}

function stopObservingElement(compId)
{
	var observers = Event.observers;
	var newObservers = new Array();

	for(var i=0; i<observers.length; i++)
	{
		var observerInfo = observers[i];
		if(observerInfo[0] != $(compId))
		{
			newObservers.push(observerInfo);
		}
		else
		{
			Event.stopObserving(compId, 'click', observerInfo[2]);
		}
	}
	Event.observers = newObservers;
}

function clickAndSubmit(compId, formId, options, listenOnce)
{
	if(listenOnce)
	{
		var observers = Event.observers;
		var newObservers = new Array();

		for(var i=0; i<observers.length; i++)
		{
			var observerInfo = observers[i];
			if(observerInfo[0] != $(compId))
			{
				newObservers.push(observerInfo);
			}
			else
			{
				Event.stopObserving(compId, 'click', observerInfo[2]);
			}
		}
		Event.observers = newObservers;
	}

	if (formCtrler==null)
	{
		formCtrler	 = new FormController($('formulaire'));
	}

  $Click(compId, function()
  {
		strFormId = document.forms[0];
		formCtrler.validate();
		getOavRequest().sendFormRequest(null, strFormId, options);
	}
	);
}


/**
 * Code below taken from - http://www.evolt.org/article/document_body_doctype_switching_and_more/17/30655/
 *
 * Modified 4/22/04 to work with Opera/Moz (by webmaster at subimage dot com)
 *
 * Gets the full width/height because it's different for most browsers.
 */
/*function getViewportHeight() {
	if (window.innerHeight!=window.undefined) return window.innerHeight;
	if (document.compatMode=='CSS1Compat') return document.documentElement.clientHeight;
	if (document.body) return document.body.clientHeight;
	return window.undefined;
}
function getViewportWidth() {
	if (window.innerWidth!=window.undefined) return window.innerWidth;
	if (document.compatMode=='CSS1Compat') return document.documentElement.clientWidth;
	if (document.body) return document.body.clientWidth;
	return window.undefined;
}
*/

function getViewportWidth()
{
	if (window.innerWidth)
		return window.innerWidth;
	else if (document.documentElement && document.documentElement.clientWidth!=0)
			return document.documentElement.clientWidth;
	else if (document.body)
		return document.body.clientWidth;
	return 0;
}

function getViewportHeight()
{
	if (window.innerHeight)
	{
		return window.innerHeight;
	}
	else if (document.documentElement && document.documentElement.clientHeight!=0)
			return document.documentElement.clientHeight;
	else if (document.body)
		return document.body.clientHeight;
	return 0;
}

	/**
	 * Rend la largeur de la zone du document visible par l'utilisateur
	 */
	function getInnerDocumentWidth()
	{
		if (window.innerWidth)
			return window.innerWidth;
		else if (document.documentElement && document.documentElement.clientWidth!=0)
    			return document.documentElement.clientWidth;
		else if (document.body)
			return document.body.clientWidth;
		return 0;
	}

	/**
	 * Rend la hauteur de la zone du document visible par l'utilisateur
	 */
	function getInnerDocumentHeight()
	{
		if (window.innerHeight)
			return window.innerHeight;
		else if (document.documentElement && document.documentElement.clientHeight!=0)
    			return document.documentElement.clientHeight;
		else if (document.body)
			return document.body.clientHeight;
		return 0;
	}

	/**
	 * Rend l'abscisse de la zone visible dans le navigateur.
	 */
	function getViewportX()
	{
		var x;
		if (self.pageYOffset) // all except Explorer
		{
			x = self.pageXOffset;
		}
		else if (document.documentElement && document.documentElement.scrollTop)
		// Explorer 6 Strict
		{
			x = document.documentElement.scrollLeft;
		}
		else if (document.body) // all other Explorers
		{
			x = document.body.scrollLeft;
		}
		return x;
	}

	/**
	 * Rend l'ordonnée de la zone visible dans le navigateur.
	 */
	function getViewportY()
	{
		var y;
		if (document.documentElement && document.documentElement.scrollTop)
		// Explorer 6 Strict
		{
			y = document.documentElement.scrollTop;
		}
		else if (document.body) // all other Explorers
		{
			y = document.body.scrollTop;
		}
		return y;
	}

	/**
	 * Rend la chaine initiale si elle est valide sinon une valeur par défaut.
	 */
	function defaultStringValue(initialValue, defaultValue)
	{
		return (!initialValue)?defaultValue:initialValue;
	}

/**
 * Rend un élément du formulaire (une input, ...)
 */
function getFormElement(formToUse, elementName)
{
	var theForm = null;
	if(!formToUse)
	{
		theForm = document.forms[0];
	}
	else
	{
		theForm = formToUse;
	}

	if(!theForm)
	{
		return null;
	}

	var elements = Form.getElements(document.forms[0]);
	for (var i = 0; i < elements.length; i++)
	{
		element = $(elements[i]);
		if(element.name == elementName)
		{
			return element;
		}
	 }
	 return null;
}
