function RSTR_Replace(p_strOld,p_strNew,p_iMax){
 var strSrc=this.valueOf()+'';
 var bIsDiff=true;
 var strReturn='';
 var i=0;
 var iMax=parseInt(p_iMax,10);

 if((isNaN(iMax))||(iMax<0))
  iMax=strSrc.length;

 while((bIsDiff)&&(i<iMax)){
  strReturn=strSrc.replace(p_strOld+'',p_strNew+'');
  bIsDiff=(strReturn != strSrc+'');
  strSrc=strReturn+'';
  i++;
 }
 return strReturn;
}

String.prototype.R_Replace=RSTR_Replace;

function RSTR_Format_LowerCaseFirstWord(){
 var strSrc=this.valueOf()+'';
 var strReturn=strSrc.charAt(0).toLowerCase()+strSrc.substring(1,strSrc.length);
 return strReturn;
}

String.prototype.R_Format_LowerCaseFirstWord=RSTR_Format_LowerCaseFirstWord;

function RSTR_Format_LowerCaseAllWord(){
 var i=0;
 var iMax=0;
 var strSrc=this.valueOf()+'';
 var aString=strSrc.split(new RegExp("\\s","gm"));
 var strReturn='';

 for(i=0,iMax=aString.length; i<iMax; i++){
  aString[i]=aString[i].R_Format_LowerCaseFirstWord();
 }
 strSrc=aString.join(' ');
 aString=strSrc.split(new RegExp("\\u002D","gm"));

 for(i=0,iMax=aString.length; i<iMax; i++){
  aString[i]=aString[i].R_Format_LowerCaseFirstWord();
 }
 strReturn=aString.join('-');

 return strReturn;
}

String.prototype.R_Format_LowerCaseAllWord=RSTR_Format_LowerCaseAllWord;

function RSTR_Format_UpperCaseFirstWord(){
 var strSrc=this.valueOf()+'';
 var strReturn=strSrc.charAt(0).toUpperCase()+strSrc.substring(1,strSrc.length);
 return strReturn;
}

String.prototype.R_Format_UpperCaseFirstWord=RSTR_Format_UpperCaseFirstWord;

function RSTR_Format_UpperCaseAllWord(){
 var i=0;
 var iMax=0;
 var strSrc=this.valueOf()+'';
 var aString=strSrc.split(new RegExp("\\s","gm"));
 var strReturn='';

 for(i=0,iMax=aString.length; i<iMax; i++){
  aString[i]=aString[i].R_Format_UpperCaseFirstWord();
 }
 strSrc=aString.join(' ');
 aString=strSrc.split(new RegExp("\\u002D","gm"));

 for(i=0,iMax=aString.length; i<iMax; i++){
  aString[i]=aString[i].R_Format_UpperCaseFirstWord();
 }
 strReturn=aString.join('-');

 return strReturn;
}

String.prototype.R_Format_UpperCaseAllWord=RSTR_Format_UpperCaseAllWord;

function RSTR_RoundByDecimal(vValue,vNbDecimal){
 var nValue=isNaN(vValue)?parseFloat('NaN'):parseFloat(vValue);
 nValue=nValue.R_RoundByDecimal(vNbDecimal);
 return nValue;
}

String.prototype.R_RoundByDecimal=RSTR_RoundByDecimal;

function RSTR_Convert_CNumber_To_LocalNumber(vDecimalSep,vNbDecimal){
 var i=0;
 var strSrc=this.valueOf()+'';
 var nSrc=this.R_RoundByDecimal(strSrc,vNbDecimal);
 var strReturn='';

 strSrc=nSrc+'';
 var aSrc=strSrc.split('.');
 var strSrcLeft='';
 var strSrcRight='';

 strSrcLeft=aSrc[0]+'';

 if(aSrc.length>1)
  strSrcRight=aSrc[1]+'';

 strReturn=strSrcLeft;

 if(vNbDecimal>0)
  strReturn=strReturn+vDecimalSep+strSrcRight;

 return strReturn;
}

String.prototype.R_Convert_CNumber_To_LocalNumber=RSTR_Convert_CNumber_To_LocalNumber;

function RSTR_Convert_CNumber_To_LocalSpacedNumber(vDecimalSep,vNbDecimal,vThousandSep){
 var i=0;
 var strSrc=this.R_Convert_CNumber_To_LocalNumber(vDecimalSep,vNbDecimal)+'';
 var strReturn='';

 var aSrc=strSrc.split(vDecimalSep);
 var strSrcLeft='';
 var strSrcRight='';
 var strSrcSpacedLeft='';
 var strSrcSpacedRight='';

 strSrcLeft=aSrc[0]+'';

 if(aSrc.length>1)
  strSrcRight=aSrc[1]+'';

 strSrcLeft=strSrcLeft.R_Mirror();

 for(i=0;i<strSrcLeft.length;i++){
  if((i>0)&&(i%3==0))
   strSrcSpacedLeft=strSrcSpacedLeft+vThousandSep;

  strSrcSpacedLeft=strSrcSpacedLeft+strSrcLeft.charAt(i);
 }

 strSrcSpacedLeft=strSrcSpacedLeft.R_Mirror();
 strReturn=strSrcSpacedLeft;

 if(strSrcRight.length>0){
  for(i=0;i<strSrcRight.length;i++){
   if((i>0)&&(i%3==0))
    strSrcSpacedRight=strSrcSpacedRight+vThousandSep;

   strSrcSpacedRight=strSrcSpacedRight+strSrcRight.charAt(i);
  }
  strReturn=strReturn+vDecimalSep+strSrcSpacedRight+'';
 }
 return strReturn;
}

String.prototype.R_Convert_CNumber_To_LocalSpacedNumber=RSTR_Convert_CNumber_To_LocalSpacedNumber;

function RSTR_Convert_LocalNumber_To_CNumber(vDecimalSep,vNbDecimal){
 var i=0;
 var strSrc=this.valueOf()+'';
 var strReturn='';
 var nSrc=0;

 var aSrc=strSrc.split(vDecimalSep);
 var strSrcLeft='';
 var strSrcRight='';

 strSrcLeft=aSrc[0]+'';
 strReturn=strSrcLeft;

 if(aSrc.length>1){
  strSrcRight=aSrc[1]+'';
  strReturn=strReturn+'.'+strSrcRight;
 }
 nSrc=this.R_RoundByDecimal(strReturn,vNbDecimal);
 strReturn=nSrc+'';
 return strReturn;
}

String.prototype.R_Convert_LocalNumber_To_CNumber=RSTR_Convert_LocalNumber_To_CNumber;

function RSTR_Convert_LocalSpacedNumber_To_CNumber(vDecimalSep,vNbDecimal,vThousandSep){
 var i=0;
 var strSrc=this.R_RemoveChars(vThousandSep);
 var strReturn=strSrc.R_Convert_LocalNumber_To_CNumber(vDecimalSep,vNbDecimal)+'';
 return strReturn;
}

String.prototype.R_Convert_LocalSpacedNumber_To_CNumber=RSTR_Convert_LocalSpacedNumber_To_CNumber;

function RSTR_Convert_LocalNumber_To_Number(vDecimalSep,vNbDecimal){
 var strValue=this.R_Convert_LocalNumber_To_CNumber(vDecimalSep,vNbDecimal);
 var fValue=isNaN(strValue)?parseFloat('NaN'):parseFloat(strValue);
 return fValue;
}

String.prototype.R_Convert_LocalNumber_To_Number=RSTR_Convert_LocalNumber_To_Number;

function RSTR_Convert_LocalSpacedNumber_To_Number(vDecimalSep,vNbDecimal,vThousandSep){
 var strValue=this.R_Convert_LocalSpacedNumber_To_CNumber(vDecimalSep,vNbDecimal,vThousandSep);
 var fValue=isNaN(strValue)?parseFloat('NaN'):parseFloat(strValue);
 return fValue;
}

String.prototype.R_Convert_LocalSpacedNumber_To_Number=RSTR_Convert_LocalSpacedNumber_To_Number;

function RSTR_Mirror(){
 var i=0;
 var iLength=this.length;
 var strSrc=this.valueOf()+'';
 var strReturn='';

 for(i=iLength-1;i>=0;i--){
  strReturn=strReturn+strSrc.charAt(i);
 }
 return strReturn;
}

String.prototype.R_Mirror=RSTR_Mirror;

function RSTR_Find(vText,vStart,vEnd){
 var i=0;
 var j=0;
 var bIsOk=false;
 var strMyString=this.toString();
 var dText='#';
 var dStart=-1;
 var dEnd=-1;
 var iReturn=-1;

 dText=vText+'';
 if(!isNaN(parseInt(vStart,10)))
  dStart=parseInt(vStart,10);

 if(!isNaN(parseInt(vEnd,10)))
  dEnd=parseInt(vEnd,10);

 if(dStart<0) dStart=0;
 if(dEnd<0) dEnd=this.length;

 if(dStart>this.length) dStart=this.length;
 if(dEnd>this.length) dEnd=this.length;

 if(dStart>dEnd) dStart=dEnd;

 for(i=dStart;((iReturn==-1)&&((i+dText.length)<(dEnd+1))); i++){
  bIsOk=true;

  for(j=0;((bIsOk)&&(j<dText.length)); j++){
   if(this.charAt(i+j)+''!=dText.charAt(j)+'') bIsOk=false;
  }
  if(bIsOk) iReturn=i;
 }
 return iReturn;
}

String.prototype.R_Find=RSTR_Find;

function RSTR_Excize(vStart,vEnd){
 var dStart=-1;
 var dEnd=-1;
 var strReturn='';

 if(!isNaN(parseInt(vStart,10))) dStart=parseInt(vStart,10);
 if(!isNaN(parseInt(vEnd,10))) dEnd=parseInt(vEnd,10);

 if(dStart<0) dStart=0;
 if(dEnd<0) dEnd=this.length;

 if(dStart>this.length) dStart=this.length;
 if(dEnd>this.length) dEnd=this.length;

 if(dStart>dEnd) dStart=dEnd;

 strReturn=this.substring(0,dStart)+this.substring(dEnd,this.length)+'';

 return strReturn+'';
}

String.prototype.R_Excize=RSTR_Excize;

function RSTR_Extract(vStart,vEnd){
 var dStart=-1;
 var dEnd=-1;
 var strReturn='';

 if(!isNaN(parseInt(vStart,10))) dStart=parseInt(vStart,10);
 if(!isNaN(parseInt(vEnd,10))) dEnd=parseInt(vEnd,10);

 if(dStart<0) dStart=0;
 if(dEnd<0) dEnd=this.length;

 if(dStart>this.length) dStart=this.length;
 if(dEnd>this.length) dEnd=this.length;

 if(dStart>dEnd) dStart=dEnd;

 strReturn=this.substring(dStart,dEnd)+'';

 return strReturn+'';
}

String.prototype.R_Extract=RSTR_Extract;

function RSTR_LTrim(vStrCharToTrim){
 var i=0;
 var j=0;
 var bTest_StopNow=false;
 var bTest_FoundOneChar=false;
 var strReturn=this.valueOf()+'';
 var iStart=-1;
 var iEnd=strReturn.length;
 var dStrNotChar=vStrCharToTrim+'';

 // On fait un tableau avec chaque caractere a tester
 var aListChar=new Array();
 for(i=0;i<dStrNotChar.length;i++){
  aListChar[i]=dStrNotChar.charAt(i);
 }

 // On identifie iStart et iEnd
 iStart=0;
 bTest_StopNow=false;
 for(i=0;((!bTest_StopNow)&&(i<strReturn.length));i++){
  bTest_FoundOneChar=false;
  for(j=0;((!bTest_FoundOneChar)&&(j<aListChar.length));j++){
   if(strReturn.charAt(i)+''==aListChar[j]+''){
    iStart=i+1;
    bTest_FoundOneChar=true;
   }
  }
  bTest_StopNow=(!bTest_FoundOneChar);
 }

 // On TRIM
 strReturn=strReturn.R_Extract(iStart,iEnd);

 return strReturn;
}

String.prototype.R_LTrim=RSTR_LTrim;

function RSTR_RTrim(vStrCharToTrim){
 var i=0;
 var j=0;
 var bTest_StopNow=false;
 var bTest_FoundOneChar=false;
 var strReturn=this.valueOf()+'';
 var iStart=-1;
 var iEnd=strReturn.length;
 var dStrNotChar=vStrCharToTrim+'';

 // On fait un tableau avec chaque caractere a tester
 var aListChar=new Array();
 for(i=0; i<dStrNotChar.length; i++){
  aListChar[i]=dStrNotChar.charAt(i);
 }

 // On identifie iStart et iEnd
 iEnd=strReturn.length;
 bTest_StopNow=false;
 for(i=strReturn.length-1;((bTest_StopNow==false)&&(i>-1));i--){
  bTest_FoundOneChar=false;
  for(j=0;((bTest_FoundOneChar==false)&&(j<aListChar.length));j++){
   if(strReturn.charAt(i)+''==aListChar[j]+''){
    iEnd=i;
    bTest_FoundOneChar=true;
   }
  }
  bTest_StopNow=(!bTest_FoundOneChar);
 }
 // On TRIM
 strReturn=strReturn.R_Extract(iStart,iEnd);
 return strReturn;
}

String.prototype.R_RTrim=RSTR_RTrim;

function RSTR_LRTrim(vStrCharToTrim){
 var strReturn=this.valueOf()+'';
 // On TRIM
 strReturn=strReturn.R_LTrim(vStrCharToTrim);
 strReturn=strReturn.R_RTrim(vStrCharToTrim);
 return strReturn;
}

String.prototype.R_LRTrim=RSTR_LRTrim;

function RSTR_RemoveChars(vStrCharToRemove){
 var bTest_FoundOneChar=false;
 var i=0;
 var strReturn=this.valueOf()+'';
 var dStrNotChar=vStrCharToRemove+'';

 // On fait un tableau avec chaque caractere a tester
 var aListChar=new Array();
 for(i=0;i<dStrNotChar.length;i++){
  aListChar[i]=dStrNotChar.charAt(i);
 }

 // On TRIM
 for(i=0;i<strReturn.length;i++){
  bTest_FoundOneChar=false;

  for(j=0; ((bTest_FoundOneChar==false)&&(j<aListChar.length)); j++){
   if(strReturn.charAt(i)+''==aListChar[j]+'')
    bTest_FoundOneChar=true;
  }

  if(bTest_FoundOneChar==true){
   strReturn=strReturn.R_Excize(i,i+1);
   i--;
  }
 }
 return strReturn;
}

String.prototype.R_RemoveChars=RSTR_RemoveChars;

function RSTR_HSplit(vLSep,vRSep,vMSep,vTrimChar){
 var i=0;
 var iLSepPos=-1;
 var iRSepPos=-1;
 var iMSepPos=-1;
 var strText=this.valueOf()+'';
 var aReturn=new Array();
 var aSepPos=new Array();
 var strBuffer='';

 var dLSep='[';
 var dRSep=']';
 var dMSep='|';
 var dTrimChar=' \n\t\r';

 if(vLSep) dLSep=vLSep+'';
 if(vRSep) dRSep=vRSep+'';
 if(vMSep) dMSep=vMSep+'';
 if(vTrimChar) dTrimChar=vTrimChar+'';

 // On verifie que les separateurs sont distincts
 if((dLSep+''!=dRSep+'')&&(dLSep+''!=dMSep+'')&&(dRSep+''!=dMSep+'')){
  // On trouve '['
  iLSepPos=this.R_HSplit__PRIVATE_Get_LSepLvl0(0,dLSep,dRSep,dMSep);

  if(iLSepPos!=-1){
   // On trouve ']'
   iRSepPos=this.R_HSplit__PRIVATE_Get_RSepLvl0(iLSepPos,dLSep,dRSep,dMSep);

   if(iRSepPos!=-1){
    // On cadre le debut des recherches...
    iMSepPos=iLSepPos+1;

    // On trouve tous les '|' de Level 0
    aSepPos[aSepPos.length]=iLSepPos;
    while((iMSepPos>-1)&&(iMSepPos>iLSepPos)&&(iMSepPos<iRSepPos)){
     iMSepPos=this.R_HSplit__PRIVATE_Get_MSepLvl0(iMSepPos,iLSepPos,iRSepPos,dLSep,dRSep,dMSep);
     if(iMSepPos!=-1){
      aSepPos[aSepPos.length]=iMSepPos;
      iMSepPos++;
     }
    }
    aSepPos[aSepPos.length]=iRSepPos;

    // On remplit le tableau...
    for(i=0;i<aSepPos.length-1;i++){
     strBuffer=strText.R_Extract(aSepPos[i]+1,aSepPos[i+1]);
     aReturn[aReturn.length]=strBuffer.R_LRTrim(dTrimChar+'');
    }
   }
  }
 }
 return aReturn;
}

String.prototype.R_HSplit=RSTR_HSplit;

// Fonction privee a NE PAS EXPOSER
// vPosStart doit etre avant ou juste sur le LSep
function RSTR_HSplit__PRIVATE_Get_LSepLvl0(vPosStart,vLSep,vRSep,vMSep){
 var i=0;
 var iPosReturn=-1;
 var iDepth=-1;
 var strText=this.valueOf()+'';

 var dPosStart =0;
 var dLSep='[';
 var dRSep=']';
 var dMSep='|';

 if(vLSep) dLSep=vLSep+'';
 if(vRSep) dRSep=vRSep+'';
 if(vMSep) dMSep=vMSep+'';
 if(isNaN(parseInt(vPosStart,10))==false) dPosStart=parseInt(vPosStart,10);

 for(i=dPosStart;((iPosReturn==-1)&&(iDepth>=-1)&&(i<strText.length));i++){
  if(strText.charAt(i)+''==dLSep+''){
   iDepth++;
   if(iDepth==0) iPosReturn=i;
  }
  else if(strText.charAt(i)+''==dRSep+'') iDepth--;
 }
 return iPosReturn;
}
String.prototype.R_HSplit__PRIVATE_Get_LSepLvl0=RSTR_HSplit__PRIVATE_Get_LSepLvl0;

// Fonction privee a NE PAS EXPOSER
// vPosStart doit etre avant ou juste sur le LSep
function RSTR_HSplit__PRIVATE_Get_RSepLvl0(vPosStart,vLSep,vRSep,vMSep){
 var i=0;
 var iPosReturn=-1;
 var iDepth=-1;
 var strText=this.valueOf()+'';

 var dPosStart=0;
 var dLSep='[';
 var dRSep=']';
 var dMSep='|';

 if(vLSep) dLSep=vLSep+'';
 if(vRSep) dRSep=vRSep+'';
 if(vMSep) dMSep=vMSep+'';
 if(isNaN(parseInt(vPosStart,10))==false) dPosStart=parseInt(vPosStart,10);

 for(i=dPosStart;((iPosReturn==-1)&&(iDepth>=-1)&&(i<strText.length));i++){
  if(strText.charAt(i)+''==dLSep+'')
   iDepth++;
  else if(strText.charAt(i)+''==dRSep+''){
   if(iDepth==0) iPosReturn=i;
   iDepth--;
  }
 }
 return iPosReturn;
}
String.prototype.R_HSplit__PRIVATE_Get_RSepLvl0=RSTR_HSplit__PRIVATE_Get_RSepLvl0;

// Fonction privee a NE PAS EXPOSER
// vPosStart doit etre APRES le LSep (vPosStart est inclu)
// vPosEnd   doit etre AVANT le RSep (vPosEnd est inclu)
// => On admet commencer en iDepth=0
function RSTR_HSplit__PRIVATE_Get_MSepLvl0(vPosM,vPosStart,vPosEnd,vLSep,vRSep,vMSep){
 var i=0;
 var iPosReturn=-1;
 var iDepth=0;
 var strText=this.valueOf()+'';
 var dPosM=1;
 var dPosStart=0;
 var dPosEnd=strText.length-1;
 var dLSep='[';
 var dRSep=']';
 var dMSep='|';

 if(vLSep) dLSep=vLSep+'';
 if(vRSep) dRSep=vRSep+'';
 if(vMSep) dMSep=vMSep+'';
 if(!isNaN(parseInt(vPosM,10))) dPosM=parseInt(vPosM,10);
 if(!isNaN(parseInt(vPosStart,10))) dPosStart=parseInt(vPosStart,10);
 if(!isNaN(parseInt(vPosEnd,10))) dPosEnd=parseInt(vPosEnd,10);

 if((dPosEnd-dPosStart)>2){
  if((dPosM>dPosStart)&&(dPosM<dPosEnd)){
   for(i=dPosM; ((iPosReturn==-1)&&(iDepth > -1)&&(i<dPosEnd)); i++){
    if(strText.charAt(i)+''==dLSep+'') iDepth++;
    else if(strText.charAt(i)+''==dRSep+'') iDepth--;
    else if(strText.charAt(i)+''==dMSep+''){if(iDepth==0) iPosReturn=i;}
   }
  }
 }
 return iPosReturn;
}
String.prototype.R_HSplit__PRIVATE_Get_MSepLvl0=RSTR_HSplit__PRIVATE_Get_MSepLvl0;

