/**
 * Get the type of a value.
 * <br />This method is equivalent at the <i>typeof<i> function except that :
 * <br />The value <i>null</i> return the string <i>null<i>.
 * <br />The value <i>NaN</i> return the string <i>NaN<i>.
 * <br />An undefine value return an empty string.
 *
 * @param any any The value.
 * @return string The constructor or an empty string.
 * @access public
 */
function getTypeOf(any)
{
 var varRtnObj='';
 if(arguments.length > 0)
 {
  if(any==null){varRtnObj='null';}
  else
  {
   var varTypNam=(typeof(any)).toLowerCase();
   switch(varTypNam)
   {
   case 'undefined':break;
   case 'number':if(isNaN(any)){varRtnObj='NaN';}else{varRtnObj=varTypNam;}break;
   default:varRtnObj=varTypNam;break;
   }
  }
 }
 return varRtnObj;
}
/**
 * Get the name of the constructor (method) of a value.
 * If the value isn't an object then this method return
 * an empty string.
 *
 * @param any any The value.
 * @return string The constructor or an empty string.
 * @access public
 */
function getConstructorName(any)
{
 var varRtnObj='';
 if((getTypeOf(any)=='object')
 && (getTypeOf(any.constructor)=='function'))
 {
  var varObjCtr=any.constructor.toString();
  var varStrIdx2=-1;
  var varStrVal='function ';
  var varStrIdx1=varObjCtr.indexOf(varObjCtr);
  if(varStrIdx1>=0)
  {
   varStrIdx1+=varStrVal.length;
   varStrVal='(';
   varStrIdx2=varObjCtr.indexOf(varStrVal,varStrIdx1);
  }
  if(varStrIdx1>=0&&varStrIdx2>varStrIdx1)
  {varRtnObj=trimSpaces(varObjCtr.substring(varStrIdx1,varStrIdx2));}
  if(varRtnObj=='')
  {
   var varUserAgent=navigator.userAgent.toLowerCase();
   var varIsSafari=(varUserAgent.indexOf('safari')>=0)?1:0;
   if(varIsSafari==1)
   {
    if(getTypeOf(any.length)=='number')
    {
     if(getTypeOf(any.indexOf)=='function'){varRtnObj='String';}
     if(getTypeOf(any.join)=='function'){varRtnObj='Array';}
    }
   }
  }
 }
 return varRtnObj;
}
/**
 * Set the style of the cursor for the wait.
 *
 * @param integer index The index of the style.
 * <ul>
 * <li><i>-1</i>=Automatic (auto).</li>
 * <li><i>0</i>=Arrow (default).</li>
 * <li><i>1</i>=Hourglass or watch (wait).</li>
 * <li><i>2</i>=Text input (text).</li>
 * <li><i>3</i>=Help , question mark or a balloon (help).</li>
 * <li><i>4</i>=Crosshair (crosshair).</li>
 * <li><i>5</i>=Hand (pointer).</li>
 * <li><i>6</i>=CrossArrow (move).</li>
 * <li><i>7</i>=Moved right / east (e-resize).</li>
 * <li><i>8</i>=Moved up and right / north-east (ne-resize).</li>
 * <li><i>9</i>=Moved up and left / north-west (nw-resize).</li>
 * <li><i>10</i>=Moved up / north (n-resize).</li>
 * <li><i>11</i>=Moved down and right / south-east (se-resize).</li>
 * <li><i>12</i>=Moved down and left / south-west (sw-resize).</li>
 * <li><i>13</i>=Moved down / south (s-resize).</li>
 * <li><i>14</i>=Moved left / west (w-resize).</li>
 * </ul>
 */
function setCursorStyle(index)
{
 var varRtnObj=false;var varCursorStyle=null;var varElementBody=null;
 if(document.getElementsByTagName&&document.getElementsByTagName('body')[0]){varElementBody=document.getElementsByTagName('body')[0];}
 if(varElementBody&&varElementBody.style){varElementBody.style.cursor='auto';varCursorStyle=varElementBody.style.cursor;}
 if(varCursorStyle)
 {
  switch(index)
  {
  case -1:varCursorStyle='auto';varRtnObj=true;break;
  case 0:varCursorStyle='default';varRtnObj=true;break;
  case 1:varCursorStyle='wait';varRtnObj=true;break;
  case 2:varCursorStyle='text';varRtnObj=true;break;
  case 3:varCursorStyle='help';varRtnObj=true;break;
  case 4:varCursorStyle='crosshair';varRtnObj=true;break;
  case 5:varCursorStyle='pointer';varRtnObj=true;break;
  case 6:varCursorStyle='move';varRtnObj=true;break;
  case 7:varCursorStyle='e-resize';varRtnObj=true;break;
  case 8:varCursorStyle='ne-resize';varRtnObj=true;break;
  case 9:varCursorStyle='nw-resize';varRtnObj=true;break;
  case 10:varCursorStyle='n-resize';varRtnObj=true;break;
  case 11:varCursorStyle='se-resize';varRtnObj=true;break;
  case 12:varCursorStyle='sw-resize';varRtnObj=true;break;
  case 13:varCursorStyle='s-resize';varRtnObj=true;break;
  case 14:varCursorStyle='w-resize';varRtnObj=true;break;
  }
  varElementBody.style.cursor=varCursorStyle;
 }
 return varRtnObj;
}
/**
 * Get the class name of an object.
 *
 * @param any any The value to check.
 * @return string className The class name.
 * @access public
 */
function getClassNameOf(any)
{
 var varRtnObj=getTypeOf(any);
 var varCtrNam=getConstructorName(any);
 if(varCtrNam.length>0){varRtnObj=varCtrNam;}
 else{if(varRtnObj=='object'){
 if(any==Math){varRtnObj='Math';}
 else{if(any==navigator){varRtnObj='navigator';}}}}
 return varRtnObj;
}
/**
 * Check if a value is an instance of a class.
 *
 * @param string className The class name.
 * @param boolean caseSensitive The comparaison of the class name an the object class is sensitive case.
 * @param any any The value to check.
 * @return boolean Is an instance of the class ? false=No|true=Yes.
 * @access public
 */
function isClassNameOf(className, caseSensitive, any)
{
 var varRtnObj=false;
 var varClsNam=getClassNameOf(className).toLowerCase();
 if(varClsNam=='string')
 {
  varClsNam=getClassNameOf(any);
  if(caseSensitive!=true)
  {varClsNam=varClsNam.toLowerCase();}
  if(varClsNam==className)
  {varRtnObj=true;}
 }
 return varRtnObj;
}
/**
 * Check if a value is an extend object (not a core object).
 *
 * @param any any The value to check.
 * @return boolean Is an object ? false=No|true=Yes.
 * @access public
 */
function isExtendObject(any)
{var varRtnObj=false;if(getTypeOf(any)=='object'){varRtnObj=true;}return varRtnObj;}
/**
 * Check if a identifier is define.
 *
 * @param any any The value to check.
 * @return boolean Is define ? false=No|true=Yes.
 * @access public
 */
function isUndefined(any)
{return isClassNameOf('',false,any);}
/**
 * Check if a value equal to </i>null</i>.
 *
 * @param any any The value to check.
 * @return boolean Is null ? false=No|true=Yes.
 * @access public
 */
function isNull(any)
{return isClassNameOf('null',false,any);}
/**
 * Check if a value a </i>Boolean</i> object.
 *
 * @param any any The value to check.
 * @return boolean Is a boolean ? false=No|true=Yes.
 * @access public
 */
function isBoolean(any)
{return isClassNameOf('boolean',false,any);}
/**
 * Check if a value a </i>String</i> object.
 *
 * @param any any The value to check.
 * @return boolean Is a string ? false=No|true=Yes.
 * @access public
 */
function isString(any)
{return isClassNameOf('string',false,any);}
/**
 * Check if a value a </i>Number</i> object.
 *
 * @param any any The value to check.
 * @return boolean Is a number ? false=No|true=Yes.
 * @access public
 */
function isNumber(any)
{return isClassNameOf('number',false,any);}
/**
 * Check if a value a </i>Date</i> object.
 *
 * @param any any The value to check.
 * @return boolean Is a date ? false=No|true=Yes.
 * @access public
 */
function isDate(any)
{return isClassNameOf('date',false,any);}
/**
 * Check if a value an </i>Array</i> object.
 *
 * @param any any The value to check.
 * @return boolean Is an array ? false=No|true=Yes.
 * @access public
 */
function isArray(any)
{return isClassNameOf('array',false,any);}
/**
 * Check if a value a </i>function</i> object.
 *
 * @param any any The value to check.
 * @return boolean Is a function ? false=No|true=Yes.
 * @access public
 */
function isFunction(any)
{return isClassNameOf('function',false,any);}
/**
 * Check if a value is empty.
 * <br />This method return <i>true</i> if :
 * <ul>
 * <li> The value it's undefined.</li>
 * <li> The value it's equal to <i>NaN</i>.</li>
 * <li> The value is equal to <i>null</i>.</li>
 * <li> The value is an empty string.</li>
 * <li> The value is an empty array.</li>
 * </ul>
 * @param any any The value to check.
 * @return boolean Is numeric ? false=No|true=Yes.
 * @access public
 */
function isEmpty(any)
{
 var varRtnObj=false;
 var varTypNam=getClassNameOf(any);
 switch(varTypNam)
 {
 case '':
 case 'null':
 case 'NaN':
  varRtnObj=true;
  break;
 case 'string':
 case 'Array':
  if(any.length<=0){varRtnObj=true;}
  break;
 }
 return varRtnObj;
}
/**
 * Check if a value is a valid number or a valid numeric string.
 *
 * @param any any The value to check.
 * @return boolean Is numeric ? false=No|true=Yes.
 * @access public
 */
function isNumeric(any)
{
 var varRtnObj=isNumber(any);
 if((varRtnObj!=true)&&isString(any))
 {if(any.match(new RegExp('^[\\-\\+]?(\\d*|0)(\\.\\d*)?$','g'))){varRtnObj=true;}}
 return varRtnObj;
}
/**
 * Check if a value is a digit.
 *
 * @param any any The value to check.
 * @return boolean Is digit ? false=No|true=Yes.
 * @access public
 */
function isDigit(any)
{
 var varRtnObj=false;
 if(varRtnObj==false){if((isNumber(any))&&(any>=0)&&(any<=9)){varRtnObj=true;}}
 if(varRtnObj==false){if((isString(any))&&(any.length==1)&&('0123456789'.indexOf(any)>=0)){varRtnObj=true;}}
 return varRtnObj;
}
/**
 * Format a integer.
 *
 * @param numeric any The value to format.
 * @param integer digits The maximum of digits (included the decimal part) of the formated value.
 * @param integer decimals The number of digits of the decimal part of the formated value.
 * @param integer signusRule The number of digits of the decimal part of the formated value.
 * <ul>
 * <li><i>1</i>=The formated value has signus only for negative value (default).</li>
 * <li><i>2</i>=The formated value has always signus.</li>
 * <li><i>3</i>=The formated value don't have any signus.</li>
 * </ul>
 * @param integer paddRule The number of digits of the decimal part of the formated value.
 * <ul>
 * <li><i>1</i>=The number isn't left padded with zeros.</li>
 * <li><i>2</i>=The number is left padded with zeros.</li>
 * </ul>
 * @param string defaultValue The default value to return if the value to format isn't a float.
 * @return string The formated value or <i>null</i>.
 * @access public
 */
function formatInteger(any, digits, decimals, signusRule, paddRule, defaultValue)
{
 var varRtnObj=null;
 var varStringValue=_normalizeStringForNumeric(any);
 if(isNumeric(varStringValue))
 {
  varStringValue=''+varStringValue;
  if(getDecPartLength(varStringValue,2)==0)
  {
   varStringValue=parseInt(varStringValue,10);
   varRtnObj=formatNumeric(varStringValue,digits,decimals,signusRule,paddRule);
  }
 }
 if((varRtnObj==null)&&(isString(defaultValue))){varRtnObj=defaultValue;}
 return varRtnObj;
}
/**
 * Format a float.
 *
 * @param numeric any The value to format.
 * @param integer digits The maximum of digits (included the decimal part) of the formated value.
 * @param integer decimals The number of digits of the decimal part of the formated value.
 * @param integer signusRule The number of digits of the decimal part of the formated value.
 * <ul>
 * <li><i>1</i>=The formated value has signus only for negative value (default).</li>
 * <li><i>2</i>=The formated value has always signus.</li>
 * <li><i>3</i>=The formated value don't have any signus.</li>
 * </ul>
 * @param integer paddRule The number of digits of the decimal part of the formated value.
 * <ul>
 * <li><i>1</i>=The number isn't left padded with zeros.</li>
 * <li><i>2</i>=The number is left padded with zeros.</li>
 * </ul>
 * @param string defaultValue The default value to return if the value to format isn't a float.
 * @return string The formated value or <i>null</i>.
 * @access public
 */
function formatFloat(any, digits, decimals, signusRule, paddRule, defaultValue)
{
 var varRtnObj=null;
 var varStringValue=_normalizeStringForNumeric(any);
 if(isNumeric(varStringValue))
 {
  varStringValue=''+varStringValue;
  if(getDecPartLength(varStringValue,2)>=0)
  {
   varStringValue=parseFloat(varStringValue,10);
   varRtnObj=formatNumeric(varStringValue,digits,decimals,signusRule,paddRule);
  }
 }
 if((varRtnObj==null)&&(isString(defaultValue))){varRtnObj=defaultValue;}
 return varRtnObj;
}
/**
 * Normalize a string that representant a numeric value.
 *
 * @param anyString string The value to normalize.
 * @return string The normalized value.
 * @access private
 */
function _normalizeStringForNumeric(anyString)
{
 var varRtnObj=anyString;
 if(isString(varRtnObj))
 {
  varRtnObj=removeSpaces(varRtnObj);
  varRtnObj=varRtnObj.replace(new RegExp('[,;]','g'),'.');
 }
 return varRtnObj;
}
/**
 * Format a numeric value.
 *
 * @param numeric anyNumeric The value to format.
 * @param integer digits The maximum of digits (included the decimal part) of the formated value.
 * @param integer decimals The number of digits of the decimal part of the formated value.
 * @param integer signusRule The number of digits of the decimal part of the formated value.
 * <ul>
 * <li><i>1</i>=The formated value has signus only for negative value (default).</li>
 * <li><i>2</i>=The formated value has always signus.</li>
 * <li><i>3</i>=The formated value don't have any signus.</li>
 * </ul>
 * @param integer paddRule The number of digits of the decimal part of the formated value.
 * <ul>
 * <li><i>1</i>=The number isn't left padded with zeros.</li>
 * <li><i>2</i>=The number is left padded with zeros.</li>
 * </ul>
 * @return string The formated value or <i>null</i>.
 * @access public
 */
function formatNumeric(anyNumeric, digits, decimals, signusRule, paddRule)
{
 var varRtnObj=null;
 var varDgtLen=0;
 var varIntLen=0;
 var varDecLen=0;
 var varSgnRul=0;
 var varPadRul=0;
 var varSgnVal='';
 var varIntVal='';
 var varSepVal='.';
 var varDecVal='';
 if(isNumeric(anyNumeric))
 {
  if(isNumber(digits)){varDgtLen=digits;}
  if(isNumber(decimals)){varDecLen=decimals;}
  if(isNumber(signusRule)){varSgnRul=signusRule;}
  if((varSgnRul<1)||(varSgnRul>3)){varSgnRul=1;}
  if(isNumber(paddRule)){varPadRul=paddRule;}
  if((varPadRul<1)||(varPadRul>2)){varPadRul=1;}
  if((varDgtLen>0)&&(varDgtLen>=varDecLen))
  {
   varIntLen=varDgtLen-varDecLen;
   varIntVal=getIntPart(anyNumeric,1,1);
   varSgnVal=varIntVal.substring(0,1);
   varIntVal=truncateString(varIntVal.substring(1,varIntVal.length),varIntLen,2);
   if(varPadRul==2){varIntVal=paddString(varIntVal,varIntLen,2,'0');}
   varDecVal=getDecPart(anyNumeric,1);
   varDecVal=adjustString(varDecVal,varDecLen,1,'0');
   varRtnObj='';
   if((varSgnRul==1)&&(varSgnVal=='+')){varSgnVal='';}
   if((varSgnRul==1)||(varSgnRul==2)){varRtnObj+=varSgnVal;}
   varRtnObj+=varIntVal;
   if(varDecVal.length>0){varRtnObj+=varSepVal+varDecVal;}
  }
 }
 return varRtnObj;
}
/**
 * Get the decimal part of a numeric value as a string.
 *
 * @param any any The value to process.
 * @param integer noDigitRule The rule to apply if the value doesn't have a decimal part.
 * <ul>
 * <li><i>1</i>=The string </i>0<i> is returned.<li>
 * <li><i>2</i>=An empty string is returned.<li>
 * </ul>
 * @return string The part or <i>null<i> if the value isn't numeric.
 * @access public
 */
function getDecPart(any, noDigitRule)
{
 var varRtnObj=null;
 var varNdgRul=0;
 if(isNumeric(any))
 {
  if(isNumber(noDigitRule)){varNdgRul=noDigitRule;}
  if((varNdgRul<1)||(varNdgRul>2)){varNdgRul=1;}
  varRtnObj='';
  var varStrVal=new String(any);
  var varStrLst=varStrVal.split(new RegExp('[\\.]','g'));
  if(varStrLst.length>1){varRtnObj=varStrLst[(varStrLst.length-1)];}
  switch(varNdgRul)
  {
  case 1:
   if(!varRtnObj.match(new RegExp('[\\d]$','g'),'')){varRtnObj+='0';}
   break;
  }
 }
 return varRtnObj;
}
/**
 * Get the length of the decimal part of a numeric value.
 *
 * @param any any The value to process.
 * @param integer noDigitRule The rule to apply if part contains only zeros.
 * <ul>
 * <li><i>1</i>=The value <i>0</i> is returned.<li>
 * <li><i>2</i>=The part length is returned.<li>
 * </ul>
 * @return string The part or <i>null<i> if the value isn't numeric.
 * @access public
 */
function getDecPartLength(any, noDigitRule)
{
 var varRtnObj=-1;
 var varStrVal=getDecPart(any,noDigitRule);
 if(varStrVal!=null){varRtnObj=varStrVal.length;}
 return varRtnObj;
}
/**
 * Get the integer part of a numeric value as a string.
 *
 * @param any any The value to process.
 * @param integer noDigitRule The rule to apply if the part contains only zeros.
 * <ul>
 * <li><i>1</i>=The string </i>0<i> is returned.<li>
 * <li><i>2</i>=An empty string is returned.<li>
 * </ul>
 * @param integer signusRule The rule to apply to the signus.
 * <ul>
 * <li><i>1</i>=The return value always include the signus.<li>
 * <li><i>2</i>=The return value don't include any signus.<li>
 * <li><i>3</i>=The return value include the signus only if it's present in the value.<li>
 * </ul>
 * @return string The part or <i>null<i> if the value isn't numeric.
 * @access public
 */
function getIntPart(any, noDigitRule, signusRule)
{
 var varRtnObj=null;
 var varNdgRul=0;
 var varSgnRul=0;
 if(isNumeric(any))
 {
  if(isNumber(noDigitRule)){varNdgRul=noDigitRule;}
  if((varNdgRul<1)||(varNdgRul>2)){varNdgRul=1;}
  if(isNumber(signusRule)){varSgnRul=signusRule;}
  if((varSgnRul<1)||(varSgnRul>3)){varSgnRul=1;}
  var varStrVal=new String(any);
  var varStrLst=varStrVal.split(new RegExp('[\\.]','g'));
  if(varStrLst.length>1){varStrLst[(varStrLst.length-1)]='';}
  varStrVal=varStrLst.join('');
  switch(varSgnRul)
  {
  case 1:
   if(parseInt(varStrVal)==0){varStrVal='0';}
   var varSgnVal='-';
   if(varStrVal.indexOf(varSgnVal)<0){varSgnVal='+';}
   varStrVal=varStrVal.replace(new RegExp('[+-]','g'),'');
   varStrVal=varSgnVal+varStrVal;
   break;
  case 2:
   varStrVal=varStrVal.replace(new RegExp('[+-]','g'),'');
   break;
  }
  switch(varNdgRul)
  {
  case 1:
   if(!varStrVal.match(new RegExp('[\\d]$','g'),'')){varStrVal+='0';}
   break;
  }
  varRtnObj=varStrVal;
 }
 return varRtnObj;
}
/**
 * Get the length of the integer part of a numeric value.
 *
 * @param any any The value to process.
 * @param integer noDigitRule The rule to apply if the part contains only zeros.
 * <ul>
 * <li><i>1</i>=The value <i>0</i> is returned.<li>
 * <li><i>2</i>=The part length is returned.<li>
 * </ul>
 * @param integer signusRule The rule to apply to the signus.
 * <ul>
 * <li><i>1</i>=The length always include the signus length if it's present or not in the value.<li>
 * <li><i>2</i>=The length don't include the signus length.<li>
 * <li><i>3</i>=The length include the signus length only if it's present in the value.<li>
 * </ul>
 * @return string The decimal part or <i>null<i> if the value isn't numeric.
 * @access public
 */
function getIntPartLength(any, noDigitRule, signusRule)
{
 var varRtnObj=-1;
 var varStrVal=getIntPart(any,noDigitRule,signusRule);
 if(varStrVal!=null){varRtnObj=varStrVal.length;}
 return varRtnObj;
}
/**
 * Check if a value is formated as an email.
 *
 * @return boolean Is formated as an email ? false=No|true=Yes.
 * @access public
 */
function isEmail(any)
{
 var varRtnObj=false;
 if(isString(any))
 {
  if(any.match(new RegExp('^([\\w|\\.|\\-|_]+)@([\\w||\\-|_]+)\\.([\\w|\\.|\\-|_]+)$','gi')))
  {varRtnObj=true;}
 }
 return varRtnObj;
}
/**
 * Replace all the occurences of a searched string in a string.
 *
 * @param string searched The searched string.
 * @param string replaceBy The string of replacement.
 * @param string inString The string to transform.
 * @return string The resulting string.
 * @access public
 */
function replaceString(searched, replaceBy, inString)
{
 var varRtnObj='';
 if((isString(searched))&&(isString(replaceBy))&&(isString(inString)))
 {
  if(searched.length>0)
  {
   var varPos=1;
   while(varPos>=0)
   {
    varPos=inString.indexOf(searched,0);
    if(varPos>=0)
    {
     varRtnObj+=inString.substring(0,varPos);
     varRtnObj+=replaceBy;varPos+=searched.length;
     inString=inString.substring(varPos);
    }else{varRtnObj+=inString;}
   }
  }else{varRtnObj=inString;}
 }
 return varRtnObj;
}
/**
 * Truncate a string.
 *
 * @param string anyString The string to process.
 * @param integer maxLength The maximum length of the returned value.
 * <br />If this value is greater than of the length of the string to process then the returned string will not be truncated.
 * <br />If this value is less or equal to zero then the return string will be empty.
 * @param integer sideRule The rule that deifne wich side must be truncate.
 * <ul>
 * <li><i>1</i>=The string is truncated at the right side.</li>
 * <li><i>2</i>=The string is truncated at the left side.</li>
 * </ul>
 * @return string The truncated string.
 * @access public
 */
function truncateString(anyString, maxLength, sideRule)
{
 var varRtnObj=null;
 var varSidRul=0;
 var varMaxLen=0;
 if(isString(anyString)&&isNumber(maxLength))
 {
  if(isNumber(sideRule)){varSidRul=sideRule;}
  if((varSidRul<1)||(varSidRul>2)){varSidRul=1;}
  if(maxLength>=0){varMaxLen=maxLength;}
  varRtnObj=anyString;
  if(varMaxLen<varRtnObj.length)
  {
   switch(varSidRul)
   {
   case 1:
    varRtnObj=varRtnObj.substring(0,varMaxLen);
    break;
   case 2:
    varRtnObj=varRtnObj.substring((varRtnObj.length-varMaxLen),varRtnObj.length);
    break;
   }
  }
 }
 return varRtnObj;
}
/**
 * Padd a string.
 *
 * @param string anyString The string to process.
 * @param integer minLength The minimum length of the return value.
 * <br />If this value is less or equal to of the string to process then the returned string will be the string to process.
 * <br />If this value is less or equal to zero then the return string will be empty.
 * @param integer sideRule The rule that define wich side must be fill.
 * <ul>
 * <li><i>1</i>=The string is filled at the right side.</li>
 * <li><i>2</i>=The string is filled at the left side.</li>
 * </ul>
 * @param string fillString The string that must be used to padd the string to process.
 * <br >if this value is invalid or empty then the string will be fill with white spaces.
 * @return string The truncated string.
 * @access public
 */
function paddString(anyString, minLength, sideRule, fillString)
{
 var varRtnObj=null;
 var varStrVal='';
 var varSidRul=0;
 if(isString(anyString)&&isNumber(minLength))
 {
  varRtnObj=anyString;
  if(varRtnObj.length<minLength)
  {
   if(isString(fillString)){varStrVal=fillString;}
   if(varStrVal.length<=0){varStrVal=' ';}
   if(isNumber(sideRule)){varSidRul=sideRule;}
   if((varSidRul<1)||(varSidRul>2)){varSidRul=1;}
   while(minLength>varRtnObj.length)
   {
    switch(varSidRul)
    {
    case 2:
     varRtnObj=varStrVal+varRtnObj;
     break;
    default:
     varRtnObj+=varStrVal;
     break;
    }
   }
   varRtnObj=truncateString(varRtnObj, minLength, varSidRul);
  }
 }
 return varRtnObj;
}
/**
 * Adjust a string.
 *
 * @param string anyString The string to process.
 * @param integer newLength The length of the return string.
 * <br />If this value is less than the length of the string to process then the returned string will be truncated.
 * <br />If this value is greater than the length of the string to process then the returned string will be filled.
 * @param integer sideRule The rule that define wich side must be fill or truncate.
 * <ul>
 * <li><i>1</i>=The string is filled or truncated at the right side.</li>
 * <li><i>2</i>=The string is filled or truncated at the left side.</li>
 * </ul>
 * @param string fillString The string that must be used to padd the string to process.
 * <br >if this value is invalid or empty then the string will be fill with white spaces.
 * @return string The adjusted string.
 * @access public
 */
function adjustString(anyString, newLength, sideRule, fillString)
{return truncateString(paddString(anyString, newLength, sideRule, fillString), newLength, sideRule);}
/**
 * Trim spaces at the left side of a string.
 *
 * @param string anyString The string to process.
 * @return string The trimed string.
 * @access public
 */
function trimLSpaces(anyString)
{return anyString.replace(new RegExp('^\\s+','g'),'');}
/**
 * Trim spaces at the right side of a string.
 *
 * @param string anyString The string to process.
 * @return string The trimed string.
 * @access public
 */
function trimRSpaces(anyString)
{return anyString.replace(new RegExp('\\s+$','g'),'');}
/**
 * Trim spaces at the left and right side of a string.
 *
 * @param string anyString The string to process.
 * @return string The trimed string.
 * @access public
 */
function trimSpaces(anyString)
{return trimRSpaces(trimLSpaces(anyString));}
/**
 * Remove spaces anywhere in a string.
 *
 * @param string anyString The string to process.
 * @return string The trimed string.
 * @access public
 */
function removeSpaces(anyString)
{return anyString.replace(new RegExp('\\s+','g'),'');}
/**
 * Convert a date in a format to another format.
 *
 * @param string The format of the date.
 * @param string The date in the "from" format.
 * @return string The date in the "to" format or an empty string.
 * @access public
 */
function convertDateFormat(fromFormat, toFormat, date)
{
 var varRtnObj='';
 var varDateValues=getDateValuesFromFormat(fromFormat,date);
 varRtnObj=formatDateFromValues(toFormat,varDateValues[0],varDateValues[1],varDateValues[2]);
 return varRtnObj;
}
/**
 * Get the current date in the ISO format <i>YYYY-MM-DD</i>.
 *
 * @return string The date.
 * @access public
 */
function getISODate()
{
 var objDate=new Date();
 return formatDateFromValues('${YEAR}-${MONTH}-${DAY}',objDate.getFullYear(),(objDate.getMonth()+1),objDate.getDate());
}
/**
 * Check if the values are parts of a valid date.
 *
 * @param integer year The year.
 * @param integer month The month.
 * @param integer day The month day.
 * @return boolean Valid ? false=No|true=Yes.
 */
function isDateValues(year, month, day)
{
 var varRtnObj=false;
 if((year>0)&&(month>0)&&(day>0))
 {
  var objDate=new Date(year,(month-1),day,0,0,0,0);
  if((objDate.getDate()==day)&&(objDate.getMonth()==(month-1))&&(objDate.getFullYear()==year)){varRtnObj=true;}
 }
 return varRtnObj;
}
/**
 * Check the validity of a date in the specified format.
 *
 * @param string format The format of the date.
 * @param string date The date to process.
 * @return array[] The date values.
 * <br />array[0] integer The year.
 * <br />array[1] integer The month.
 * <br />array[2] integer The month day.
 * @access public
 */
function isDateInFormat(format, date)
{
 var varRtnObj=0;
 var varDateValues=getDateValuesFromFormat(format,date);
 varRtnObj=isDateValues(varDateValues[0],varDateValues[1],varDateValues[2]);
 return varRtnObj;
}
/**
 * Get the date values from a date in the specified format.
 *
 * @param string format The format of the date.
 * @param string date The date to process.
 * @return array[] The date values.
 * <br />array[0] integer The year.
 * <br />array[1] integer The month.
 * <br />array[2] integer The month day.
 * @access public
 */
function getDateValuesFromFormat(format, date)
{
 var varRtnObj=new Array(0,0,0);
 if((isString(format))&&(isString(date)))
 {
  var varValue1=null;
  var varDateValn=new Array(0,0,0);
  var varDateVals=new Array('${DAY}','${MONTH}','${YEAR}');
  for(i=0;i<varDateVals.length;i++)
  {varDateValn[i]=format.indexOf(varDateVals[i]);}
  for(i=0;i<varDateVals.length;i++)
  {
   for(j=(i+1);j<varDateValn.length;j++)
   {
    if(varDateValn[i]>varDateValn[j])
    {
     varValue1=varDateValn[i];varDateValn[i]=varDateValn[j];varDateValn[j]=varValue1;
     varValue1=varDateVals[i];varDateVals[i]=varDateVals[j];varDateVals[j]=varValue1;
    }
   }
  }
  var varDelta=0;
  for(i=0;i<varDateVals.length;i++)
  {
   j=varDateValn[i]+varDelta;varValue1='';
   while(j<date.length)
   {
    if(isDigit(date.charAt(j)))
    {varValue1+=date.charAt(j);j++;}
    else{j=date.length;}
    if(j>=date.length)
    {
     if(varValue1.length>0)
     {
      if(varDateVals[i]=='${YEAR}'){varRtnObj[0]=parseInt(varValue1,10);}
      else{if(varDateVals[i]=='${MONTH}'){varRtnObj[1]=parseInt(varValue1,10);}
      else{if(varDateVals[i]=='${DAY}'){varRtnObj[2]=parseInt(varValue1,10);}}}
      varDelta+=varValue1.length-varDateVals[i].length;
     }
    }
   }
  }
 }
 return varRtnObj;
}
/**
 * Get a formated date from the date values : year, month, day.
 *
 * @param string format The return format of the date.
 * @param integer year The year.
 * @param integer month The month.
 * @param integer day The day.
 * @return string The formated date.
 * @access public
 */
function formatDateFromValues(format, year, month ,day)
{
 var varRtnObj=(isString(format))?format:'${YEAR}-${MONTH}-${DAY}';
 var varDay='0'+parseInt(day);
 var varMonth='0'+parseInt(month);
 var varYear='0'+parseInt(year);
 varDay=adjustString(varDay,2,2,'0');
 varMonth=adjustString(varMonth,2,2,'0');
 varYear=adjustString(varYear,4,2,'0');
 varRtnObj=replaceString('${YEAR}',varYear,varRtnObj);
 varRtnObj=replaceString('${MONTH}',varMonth,varRtnObj);
 varRtnObj=replaceString('${DAY}',varDay,varRtnObj);
 return varRtnObj;
}
/**
 * Get the type of a HTML control.
 *
 * @return string The type.
 * @access public
 */
function getControlTypeOf(control)
{
 var varRtnObj='';
 if(isExtendObject(control))
 {
  if(isString(control.type))
  {varRtnObj=control.type;}
 }
 return varRtnObj;
}
/**
 * Get the HTML controls objects that have the same name in a form.
 *
 * @param string controlName The control name in format <i>FormName.ControlName</i>.
 * @param integer controlIndex Index of the control name if the control is in format <i>FormName.ControlName1..n</i>.
 * @return array[] The control objects.
 * @access public
 */
function getControlForName(controlName, controlIndex)
{
 var varRtnObj=new Array();
 var varFrmNam=null;
 var varFrmObj=null;
 var varCtlNam=null;
 var varCtlObj=null;
 var varAnyIdx=0;
 var varColObj=null;
 var varColIdx=0;
 varAnyIdx=controlName.indexOf('.');
 varFrmNam=controlName.substring(0,varAnyIdx);
 varCtlNam=controlName.substring(varAnyIdx+1,controlName.length);
 if((arguments.length>= 2)&&(controlIndex>0))
 {varCtlNam+=''+controlIndex;}
 varFrmObj=document.forms[varFrmNam];
 if(varFrmObj)
 {
  varCtlObj=varFrmObj.elements[varCtlNam];
  if(varCtlObj)
  {
   if(varCtlObj.type)
   {
    if(varCtlObj.name==varCtlNam)
    {varRtnObj[varRtnObj.length]=varCtlObj;}
   }
   else
   {
    varColObj=varCtlObj;
    for(varColIdx=0;varColIdx<varColObj.length;varColIdx++)
    {
     varCtlObj=varColObj[varColIdx];
     if(varCtlObj.type)
     {
      if(varCtlObj.name==varCtlNam)
      {varRtnObj[varRtnObj.length]=varCtlObj;}
     }
    }
   }
  }
 }
 return varRtnObj;
}
/**
 * Check by name if a HTML control exist in a form.
 *
 * @param string controlName The control name in format <i>FormName.ControlName</i>.
 * @param integer controlIndex Index of the control name if the control is in format <i>FormName.ControlName1..n</i>.
 * @return boolean Is exist ? false=No|true=Yes.
 * @access public
 */
function isControlName(controlName, controlIndex)
{return !isEmpty(getControlForName(controlName,controlIndex));}
/**
 * Set or unset the focus on a HTML control in a form.
 *
 * @param string controlName The control name in format <i>FormName.ControlName</i>.
 * @param integer controlIndex Index of the control name if the control is in format <i>FormName.ControlName1..n</i>.
 * @param boolean focusValue Focus rule : false=Unset the focus|true=Set the focus.
 * @return boolean Operation performed successfully ? false=No|true=Yes.
 * @access public
 */
function setControlFocusForName(controlName, controlIndex, focusValue)
{
 var varRtnObj=false;
 if(isBoolean(focusValue))
 {
  var varColCtl=getControlForName(controlName,controlIndex);
  if(varColCtl.length>0)
  {
   if(focusValue){if(varColCtl[0].focus){varColCtl[0].focus();varRtnObj=true;}}
   else{if(varColCtl[0].blur){varColCtl[0].blur();varRtnObj=true;}}
  }
 }
 return varRtnObj;
}
/**
 * Get by name the values of HTML controls in a form.
 *
 * @param string controlName The control name in format <i>FormName.ControlName</i>.
 * @param integer controlIndex Index of the control name if the control is in format <i>FormName.ControlName1..n</i>.
 * @param integer trimValue Trim rule to apply on the values.
 * <ul>
 * <li><i>1</i>=Trim left.</li>
 * <li><i>2</i>=Trim right.</li>
 * <li><i>3</i>=Trim left and right.</li>
 * </ul>
 * @param string defaultValue The value that must be used if the control is without value or can't be found.
 * @param string omitValue The value that must be ignored for the control (the null value of the control).
 * If a trim rule is define then this value is compare with the trimed value(s).
 * @param integer selectRule For controls that allow selection this value define witch values must be returned.
 * <ul>
 * <li><i>1</i>=The selected values (the default value).</li>
 * <li><i>2</i>=The unselected values.</li>
 * <li><i>3</i>=All the values (selected or not).</li>
 * </ul>
 * @return array[] The values
 * <br />array[0..n] of string values.
 * @access public
 */
function getControlValueForName(controlName, controlIndex, trimValue, defaultValue, omitValue, selectRule)
{
 var varRtnObj=new Array();
 var varColCtl=getControlForName(controlName,controlIndex);
 if(varColCtl.length>0)
 {
  var varColIdx=0;
  var varCtlOmt=null;
  var varCtlObj=null;
  var varCtlTyp=null;
  var varCtlVal=null;
  var varCtlSlr=0;
  var varCtlSel=false;
  var varCtlCas=0;
  if(isString(omitValue))
  {varCtlOmt=omitValue;}
  if(isNumber(selectRule))
  {varCtlSlr=selectRule;}
  if((varCtlSlr<1)||(varCtlSlr>3))
  {varCtlSlr=1;}
  for(varColIdx=0;varColIdx<varColCtl.length;varColIdx++)
  {
   varCtlVal=null;
   varCtlObj=varColCtl[varColIdx];
   varCtlTyp=getControlTypeOf(varCtlObj);
   switch(varCtlTyp)
   {
   case '':
    varCtlCas=0;
    break;
   case 'select-multiple':
   case 'select-one':
    varCtlCas=3;
    break;
   case 'radio':
   case 'checkbox':
    varCtlCas=2;
    break;
   default:
    varCtlCas=1;
    break;
   }
   switch(varCtlCas)
   {
   case 1: // control : value
    varCtlVal=varCtlObj.value;
    if(varCtlVal==null)
    {varCtlVal='';}
    switch(trimValue)
    {
    case 1:
     varCtlVal=trimLSpaces(varCtlVal);
     break;
    case 2:
     varCtlVal=trimRSpaces(varCtlVal);
     break;
    case 3:
     varCtlVal=trimSpaces(varCtlVal);
     break;
    }
    if(varCtlVal!=varCtlOmt)
    {varRtnObj[varRtnObj.length]=varCtlVal;}
    break;
   case 2: // control : checked
    varCtlSel=false;
    switch(varCtlSlr)
    {
    case 1:
     if(varCtlObj.checked){varCtlSel=true;}
     break;
    case 2:
     if(!varCtlObj.checked){varCtlSel=true;}
     break;
    case 3:
     varCtlSel=true;
     break;
    }
    if(varCtlSel)
    {varCtlVal=varCtlObj.value;}
    if(varCtlVal==null)
    {varCtlVal='';}
    switch(trimValue)
    {
    case 1:
     varCtlVal=trimLSpaces(varCtlVal);
     break;
    case 2:
     varCtlVal=trimRSpaces(varCtlVal);
     break;
    case 3:
     varCtlVal=trimSpaces(varCtlVal);
     break;
    }
    if(varCtlVal!=varCtlOmt)
    {varRtnObj[varRtnObj.length]=varCtlVal;}
    break;
   case 3: // control : selected
    var i=0;
    var varSelIdx=-1; 
    if(varCtlTyp=='select-one')
    {varSelIdx=varCtlObj.selectedIndex;if(varCtlSlr==1){i=varSelIdx;}}
    while((i>=0)&&(i<varCtlObj.options.length))
    {
     varCtlSel=false;
     switch(varCtlSlr)
     {
     case 1:
      if((varCtlObj.options[i].selected)||(i==varSelIdx)){varCtlSel=true;}
      break;
     case 2:
      if((!varCtlObj.options[i].selected)&&(i!=varSelIdx)){varCtlSel=true;}
      break;
     case 3:
      varCtlSel=true;
      break;
     }
     if(varCtlSel)
     {
      varCtlVal=varCtlObj.options[i].value;
      if(varCtlVal==null)
      {varCtlVal='';}
      switch(trimValue)
      {
      case 1:
       varCtlVal=trimLSpaces(varCtlVal);
       break;
      case 2:
       varCtlVal=trimRSpaces(varCtlVal);
       break;
      case 3:
       varCtlVal=trimSpaces(varCtlVal);
       break;
      }
      if(varCtlVal!=varCtlOmt)
      {varRtnObj[varRtnObj.length]=varCtlVal;}
     }
     i++;
     if((varCtlTyp=='select-one')&&(varCtlSlr==1))
     {i=varCtlObj.options.length;}
    }
    break;
   }
  }
 }
 if((varRtnObj.length<=0)&&(isString(defaultValue)))
 {varRtnObj[0]=defaultValue;}
 return varRtnObj;
}
/**
 * Set by name the values of HTML controls in a form.
 *
 * @param string controlName The control name in format <i>FormName.ControlName</i>.
 * @param integer controlIndex Index of the control name if the control is in format <i>FormName.ControlName1..n</i>.
 * @param integer trimValue Trim rule to apply on the values.
 * <ul>
 * <li><i>1</i>=Trim left.</li>
 * <li><i>2</i>=Trim right.</li>
 * <li><i>3</i>=Trim left and right.</li>
 * </ul>
 * @param any value The value(s) of the control.
 * <br />The following data types and data structures are supported :
 * <br />string values
 * <br />number values : integer, float.
 * <br />array[0..n] of strings and/or numbers values.
 * @param integer selectRule For controls that allow selection this value define witch values must be returned.
 * <ul>
 * <li><i>1</i>=The selected values (the default value).</li>
 * <li><i>2</i>=The unselected values.</li>
 * <li><i>3</i>=All the values (selected or not).</li>
 * </ul>
 * @access public
 */
function setControlValueForName(controlName, controlIndex, trimValue, value, selectRule)
{
 var varColCtl=getControlForName(controlName,controlIndex);
 if(varColCtl.length>0)
 {
  var varColIdx=0;
  var varCtlObj=null;
  var varCtlTyp=null;
  var varCtlSlr=0;
  var varCtlCas=0;
  var varCtlOne=true;
  var varValLst=null;
  var varValIdx=0;
  var varValObj=null;
  var varValStr=null;
  var varValTxt=null;
  var varValfst=true;
  var varValNxt=true;
  if(isNumber(selectRule))
  {varCtlSlr=selectRule;}
  if((varCtlSlr<1)||(varCtlSlr>3))
  {varCtlSlr=1;}
  if(!isArray(value))
  {varValLst=new Array();varValLst[0]=value;}
  else{varValLst=value;}
  for(varColIdx=0;varColIdx<varColCtl.length;varColIdx++)
  {
   varCtlObj=varColCtl[varColIdx];
   varCtlTyp=getControlTypeOf(varCtlObj);
   switch(varCtlTyp)
   {
   case '':
    varCtlOne=true;
    varCtlCas=0;
    break;
   case 'select-one':
    varCtlOne=true;
    varCtlCas=3;
    break;
   case 'select-multiple':
    varCtlOne=false;
    varCtlCas=3;
    break;
   case 'radio':
    varCtlOne=true;
    varCtlCas=2;
    break;
   case 'checkbox':
    varCtlOne=false;
    varCtlCas=2;
    break;
   default:
    varCtlOne=true;
    varCtlCas=1;
    break;
   }
   for(varValIdx=0;varValIdx<varValLst.length;varValIdx++)
   {
    varValStr=null;
    varValTxt=null;
    varValObj=varValLst[varValIdx];
    if(isArray(varValObj))
    {
     if(varValObj.length>0)
     {varValStr=varValObj[0];}
     if(varValObj.length>1)
     {varValTxt=varValObj[1];}
    }
    else
    {varValStr=varValObj;}
    if(isNumber(varValStr))
    {varValStr=''+varValStr;}
    if(isString(varValStr))
    {
     switch(trimValue)
     {
     case 1:
      varValStr=trimLSpaces(varValStr);
      break;
     case 2:
      varValStr=trimRSpaces(varValStr);
      break;
     case 3:
      varValStr=trimSpaces(varValStr);
      break;
     }
     if(isNumber(varValTxt))
     {varValTxt=''+varValTxt;}
     if(!isString(varValTxt))
     {varValTxt=varValStr;}
     switch(varCtlCas)
     {
     case 1: // control : value
      varCtlObj.value=varValStr;
      varValNxt=false;
      break;
     case 2: // control : checked
      switch(varCtlSlr)
      {
      case 1:
       if(varValIdx==0){varCtlObj.checked=false;}
       if(varCtlObj.value==varValStr)
       {varCtlObj.checked=true;}
       break;
      case 2:
       if(varValIdx==0){varCtlObj.checked=true;}
       if(varCtlObj.value==varValStr)
       {varCtlObj.checked=false;}
       break;
      case 3:
       varCtlObj.value=varValStr;
       varCtlObj.checked=false;
       break;
      }
      if(varCtlOne==true)
      {varValNxt=false;}
      break;
     case 3: // control : selected
      switch(varCtlSlr)
      {
      case 1:
       if(varValfst==true)
       {
        if(varCtlOne==true){varCtlObj.selectedIndex=-1;}
        else{for(var i=0;i<varCtlObj.options.length;i++){varCtlObj.options[i].selected=false;}}
       }
       for(var i=0;i<varCtlObj.options.length;i++)
       {
        if(varCtlObj.options[i].value==varValStr)
        {
         if(varCtlOne==true)
         {
          varCtlObj.selectedIndex=i;
          i=varCtlObj.options.length;
          varValNxt=false;
         }
         else{varCtlObj.options[i].selected=true;}
        }
       }
       break;
      case 2:
       for(var i=0;i<varCtlObj.options.length;i++)
       {
        if(varCtlObj.options[i].value==varValStr)
        {
         if(varCtlOne==true)
         {
          if(varCtlObj.selectedIndex==i)
          {varCtlObj.selectedIndex=-1;}
          i=varCtlObj.options.length;
          varValNxt=false;
         }
         else{varCtlObj.options[i].selected=false;}
        }
       }
       break;
      case 3:
       if(varValfst==true)
       {for(var i=0;i<varCtlObj.options.length;i++){varCtlObj.options[i]=null;}}
       varCtlObj.options[varValIdx]=new Option(varValTxt,varValStr);
       break;
      }
      break;
     }
     varValfst=false;
    }
    if(varValNxt!=true)
    {varValIdx=varValLst.length;}
   }
  }
 }
}
