var wrap_regex_array = [/[\s&\(\)\/\'\-\\%]/, /[\s]/];
var _space_start = /^\s+/ ;
var _space_end = /\s+$/ ;
var _html_br = "<BR>"
var _text_br = "&#10;"

var eng_word_match_regex1=/[a-zA-Z0-9\s&\(\)\/\'\-\\%:;_+\?\$\^\{\}\[\]\*]/gi;

function breakLongTextObject(classId, maxChrWidth) {
	breakLongTextObject(classId, maxChrWidth, 1);
}

function breakLongTextObject(classId, maxChrWidth, regExpType) {
     var elemArray = new Array();
     var obj = null;

     for (var n=1;;n++) {
		obj = document.getElementById(classId + n );
		if (obj == null) {
			break;
	    }
		elemArray[n-1] =  obj;
	 }
	
	 if (elemArray) {
		for (var i=0;i < elemArray.length; i++) {
			
//			var str = _Url.decode(elemArray[i].innerHTML);		

			//same as function breakLongTextValue
			var str1 = _Url.convertpEsc2CP(elemArray[i].innerHTML);
			var str = _Url.convertCP2Char(str1);
			
			if (str == null) { str = elemArray[i].innerHTML; }

			str = str.replace(eng_word_match_regex1, '');	 		
				
			if (str.length == 0) {					
				elemArray[i].innerHTML = breakLongText(elemArray[i].innerHTML, maxChrWidth, regExpType, _html_br)     ;		
			}
			//
		}
     }
}

function breakLongTextValue(contentValue, maxChrWidth) {
	var strValue = contentValue;
	var regExpType = 2;
	
	var str1 = _Url.convertpEsc2CP(strValue);
	var str = _Url.convertCP2Char(str1);
	
	if (str == null) { str = strValue; }

	str = str.replace(eng_word_match_regex1, '');	 		
		
	if (str.length == 0) {			
		strValue = breakLongText(strValue, maxChrWidth, regExpType, _html_br)     ;		
	}	
	return strValue;
}

function breakLongText(str, maxChrWidth, regExpType, break_str) {

      var regex = null;
      var returnStr = "";

      var strToken = null;
      var tmpStrToken = null;
      var tmpStr = "";
      var j = 0;
      var p = 0;
      var x = 0;
      var nCnt = 0;

	  regex = wrap_regex_array[regExpType-1];
	  
      if (str) {
      	  str = trim(str);
      	  
          if (str.search(regex) == -1) {
              if (str.length > maxChrWidth) {
                      strToken=breakLongTextByWidth(str, maxChrWidth) ;
              }
              else {
                      strToken = new Array();
                      strToken[0]=str;
              }
          }
          else {
              strToken = new Array();

              tmpStr = str;
              for (;tmpStr.search(regex) > -1;) {
                 p = tmpStr.search(regex);
//alert("0:{"+p+"}{"+tmpStr+"}");                 
                 tmpStrToken = breakLongTextByWidth(tmpStr.substring(0, p + 1), maxChrWidth);
                 for (j=0; j < tmpStrToken.length; j++) {
                          strToken[x++] = tmpStrToken[j];
//alert("1:{"+strToken[x-1]+"}");                          
                 }
                 tmpStr = tmpStr.substring(p + 1);
              }
              if (tmpStr.length > 0) {
                 tmpStrToken = breakLongTextByWidth(tmpStr, maxChrWidth);
                 for (j=0; j < tmpStrToken.length; j++) {              
                          strToken[x++] = tmpStrToken[j];
//alert("2:{"+strToken[x-1]+"}");                             
                 }
              }
          }

           /*
          for (var i=0; i < strToken.length; i++) {
                  alert(strToken[i]);
          }
           */

          if (strToken && strToken.length > 0) {

            j = 0;
            tmpStr = "";            
            for (var i=0; i < strToken.length; i++) {
            
				if (i == (strToken.length-1)) {
					if (j > 0 && returnStr.length > 0) {						
						returnStr += break_str
					}
					returnStr += tmpStr;
					tmpStr=strToken[i];
					j++;
					
					if (j > 0 && returnStr.length > 0) {
						returnStr += break_str
					}
					returnStr += tmpStr;
				}
				else if ((nCnt + strToken[i].length) <= maxChrWidth) {
					//
				}
				else if ((nCnt + strToken[i].length) == (maxChrWidth + 1) && strToken[i].search(_space_end) > -1) {
					//tmpStr += strToken[i];
					strToken[i] = strToken[i].replace(_space_end, '');
				}
				else {
					if (j > 0 && returnStr.length > 0) {
						returnStr += break_str
					}
					returnStr += tmpStr;
					nCnt = 0;
					tmpStr = "";
					j++;
				}
				tmpStr += strToken[i];
				nCnt += strToken[i].length;
			}
          }
      }

      return returnStr;
}

function breakLongTextByWidth(str, maxChrWidth) {

      var strToken = new Array();
      var j =0;
      var x =0;

      for (var i=0; i < str.length; i++) {
          j = i + maxChrWidth;
          strToken[x++]=str.substring(i, j) ;
          i = j - 1;
      }

      return strToken;
}

var _Url = {

    // public method for url encoding
    encode : function (string) {
        return escape(this._utf8_encode(string));
    },

    // public method for url decoding
    decode : function (string) {
        return this._utf8_decode(unescape(string));
    },

    // private method for UTF-8 encoding
    _utf8_encode : function (string) {
    	if (typeof(string) == 'string') {
	        string = string.replace(/\r\n/g,"\n");
	        var utftext = "";
	
	        for (var n = 0; n < string.length; n++) {
	
	            var c = string.charCodeAt(n);
	
	            if (c < 128) {
	                utftext += String.fromCharCode(c);
	            }
	            else if((c > 127) && (c < 2048)) {
	                utftext += String.fromCharCode((c >> 6) | 192);
	                utftext += String.fromCharCode((c & 63) | 128);
	            }
	            else {
	                utftext += String.fromCharCode((c >> 12) | 224);
	                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
	                utftext += String.fromCharCode((c & 63) | 128);
	            }
	        }
	        return utftext;
        }
        return '';
    },

    // private method for UTF-8 decoding
    _utf8_decode : function (utftext) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;

        while ( i < utftext.length ) {

            c = utftext.charCodeAt(i);

            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            }
            else if((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            }
            else {
                c2 = utftext.charCodeAt(i+1);
                c3 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }

        }
        return string;
    },
    
    convertpEsc2CP : function (textString) {
		// textstring: sequence of percent-escaped text
	  	var CPstring = '';
		var outputString = "";
		var compte = 0;
		var n = 0;
		// remove all leading spaces
		textString = textString.replace(/^\s+/, '');
		if (textString.length == 0) { return ""; }
		// normalize all multiple spaces to a single space - note: there shouldn't be any spaces!
		textString = textString.replace(/\s+/g, ' ');
		// convert the whole string to percent escaped forms (to reduce work in coding)
		for ( var j = 0; j < textString.length; j++ ) {
			if (textString.charAt(j) == '%') { outputString += textString.slice(j, j+3); j += 2; }
			else { outputString += '%'+ this._dec2hex(textString.charCodeAt(j)); }
		}
		textString = outputString; outputString = '';
		var listArray = textString.split('%');
		for ( var i = 1; i < listArray.length; i++ ) { // runs from 1 to eliminate first % (produces null array item)
			var b = parseInt(listArray[i], 16);   // alert('b:'+dec2hex(b));
			switch (compte) {
				case 0:
					if (0 <= b && b <= 0x7F) {  // 0xxxxxxx
						outputString += this._dec2hex(b) + ' '; } 
					else if (0xC0 <= b && b <= 0xDF) {  // 110xxxxx
						compte = 1;
						n = b & 0x1F; }
					else if (0xE0 <= b && b <= 0xEF) {  // 1110xxxx
						compte = 2;
						n = b & 0xF; } 
					else if (0xF0 <= b && b <= 0xF7) {  // 11110xxx
						compte = 3;
						n = b & 0x7; } 
					else {
						outputString += '!erreur ' + this._dec2hex(b) + '! ';
						}
					break;
				case 1:
					if (b < 0x80 || b > 0xBF) {
						outputString += '!erreur ' + this._dec2hex(b) + '! ';
						}
					compte--;
					outputString += this._dec2hex((n << 6) | (b-0x80)) + ' ';
					n = 0;
					break;
				case 2: case 3:
					if (b < 0x80 || b > 0xBF) {
						outputString += '!erreur ' + this._dec2hex(b) + '! ';
						}
					n = (n << 6) | (b-0x80);
					compte--;
					break;
			}
		}
		
		CPstring = outputString.replace(/ $/, '');		
		
		return CPstring;
	},
	
	convertCP2Char  : function  ( textString ) {
		var outputString = '';
		var error = 0;
		
	  	textString = textString.replace(/^\s+/, '');
	  	
	  	if (textString.length == 0) { return ""; }
	  	
	  	textString = textString.replace(/\s+/g, ' ');
	  	var listArray = textString.split(' ');
	  	for ( var i = 0; i < listArray.length; i++ ) {
	    	var n = parseInt(listArray[i], 16);
	    	if (n <= 0xFFFF) {
	      		outputString += String.fromCharCode(n);
	    	} else if (n <= 0x10FFFF) {
	      		n -= 0x10000
	      		outputString += String.fromCharCode(0xD800 | (n >> 10)) + String.fromCharCode(0xDC00 | (n & 0x3FF));
	    	} else {
	      		//outputString += 'convertCP2Char error: Code point out of range: '+ this._dec2hex(n);
	      		error = 1;
	    	}
	  	}
	  	
	  	if (error == 1) { outputString = null; }
	  	
	  	return( outputString );
	},
		
	_dec2hex : function (textString) {	
		return (textString+0).toString(16).toUpperCase();
	}
    
}

function trim (a) {
    a = a.replace(_space_start, '');
    return a.replace(_space_end, '');
}