  function StringToHex()
  {
    var sHex =
      ['0','1','2','3','4','5','6','7'
      ,'8','9','A','B','C','D','E','F'
      ]
    ;
    var sTemp = this;
    var sRet = "";
    var sChar = new String();
    var sHigh, sLow;
    while (sTemp.length>0)
    {
      sChar = sTemp.charCodeAt(0);
      sTemp = sTemp.substr(1);
      sHigh = (sChar & 0xf0) >>> 4;
      sLow = sChar & 0x0f;
      sRet += sHex[sHigh] + sHex[sLow];
    }
    return sRet;
  }
  String.prototype.toHex = StringToHex;
  function StringToAscii()
  {
    var sHex = "0123456789ABCDEF";
    var sTemp = this.toUpperCase();
    var sCharH;
    var sCharL;
    var sRet = "";
    while (sTemp.length>0)
    {
      sCharH = sTemp.substr(0,1);
      sCharL = sTemp.length > 1 ? sTemp.substr(1,1) : "0";
      sTemp = sTemp.length > 1 ? sTemp.substr(2) : "";
      sCharH = sHex.indexOf(sCharH);
      sCharL = sHex.indexOf(sCharL);
      sRet += String.fromCharCode(sCharH*16+sCharL);
    }
    return sRet;
  }
  String.prototype.toAscii = StringToAscii;
  String.base64string =
      "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    + "abcdefghijklmnopqrstuvwxyz"
    + "0123456789+/"
  ;
  function StringBase64Encode()
  {
    var decStr = this;
    var bits, dual, i = 0, encOut = '';
    while(decStr.length >= i + 3)
    {
      bits =
          (decStr.charCodeAt(i++) & 0xff) <<16
        | (decStr.charCodeAt(i++) & 0xff) <<8
        | (decStr.charCodeAt(i++) & 0xff)
      ;
      encOut +=
          String.base64string.charAt((bits & 0x00fc0000) >>18)
        + String.base64string.charAt((bits & 0x0003f000) >>12)
        + String.base64string.charAt((bits & 0x00000fc0) >> 6)
        + String.base64string.charAt((bits & 0x0000003f))
      ;
    }
    if (decStr.length -i > 0 && decStr.length -i < 3)
    {
      dual = Boolean(decStr.length -i -1);
      bits =
          ((decStr.charCodeAt(i++) & 0xff) <<16)
        | (dual ? (decStr.charCodeAt(i) & 0xff) <<8 : 0)
      ;
      encOut +=
          String.base64string.charAt((bits & 0x00fc0000) >>18)
        + String.base64string.charAt((bits & 0x0003f000) >>12)
        + (dual ? String.base64string.charAt((bits & 0x00000fc0) >>6) : '=')
        + '='
      ;
    }
    return encOut;
  }
  String.prototype.Base64Encode = StringBase64Encode;
  function StringBase64Decode()
  {
    var encStr = this;
    var bits, decOut = '', i = 0;
    for(; i<encStr.length; i += 4)
    {
      bits =
          (String.base64string.indexOf(encStr.charAt(i))    & 0xff) <<18
        | (String.base64string.indexOf(encStr.charAt(i +1)) & 0xff) <<12
        | (String.base64string.indexOf(encStr.charAt(i +2)) & 0xff) << 6 
        |  String.base64string.indexOf(encStr.charAt(i +3)) & 0xff
      ;
      decOut +=
          String.fromCharCode
            (
              (bits & 0xff0000) >>16
            , (bits & 0xff00) >>8
            , bits & 0xff
            )
      ;
    }
    if (encStr.charCodeAt(i -2) == 61)
    {
      return decOut.substring(0, decOut.length -2);
    }
    else if (encStr.charCodeAt(i -1) == 61)
    {
      return decOut.substring(0, decOut.length -1);
    }
    return decOut;
  }
  String.prototype.Base64Decode = StringBase64Decode;
  function StringHexToNumber()
  {
    var sHex = "0123456789ABCDEF";
    var sTemp = this.toUpperCase();
    var sChar = '';
    var lNumber = 0;
    while (sTemp.length>0)
    {
      sChar = sTemp.substr(0,1);
      sTemp = sTemp.substr(1);
      lNumber = lNumber * 16 + sHex.indexOf(sChar);
    }
    return lNumber;
  }
  String.prototype.HexToNumber = StringHexToNumber;
  function NumberToHex
  ( lpNumber
  )
  {
    var sHex = "0123456789ABCDEF";
    var sRet = '';
    var lMod = 0;
    var lDiv = 0;
    lpNumber = Math.abs(Math.floor(lpNumber));
    lMod = lpNumber % 16;
    lDiv = lpNumber - lMod;
    if (lDiv > 0)
    {
      sRet = NumberToHex(lDiv/16);
    }
    sRet += sHex.substr(lMod,1);
    return sRet;
  }
  function StringPadLeft
  ( spPad
  , lpChars
  )
  {
    var sRet = this;
    while (sRet.length < lpChars)
    {
      sRet = spPad + sRet;
    }
    sRet = sRet.substr(sRet.length-lpChars,lpChars);
    return sRet;
  }
  function NumbersToColor
  ( lpR
  , lpG
  , lpB
  )
  {
    sRet =
        NumberToHex(lpR).PadLeft('0',2)
      + NumberToHex(lpG).PadLeft('0',2)
      + NumberToHex(lpB).PadLeft('0',2)
    ;
    return sRet;
  }
  String.prototype.PadLeft = StringPadLeft;
  function _ColorShadePercentValidate ( lpPercent )
  {
    return ( lpPercent > 100 ? 100 : ( lpPercent < -100 ? - 100 : lpPercent ) );
  }
  function StringColorRGBShade
  ( lpRP
  , lpGP
  , lpBP
  )
  {
    var sCol = this;
    var lR = sCol.substr(0,2).HexToNumber();
    var lG = sCol.substr(2,2).HexToNumber();
    var lB = sCol.substr(4,2).HexToNumber();
    lpRP = _ColorShadePercentValidate(lpRP);
    lpGP = _ColorShadePercentValidate(lpGP);
    lpBP = _ColorShadePercentValidate(lpBP);
    sRet =
        NumberToHex(lR+((lpRP>0)?(255-lR):lR)*lpRP/100).PadLeft('0',2)
      + NumberToHex(lG+((lpGP>0)?(255-lG):lG)*lpGP/100).PadLeft('0',2)
      + NumberToHex(lB+((lpBP>0)?(255-lB):lB)*lpBP/100).PadLeft('0',2)
    ;
    return sRet;
  }
  String.prototype.ColorRGBShade = StringColorRGBShade;
  function StringColorShade
  ( lpPercent
  )
  {
    return this.ColorRGBShade(lpPercent, lpPercent, lpPercent);
  }
  String.prototype.ColorShade = StringColorShade;
  function StringColorToWhitePercent
  ( lpPercent
  )
  {
    var sRet = '';
    var sCol = this;
    if (lpPercent > 100) { lpPercent = 100; }
    if (lpPercent < 0) { lpPercent = 0; }
    sRet =
        NumberToHex(sCol.substr(0,2).HexToNumber()+(255-sCol.substr(0,2).HexToNumber())*lpPercent/100).PadLeft('0',2)
      + NumberToHex(sCol.substr(2,2).HexToNumber()+(255-sCol.substr(2,2).HexToNumber())*lpPercent/100).PadLeft('0',2)
      + NumberToHex(sCol.substr(4,2).HexToNumber()+(255-sCol.substr(4,2).HexToNumber())*lpPercent/100).PadLeft('0',2)
    ;
    return sRet;
  }
  String.prototype.ColorToWhitePercent = StringColorToWhitePercent;
  function StringColorToWhite()
  {
    return this.ColorToWhitePercent(50);
  }
  String.prototype.ColorToWhite = StringColorToWhite;
  function StringColorToBlackPercent
  ( lpPercent
  )
  {
    var sRet = '';
    var sCol = this;
    if (lpPercent > 100) { lpPercent = 100; }
    if (lpPercent < 0) { lpPercent = 0; }
    sRet =
        NumberToHex(sCol.substr(0,2).HexToNumber()-sCol.substr(0,2).HexToNumber()*lpPercent/100).PadLeft('0',2)
      + NumberToHex(sCol.substr(2,2).HexToNumber()-sCol.substr(2,2).HexToNumber()*lpPercent/100).PadLeft('0',2)
      + NumberToHex(sCol.substr(4,2).HexToNumber()-sCol.substr(4,2).HexToNumber()*lpPercent/100).PadLeft('0',2)
    ;
    return sRet;
  }
  String.prototype.ColorToBlackPercent = StringColorToBlackPercent;
  function StringColorToBlack()
  {
    return this.ColorToBlackPercent(50);
  }
  String.prototype.ColorToBlack = StringColorToBlack;
  function StringHTMLEncode()
  {
    var sRet = this;
    sRet = sRet.replace(/&/g,'&amp;');
    sRet = sRet.replace(/</g,'&lt;');
    sRet = sRet.replace(/>/g,'&gt;');
    sRet = sRet.replace(/\"/g,'&quot;');
    return sRet;
  }
  String.prototype.HTMLEncode = StringHTMLEncode;
  