function identifyBrowser(){
	var uaTests =
	{
		'op':/opera/i,
		'ie':/MSIE/,
		'moz':/gecko/i,
		'ns':/netscape/i
	};
	this.type = '';
	for (var n in uaTests)
	{
		if (uaTests[n].test(navigator.userAgent))
		{
			this.type = n;
			break;
		}
	}
	window.ie = (this.type=='ie');
	window.moz = (this.type=='moz');
	
}
identifyBrowser();
if(moz){
	HTMLElement.prototype.insertAdjacentHTML = function (sWhere, sHTML){
		var df, r = this.ownerDocument.createRange();
		
		switch (String(sWhere).toLowerCase())
		{
			case "beforebegin":
				r.setStartBefore(this);
				df = r.createContextualFragment(sHTML);
				this.parentNode.insertBefore(df, this);
				break;
				
			case "afterbegin":
				r.selectNodeContents(this);
				r.collapse(true);
				df = r.createContextualFragment(sHTML);
				this.insertBefore(df, this.firstChild);
				break;
				
			case "beforeend":
				r.selectNodeContents(this);
				r.collapse(false);
				df = r.createContextualFragment(sHTML);
				this.appendChild(df);
				break;
				
			case "afterend":
				r.setStartAfter(this);
				df = r.createContextualFragment(sHTML);
				this.parentNode.insertBefore(df, this.nextSibling);
				break;
		}
	};
}
function clientToScreen(oElm)
{
	var px = oElm.offsetLeft;
	var py = oElm.offsetTop;
	var p = oElm.offsetParent;
	while (p && p.tagName !='HTML')
	{
		px += parseInt(p.offsetLeft, 10);
		py += parseInt(p.offsetTop, 10);
		p = p.offsetParent;
	}
	if (moz) {
		p = oElm.parentNode
		while (p && p.tagName !='BODY')
		{
			if (p.scrollTop) py -= p.scrollTop;
			if (p.scrollLeft) px -= p.scrollLeft;
			p = p.parentNode;
		}
	}
	return {'left':px, 'top':py};
};

function screenToClient(obj, point)
{
	function getParent(oElm)
	{
		var p = oElm.offsetParent;
		while (p && p.tagName !=' BODY')
		{
			if (p.currentStyle.position!='static' || p.currentStyle.overflow!='visible')
				break;
			p = p.offsetParent;
		}
		return p;
	};
	var p = getParent(obj);
	if (p)
	{
		var pPos = clientToScreen(p);
		point.top -= pPos.top;
		point.left -= pPos.left;					
	}
};

function moveTo(obj, point)
{
	if(ie) screenToClient(obj, point);
	obj.style.top = point.top;
	obj.style.left = point.left;
};


function setSize(oElm, width, height)
{
	setWidth(oElm, width);
	setHeight(oElm, height);
};

function setWidth(oElm, width)
{
	if (oElm)
	{
		if (width)
		{
			if (!ie)
			{
				var cs = oElm.currentStyle;
				width -= (cs.marginLeft) ? parseInt(cs.marginLeft, 10) : 0;
				width -= (cs.marginRight) ? parseInt(cs.marginRight, 10) : 0;
				width -= (cs.paddingLeft) ? parseInt(cs.paddingLeft, 10) : 0;
				width -= (cs.paddingRight) ? parseInt(cs.paddingRight, 10) : 0;
				width -= (cs.borderLeftWidth) ? parseInt(cs.borderLeftWidth, 10) : 0;
				width -= (cs.borderRightWidth) ? parseInt(cs.borderRightWidth, 10) : 0;
			}
			oElm.style.width = width;
		}
	}
};

function setHeight(oElm, height)
{
	if (oElm)
	{
		if (height)
		{
			if (!ie)
			{
				var cs = oElm.currentStyle;
				height -= (cs.marginTop) ? parseInt(cs.marginTop, 10) : 0;
				height -= (cs.marginBottom) ? parseInt(cs.marginBottom, 10) : 0;
				height -= (cs.paddingTop) ? parseInt(cs.paddingTop, 10) : 0;
				height -= (cs.paddingBottom) ? parseInt(cs.paddingBottom, 10) : 0;
				height -= (cs.borderTopWidth) ? parseInt(cs.borderTopWidth, 10) : 0;
				height -= (cs.borderBottomWidth) ? parseInt(cs.borderBottomWidth, 10) : 0;
			}
			oElm.style.height = height;
		}
	}
};

Date.prototype.add = function(part, nbr)
{
	var millisecond=1;
	var second=millisecond*1000;
	var minute=second*60;
	var hour=minute*60;
	var day=hour*24;
	var year=day*365;
	parts =
	{
		'ms':function(){return millisecond*nbr},
		's':function(){return second*nbr},
		'mi':function(){return minute*nbr},
		'h':function(){return hour*nbr},
		'd':function(){return day*nbr},
		'mo':function(){return day*nbr},
		'y':function(){return year*nbr}
	};
	return new Date(this.getTime()+(parts[part]?parts[part]():0));
};

Number.decimalChar = function()
{
	var dc = parseFloat(1/2).toString().substr(1,1);
	return dc;
};

function ajaxGet(uri, method, parameters)
{
	method = (method||'GET');
	parameters = (parameters||'');
	var req = null;
	if (moz)
		req = new XMLHttpRequest();
	else if (ie)
		req = new ActiveXObject("Microsoft.XMLHTTP");
	if (!req) return '';
	
	if (method=='GET') {
		var tmpUri = uri;
		if (parameters) tmpUri +='?'+parameters;
		if (moz){// on est passé en ascynchrone pour eviter bug freeze firefox, qd il fait un req.open alors qu'il dl des images de taille ~= 100ko
			var uid =  getGUID();
			req.open("GET", tmpUri, true);
			// il faut se servir de req pour passer le parametre uid au callBack onreadystatechange en FF et this.uid en ie
			req.uid = uid;
			// call back; sous ie, ai pas réussi a passer de paramètre par instance donc pas de uid donc pas d'asynchrone :s
			req.onreadystatechange = function () {
				if (req.readyState == 4) {
					var spn = window.document.getElementById(req.uid);
					// on remplit les span avec le contenu final
					spn.insertAdjacentHTML("afterbegin", req.responseText);
				}
			};
			req.send(null);
			return "<span id='"+uid+"'></span>";
		}else{
			req.open("GET", tmpUri, false);
			req.send(null);
			return req.responseText;
		}
	}
	else {
		req.open("POST", uri, false);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		req.send(parameters);
		return req.responseText;
	}
};
function isDate(value)
{
	var rx = new RegExp(/^(\d{1,2})([^\d])(\d{1,2})\2(\d{2})(\d{2})?$/);
	var ar = rx.exec(value);
	var ret = false;
	if (ar)
	{
		ar[3]=parseInt(ar[3],10)-1;
		ar[1]=parseInt(ar[1],10);
		ar[4]=parseInt((ar[4]+ar[5]),10);
		var dte = new Date(ar[4], ar[3], ar[1]);
		ret = (dte.getDate()==ar[1] && dte.getMonth()==ar[3] && dte.getFullYear()==ar[4]);
	}
	return ret;
};

function str2Date(value)
{
	var rx = new RegExp(/^(\d{1,2})([^\d])(\d{1,2})\2(\d{2})(\d{2})?$/);
	var ar = rx.exec(value);
	if (ar)
		var date = new Date(parseInt((ar[4]+ar[5]),10), parseInt(ar[3],10) - 1, parseInt(ar[1],10));
	else
		var date = new Date();
	return date;
};

function date2Str(date)
{
	var day = parseInt(date.getDate(),10);
	var month = parseInt(date.getMonth(),10) + 1;
	var year = parseInt(date.getFullYear(),10);
	return ((day < 10)?'0':'') + day + '/' + ((month < 10)?'0':'') + month + '/' + year;
};

function getKeyInfo (evnt)
{
	var key = 0;
	var tgt = null;
	var vkey = false;
	
	if (!ie)
	{
		key=evnt.which;
		tgt=evnt.target;
		if (key==0)
		{
			key=evnt.keyCode;
			vkey=true;
		}
	}
	else
	{
		key=event.keyCode;
		tgt=event.srcElement;
	}
	return {'key':key, 'tgt':tgt, 'vkey':vkey};
};

function setKeyCode (evnt, keyCode)
{
	if (!ie)
		if(!(evnt.which = keyCode))
			evnt.keyCode = keyCode;
	else
		evnt.keyCode = keyCode;
};

function SetCaretTo(Field, Pos)
{
	if (moz)
	{
		Field.setSelectionRange(Pos,Pos); 
		return true;
	}
	else if (ie)
	{
		var range = Field.createTextRange();
		range.collapse(true);
		range.moveEnd('character', Pos);
		range.moveStart('character', Pos);
		range.select();
		return true;
	}
	return false;
};

function getGUID()
{
	var uid;
	var evChars='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
	var ret=false;
	while(!ret)
	{
		uid = '';
		for(var t=1;t<=10;t++) uid+=evChars.charAt(Math.floor(52*Math.random()));
		ret = (document.getElementById(uid)==null);
	}
	return uid;
};

function bindXmlToObj(instance, xNde)
{
	if (xNde)
	{
		for (var pAtb=0; pAtb<xNde.attributes.length; pAtb++)
		{
			var atb = xNde.attributes[pAtb];
			switch (typeof instance[atb.name])
			{
				case 'boolean':
					instance[atb.name]=new Boolean(atb.value);
					break;
				case 'number':
					instance[atb.name]=parseInt(atb.value, 10);
					break;
				case 'undefined':
					break;
				default:
					instance[atb.name]=atb.value;
					break;
			}
		}
	}
};

Function.prototype.extend = function(baseClass)
{
	this.prototype = new baseClass();
	this.prototype.constructor = this;
	this.baseConstructor = baseClass;
	this.base = baseClass.prototype;
	this.callBaseConstructor = function(instance) {
		for(var a=1,args=[];a<arguments.length;args.push(arguments[a]),a++);
		this.base['constructor'].apply(instance, args);
	};
	this.callBaseMethod = function(instance, method) {
		for(var a=2,args=[];a<arguments.length;args.push(arguments[a]),a++);
		return this.base[method].apply(instance, args);
	};
};

String.prototype.isLowerCase = function(pos){
	if (!arguments.length) var pos = 0;
	if (pos >= this.length) return false;
	var c = this.charCodeAt(pos);
	return (c > 96 && c < 123);
}
String.prototype.isUpperCase = function(pos){
	if (!arguments.length) var pos = 0;
	if (pos >= this.length) return false;
	var c = this.charCodeAt(pos);
	return (c > 64 && c < 91);
}
