/**
 * stringFunctions.js
 *
 * This file contains a collection of string functions for javascript.
 * Most of them are inspired by their PHP equivalent.
 *
 * This source file is subject to version 2.1 of the GNU Lesser
 * General Public License (LPGL), found in the file LICENSE that is
 * included with this package, and is also available at
 * http://www.gnu.org/copyleft/lesser.html.
 * @package     Javascript
 *
 * @author      Dieter Raber <dieter@dieterraber.net>
 * @copyright   2004-12-27
 * @version     1.0
 * @license     http://www.gnu.org/copyleft/lesser.html
 *
 */

/**
 * TOC
 *
 * - hex2rgb
 * - htmlentities
 * - numericEntities
 * - trim
 * - ucfirst
 * - strPad
 */

/**
 * hex2rgb
 *
 * Convert hexadecimal color triplets to RGB
 *
 * Expects an hexadecimal color triplet (case insensitive)
 * Returns an array containing the decimal values
 * for r, g and b.
 *
 * example:
 *   test = 'ff0033'
 *   test.hex2rgb() //returns the array (255,00,51)
 */

String.prototype.hex2rgb = function()
{
  var red, green, blue;
  var triplet = this.toLowerCase().replace(/#/, '');
  var rgbArr  = new Array();

  if(triplet.length == 6)
  {
    rgbArr[0] = parseInt(triplet.substr(0,2), 16)
    rgbArr[1] = parseInt(triplet.substr(2,2), 16)
    rgbArr[2] = parseInt(triplet.substr(4,2), 16)
    return rgbArr;
  }
  else if(triplet.length == 3)
  {
    rgbArr[0] = parseInt((triplet.substr(0,1) + triplet.substr(0,1)), 16);
    rgbArr[1] = parseInt((triplet.substr(1,1) + triplet.substr(1,1)), 16);
    rgbArr[2] = parseInt((triplet.substr(2,2) + triplet.substr(2,2)), 16);
    return rgbArr;
  }
  else
  {
    throw triplet + ' is not a valid color triplet.';
  }
}


/**
 * htmlEntities
 *
 * Convert all applicable characters to HTML entities
 *
 * object string
 * return string
 *
 * example:
 *   test = ''
 *   test.htmlEntities() //returns '&auml;&ouml;&uuml;'
 */

String.prototype.htmlEntities = function()
{
  var chars = new Array ('&','','','','','','','','','','',
                         '','','','','','','','','','','',
                         '','','','','','','','','','','',
                         '','','','','','','','','','','',
                         '','','','','','','','','','','',
                         '','','','','','','','','\"','','<',
                         '>','','','','','','','','','','',
                         '','','','','','','','','','','',
                         '','','','','','','','');

  var entities = new Array ('amp','agrave','aacute','acirc','atilde','auml','aring',
                            'aelig','ccedil','egrave','eacute','ecirc','euml','igrave',
                            'iacute','icirc','iuml','eth','ntilde','ograve','oacute',
                            'ocirc','otilde','ouml','oslash','ugrave','uacute','ucirc',
                            'uuml','yacute','thorn','yuml','Agrave','Aacute','Acirc',
                            'Atilde','Auml','Aring','AElig','Ccedil','Egrave','Eacute',
                            'Ecirc','Euml','Igrave','Iacute','Icirc','Iuml','ETH','Ntilde',
                            'Ograve','Oacute','Ocirc','Otilde','Ouml','Oslash','Ugrave',
                            'Uacute','Ucirc','Uuml','Yacute','THORN','euro','quot','szlig',
                            'lt','gt','cent','pound','curren','yen','brvbar','sect','uml',
                            'copy','ordf','laquo','not','shy','reg','macr','deg','plusmn',
                            'sup2','sup3','acute','micro','para','middot','cedil','sup1',
                            'ordm','raquo','frac14','frac12','frac34');

  newString = this;
  for (var i = 0; i < chars.length; i++)
  {
    myRegExp = new RegExp();
    myRegExp.compile(chars[i],'g')
    newString = newString.replace (myRegExp, '&' + entities[i] + ';');
  }
  return newString;
}


/**
 * numericEntities
 *
 * Convert all applicable characters to numeric entities
 *
 * object string
 * return string
 *
 * example:
 *   test = ''
 *   test.numericEntities() //returns '&#228;&#246;&#252;'
 */

String.prototype.numericEntities = function()
{
  var i;
  var chars = new Array ('&','','','','','','','','','','',
                         '','','','','','','','','','','',
                         '','','','','','','','','','','',
                         '','','','','','','','','','','',
                         '','','','','','','','','','','',
                         '','','','','','','','','\"','','<',
                         '>','','','','','','','','','','',
                         '','','','','','','','','','','',
                         '','','','','','','','');

  var entities = new Array()
  for (i = 0; i < chars.length; i++)
  {
    entities[i] = chars[i].charCodeAt(0);
  }

  newString = this;
  for (i = 0; i < chars.length; i++)
  {
    myRegExp = new RegExp();
    myRegExp.compile(chars[i],'g')
    newString = newString.replace (myRegExp, '&#' + entities[i] + ';');
  }
  return newString;
}



/**
 * trim
 *
 * Strip whitespace from the beginning and end of a string
 *
 * object string
 * return string
 *
 * example:
 *   test = '\nsomestring\n\t\0'
 *   test.trim()  //returns 'somestring'
 */
String.prototype.trim = function()
{
  return this.replace(/^\s*([^ ]*)\s*$/, "$1");
}


/**
 * ucfirst
 *
 * Returns a string with the first character capitalized,
 * if that character is alphabetic.
 *
 * object string
 * return string
 *
 * example:
 *   test = 'john'
 *   test.ucfirst() //returns 'John'
 */

String.prototype.ucfirst = function()
{
  firstLetter = this.charCodeAt(0);
  if((firstLetter >= 97 && firstLetter <= 122)
     || (firstLetter >= 224 && firstLetter <= 246)
     || (firstLetter >= 249 && firstLetter <= 254))
  {
    firstLetter = firstLetter - 32;
  }
  alert(firstLetter)
  return String.fromCharCode(firstLetter) + this.substr(1,this.length -1)
}


/**
 * strPad
 *
 * Pad a string to a certain length with another string
 *
 * This functions returns the input string padded on the left, the right, or both sides
 * to the specified padding length. If the optional argument pad_string is not supplied,
 * the output is padded with spaces, otherwise it is padded with characters from pad_string
 * up to the limit.
 *
 * The optional argument pad_type can be STR_PAD_RIGHT, STR_PAD_LEFT, or STR_PAD_BOTH.
 * If pad_type is not specified it is assumed to be STR_PAD_RIGHT.
 *
 * If the value of pad_length is negative or less than the length of the input string,
 * no padding takes place.
 *
 * object string
 * return string
 *
 * examples:
 *   var input = 'foo';
 *   input.strPad(9);                      // returns "foo      "
 *   input.strPad(9, "*+", STR_PAD_LEFT);  // returns "*+*+*+foo"
 *   input.strPad(9, "*", STR_PAD_BOTH);   // returns "***foo***"
 *   input.strPad(9 , "*********");        // returns "foo******"
 */

var STR_PAD_LEFT  = 0;
var STR_PAD_RIGHT = 1;
var STR_PAD_BOTH  = 2;

String.prototype.strPad = function(pad_length, pad_string, pad_type)
{
  /* Helper variables */
  var num_pad_chars   = pad_length - this.length;/* Number of padding characters */
  var result          = '';                       /* Resulting string */
  var pad_str_val     = ' ';
  var pad_str_len     = 1;                        /* Length of the padding string */
  var pad_type_val    = STR_PAD_RIGHT;            /* The padding type value */
  var i               = 0;
  var left_pad        = 0;
  var right_pad       = 0;
  var error           = false;
  var error_msg       = '';
  var output           = this;

  if (arguments.length < 2 || arguments.length > 4)
  {
    error     = true;
    error_msg = "Wrong parameter count.";
  }


  else if(isNaN(arguments[0]) == true)
  {
    error     = true;
    error_msg = "Padding length must be an integer.";
  }
  /* Setup the padding string values if specified. */
  if (arguments.length > 2)
  {
    if (pad_string.length == 0)
    {
      error     = true;
      error_msg = "Padding string cannot be empty.";
    }
    pad_str_val = pad_string;
    pad_str_len = pad_string.length;

    if (arguments.length > 3)
    {
      pad_type_val = pad_type;
      if (pad_type_val < STR_PAD_LEFT || pad_type_val > STR_PAD_BOTH)
      {
        error     = true;
        error_msg = "Padding type has to be STR_PAD_LEFT, STR_PAD_RIGHT, or STR_PAD_BOTH."
      }
    }
  }

  if(error) throw error_msg;

  if(num_pad_chars > 0 && !error)
  {
    /* We need to figure out the left/right padding lengths. */
    switch (pad_type_val)
    {
      case STR_PAD_RIGHT:
        left_pad  = 0;
        right_pad = num_pad_chars;
        break;

      case STR_PAD_LEFT:
        left_pad  = num_pad_chars;
        right_pad = 0;
        break;

      case STR_PAD_BOTH:
        left_pad  = Math.floor(num_pad_chars / 2);
        right_pad = num_pad_chars - left_pad;
        break;
    }

    for(i = 0; i < left_pad; i++)
    {
      output = pad_str_val.substr(0,num_pad_chars) + output;
    }

    for(i = 0; i < right_pad; i++)
    {
      output += pad_str_val.substr(0,num_pad_chars);
    }
  }

  return output;
}



String.prototype.html_entity_decode=function() {
//Dcode une chane
texte=this;
texte = texte.replace(/&quot;/g,'"');
texte = texte.replace(/&amp;/g,'&');
texte = texte.replace(/&#39;/g,"'");
texte = texte.replace(/&lt;/g,'<');
texte = texte.replace(/&gt;/g,'>');
texte = texte.replace(/&circ;/g,'^');
texte = texte.replace(/&lsquo;/g,'');
texte = texte.replace(/&rsquo;/g,'');
texte = texte.replace(/&ldquo;/g,'');
texte = texte.replace(/&rdquo;/g,'');
texte = texte.replace(/&bull;/g,'');
texte = texte.replace(/&ndash;/g,'');
texte = texte.replace(/&mdash;/g,'');
texte = texte.replace(/&tilde;/g,'');
texte = texte.replace(/&trade;/g,'');
texte = texte.replace(/&scaron;/g,'');
texte = texte.replace(/&rsaquo;/g,'');
texte = texte.replace(/&oelig;/g,'');
texte = texte.replace(/&#357;/g,'');
texte = texte.replace(/&#382;/g,'');
texte = texte.replace(/&Yuml;/g,'');
texte = texte.replace(/&nbsp;/g,' ');
texte = texte.replace(/&iexcl;/g,'');
texte = texte.replace(/&cent;/g,'');
texte = texte.replace(/&pound;/g,'');
texte = texte.replace(/&curren;/g,' ');
texte = texte.replace(/&yen;/g,'');
texte = texte.replace(/&brvbar;/g,'');
texte = texte.replace(/&sect;/g,'');
texte = texte.replace(/&uml;/g,'');
texte = texte.replace(/&copy;/g,'');
texte = texte.replace(/&ordf;/g,'');
texte = texte.replace(/&laquo;/g,'');
texte = texte.replace(/&not;/g,'');
texte = texte.replace(/&shy;/g,'');
texte = texte.replace(/&reg;/g,'');
texte = texte.replace(/&macr;/g,'');
texte = texte.replace(/&deg;/g,'');
texte = texte.replace(/&plusmn;/g,'');
texte = texte.replace(/&sup2;/g,'');
texte = texte.replace(/&sup3;/g,'');
texte = texte.replace(/&acute;/g,'');
texte = texte.replace(/&micro;/g,'');
texte = texte.replace(/&para/g,'');
texte = texte.replace(/&middot;/g,'');
texte = texte.replace(/&cedil;/g,'');
texte = texte.replace(/&sup1;/g,'');
texte = texte.replace(/&ordm;/g,'');
texte = texte.replace(/&raquo;/g,'');
texte = texte.replace(/&frac14;/g,'');
texte = texte.replace(/&frac12;/g,'');
texte = texte.replace(/&frac34;/g,'');
texte = texte.replace(/&iquest;/g,'');
texte = texte.replace(/&Agrave;/g,'');
texte = texte.replace(/&Aacute;/g,'');
texte = texte.replace(/&Acirc;/g,'');
texte = texte.replace(/&Atilde;/g,'');
texte = texte.replace(/&Auml;/g,'');
texte = texte.replace(/&Aring;/g,'');
texte = texte.replace(/&AElig;/g,'');
texte = texte.replace(/&Ccedil;/g,'');
texte = texte.replace(/&Egrave;/g,'');
texte = texte.replace(/&Eacute;/g,'');
texte = texte.replace(/&Ecirc;/g,'');
texte = texte.replace(/&Euml;/g,'');
texte = texte.replace(/&Igrave;/g,'');
texte = texte.replace(/&Iacute;/g,'');
texte = texte.replace(/&Icirc;/g,'');
texte = texte.replace(/&Iuml;/g,'');
texte = texte.replace(/&ETH;/g,'');
texte = texte.replace(/&Ntilde;/g,'');
texte = texte.replace(/&Ograve;/g,'');
texte = texte.replace(/&Oacute;/g,'');
texte = texte.replace(/&Ocirc;/g,'');
texte = texte.replace(/&Otilde;/g,'');
texte = texte.replace(/&Ouml;/g,'');
texte = texte.replace(/&times;/g,'');
texte = texte.replace(/&Oslash;/g,'');
texte = texte.replace(/&Ugrave;/g,'');
texte = texte.replace(/&Uacute;/g,'');
texte = texte.replace(/&Ucirc;/g,'');
texte = texte.replace(/&Uuml;/g,'');
texte = texte.replace(/&Yacute;/g,'');
texte = texte.replace(/&THORN;/g,'');
texte = texte.replace(/&szlig;/g,'');
texte = texte.replace(/&agrave;/g,'');
texte = texte.replace(/&aacute;/g,'');
texte = texte.replace(/&acirc;/g,'');
texte = texte.replace(/&atilde;/g,'');
texte = texte.replace(/&auml;/g,'');
texte = texte.replace(/&aring;/g,'');
texte = texte.replace(/&aelig;/g,'');
texte = texte.replace(/&ccedil;/g,'');
texte = texte.replace(/&egrave;/g,'');
texte = texte.replace(/&eacute;/g,'');
texte = texte.replace(/&ecirc;/g,'');
texte = texte.replace(/&euml;/g,'');
texte = texte.replace(/&igrave;/g,'');
texte = texte.replace(/&iacute;/g,'');
texte = texte.replace(/&icirc;/g,'');
texte = texte.replace(/&iuml;/g,'');
texte = texte.replace(/&eth;/g,'');
texte = texte.replace(/&ntilde;/g,'');
texte = texte.replace(/&ograve;/g,'');
texte = texte.replace(/&oacute;/g,'');
texte = texte.replace(/&ocirc;/g,'');
texte = texte.replace(/&otilde;/g,'');
texte = texte.replace(/&ouml;/g,'');
texte = texte.replace(/&divide;/g,'');
texte = texte.replace(/&oslash;/g,'');
texte = texte.replace(/&ugrave;/g,'');
texte = texte.replace(/&uacute;/g,'');
texte = texte.replace(/&ucirc;/g,'');
texte = texte.replace(/&uuml;/g,'');
texte = texte.replace(/&yacute;/g,'');
texte = texte.replace(/&thorn;/g,'');
texte = texte.replace(/&yuml;/g,'');
return texte;
}




//Dcode une chane
function html_entity_decode(texte) {
texte = texte.replace(/&quot;/g,'"');
texte = texte.replace(/&amp;/g,'&');
texte = texte.replace(/&#39;/g,"'");
texte = texte.replace(/&lt;/g,'<');
texte = texte.replace(/&gt;/g,'>');
texte = texte.replace(/&circ;/g,'^');
texte = texte.replace(/&lsquo;/g,'');
texte = texte.replace(/&rsquo;/g,'');
texte = texte.replace(/&ldquo;/g,'');
texte = texte.replace(/&rdquo;/g,'');
texte = texte.replace(/&bull;/g,'');
texte = texte.replace(/&ndash;/g,'');
texte = texte.replace(/&mdash;/g,'');
texte = texte.replace(/&tilde;/g,'');
texte = texte.replace(/&trade;/g,'');
texte = texte.replace(/&scaron;/g,'');
texte = texte.replace(/&rsaquo;/g,'');
texte = texte.replace(/&oelig;/g,'');
texte = texte.replace(/&#357;/g,'');
texte = texte.replace(/&#382;/g,'');
texte = texte.replace(/&Yuml;/g,'');
texte = texte.replace(/&nbsp;/g,' ');
texte = texte.replace(/&iexcl;/g,'');
texte = texte.replace(/&cent;/g,'');
texte = texte.replace(/&pound;/g,'');
texte = texte.replace(/&curren;/g,' ');
texte = texte.replace(/&yen;/g,'');
texte = texte.replace(/&brvbar;/g,'');
texte = texte.replace(/&sect;/g,'');
texte = texte.replace(/&uml;/g,'');
texte = texte.replace(/&copy;/g,'');
texte = texte.replace(/&ordf;/g,'');
texte = texte.replace(/&laquo;/g,'');
texte = texte.replace(/&not;/g,'');
texte = texte.replace(/&shy;/g,'');
texte = texte.replace(/&reg;/g,'');
texte = texte.replace(/&macr;/g,'');
texte = texte.replace(/&deg;/g,'');
texte = texte.replace(/&plusmn;/g,'');
texte = texte.replace(/&sup2;/g,'');
texte = texte.replace(/&sup3;/g,'');
texte = texte.replace(/&acute;/g,'');
texte = texte.replace(/&micro;/g,'');
texte = texte.replace(/&para/g,'');
texte = texte.replace(/&middot;/g,'');
texte = texte.replace(/&cedil;/g,'');
texte = texte.replace(/&sup1;/g,'');
texte = texte.replace(/&ordm;/g,'');
texte = texte.replace(/&raquo;/g,'');
texte = texte.replace(/&frac14;/g,'');
texte = texte.replace(/&frac12;/g,'');
texte = texte.replace(/&frac34;/g,'');
texte = texte.replace(/&iquest;/g,'');
texte = texte.replace(/&Agrave;/g,'');
texte = texte.replace(/&Aacute;/g,'');
texte = texte.replace(/&Acirc;/g,'');
texte = texte.replace(/&Atilde;/g,'');
texte = texte.replace(/&Auml;/g,'');
texte = texte.replace(/&Aring;/g,'');
texte = texte.replace(/&AElig;/g,'');
texte = texte.replace(/&Ccedil;/g,'');
texte = texte.replace(/&Egrave;/g,'');
texte = texte.replace(/&Eacute;/g,'');
texte = texte.replace(/&Ecirc;/g,'');
texte = texte.replace(/&Euml;/g,'');
texte = texte.replace(/&Igrave;/g,'');
texte = texte.replace(/&Iacute;/g,'');
texte = texte.replace(/&Icirc;/g,'');
texte = texte.replace(/&Iuml;/g,'');
texte = texte.replace(/&ETH;/g,'');
texte = texte.replace(/&Ntilde;/g,'');
texte = texte.replace(/&Ograve;/g,'');
texte = texte.replace(/&Oacute;/g,'');
texte = texte.replace(/&Ocirc;/g,'');
texte = texte.replace(/&Otilde;/g,'');
texte = texte.replace(/&Ouml;/g,'');
texte = texte.replace(/&times;/g,'');
texte = texte.replace(/&Oslash;/g,'');
texte = texte.replace(/&Ugrave;/g,'');
texte = texte.replace(/&Uacute;/g,'');
texte = texte.replace(/&Ucirc;/g,'');
texte = texte.replace(/&Uuml;/g,'');
texte = texte.replace(/&Yacute;/g,'');
texte = texte.replace(/&THORN;/g,'');
texte = texte.replace(/&szlig;/g,'');
texte = texte.replace(/&agrave;/g,'');
texte = texte.replace(/&aacute;/g,'');
texte = texte.replace(/&acirc;/g,'');
texte = texte.replace(/&atilde;/g,'');
texte = texte.replace(/&auml;/g,'');
texte = texte.replace(/&aring;/g,'');
texte = texte.replace(/&aelig;/g,'');
texte = texte.replace(/&ccedil;/g,'');
texte = texte.replace(/&egrave;/g,'');
texte = texte.replace(/&eacute;/g,'');
texte = texte.replace(/&ecirc;/g,'');
texte = texte.replace(/&euml;/g,'');
texte = texte.replace(/&igrave;/g,'');
texte = texte.replace(/&iacute;/g,'');
texte = texte.replace(/&icirc;/g,'');
texte = texte.replace(/&iuml;/g,'');
texte = texte.replace(/&eth;/g,'');
texte = texte.replace(/&ntilde;/g,'');
texte = texte.replace(/&ograve;/g,'');
texte = texte.replace(/&oacute;/g,'');
texte = texte.replace(/&ocirc;/g,'');
texte = texte.replace(/&otilde;/g,'');
texte = texte.replace(/&ouml;/g,'');
texte = texte.replace(/&divide;/g,'');
texte = texte.replace(/&oslash;/g,'');
texte = texte.replace(/&ugrave;/g,'');
texte = texte.replace(/&uacute;/g,'');
texte = texte.replace(/&ucirc;/g,'');
texte = texte.replace(/&uuml;/g,'');
texte = texte.replace(/&yacute;/g,'');
texte = texte.replace(/&thorn;/g,'');
texte = texte.replace(/&yuml;/g,'');
return texte;
}


