/* comments of modify byteEncode and byteDecode
1. if you modify byteEnocde or byteDecode function, you must modify the corresponding method in Tool.java .

2. There is a copy of byteEnocde function in find.js(Encapulased in the document.write code) in order to avoid a strange bug if we include encodeUtil.js in the find window. So don't forget to modify find.js if you modify the byteEncode function.
*/
/**
 *
 * @param isEncodeAll true it will encode all characters including English.
 */
function byteEncode(str, isEncodeAll) {
   if((str == null) || (str == "")) {
     return "";
   }

   if(isEncodeAll == null) { // default value is false
      isEncodeAll = false;
   }

   var ret = '';

   for(var i=0; i < str.length; i++) {
      var ch = str.charAt(i);
      var code = str.charCodeAt(i);

      if(i > 0 && ch =='[' && str.charAt(i - 1) == '^') {
         ret += ch;
      }
      else {
         if(code < 128 && ch != '[' && !isEncodeAll && ch != '/' && ch != '\'' &&
            ch != '=' && ch != '#' && ch != '+' && ch != ' ' && ch != '&' ) {
            ret += ch;
         }
         else {
            ret += "[" + code.toString(16) + "]";
         }
      }
   }

   return ret;
}

function byteEncode2(str) {
   var ret = '';

   for(var i = 0; i < str.length; i++) {
      var ch = str.charAt(i);
      var code = str.charCodeAt(i);

      if(code < 128 && ch != '[' && ch != '/' && ch != '\'' &&
         ch != '=' && ch != '%' && ch != '&' && ch != '?' &&
         ch != '#' && ch != '"' && ch != '<' && ch != '>' &&
         ch != ',' && ch != '\\' && ch != '+')
      {
         ret += ch;
      }
      else {
         ret += "[" + code.toString(16) + "]";
      }
   }

   return ret;
}

/**
 * It will encode the character '/'.
 * @param isEncodeAll true it will encode all characters including English.
 */
function byteEncodeURL(str, isEncodeAll) {
   return byteEncode(str, isEncodeAll);
}

function byteDecode(encString) {
   if((encString == null) || (encString == '')) {
      return "";
   }

   var arr = new Array();

   for(var i = 0; i < encString.length; i++) {
      var ch = encString.charAt(i);

      if(ch == '[') {
         var idx = encString.indexOf(']', i + 1);

         if(idx > i + 1) {
            ch = String.fromCharCode(parseInt(encString.substring(i + 1, idx),
                                              16));
            i = idx;
         }
      }

      arr[i] = ch;
   }

   return arr.join("");
}

// html encoding mapping
var encodingXML = new Array();
encodingXML.push(new Array("&amp;", "&lt;", "&gt;", "&apos;", "&quot;"));
encodingXML.push(new Array("&", "<", ">", "'", "\""));

var encodingXMLAttr = new Array();
encodingXMLAttr.push(new Array("&amp;", "&lt;", "&gt;", "&quot;"));
encodingXMLAttr.push(new Array("&", "<", ">", "\""));

function encodeXML(str) {
   if(_root.is_ie) {
      return encodeXMLString(str, encodingXMLAttr);
   }
   else {
      return encodeXMLString(str, encodingXML);
   }
}

function encodeXMLString(str, encoding) {
   if(str == null) {
      return "";
   }

   var buf = "";

   encodeLoop:
   for(var i = 0; i < str.length; i++) {
      for(var j = 0; j < encoding[1].length; j++) {
         try {
            if(str.charAt(i) == encoding[1][j].charAt(0)) {
               buf += encoding[0][j];
               continue encodeLoop;
            }
         }
         catch(ex) {
         }
      }

      buf += str.charAt(i);
   }
   return buf;
}

