String.prototype.endsWith = function(suffix)
{
   return (this.substr(this.length -suffix.length)==suffix);
}

String.prototype.startsWith = function(prefix)
{
   return (this.substr(0,prefix.length)==prefix);
}

String.prototype.trimLeft = function()
{
   return this.replace(/^\s*/,"");
}

String.prototype.trimRight = function()
{
   return this.replace(/\s*$/,"");
}

String.prototype.trim = function()
{
   return this.trimRight().trimLeft();
}

String.prototype.Format = function(format)
{
   var reg = null;
   for (var i =1;i <arguments.length;i++)
   {
      reg = new RegExp("\\{"+parseInt(i-1)+"\\}","g");
      format =format.replace(reg,arguments[i]);
   }
   return format;
}

String.prototype.SubstitutePattern = function (pattern,new_pattern)
{
   var str = this;
   if(pattern=="")
   {
     return str; 
   }
   
   var pos = 0;
   while((pos=str.indexOf(pattern,pos))!=-1)
   {
      str = ((pos!=0)?str.substring(0, pos):"") + new_pattern + str.substring(pos+pattern.length);
   }

   return str;
}

String._typeName ='String';

String.prototype.split2 = function(sep)
{
   var array = new Array();
   var nrchars = this.length;
   var pos1=0;
   if(typeof sep != "string")
   {
      return null;
   }
   for(i=0;i<nrchars;i++)
   {
      if(this.charAt(i) != sep)
      {
         continue;
      }

      array.push(this.substring(pos1,i));
      pos1 = i+1;
   }
   var laststr = this.substring(pos1);
   if(laststr!=sep)
      array.push(laststr);
   return array;
}

function Trim(s) 
{
  // Remove leading spaces and carriage returns
  return s.trim();
}

function RemoveQuotes(s)
{

  var begin, end, i, ic, c1, c2;

  if (!s || s.length == 0) 
     return s;
  for (i=0, ic=0; i<s.length; i++) 
     if (s[i] == '"') 
        ic++;
  if (ic > 2) 
     return s;

  /* Initalize some variables */

  begin = 0;
  end = s.length - 1;
  c1 = s.charAt(begin);
  c2 = s.charAt(end);
  if (c1 != c2 || (c1 != '\'' && c1 != '"')) return s;

  if (s.charAt(begin) == '"' || s.charAt(begin) == '\'') begin++;
  if (end >= 0 && (s.charAt(end) == '"' || s.charAt(end) == '\'')) end--;
  
  if (begin) 
     s= s.substring(begin, end + 1);

  return s;
}

function AddExterialQuotes(s)
{
   s = RemoveQuotes(s);
   s = "\""+s+"\"";
   return s;
}


function dummy(string)
{
   var font = document.createElement('FONT');
   var theData = document.createTextNode(string);
   font.appendChild(theData);
   document.body.appendChild(font)
}

//var expression : is a RegExp e.g.: var expression = new RegExp("[ :-]","g");
function ConvertStringDateToDouble(str,expression)
{
   var table = str.split(expression);
   var year = table[0];
   var month = table[1];
   var day = table[2];
   if(table.length<6)
   {
      var houre = "00";
      var min = "00";
      var sec = "00";
   }
   else
   {
      var houre = table[3];
      var min = table[4];
      var sec = table[5];
   }
   var date = year+month+day+"."+houre+min+sec;
   return date;
}

/*
**  Purpose : Get the statements with argument from string.
**            ex. " AAA (BBB) CCC DDD(FFF) "
**                statements["name"][0] = "AAA" ; 
**                          ["argument"][0] = "BBB";
**                statements["name"][1] = "CCC" ;
**                          ["argument"][1] = "";
**                statements["name"][2] = "DDD" ; 
**                          ["argument"][2] = "FFF"
*/
function GetStatements(string)
{

   var i,j, fl_goto_done,flag_open=false,flag_b_open=false,nm_open_brackets = 0, pos_open_bracket; 
   var pos,flag = 0, flag_last_read = 0;
   var len = 0;
   var poi = 0;
   
   var nr_args = 0;
   var statements = new Array();
   statements["name"] = new Array();
   statements["argument"] = new Array();
   
   len = (string)?string.length:0;
   //Bad string ?
   if (len <= 0)
   {
      alert("syntax error 0");
      return statements;
   }

   while(poi<len)
   {
      nr_args = statements["name"].length;
      statements["name"][nr_args] = "";
      statements["argument"][nr_args] = "";
      //alert(nr_args);
      pos = poi;
      fl_goto_done = false;
      for( i=poi; i<len; i++)
      {
         /* don't look for brackets in pieces enclosed with quotes */      
         if ((string.charAt(i)=='"') && ((i==0) || ((i>0) && (string.charAt(i-1)!='\\')))) 
            flag_b_open=(!flag_b_open);
         /*
         if(string.charAt(i)=='[')
            flag_b_open=true;
         
         if(string.charAt(i)==']')
            flag_b_open=false;
         */
         if (flag_b_open) continue;

         if ( ! flag_open )
         {
            if ((string.charAt(i)=='(') || (string.charAt(i)==' '))
            {
               if ((string.charAt(i)==' ') && flag == 0) 
               {
                  continue; 
               }
               if (string.charAt(i)=='(') 
               {
                  if ( flag == 0 && flag_last_read != 1 )
                  {
                     /* syntax error */
                     alert("syntax error 1")
                     return statements;
                   }
                   flag_open = 1;
                   pos_open_bracket = i;
                   nm_open_brackets++;
               }
               if (flag != 0)
               { 
                  statements['name'][nr_args]=string.substr(pos,i-pos);
                  statements['name'][nr_args] = Trim(statements['name'][nr_args]);
                  if(statements['name'][nr_args]=="")
                  {
                     alert("syntax error 2")
                     return statements;
                  }
                  flag_last_read = 1;
                  pos = i+1;
                  flag = 0;
               }
               continue;
            }
            
            /* Statement without argument */
            
            if (flag_last_read == 1 && flag == 0)
            {
               for( j=pos; j<len; j++)
               {
                  if (string.charAt(j)!=' ') break; 
                  if (j == len - 1) j++; 
                  continue;
               }
               poi = j;
               fl_goto_done = true;
               break;              
            }

            if (string.charAt(i)==')')
            {
               alert("syntax error 3")
               return statements;               
            }

            if (string.charAt(i)!=' ') 
               flag = 1;
         }
         else
         {
            if (string.charAt(i)=='(') 
            {
               nm_open_brackets++;
               continue;
            }//if string '('

            if (string.charAt(i)==')')
            {
                nm_open_brackets--;
                if ( nm_open_brackets < 0 )
                {
                   /* syntax error */
                   alert("syntax error 4")
                   return statements;               
                }
                else 
                   if (nm_open_brackets == 0 )
                   {
                      flag_last_read = 2;
                      if (i-pos_open_bracket-1)
                      {
                         //alert(string.substr(pos_open_bracket+1,i-pos_open_bracket-1)+" pos start "+(pos_open_bracket+1)+" pos end "+(i-pos_open_bracket-1));
                         statements['argument'][nr_args] = string.substr(pos_open_bracket+1,i-pos_open_bracket-1);
                         statements['argument'][nr_args] = Trim(statements['argument'][nr_args]);
                      }
                      flag_open = 0;
                      pos = i + 1;
                      flag = 0;
   
                      for( j=pos; j<len; j++)
                      {
                         if (string.charAt(j)!=' ') break; 
                         if (j == len - 1) j++;
                         continue;
                      }
                      poi = j;
                      fl_goto_done = true;
                      break;
                  }//if
                  continue;
            }//if string ')'
         }//else

      }//for
      
      // goto next statement
      if(fl_goto_done)
         continue;
      
      if ( nm_open_brackets != 0 )
      {
          /* syntax error */
         alert("syntax error 5");
         break;
      }

      if ( (  statements["name"][nr_args].length == 0 ) || pos < len)
      {
         if (flag == 0)
         {
            poi = len;
            fl_goto_done = true;
         }
         else
         {
            statements["name"][nr_args] = string.substr(pos, len-pos);
            statements["name"][nr_args] = Trim(statements["name"][nr_args]);
            poi = len;
            continue;
         }
      }

      if(fl_goto_done)
         continue;
  
      /* syntax error */
      alert("syntax error 6");
      break;
   }//while
/*-----------------------------------*/

      return statements
}

function SetBitArray(string)
{
   var r_comma = new RegExp("[,]","g");
   var r_min = new RegExp("[-]","g");
   var segments = string.split(r_comma);
   var pos,lastvalue,firstvalue,temp;
   var array = new Array();
   
   for(i=0;i<segments.length;i++)
   {
      //find "x-y"
      if(segments[i].match(r_min))
      {
         pos = segments[i].search(r_min);
         lastvalue=parseInt(segments[i].substring(pos+1,segments[i].length));//y
         firstvalue=parseInt(segments[i].substring(0,pos));//x
         if(lastvalue<firstvalue)
         {
            temp=lastvalue;
            lastvalue=firstvalue;
            firstvalue=temp;
         }
         
         for(i=firstvalue;i<=lastvalue;i++)
         {
            array.push(i);
         }
         continue;
      }
      
      if(parseInt(segments[i])||parseInt(segments[i])==0)
      {
         array.push(parseInt(segments[i]));
         continue;
      }
   }//for
   
   return array;
}

/*
* HFHX 29/11/2005   
* create an array with the columns to select in the datagrid  *
* the string must have following formats :                    *
* 'X-~Y'  => from column X to the last column minus Y         *
* 'X-Y'   => from column X to column Y                        *
* 'X,Y,Z' => enumeration of columns                           *
* max = integer with the maximum number of columns            *
*/   
function SetBitArray1(string,max)
{
   var r_comma = new RegExp("[,]","g");
   var r_min = new RegExp("[-]","g");
   var r_tilde = new RegExp("[~]","g");
   var segments = string.split(r_comma);
   var pos,lastvalue,firstvalue;
   var array = new Array();

   if(string.search(r_tilde)>=0)
   {
      pos = string.search(r_min);
      firstvalue = parseInt(string.substring(0,pos));
      lastvalue = max - parseInt(string.substring(pos+2,string.length));
         
      //avoid crash
      lastvalue = (firstvalue>max)         ?  max : lastvalue;
      firstvalue = (firstvalue>=lastvalue) ? lastvalue : firstvalue;

      //fill array
      for(i=firstvalue;i<=lastvalue;i++)
      {
         array.push(i);
      }
   }
   else   
   if(string.search(r_min)>=0)
   {
      pos = string.search(r_min);
      firstvalue = parseInt(string.substring(0,pos));
      firstvalue = parseInt(string.substring(0,pos));
      lastvalue = parseInt(string.substring(pos+1,string.length));

      //avoid crash
      lastvalue  = (firstvalue>max)        ? max : lastvalue;
      firstvalue = (firstvalue>=lastvalue) ? lastvalue   : firstvalue;
      
      //fill array
      for(i=firstvalue;i<=lastvalue;i++)
      {
         array.push(i);
      }         
   }       
   else
   {
      for(i=0;i<segments.length;i++)
      {
         array.push(parseInt(segments[i]));
      }
   }
   return array;
}
