/*** Variables ***/ var prefix = "xn--"; var delim = "-"; var base = 36; var tmin = 1; var tmax = 26; var skew = 38; var damp = 700; var initial_bias = 72; var initial_n = 128; function decode(text) /*** {{{ ***/ { var n = initial_n; var i = 0; var bias = initial_bias; var output = new Array(); if(text.substr(0, prefix.length) != prefix) { return text } else { text = text.replace(prefix, ""); } var delim_pos = text.lastIndexOf(delim); if(delim_pos !== false) { for(var j = 0; j < delim_pos; j++) output.push(text.charAt(j)); text = text.substr(delim_pos + 1); } for(; text.length > 0;) { var oldi = i; var w = 1; for(var k = base; 1; k = k + base) { var digit = decode_digit(text.charAt(0)); text = text.substr(1); i = i + digit * w; var t = 0; if(k <= bias + tmin) t = tmin; else if(k >= bias + tmax) t = tmax; else t = k - bias; if(digit < t) break; w = w * (base - t); } bias = adapt(i - oldi, output.length + 1, oldi == 0); n = n + Math.floor(i / (output.length + 1)); i = i % (output.length + 1); var tmp = output; output = new Array(); j = 0; for(j = 0; j < i; j++) output.push(tmp[j]); output.push(unicode_to_utf8(n)); for(j = j; j < tmp.length; j++) output.push(tmp[j]); i++; } return output.join(''); } /*** }}} ***/ function encode(text) { var text = utf8_to_unicode(text); var codecount = 0; var basic_string = ""; var extended_string = ""; for (var i = 0; i < text.length; i++) { if(text[i] < initial_n) { basic_string += String.fromCharCode(text[i]); codecount++; } } var n = initial_n; var delta = 0; var bias = initial_bias; var h = codecount; while(h < text.length) { var m = 100000; for(var j = 0; j < text.length; j++) { if(text[j] >= n && text[j] <= m) { m = text[j]; } } delta = delta + (m - n) * (h + 1); n = m; for(j = 0; j < text.length; j++) { var c = text[j]; if(c < n) { delta++; } else if(c == n) { var q = delta; for(var k = base; 1; k = k + base) { var t = 0; if(k <= bias + tmin) { t = tmin; } else if(k >= bias + tmax) { t = tmax; } else { t = k - bias; } if(q < t) { break; } extended_string += encode_digit(t + ((q - t) % (base - t))); q = Math.floor((q - t) / (base - t)); } extended_string += encode_digit(q); bias = adapt(delta, h+1, h==codecount); delta = 0; h++; } } delta++; n++; } var encoded; if(basic_string.length > 0 && extended_string.length < 1) { encoded = basic_string; } else if(basic_string.length > 0 && extended_string.length > 0) { encoded = prefix+basic_string+delim+extended_string; } else if(basic_string.length < 1 && extended_string.length > 0) { encoded = prefix+extended_string; } return encoded; } function adapt(delta, numpoints, firsttime) { if(firsttime) delta = Math.floor(delta / damp); else delta = Math.floor(delta / 2); delta = delta + Math.floor(delta / numpoints); var k = 0; while(delta > Math.floor(((base - tmin) * tmax) / 2)) { delta = Math.floor(delta / (base - tmin)); k = k + base; } return (k + (Math.floor(((base - tmin + 1) * delta) / (delta + skew)))); } /*** ***/ function encode_digit(d) { return String.fromCharCode((d + 22 + 75 * (d < 26))); } function decode_digit(cp) /*** {{{ ***/ { cp = cp.charCodeAt(); if (cp - 48 < 10) { return cp - 22; } else { if (cp - 65 < 26 ) { return cp - 65; } else { if (cp - 97 < 26) { return cp - 97; } else { return base; } } } } /*** }}} ***/ /*** ***/ function unicode_to_utf8( unicode ) /*** {{{ ***/ { var utf8 = ''; utf8 += String.fromCharCode( unicode ); return utf8; } /*** }}} ***/ function utf8_to_unicode( str ) { var unicode = new Array(); for (var i = 0; i < str.length; i++) { var thisValue = str.charCodeAt(i); unicode[unicode.length] = thisValue; } return unicode; } /*** PUBLIC FUNCTION ***/ function toPuny(input) { var text = trim(input.toLowerCase()); var splitArray = text.split('.'); var resultArray = new Array(); for (var x=0; x< splitArray.length; x++) { var result = encode(splitArray[x]); resultArray.push(result); } var returnValue = resultArray.join('.'); return returnValue.replace(" ", " "); } function toNonASCII(input) { var text = trim(input.toLowerCase()); var splitArray = text.split('.'); var resultArray = new Array(); for (var x=0; x < splitArray.length; x++) { var result = decode(splitArray[x]); resultArray.push(result); } var returnValue = resultArray.join('.'); return returnValue.replace(" ", " "); }