/**
* 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((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.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) || Object.objectOfType(objRef,'undefined'))
	{
		rtB = false;
	}

	return rtB;
}
/* trouver autre nom -> conflit avec prototype
Object.clone = function(obj)
{
	try
	{
		return new obj.constructor();
	}
	catch(e)
	{
		return null;
	}
}
*/
/*
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.getElement = function(ind)
{
	var retE = null;

	if((ind >= 0) && (ind < this.length))
	{
		retE = this[ind];
	}

	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 Parameter(pN,pV)
{
	var _name = pN;
	var _value = pV;

	this.getName = function()
	{
		return _name;
	}

	this.getValue = function()
	{
		return _value;
	}
}

function RequestParam()
{
	var _param = new Array();
	var _xmlString = true;
	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;
	}
}