/**
 * hvs_utils.js version 1.0.0
 *
 * LIBRAIRIE DE FONCTIONS UTILITAIRES JAVASCRIPT HARVEST
 */

// Change la classe d'un élément
function changeClass(element, classToRemove, classToAdd) {
	element.removeClassName(classToRemove);
	element.addClassName(classToAdd);
}

var FormUtils = Class.create();

FormUtils.prototype = {
	initialize : function()
	{
	},
	/** Renvoir une liste d'éléments de formulaire compris dans les éléments du dom en entrée.
	 */
	getFormElements:function(formElementBlockList)
	{
		var formElList = new Array();
	
		for(i=0; i<formElementBlockList.length; i++)
		{
			blockEl = $(formElementBlockList[i]);

			if(blockEl == null)
			{
				alert("Bloc " + formElementBlockList[i] + " not found");
				return;
			}

			childList = blockEl.childNodes;

			elStack = new Array();

			if(childList)
			{
				elStack.push(blockEl);
			}

			while(elStack.length > 0)
			{
				blockEl = elStack.pop();

				childList = blockEl.childNodes;

				for(j=0; j<childList.length; j++)
				{
					childEl = childList[j];

					// Pour les boutons radio, gère les valeurs manuellement
					// si non sélectionné -> vide, sinon la valeur sélectionnée.
					if(childEl.type != undefined &&
						childEl.name && 
						childEl.name.length > 0 &&
						childEl.name != "")
					{
						formElList.push(childEl);
					}
					
					if(childEl.childNodes && childEl.childNodes.length > 0)
					{
						elStack.push(childEl);
					}
				}
			}
		}
		return formElList;
	}
}


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');
	}
}

function isVariableDefined(variable)
{
    return (typeof(window[variable]) == "undefined")?  false: true;
}

//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);
	}
}

/**
 * Cette fonction est un raccourci pour gï¿½rer un changement sur un ï¿½lï¿½ment. 
 * (touche clavier relachï¿½e)
 */
function $KeyUp(elt,myFunction)
{
	if ($(elt)!=null )
	{
		Event.observe($(elt) , 'keyup', myFunction);
	}
}

/**
 * Cette fonction est un raccourci pour gï¿½rer un changement sur un ï¿½lï¿½ment.
 */
function $Change(elt,myFunction)
{
	if ($(elt)!=null )
	{
		Event.observe($(elt) , 'change', myFunction);
	}
}

/**
 * Cette fonction permet de limiter le nombre de caractères d'une textarea
 */
function limitCaracters(evt,size)
{
    var element = Event.element(evt);
    if (element.value.length>size)
    {
        element.value = element.value.substring(0,size);
    }
}

/**
 * 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)
{
	Dialog.alert(description, {className: "harvest",  width:400, height:100, title:"Erreur", id: "erreur", okLabel:"OK"});
}

/**
 * Fonction chargï¿½e d'afficher un message d'avertissement
 */
function displayAvertissement(description)
{
	Dialog.alert(description, {className: "harvest",  width:400, height:100, title:"Avertissement", id: "avert", okLabel:"OK"});
}


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 lance la validation du formulaire puis déclenche la requète.
 * @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 validateAndSubmit(strFormId, options, msgMap, valideFctEx)
{
	checkDefaultFormController(strFormId);
	var msgError = hasErrorMessage(msgMap, valideFctEx);
	if (msgError!=null)
	{
		displayErrors(msgError);
		return;
	}
	getOavRequest().sendFormRequest(null, strFormId, options);
}

/**
 * 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,msgMap,valideFctEx)
{
	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;
	}

	//checkDefaultFormController(formId);
        
	$Click(compId, function()
	{
		/*var msgError = hasErrorMessage(msgMap,valideFctEx);
      if (msgError!=null)
      {
          displayErrors(msgError);
          return;
      }
        getOavRequest().sendFormRequest(null, strFormId, options);*/
	    validateAndSubmit(formId, options, msgMap, valideFctEx);
	}
);
}

function hasErrorMessage(msgMap,valideFctEx)
{
    strFormId = document.forms[0];
    if (msgMap)
        formCtrler.setMsgMap(msgMap);
    formCtrler.validate();
    formCtrler.setMsgMap();
    if (formCtrler.hasErrors())
    {
        errList = formCtrler.getErrors();
        return errList[0].getMessage();
    }
    else
    {
        if (valideFctEx!=null)
        {
            var returnMsg = valideFctEx();
            if (returnMsg!=null)
            {
                return returnMsg;
            }
        }
    }
    return null;
}

function checkDefaultFormController(formId,force)
{
    if (formCtrler==null || force)
    {
        if(!formId)
        {
            formIdToUse = document.forms[0];
        }
        else
        {
            formIdToUse = formId;
        }

        formCtrler = new FormController(formIdToUse);
    }
	return formCtrler;
}

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(document.forms.length == 0)
	{
		alert("The document do not have any form ");
		return;
	}                        

	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;
	}

	//checkDefaultFormController(formId);

	$Click(compId, function()
	{
		if(!formId)
		{
			strFormId = document.forms[0];
		}
		else
		{
			strFormId = formId;
		}
		/*if(msgMap)
                    formCtrler.setMsgMap(msgMap);
		formCtrler.validate();
                formCtrler.setMsgMap();*/
		getOavRequest().sendFormRequest(null, strFormId, options);
	}
);
}

function keyPressedAndSubmit(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;
	}

	//checkDefaultFormController(formId);

	$KeyUp(compId, function()
	{
		if(!formId)
		{
			strFormId = document.forms[0];
		}
		else
		{
			strFormId = formId;
		}
		//formCtrler.validate();
		getOavRequest().sendFormRequest(null, strFormId, options);
	}
);
}

function changeAndSubmit(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;
	}

	//checkDefaultFormController(formId);

	$Change(compId, function()
	{
		if(!formId)
		{
			strFormId = document.forms[0];
		}
		else
		{
			strFormId = formId;
		}
		//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(theForm);
	for (var i = 0; i < elements.length; i++)
	{
		element = $(elements[i]);
		if(element.name == elementName)
		{
			return element;
		}
	}
	return null;
}
