function makePrintable ( text )

{
   var printable = ""
   var length = text.length
   var i = 0

   while ( i < length ) {

	var ch = text.charAt ( i++ )

	switch ( ch ) {

	  case " ":

		printable += "\\s"
		break

	  case "\t":

		printable += "\\t"
		break

	  case "\r":

		printable += "\\r"
		break

	  case "\n":

		printable += "\\n"
		break

	  case "\\":

		printable += "\\\\"
		break

	  default:

		if ( ch.charCodeAt (0) < 32 || ch.charCodeAt (0) > 126 ) {

			var hex = ( ch.charCodeAt (0) % 256 ).toString ( 16 )

			printable += "\\x"

			if ( hex.length < 2 ) printable
						+= ( "0" + hex.charAt (0) )
			else printable += hex

		} else printable += ch

		break
	}
   }

   return ( printable )
}


function merge ( indices1, indices2, text ) 

{
   var result = new Array ()

   var length1 = indices1.length
   var ix1 = 0
   var length2 = indices2.length
   var ix2 = 0
   var length = 0

   while ( ix1 < length1 && ix2 < length2 ) {

	if ( text.charCodeAt ( indices1 [ix1] )
					> text.charCodeAt ( indices2 [ix2] ) )
		result [length++] = indices2 [ix2++]
	else result [length++] = indices1 [ix1++]
   }

   while ( ix1 < length1 ) result [length++] = indices1 [ix1++]

   while ( ix2 < length2 ) result [length++] = indices2 [ix2++]

   return ( result )
}


function mergeSort ( indices, text, start, length )

{
   var result

   if ( length > 1 ) {

	var length2 = ( length - ( length % 2 ) ) / 2
	var result1 = mergeSort ( indices, text, start, length2 )
	var result2 = mergeSort ( indices, text, start + length2,
							length - length2 )

	result = merge ( result1, result2, text )

   } else {

	result = new Array()

	result [0] = indices [start]
   }

   return ( result )
}


function bwtEncode ( plainText )

{
   var cypher = ""
   var text = makePrintable ( plainText )
   var done = false
   var i = 0
   var length = text.length
   var indices = new Array ()
   var ranks = new Array ()
   var key = 0

   while ( i < length ) {

	indices [i] = i
	ranks [i] = i++
   }

   i = 0

   while ( ! done && i < length ) {

	var j = 0

	indices = mergeSort ( indices, text, 0, length )

	done = true

	while ( j < length ) {

		if ( ranks [indices [j]] != j ) {

			ranks [indices [j]] = j
			done = false
		}

		++j
	}

	j = 0

	while ( j < length ) {

		if ( --indices [j] < 0 ) indices [j] += length 
		++j
	}

	++i
   }

   key = ranks [0]

   if ( key > 0 ) {

	for ( i = 0; i < key; i++ ) cypher += text.charAt ( indices [i] )

	cypher += " "
   }

   for ( i = key; i < length; i++ ) cypher += text.charAt ( indices [i] )

   return ( cypher )
}


function useHTMLentities ( text )

{
   var htmlText = ""
   var length = text.length
   var i = 0

   while ( i < length ) {

	var ch = text.charAt ( i++ )

	switch ( ch ) {

	  case "&":

		htmlText += "&amp;"
		break

	  case "<":

		htmlText += "&lt;"
		break

	  case ">":

		htmlText += "&gt;"
		break

	  default:

		htmlText += ch
		break
	}
   }

   return ( htmlText )
}


function scrambleEmail ()

{
   var address = document.getElementById ( "email" ).value.replace( /^ */, "" ).replace( / *$/, "" )

   if ( address != "" ) {

	var link = document.getElementById ( "plainText" )

	link.href = "mailto:" + address
	link.innerHTML = useHTMLentities ( address )

	var scrambledAddress = bwtEncode ( address )

	document.getElementById ( "scrambledEmail" ).innerHTML
		= "&lt;a href=\"mailto:\" name=\"e_mail\"&gt;"
		+ useHTMLentities ( useHTMLentities ( scrambledAddress ) )
		+ "&lt;/a&gt;"
   }
}


function keyup (e)

{
   var status = true
   var key

   if ( window.event ) key = e.keyCode
   else key = e.which

   if ( key == 13 ) {

	document.getElementById ( "scrambleButton" ).focus()
	scrambleEmail ()
	status = false
   }

   return ( status )
}

