function asciiSubstitute(charToReplace)
{

// charToReplace is to replace or cancel if no ascii substitute is listed below

var unicodeToReplace = charToReplace.charCodeAt() ;

// subChar array values must be contiguous subChar[0], subChar[1], [2]...

subChar = Array() ;

subChar[0] = Array('A',192,193,194,195,196,197,570) ;
subChar[1] = Array('a',224,225,226,227,228,229,257,259,261,462,513,515,551,7681,7834,7841,7843) ;
subChar[2] = Array('B',385,579) ;
subChar[3] = Array('b',384,387,595,7683,7685,7687) ;
subChar[4] = Array('C',199,571) ;
subChar[5] = Array('c',231,263,265,267,269,392,572,597) ;
subChar[6] = Array('D',394) ;
subChar[7] = Array('d',271,273,396,545,598,599,7691,7693,7695,7697,7699) ;
subChar[8] = Array('E',200,201,202,203,582) ;
subChar[9] = Array('e',232,233,234,235,275,277,279,281,283,517,519,553,583,605,7705,7707,7865,7867,7869) ;
subChar[10] = Array('f',402,7711) ;
subChar[11] = Array('G',403) ;
subChar[12] = Array('g',285,287,289,291,485,487,501,608,667,7713) ;
subChar[13] = Array('h',293,295,543,614,686,7715,7717,7719,7721,7723,7830) ;
subChar[14] = Array('I',204,205,206,207,304,407) ;
subChar[15] = Array('i',236,237,238,239,297,299,301,303,464,521,523,616,7725,7881,7883) ;
subChar[16] = Array('J',584) ;
subChar[17] = Array('j',309,496,585,607,669) ;
subChar[18] = Array('k',311,409,489,7729,7731,7733) ;
subChar[19] = Array('L',573) ;
subChar[20] = Array('l',314,316,318,320,322,410,564,619,620,621,7436,7735,7739,7741) ;
subChar[21] = Array('m',624,625,7743,7745,7747) ;
subChar[22] = Array('N',209,413,544) ;
subChar[23] = Array('n',241,324,326,328,414,505,565,626,627,7749,7751,7753,7755) ;
subChar[24] = Array('O',210,211,212,213,214,216,415) ;
subChar[25] = Array('o',242,243,244,245,246,248,333,335,337,417,466,491,525,527,559,7443,7885,7887) ;
subChar[26] = Array('p',421,7765,7767) ;
subChar[27] = Array('Q',586) ;
subChar[28] = Array('q',587,672) ;
subChar[29] = Array('R',588) ;
subChar[30] = Array('r',341,343,345,529,531,589,634,635,636,637,638,639,7769,7771,7775) ;
subChar[31] = Array('s',347,349,351,353,537,575,642,7777,7779,7835) ;
subChar[32] = Array('T',430,574) ;
subChar[33] = Array('t',355,357,359,427,429,539,566,648,7787,7789,7791,7793,7831) ;
subChar[34] = Array('U',217,218,219,220) ;
subChar[35] = Array('u',249,250,251,252,361,363,365,367,369,371,432,468,533,535,7795,7797,7799,7909,7911) ;
subChar[36] = Array('V',434) ;
subChar[37] = Array('v',651,7805,7807) ;
subChar[38] = Array('w',373,7809,7811,7813,7815,7817,7832) ;
subChar[39] = Array('x',7819,7821) ;
subChar[40] = Array('Y',221,376,590) ;
subChar[41] = Array('y',253,255,375,436,563,591,7823,7833,7923,7925,7927,7929) ;
subChar[42] = Array('z',378,380,382,438,495,549,576,656,657,7825,7827,7829) ;

for( var i=0 ; subChar[i] ; i++ )
 { 

 for( var j=0 ; subChar[i][j] ; j++ )
  { if( unicodeToReplace==subChar[i][j] ) return subChar[i][0] ; }

 }

return '' ;

} // end of function asciiSubstitute

function trim (str, charlist) 
{

var whitespace, l = 0 , i = 0 ;
str += '' ;

if (!charlist) // default char list
{ whitespace = " \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000" ; }
else // preg_quote custom list
{
charlist += '';
whitespace = charlist.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '$1') ;
}
 
l = str.length;
for (i = 0; i < l; i++)
{
if (whitespace.indexOf(str.charAt(i)) === -1)
 {
 str = str.substring(i);
 break;
 }
} 

l = str.length;
for (i = l - 1; i >= 0; i--)
{
if (whitespace.indexOf(str.charAt(i)) === -1)
 {
 str = str.substring(0, i + 1) ;
 break ;
 }
}

return whitespace.indexOf(str.charAt(0)) === -1 ? str : '' ;

} //  end of function trim



function utf8ToAscii(strToCtrl)
{
var strCtrlExp = RegExp("^[0-9a-zA-Z ]+$") ;

if( strCtrlExp.test(strToCtrl) ) { return strToCtrl ; }
else
 {
 var strToReturn = String() ;

 for( var i = 0 ; i < strToCtrl.length ; i++ )
  {
  if( strCtrlExp.test( strToCtrl.charAt(i) ) ) { strToReturn = strToReturn + strToCtrl.charAt(i) ; }
  else { strToReturn = strToReturn + asciiSubstitute( strToCtrl.charAt(i) ) ; }
  }

 return strToReturn ;
 }

} // end of function utf8ToAscii




function utf8ToLowerAscii(strToCtrl) { return utf8ToAscii(strToCtrl).toLowerCase() ; }



function utf8ToUpperAscii(strToCtrl) { return utf8ToAscii(strToCtrl).toUpperCase() ; }



function utf8ToPostalLatin(strToCtrl)
{
var puntMarkStrCtrlExp = RegExp('[!"#$%&\'()*+,-./:;?@[\\\]_`{|}~]') ;

// take away punctuation marks (pctns) from the string to control (strToCtrl) if there is any

if( puntMarkStrCtrlExp.test(strToCtrl) ) 
{
var noPctnsStr = String() ;

for( var i=0 ; i<strToCtrl.length ; i++ )
  {
  if( puntMarkStrCtrlExp.test(strToCtrl.charAt(i) ) ) { noPctnsStr = noPctnsStr + ' ' ; }
  else { noPctnsStr = noPctnsStr + strToCtrl.charAt(i) ; }
  }

}

else var noPctnsStr = String(strToCtrl) ; // there is no punctuation mark in the string

/* take away spaces from the string (without punctuation mark - noPctnsStr)
and the first spaces character if there is one or more */

if( RegExp('[ ]').test(noPctnsStr) ) 
{
var strToReturn = String() ;

var multiSpacesCtrl=0 ;
var i=0 ;

while (noPctnsStr.charAt(i)==' ') i++ ; // shift while the first character of the string is a space

while(i<noPctnsStr.length)
 {
 if(noPctnsStr.charAt(i)==' ') 
  { if( ! multiSpacesCtrl) { strToReturn = strToReturn + noPctnsStr.charAt(i) ;  multiSpacesCtrl=1 ; }  }
 else { strToReturn = strToReturn + noPctnsStr.charAt(i) ; multiSpacesCtrl=0 ; }
 i++ ;
 }

}

else var strToReturn = String(noPctnsStr) ; // there is no space in the string to control

return utf8ToUpperAscii(strToReturn) ;

} // end of function utf8ToPostalLatin


function utf8ToAddrMail(strToCtrl)
{
strCtrlExp = RegExp("^[0-9a-zA-Z\-\._@]+$") ;
strToReturn = String(strToCtrl) ;

if( strCtrlExp.test(strToCtrl) ) { return strToReturn.toLowerCase() ; }
else
 {
 for( var i=0 ; i < strToCtrl.length ; i++ )
  if( strCtrlExp.test( strToCtrl.charAt(i) ) == false )
   strToReturn = strToReturn.replace( strToCtrl.charAt(i) , asciiSubstitute( strToCtrl.charAt(i) ) ) ;
 }

return strToReturn.toLowerCase() ;

} // end of function utf8ToAddrMail

function neatPostalLatin(strToCtrl) { return trim( utf8ToPostalLatin(strToCtrl) ) ; }

function neatAddrMail(strToCtrl) { return trim( utf8ToAddrMail(strToCtrl) ) ; }
