MIXAD.common =
{
	isObject: function(e)
	{
		return (typeof e == "object");
	},

	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;
	},

	urlEncode: function(str)
	{
		var SAFECHARS = "0123456789" +
						"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
						"abcdefghijklmnopqrstuvwxyz" +
						"-_.!~*'()";
		
		var HEX = "0123456789ABCDEF";

		var encoded = "";

		if (typeof str == 'string')
		{
			if (str.length > 0)
			{
				for (var i = 0; i < str.length; i++ )
				{
					var ch = str.charAt(i);
					if (ch == " ")
					{
						encoded += "+";	// x-www-urlencoded, plutot que %20
					}
					else if (SAFECHARS.indexOf(ch) != -1)
					{
						encoded += ch;
					}
					else
					{
						var charCode = ch.charCodeAt(0);
						if (charCode > 255)
						{
							alert("Unicode Character '" + ch + "' cannot be encoded using standard URL encoding.\n" + "(URL encoding only supports 8-bit characters.)\n" + "A space (+) will be substituted.");
							encoded += "+";
						}
						else
						{
							encoded += "%";
							encoded += HEX.charAt((charCode >> 4) & 0xF);
							encoded += HEX.charAt(charCode & 0xF);
						}
					}
				}
			}
		}

		return encoded;
	},

	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";
		}
		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;
	},

	getCenteredCoordinates: function (e)
	{ 
		var o =
		{ 
			left: 0,
			top: 0
		}; 

		//var x = (document.clientWidth - this.getCssValue(e, "width")) / 2;
		//var y = (document.clientHeight - this.getCssValue(e, "height")) / 2;


		var x = (document.body.clientWidth - this.getCssValue(e, "width")) / 2;
		var y = (document.body.clientHeight - this.getCssValue(e, "height")) / 2;
		
		x += document.body.scrollLeft;
		y += document.body.scrollTop;

		o.left = x;
		o.top = y;
		
		return o;
	},

	createSimpleElement: function (eType, eId, eClassName, eParent, eCaption, eValue, eInsertBefore)
	{
		eType = eType.toLowerCase();
		eClassName = eClassName || "";
		
		var newElement = null;
		var eName = eId;
		var subType = null;


		// l'id et le name sont-ils differents ? (cas ou l'id passé en parametre contient une ",", i.e : "name,id")
		if (eId.indexOf(",") != -1)
		{
			var eIdData = eId.split(",");
			eName = eIdData[0];
			eId = eIdData[1];
		}


		// creation des input de type radio, checkbox, button et submit
		if (eType == "radio" || eType == "checkbox" || eType == "button" || eType == "submit")
		{
			// cas special pour ie (qui persiste dans sa mediocrité :))
			try
			{
				newElement = document.createElement('<input type="' + eType + '" name="' + eId + '">');
			}
			// opera, firefox et les autres
			catch(err)
			{
				newElement = document.createElement("input");
				newElement.setAttribute("type", eType);
			}
			subType = eType;
			eType = "input";

			if (eValue != null)
			{
				newElement.setAttribute("value", eValue);
			}
		}
		else
		{
			newElement = document.createElement(eType);
		}
		
		newElement.setAttribute("name", eName);
		newElement.setAttribute("id", 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" || subType != null) && eValue != null)
		{
		    newElement.value = eValue;
		}

		return newElement;
	},
	
	removeChildObject: function(parentObj, childId)
    {
        var childObj = document.getElementById(childId);
        if (childObj != null)
        {
            parentObj.removeChild(childObj);
        }
    },

	/****************************************************************************************************************
	* Recupere une valeur css pour un element ou identifiant d'element donné
	* @param e {Object ou String} element ou id d'element pour lequel on veut recuperer une valeur css
	* @param valueId {String} identifant css pour lequel on va recuperer la valeur
	*****************************************************************************************************************/
	getCssValue: function (e, valueId)
	{
		var elem = e;
		if (!this.isObject(elem))
		{
			elem = document.getElementById(e);
		}

		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", "");
	},

	getXmlDocumentFromRequest: function (httpObject)
	{
		var xmlDoc = null;

		var responseText = httpObject.responseText;

		// on enleve les cochonneries envoyees par IIS qui sux
		var myRe = new RegExp("<\\?xml[^>]*>(.*?)</[^>]*>\\r");
		var myArray = myRe.exec(responseText);

		
		if (myArray != null)
		{	
			responseText = myArray[0].replace(/\r/g, "");
		}

		responseText = responseText.replace(/\n/g, "");

		// code pour ie
		if (window.ActiveXObject)
		{
			xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
			xmlDoc.async = false;
			xmlDoc.loadXML(responseText);
		}
		// code pour opera, firefox, ...
		else if (document.implementation && document.implementation.createDocument)
		{
			var xmlDoc = null;

			// firefox / opera
			if (window.DOMParser)
			{
				var parser = new DOMParser();
				var xmlDoc = parser.parseFromString(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();
		}
	},

	isCountryFrench: function (countryId)
	{
		countryId = countryId.toLowerCase();
		return (countryId == "fr" || countryId == "gp" || countryId == "mq" || countryId == "re" || countryId == "pm" || countryId == "pf");
	},

	/****************************************************************************************************************
	* 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];
	},
	
	getCookie: function (cookieName)
	{
		if (document.cookie.length > 0)
		{
			cookieStart = document.cookie.indexOf(cookieName + "=");
			if (cookieStart !=-1 )
			{
				cookieStart = cookieStart + cookieName.length+1;
				cookieEnd = document.cookie.indexOf(";", cookieStart);
				if (cookieEnd == -1) cookieEnd = document.cookie.length;
				return unescape(document.cookie.substring(cookieStart, cookieEnd));
			} 
		}
		return null
	}
	
}
