/**
 *	utils pour DOM
 *	static object 
 *	mainly borrowed from xajax library
 *
 *
 **/    
 
 
 //  shorthand for document.getElementById()
// SONILOG: Fonction $ du dom.js que l'on n'utilise plus car on utilise celle de scriptaculous
/*function $_dom(sId) {
	return (sId) ? document.getElementById(sId) : null;
}*/


function $C(elType) {
  return document.createElement(elType);
}

// ========================================================
	this.setVar = function(name, value){
		this.vars[name] = Array(value, false);
	}
	
	this.encVar = function(name, value, returnvars){
		if(true == returnvars){
			return Array(encodeURIComponent(name), encodeURIComponent(value));
		} else {
			this.vars[encodeURIComponent(name)] = Array(encodeURIComponent(value), true);
		}
	}
	
	this.processURLString = function(string, encode){
		varArray = string.split('&');
		for (i = 0; i < varArray.length; i++){
			urlVars = varArray[i].split('=');
			if (urlVars[0].indexOf('amp;') != -1){
				urlVars[0] = urlVars[0].substring(4);
			}
			if (true == encode){
				this.encVar(urlVars[0],urlVars[1]);
			} else {
				this.setVar(urlVars[0],urlVars[1]);
			}
		}
	}
	
	this.createURLString = function(urlstring){ // near done! 
		var timeval = new Date().getTime();
		
		if (this.encodeURIString && this.URLString){
			this.processURLString(this.URLString, true);
		}
		if (urlstring){
			if (this.URLString.length){
				this.URLString = this.URLString + "&" + urlstring; 
			} else {
				this.URLString = urlstring; 
			}
		}

		this.setVar("rndval", timeval); //prevents caching of URLString.

		for (key in this.vars){ //First Loop: Vars are encoded if needed.
    			if (false == this.vars[key][1] && true == this.encodeURIString){
				var encoded = this.encVar(key, this.vars[key][0], true);
				delete this.vars[key];
				this.vars[encoded[0]] = Array(encoded[1], true);
    			}
		}
		var i = 0;
		for (key in this.vars){ //Second Loop: Creates URLString from vars.
			if (i != 0){
    				this.URLString += "&" + key + "=" + this.vars[key][0];
    			} else {
    				this.URLString += key + "=" + this.vars[key][0];
    			}
    			i++;
		}
	}
	
	this.runResponse = function(){
		eval(this.response);
	}






var dom = {

// ======================== EVENTS ======================	
	
/* Retrieves the target element for some event (useful when bubbling).
 This function is not actually very useful, but it's legacy from the old calendar code.
 @param ev [Event] the event object.
 @return [HTMLElement] window.event.srcElement for MSIE, ev.target for other browsers.
*/
 getTargetElement : function(ev) {
 	return (ev.target) ? ev.target : window.event.srcElement
 },

/// Stops bubbling and propagation of some event.
/// @param ev [Event] the event object
/// @return false
 stopEvent : function(ev) {
	ev || (ev = window.event);
	if (ev.preventDefault) {
		ev.preventDefault();
		ev.stopPropagation();
	}else {
		ev.cancelBubble = true;
		ev.returnValue = false;
	}
	return false;
 },

/* Adds an event handler to a certain element.  This function adds a handler
	using the DOM2 addEventListener (or attachEvent for MSIE).  Doing this
	means that you can add multiple handlers for the same element and same
	event name, and they will be called in order.

	WARNING: for really old browsers that don't support attachEvent nor
	addEventListener, it falls back to the default way: el.onclick = func.
	This means that you CANNOT add multiple handlers in those browsers, as a
	new one will override the old one.

	@param el [HTMLElement] reference to the element.
	@param evname [string] the event name, excluding the "on" prefix.
	@param func event handler function.
*/
 	addHandler : function(el, evname, func) {
	 if (el.addEventListener) el.addEventListener(evname, func, false); //  W3C
	 else if (el.attachEvent) el.attachEvent("on" + evname, func); // IE
	 else el["on" + evname] = func; // OLD
 	},

// Removes an event handler.  The prototype scheme is the same.
	removeHandler : function(el, evname, func) {
		if (el.removeEventListener) el.removeEventListener(evname, func, false); // W3C
		else if (el.detachEvent) el.detachEvent("on" + evname, func); // IE
		else el["on" + evname] = null;
	},
	
// ================== Dom object manipulation ==============	

// dom.include(sFileName) dynamically includes an external javascript file
	include : function(sFileName){
		var objHead = document.getElementsByTagName('head');
		var objScript = $C('script');
		objScript.type = 'text/javascript';
		objScript.src = sFileName;
		objHead[0].appendChild(objScript);
	},
	
// dom.create creates a new child node under a parent
	create : function(sParentId, sTag, sId) {
		var objParent = $(sParentId);
		objElement = $C(sTag);
		objElement.setAttribute('id',sId);
		objParent.appendChild(objElement);
	},

// dom.insert inserts a new node before another node
	insert : function(sBeforeId, sTag, sId) {
		var objSibling = $(sBeforeId);
		objElement = $C(sTag);
		objElement.setAttribute('id',sId);
		objSibling.parentNode.insertBefore(objElement, objSibling);
	},
	
// récupère une référence sur un élément possédant une classe
	getElementsByClassName : function (classname) {
    var a = [];
    var re = new RegExp('\\b' + classname + '\\b');
    var els = document.getElementsByTagName("*");
    for(var i=0,j=els.length; i<j; i++)
        if(re.test(els[i].className))a.push(els[i]);
    return a;
},
	
	/*
	create an input object and return a reference to it.
	do not insert this element in document
	
	*/
	getInput : function(sType, sName, sId)	{
		var Obj;
		if (sType == "radio" && !window.addEventListener)
		{
			Obj = $C('<input type="radio" id="'+sId+'" name="'+sName+'">');
		}
		else
		{
			Obj = $C('input');
			Obj.setAttribute('type',sType);
			Obj.setAttribute('name',sName);
			Obj.setAttribute('id',sId);
		}
		return Obj;
	},
	
 /* dom.createInput creates a new input node under a parent
 
 */
	createInput : function(sParentId, sType, sName, sId)
	{
		var objParent = $(sParentId);
		var objElement = this.getInput(sType, sName, sId);
		objParent.appendChild(objElement);
	},
	
/* xajax.insertInput creates a new input node before another node

*/
	insertInput : function(sBeforeId, sType, sName, sId) {
		var objSibling = $(sBeforeId);
		var objElement = this.getInput(sType, sName, sId);
		objSibling.parentNode.insertBefore(objElement, objSibling);
	},
	
/* dom.remove deletes an element

*/
	remove : function(sId)	{
		objElement = $(sId);
		if (objElement.parentNode && objElement.parentNode.removeChild)
		{
			objElement.parentNode.removeChild(objElement);
		}
	},
	
/* xajax.replace searches for text in an attribute of an element and replaces it
   with a different text
*/
	replace : function(sId,sAttribute,sSearch,sReplace)	{
		var bFunction = false;
		
		if (sAttribute == "innerHTML")
			sSearch = this.getBrowserHTML(sSearch);
		
		eval("var txt=document.getElementById('"+sId+"')."+sAttribute);
		if (typeof txt == "function")
        {
            txt = txt.toString();
            bFunction = true;
        }
		if (txt.indexOf(sSearch)>-1)
		{
			var newTxt = '';
			while (txt.indexOf(sSearch) > -1)
			{
				x = txt.indexOf(sSearch)+sSearch.length+1;
				newTxt += txt.substr(0,x).replace(sSearch,sReplace);
				txt = txt.substr(x,txt.length-x);
			}
			newTxt += txt;
			if (bFunction)
			{
				eval("newTxt =" + newTxt); 
				eval('$("'+sId+'").'+sAttribute+'=newTxt;');
			}
			else if (this.willChange(sId,sAttribute,newTxt))
			{
				eval('$("'+sId+'").'+sAttribute+'=newTxt;');
			}
		}
	},
	
/* 	xajax.getFormValues() 
	builds a query string XML message from the elements of a form object
*/
	getFormValues : function(frm) {
		var objForm;
		var submitDisabledElements = false;
		if (arguments.length > 1 && arguments[1] == true)
			submitDisabledElements = true;
		
		if (typeof(frm) == "string")
			objForm = $(frm);
		else
			objForm = frm;
		var sXml = "<xjxquery><q>";
		if (objForm && objForm.tagName == 'FORM')
		{
			var formElements = objForm.elements;
			for( var i=0; i < formElements.length; i++)
			{
				if (formElements[i].type && (formElements[i].type == 'radio' || formElements[i].type == 'checkbox') && formElements[i].checked == false)
					continue;
				if (formElements[i].disabled && formElements[i].disabled == true && submitDisabledElements == false) continue;
				var name = formElements[i].name;
				if (name)
				{
					if (sXml != '<xjxquery><q>')
						sXml += '&';
					if(formElements[i].type=='select-multiple')
					{
						for (var j = 0; j < formElements[i].length; j++)
						{
							if (formElements[i].options[j].selected == true)   sXml += name+"="+encodeURIComponent(formElements[i].options[j].value)+"&";
						}
					}
					else
					{
						sXml += name+"="+encodeURIComponent(formElements[i].value);
					}
				} 
			}
		}
		
		sXml +="</q></xjxquery>";
		
		return sXml;
	}
	
} // end object dom


	
	// misc functions
	
	
/**
 *	défini un objet form select.
 *
*/
 
 
function form_select(e){
	var elt;
	var def_option = {'' : '-'};


	// reset select to default value 
	this.reset = function () {
		// nota: voir référence http://www.quirksmode.org/js/options.html
		this.elt.options.length = 0;
		this.populate(this.def_option);
		this.disable();
	};
	
	this.disable = function(flag){
		this.elt.disabled = flag;
	};
	
	/*  renvoie null ou la première options sélectionnée
		ne fonctionne pas pour les sélections multiples 
	*/
	this.getSelectedOption = function () {
	    var options = this.elt.options;
	    var selected = null;
	
	    for(var i = 0; i < options.length; i++) {
	        if(options[i].selected) {
				selected = options[i].value;
				break;
	        }
	     }
	    return selected;
	};
	
	/*  renvoie un tableau des options sélectionnées
		(sélections multiples)
	*/
	this.getAllSelectedOption = function () {
	    var options = this.elt.options;
	    var selected = new Array();
	
	    for(var i = 0; i < options.length; i++) {
	        if(options[i].selected) selected.push (options[i].value);
	     }
	    return selected;
	};
	
	/* ajoute des options aux options existantes
	*/
	this.populate = function (o) {
		var n = this.elt.options.length;
		for ( var i in o){
		 this.elt.options[n] = new Option( o[i],i);
		 n++;
		}
	};
	
	
	
	// ================  constructor ==============================
	this.elt = e;
	
	}
	
