MIXAD.common =
{
	getXmlHttp: function()
	{
		var xmlHttp = null;
		if (window.XMLHttpRequest)
		{
			xmlHttp = new XMLHttpRequest();
		}
		if (window.ActiveXObject)
		{
			try 
			{
				xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
			} 
			catch (othermsxml)
			{
				try
				{
					xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
				} 
				catch (failed)
				{
					//xmlHttp = false;
				}
			}
		}
		return xmlHttp;
	},


	addEvent: function (obj, eventType, fn, cInstance)
	{
		var wrappedFn = function (e) { return fn.call(obj, MIXAD.common.getEvent(e), cInstance); };

		if (obj.addEventListener)
		{
			obj.addEventListener(eventType, wrappedFn, false); 
			return true;
		}
		else if (obj.attachEvent)
		{
			var r = obj.attachEvent("on" + eventType, wrappedFn);
			return r;
		}
		return false;
	},

	getEvent: function (e) 
	{
		var ev = e || window.event;

		if (!ev) 
		{
			var c = this.getEvent.caller;
			while (c) 
			{
				ev = c.arguments[0];
				if (ev && Event == ev.constructor)
				{
					break;
				}
				c = c.caller;
			}
		}

		return ev;
	},

	fireMouseEvent: function (id, type)
	{
		var evt = null, elm = null; 

		if (document.getElementById)
		{ 
			elm = document.getElementById(id); 
		}
		if (document.createEvent) 
		{ 
			evt = document.createEvent('MouseEvents'); 
		}

		// opera, firefox, safari
		if (elm && elm.dispatchEvent && evt && evt.initMouseEvent)
		{ 
			evt.initMouseEvent(
			type, 
			true,
			true,
			document.defaultView,
			1,        // simple clic 
			0,
			0, 
			0, 
			0, 
			false,
			false, 
			false, 
			false, 
			0,        // 0 - left, 1 - middle, 2 - right 
			null);

			elm.dispatchEvent(evt); 
		}
		// ie
		else if (document.createEventObject)
		{
			elm.fireEvent("on" + type);
		}

	},

	stopPropagation: function (e)
	{
		if (e.stopPropagation)
		{
			e.stopPropagation();
		}
		else
		{
			e.cancelBubble = true;
		}
		if (e.preventDefault)
		{
			e.preventDefault();
		}
		else
		{
			e.returnValue = false;
		}
	},

	isSet: function (obj)
	{
		return (typeof(obj) != 'undefined');
	},

	getBrowserId: function ()
	{
		var brower = "";
		if (document.layers)
		{
			browser = "NS";
		}
		else if (document.all)
		{
			var agent = navigator.userAgent.toLowerCase();

			if (agent.indexOf("opera") != -1)
			{
				browser = "OPR";
			}
			else if (agent.indexOf("konqueror") != -1)
		    {
				browser = "KONQ";
			}
			else
			{
				browser = "IE";
				if (typeof document.body.style.maxHeight != "undefined")
				{
					browser = "IE7";
				}
			}
		}
		else if (document.getElementById)
		{
			browser = "MOZ";
		}
		else 
	    {
			browser = "OTHER";
		}

		return browser;
	},

	getAbsoluteCoordinates: function (e)
	{ 
		var o =
		{ 
			height: e.offsetHeight,
			width: e.offsetWidth
		}; 

		var x = e.offsetLeft;
		var y = e.offsetTop;
		var p = e.offsetParent;

		while (p && (p.nodeType != 9)) 
		{ 
			x += p.offsetLeft;
			y += p.offsetTop;
			p = p.offsetParent;
		} 
		
		o.left = x;
		o.top = y;
		
		return o;
	},

	createSimpleElement: function (eType, eId, eClassName, eParent, eCaption, eValue, eInsertBefore)
	{
		eClassName = eClassName || "";
		//eParent = eParent || document.body;
		
		var newElement = document.createElement(eType);
		newElement.id = eId;
		newElement.name = eId;

		if (eClassName != "")
		{
			newElement.className = eClassName;
		}
		
		if (eParent != null)
		{
		    newElement.parent = eParent;
		    
		    if (eInsertBefore == null)
		    {
			    eParent.appendChild(newElement);
			}
			else
			{
			    eParent.insertBefore(newElement, eInsertBefore);
			}
		}
		
		if (eCaption != null)
		{
		    if (eType != "input" && eType != "optgroup")
		    {
			    var txtObj = document.createTextNode(eCaption);
			    newElement.appendChild(txtObj);
		    }
		    else
		    {
		        if (eType == "optgroup")
		        {
		            newElement.label = eCaption;
		        }
		    }
		}
		
		if (eType == "option" && eValue != null)
		{
		    newElement.value = eValue;
		}

		return newElement;
	},
	
	removeChildObject: function(parentObj, childId)
    {
        var childObj = document.getElementById(childId);
        if (childObj != null)
        {
            parentObj.removeChild(childObj);
        }
    },

	getCssValue: function (elemId, valueId)
	{
		var elem = document.getElementById(elemId);
		var cssValue = "";

		if (elem.currentStyle)
		{
			elemStyle = elem.currentStyle;

			if (valueId.indexOf("-") != -1)
			{
				var valueIdData = valueId.toLowerCase().split("-");
				for (i = 1; i < valueIdData.length; i++)
				{
					valueIdData[i] = valueIdData[i].charAt(0).toUpperCase() + valueIdData[i].substr(1);
				}
				valueId = valueIdData.join("");
			}

			cssValue = eval("elemStyle." + valueId);
		}
		else
		{
			elemStyle = document.defaultView.getComputedStyle(elem, null);
			cssValue = elemStyle.getPropertyValue(valueId);
		}
		return cssValue.replace("px", "");
	},

	
	validateNumericField: function (e)
	{                       
		// uniquement pour IE / Opera
		if (!e) var e = window.event;

		var keyCode = (e.keyCode) ? e.keyCode : e.charCode;
		
		// 8 = backspace, 9 = tab, 13 = return, 35 = end, 36 = home, 37 = left, 39 = right
		if (keyCode == 8 || keyCode == 9 || keyCode == 13 || keyCode == 35 || keyCode == 36 || keyCode == 37 || keyCode == 39) return true; 

		var strValue = String.fromCharCode("" + keyCode);
	
		if (isNaN(parseInt(strValue)))
		{
			MIXAD.common.stopPropagation(e);
		}
	},

	getXmlDocumentFromRequest: function (httpObject)
	{
		var xmlDoc = null;
		// code pour ie
		if (window.ActiveXObject)
		{
			xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
			xmlDoc.async = false;

			xmlDoc.load(httpObject.responseXML);
		}
		// code pour opera, firefox, ...
		else if (document.implementation && document.implementation.createDocument)
		{
			var xmlDoc = null;

			// firefox
			if (window.DOMParser)
			{
				var parser = new DOMParser();
				var xmlDoc = parser.parseFromString(httpObject.responseText, "application/xml");
			}
			// les autres
			else
			{
				xmlDoc.load(httpObject.responseXML);
				xmlDoc = document.implementation.createDocument("", "", null);
			}
		}
		return xmlDoc;
	},

	setCursorPosition: function (inputObj, startIndex, endIndex)
	{
		if (inputObj.setSelectionRange)
		{
			inputObj.setSelectionRange(startIndex, endIndex);
		}
		else if (inputObj.createTextRange)
		{
			var range = inputObj.createTextRange();
            range.collapse(true);
			range.moveStart('character', startIndex);
			range.moveEnd('character', endIndex);
			range.select();
		}
	},

	/****************************************************************************************************************
	* Recupere une valeur de parametre, la totalite ou une partie de la querystring
	* @param keyName {String} nom du parametre pour lequel il faut recuperer la valeur, si a null alors retourne
	*                         la totalite de la querystring
	* @param omittedKeys {Array} dans le cas d'une recuperation partielle de la querystring, permet de specifier
	*                            le nom des parametres dont il ne faut pas tenir compte
	*****************************************************************************************************************/
	getQueryStringData: function (keyName, omittedKeys)
	{
		var docLocation = document.location + "";
		var queryString = docLocation.split("?");
		queryString = queryString[1];

		if (keyName || omittedKeys)
		{
			var queryPairs = queryString.split("&");
			queryString = "";
			for (var i in queryPairs)
			{
				if (typeof(queryPairs[i]) == "string")
				{
					var keyData = queryPairs[i].split("=");

					if (keyName)
					{
						if (keyData[0] == keyName)
						{
							return keyData[1];
						}
					}
					if (omittedKeys)
					{
						var keyOmitted = false;
						for (var j in omittedKeys)
						{
							keyOmitted = (keyData[0] == omittedKeys[j]);
							if (keyOmitted) { break; }
						}
						if (!keyOmitted)
						{
							queryString += queryPairs[i] + "&";
						}
					}
				}
			}
			queryString = queryString.substr(0, queryString.length-1);
		}
		
		return queryString;
	},
	
	getServerAddress: function ()
	{
		var docLocation = document.location + "";
		docLocation = docLocation.replace("http://", "").split("/");
		return "http://" + docLocation[0];
	},
	
	getUniqueId: function()
	{
	    return new Date().getTime();
	}
}

// ajout d'une fonction de formatage sur l'object String
// similaire dans l'utilisation (dans les grandes lignes) a la fonction .NET
String.format = function()
{
    if (arguments.length == 0)
    {
        return null;
    }

    var str = arguments[0];
    for (var i=1; i < arguments.length; i++)
    {
        var re = new RegExp('\\{' + (i-1) + '\\}', 'gm');
        str = str.replace(re, arguments[i]);
    }
    
    return str;
}
// ajout d'une fonction de troncage (troncature ? :)) sur l'object String
// permet de tronquer n caracteres situes en fin de string
String.prototype.trunc = function()
{
    if (arguments.length == 0)
    {
        return this;
    }
    return this.substring(0, this.length - arguments[0]);
}
