/**
* méthode statique permettant de dupliquer un caractère.
*
* @param chr caractère à dupliquer
* @param num nombre de dupllications
*
* @return String
*/
String.duplicateChar = function(chr,num)
{
	var tmpAr = new Array();

	for(var i=0; i<num; i++)
	{
		tmpAr.push(chr);
	}

	return tmpAr.join('');
}

/**
* méthode statique permettant de dupliquer un caractère de padding.
*
* @param str chaîne devant être précédée du padding
* @param arguments[1] caractère de padding
* @param arguments[2] caractère de padding
* @param arguments[3]
*
* @return String
*/
String.setPad = function(str)
{
	var decLength = 2;
	var padChar = '0';
	var endPad = true;
	
	if(!Object.objectOfType(str,'string'))
	{
		str = str.toString();
	}

	if((arguments.length == 2) && Object.objectOfType(arguments[1],'number'))
	{
		decLength = arguments[1];
	}

	if((arguments.length == 3) && Object.objectOfType(arguments[2],'string'))
	{
		padChar = arguments[2];
	}

	if((arguments.length == 4) && Object.objectOfType(arguments[3],'boolean'))
	{
		endPad = arguments[3];
	}

	if(decLength > str.length)
	{
		if(endPad)
		{
			str += String.duplicateChar(padChar,decLength-str.length);
		}
		else
		{
			str = String.duplicateChar(padChar,decLength-str.length)+str;
		}
	}

	return str;
}

/**
* Méthode statique permettant de convertir un tableau en chaîne (avec un éventuel séparateur)
*
* @param data tableau à convertir en chaîne
* @param arguments[1] séparateur (par défaut espace : dec 32)
*
* @return Chaîne de texte résultante
*/
String.arrayToString = function(data)
{
	var sep = arguments[1] || ' ';
	return data.join(sep);
}

String.setDecimal = function(num)
{
	var decLength = 2;
	var padChar = '0';

	var numStr = '';

	var decChar = '.';
	var dispDecChar = ',';

	if((arguments.length == 2) && Object.objectOfType(arguments[1],'number'))
	{
		decLength = arguments[1];
	}

	if(Object.objectOfType(num,'number'))
	{
		numStr = num.toString();
	}
	else if(Object.objectOfType(num,'string'))
	{
		numStr = num;
	}

	var numPart = numStr.split(decChar);

	if(numPart.length == 2)
	{
		if(decLength > numPart[1].length)
		{
			numPart[1] += String.duplicateChar(padChar,decLength-numPart[1].length);
		}
	}

	return numPart.join(dispDecChar);
}

String.parseFloatString = function(flStr)
{
	var rtN = null;
	
	var numberStr = flStr.replace(',','.');
	var numberValue = parseFloat(numberStr);
	if(!isNaN(numberValue))
	{
		rtN = numberValue;
	}
	
	return rtN;
}

String.getNumberFromString = function(strVal)
{
	var retNum = null;

	if(Object.objectOfType(strVal,'string'))
	{
		var numVal = /^(-?[0-9]*(\.[0-9]+)?)(px)?$/;

		var res = numVal.exec(strVal);

		if(res)
		{
			retNum = parseFloat(res[1]);
		}
		else
		{
			retNum = 0;
		}
	}
	else if(Object.objectOfType(strVal,'number'))
	{
		retNum = strVal;
	}

	return retNum;
}

String.getLinesFromHtml = function(str)
{
	var brEr = /<br ?\/?>/i;

	var rtAr = new Array(str);

	if(str.search(brEr) != -1)
	{
		rtAr = str.split(brEr);
	}

	return rtAr;
}

String.getLinesFromText = function(str)
{
	var brEr = /\n\r|\n|\r/i;

	var rtAr = new Array(str);

	if(str.search(brEr) != -1)
	{
		rtAr = str.split(brEr);
	}

	return rtAr;
}

Boolean.getBooleanValue = function(val)
{
	var rtB = false;
	
	switch((typeof val).toLowerCase())
	{
		case 'number':
			if(val != 0)
			{
				rtB = true;
			}
			break;
		case 'string':
			if(val != '')
			{
				var numStr = parseInt(val);
				if(!isNaN(numStr))
				{
					if(numStr != 0)
					{
						rtB = true;
					}
				}
				else if(val != 'false')
				{
					rtB = true;
				}
			}
			break;
		case 'object':
			if(val != null)
			{
				rtB = true;
			}
			break;
		case 'boolean':
			rtB = val;
			break;
	}
	
	return rtB;
}

Object.objectOfType = function(refObject,strType)
{
	var retBool = false;

	if((typeof strType).toLowerCase() == 'string')
	{
		if((typeof refObject).toLowerCase() == strType.toLowerCase())
		{
			retBool = true;
		}
	}
	else if((typeof strType).toLowerCase() == 'function')
	{
		if(refObject instanceof strType)
		{
			retBool = true;
		}
	}

	return retBool;
}

Object.isInitialized = function(objRef)
{
	var rtB = true;

	if((objRef == null) || (objRef == undefined))
	{
		rtB = false;
	}

	return rtB;
}

/*
Object.prototype.properties = new Array();

Object.prototype.setProperty = function(pN,pV)
{
	if(this.isObjectOfType(pN,'string'))
	{
		this.properties[pN] = pV;
	}
}

Object.prototype.getProperty = function(pN)
{
	var rtV = null;

	if(this.isObjectOfType(pN,'string'))
	{
		rtV = this.properties[pN];
	}

	return rtV;
}

*/
Array.prototype.getElement = function(ind)
{
	var retE = null;

	if((ind >= 0) && (ind < this.length))
	{
		retE = this[ind];
	}

	return retE;
}

Array.prototype.isValueInArray = function(val)
{
	var retE = false;

	for(var i=0; i<this.length; i++)
	{
		if(this[i] == val)
		{
			retE = true;
			break;
		}
	}

	return retE;
}

function NamedEntry(k,sO)
{
	var _key = '';
	var _storedObject = sO;

	if(Object.objectOfType(k,'string'))
	{
		_key = k;
	}

	this.getKey = function()
	{
		return _key;
	}

	this.getStoredObject = function()
	{
		return _storedObject;
	}
}

function NamedList()
{
	var _collection = new Array();

	this.addObject = function(o)
	{
		var sO = null;

		if(arguments.length == 1)
		{
			if(o instanceof NamedEntry)
			{
				if(this.getObject(o.getKey()) == null)
				{
					sO = o;
				}
			}
		}
		else if(arguments.length == 2)
		{
			if(Object.objectOfType(o,'string'))
			{
				if(this.getObject(o) == null)
				{
					sO = new NamedEntry(o,arguments[1]);
				}
			}
		}

		if(sO != null)
		{
			_collection.push(sO);
		}
	}

	this.getObject = function(k)
	{
		var rtO = null;

		if(Object.objectOfType(k,'string'))
		{
			for(var i=0; i<_collection.length; i++)
			{
				if(_collection[i].getKey() == k)
				{
					rtO = _collection[i].getStoredObject();
					break;
				}
			}
		}

		return rtO;
	}
	
	this.getCollection = function()
	{
		return _collection;
	}
}

function NameValue(pN,pV)
{
	var _name = '';
	var _value = '';
	
	if(Object.objectOfType(pN,'string'))
	{
		_name = pN;
	}

	if(Object.objectOfType(pV,'string'))
	{
		_value = pV;
	}

	this.getName = function()
	{
		return _name;
	}

	this.getValue = function()
	{
		return _value;
	}
}

function Parameter(pN,pV)
{
	NameValue.call(this,pN,pV);
}
Parameter.prototype = new NameValue;

function RequestParam()
{
	var _param = new Array();
	var _xmlString = false;
	var _post = false;

	this.setXmlCompat = function(hB)
	{
		if(Object.objectOfType(hB,'boolean'))
		{
			_xmlString = hB;
		}
	}

	this.isXmlCompat = function()
	{
		return _xmlString;
	}

	this.addParam = function(pO)
	{
		if(Object.objectOfType(pO,Parameter))
		{
			if(pO.getName() != '' && pO.getValue != '')
			{
				_param.push(pO);
			}
		}
		else if(Object.objectOfType(pO,'string') && (arguments.length == 2))
		{
			if(pO != '' && Object.objectOfType(arguments[1],'string'))
			{
				_param.push(new Parameter(pO,arguments[1]));
			}
		}
	}

	this.getParamCount = function()
	{
		return _param.length;
	}

	this.hasParam = function()
	{
		var rtB = false;

		if(this.getParamCount() > 0)
		{
			rtB = true;
		}

		return rtB;
	}

	this.setPost = function(pB)
	{
		if(Object.objectOfType(pB,'boolean'))
		{
			_post = pB;
		}
	}

	this.methodIsPost = function()
	{
		return _post;
	}

	this.createRequestString = function()
	{
		var rtStr = '';

		var pCount = this.getParamCount();

		for(var i=0; i<pCount; i++)
		{
			if((i == 0) && !this.methodIsPost())
			{
				rtStr += '?';
			}

			rtStr += _param[i].getName()+'='+_param[i].getValue();

			if(i != pCount-1)
			{
				if(this.isXmlCompat() && !this.methodIsPost())
				{
					rtStr += '&#38;';
				}
				else
				{
					rtStr += '&';
				}
			}
		}

		return rtStr;
	}
}

function ConfigurableObject()
{
	var _config = {};
	
	this.initConfig = function(cnf)
	{
		_config = cnf;
	}
	
	this.setConfig = function(cnf)
	{
		for(i in _config)
		{
			if(Object.isInitialized(cnf[i]))
			{
				_config[i] = cnf[i];
			}
		}
	}
	
	this.getConfig = function()
	{
		return _config;
	}
	
	this.getConfigProperty = function(cnfP)
	{
		var rtP = null;
		
		if(Object.isInitialized(_config[cnfP]))
		{
			rtP = _config[cnfP];
		}
		
		return rtP;
	}
	
	this.hasConfigProperty = function(cnfP)
	{
		var rtP = false;
		
		if(Object.isInitialized(_config[cnfP]))
		{
			rtP = true;
		}
		
		return rtP;
	}
}

UriInfo = {};
UriInfo.URI_REQUEST = '?';
UriInfo.URI_SEPARATOR = '&';
UriInfo.URI_PART_SEPARATOR = '=';
UriInfo.URI_VAL_SEPARATOR = ';';

UriInfo.rewriteUri = function(uri)
{
	var _secure = false;
	var _rtUri = '';
	
	if(Object.objectOfType(uri,'string'))
	{
		_rtUri = uri;
	}
	if(arguments.length == 2 && Object.objectOfType(arguments[1],'boolean'))
	{
		_secure = arguments[1];
	}
	
	if(_secure)
	{
		var _uriPattern = /^http:/;
		
		_rtUri = uri.replace(_uriPattern,'https:');
	}
	
	return _rtUri;
}

UriInfo.getRequestParam = function()
{
	if(arguments.length == 1)
	{
		return UriInfo.parseRequest(window.location.search.substr(1),arguments[0]);
	}
	else
	{
		return UriInfo.parseRequest(window.location.search.substr(1));
	}
}

UriInfo.getLinkInfo = function(linkVal)
{
	var rq = new Array();
	if(linkVal.indexOf(UriInfo.URI_REQUEST) != -1)
	{
		rq = linkVal.split(UriInfo.URI_REQUEST);
	}
	else
	{
		rq[0] = linkVal;
	}
	//alert(rq.toSource())
	if(rq.length >= 1)
	{
		var rtObj = {uri: rq[0]};
		if(rq.length == 2)
		{
			rtObj['param'] = UriInfo.parseRequest(rq[1]);
		}
		
		return rtObj;
	}
	else
	{
		return false;
	}
}

UriInfo.parseUri = function(rqStr)
{
	var uriObject = {};
	
	if(rqStr.indexOf(UriInfo.URI_REQUEST) != -1)
	{
		var uriPart = rqStr.split(UriInfo.URI_REQUEST);
	
		if(uriPart.length == 2)
		{
			var pathPart = uriPart[0];
			if(pathPart.indexOf(UriInfo.URI_VAL_SEPARATOR) != -1)
			{
				var part = pathPart.split(UriInfo.URI_VAL_SEPARATOR);
				
				if(part.length == 2)
				{
					uriObject['href'] = part[0];
					
					var sessionPart = part[1];
					if(sessionPart.indexOf(UriInfo.URI_PART_SEPARATOR) != -1)
					{
						var sPart = sessionPart.split(UriInfo.URI_PART_SEPARATOR);
				
						if(sPart.length == 2)
						{
							uriObject['session'] = {name: sPart[0],value: sPart[1]};
						}
					}
				}
			}
			else
			{
				uriObject['href'] = pathPart;
			}
			
			var paramPart = uriPart[1];
			var part;
			if(paramPart.indexOf(UriInfo.URI_SEPARATOR) != -1)
			{
				part = paramPart.split(UriInfo.URI_SEPARATOR);
			}
			else
			{
				part = new Array(paramPart);
			}
				if(part.length > 0)
				{
					uriObject['parameter'] = new Array();
					
					for(var i=0; i<part.length; i++)
					{
						var cParam = part[i];
						
						if(cParam.indexOf(UriInfo.URI_PART_SEPARATOR) != -1)
						{
							var cPart = cParam.split(UriInfo.URI_PART_SEPARATOR);
							
							if(cPart.length == 2)
							{
								/* Si 2ème argument (tableau de noms de variables) ces vatriables ne seront pas récupérées dans l'url */
								if((arguments.length == 2) && Object.objectOfType(arguments[1],Array))
								{					
									if(!arguments[1].isValueInArray(cPart[0]))
									{
										uriObject['parameter'].push({name: cPart[0],value: cPart[1]});
									}
								}
								else
								{
									uriObject['parameter'].push({name: cPart[0],value: cPart[1]});
								}
							}
						}
					}
				}
			
		}
	}
	else
	{
		var pathPart = rqStr;
		if(pathPart.indexOf(UriInfo.URI_VAL_SEPARATOR) != -1)
		{
			var part = pathPart.split(UriInfo.URI_VAL_SEPARATOR);
			
			if(part.length == 2)
			{
				uriObject['href'] = part[0];
				
				var sessionPart = part[1];
				if(sessionPart.indexOf(UriInfo.URI_PART_SEPARATOR) != -1)
				{
					var sPart = sessionPart.split(UriInfo.URI_PART_SEPARATOR);
			
					if(sPart.length == 2)
					{
						uriObject['session'] = {name: sPart[0],value: sPart[1]};
					}
				}
			}
		}
		else
		{
			uriObject['href'] = rqStr;
		}
	}
	
	return uriObject;
}

UriInfo.parseRequest = function(rqStr)
{
	var uriParam = new Array();
	//alert(rqStr+'\n'+unescape(rqStr))
	var uriPart = rqStr.split(UriInfo.URI_SEPARATOR);
	
	if(uriPart.length > 0)
	{
		for(var i=0; i<uriPart.length; i++)
		{
			var tmp = {};
			
			var uriToken = uriPart[i];
			
			if(uriToken.indexOf(UriInfo.URI_PART_SEPARATOR) != -1)
			{
				var uriVarPart = uriToken.split(UriInfo.URI_PART_SEPARATOR);
				
				tmp['name'] = uriVarPart[0];
				tmp['value'] = unescape(uriVarPart[1]);
			}
			else
			{
				tmp['name'] = uriToken;
			}
				
			/* Si 2ème argument (tableau de noms de variables) ces vatriables ne seront pas récupérées dans l'url */
			if((arguments.length == 2) && Object.objectOfType(arguments[1],Array))
			{					
				if(!arguments[1].isValueInArray(tmp['name']))
				{
					uriParam.push(tmp);
				}
			}
			else
			{
				uriParam.push(tmp);
			}
		}
	}
	//alert(uriParam.toSource())
	return uriParam;
}

UriInfo.joinParamValue = function(paramAr)
{
	var rtStr = '';
	
	if(Object.objectOfType(paramAr,Array))
	{
		if(paramAr.length > 0)
		{
			for(var i=0; i<paramAr.length; i++)
			{
				if(Object.objectOfType(paramAr[i],Array))
				{
					for(var j=0; j<paramAr[i].length; j++)
					{
						var cParam = paramAr[i][j];
						
						if(Object.isInitialized(cParam['name']))
						{
							rtStr += cParam['name'];
						}
						if(Object.isInitialized(cParam['value']))
						{
							rtStr += UriInfo.URI_PART_SEPARATOR+escape(cParam['value']);
						}
						
						if(j != paramAr[i].length-1)
						{
							rtStr += UriInfo.URI_VAL_SEPARATOR;
						}
					}
				}
				else
				{
					if(Object.isInitialized(paramAr[i]['name']))
					{
						rtStr += paramAr[i]['name'];
					}
					if(Object.isInitialized(paramAr[i]['value']))
					{
						rtStr += UriInfo.URI_PART_SEPARATOR+escape(paramAr[i]['value']);
					}
				}
				if(i != paramAr.length-1)
				{
					rtStr += UriInfo.URI_SEPARATOR;
				}
			}
		}
	}
	
	return rtStr;
}

UriInfo.getParamValue = function(paramAr,val)
{
	var rtVal = '';
	
	if(Object.objectOfType(paramAr,Array))
	{
		if(paramAr.length > 0)
		{
			for(var i=0; i<paramAr.length; i++)
			{
				if(Object.objectOfType(paramAr[i],Array))
				{
					for(var j=0; j<paramAr[i].length; j++)
					{
						var cParam = paramAr[i][j];
						
						if(Object.isInitialized(cParam['name']))
						{
							if(val == cParam['name'])
							{
								if(Object.isInitialized(cParam['value']))
								{
									rtVal = cParam['value'];
								}
							}
						}
					}
				}
				else
				{
					if(Object.isInitialized(paramAr[i]['name']))
					{
						if(val == paramAr[i]['name'])
						{
							if(Object.isInitialized(paramAr[i]['value']))
							{
								rtVal = paramAr[i]['value'];
							}
						}
					}
				}
			}
		}
	}
	
	return rtVal;
}

function MaskData(mVal)
{
	var _mask = 0;
	
	var tempVal = parseInt(mVal);
	if(!isNaN(tempVal))
	{
		_mask = tempVal;
	}
	
	this.getMask = function()
	{
		return _mask;
	}
	
	this.getTestMask = function(val)
	{
		if(val < 0)
		{
			return ~_mask;
		}
		else
		{
			return _mask;
		}
	}
	
	this.isValueInMask = function(tVal)
	{
		var rtVal = false;

		if(Object.objectOfType(tVal,Array))
		{
			for(var i=0; i<tVal.length; i++)
			{
				var val = Math.abs(tVal[i]);
				if((this.getTestMask(tVal[i]) & val) == val)
				{
					rtVal = true;
					break;
				}
			}
		}
		else if(Object.objectOfType(tVal,'number'))
		{
			var val = Math.abs(tVal);
			if((this.getTestMask(tVal) & val) == val)
			{
				rtVal = true;
			}
		}
		
		return rtVal;
	}
}
