
var letterScroll = {

	durationStable : 2000,
	durationScroll : 1400,
	durationScrollStep : 25,
	scrollCharacters : new Array(
		'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
		'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
	),

	words : new Array(),
	maxWordLength : 0,
	currentWordIndex : 0,
	currentWord : '',

	notSetCharacters : new Array(),
	scrollCount : 0,
	interval : null,

	addWord : function(word) {
		letterScroll.words.push(word);
		if (word.length > letterScroll.maxWordLength) {
			letterScroll.maxWordLength = word.length;
		}
	},

	setFirst : function(index) {
		letterScroll.currentWordIndex = index;
		letterScroll.currentWord = letterScroll._padWord(letterScroll.words[letterScroll.currentWordIndex]);
	},

	init : function() {
		var node = document.getElementById('letters');
		var html = '';
		for (var i = 0; i < letterScroll.maxWordLength; i++) {
			html += '<span id="letter'+i+'" class="letter">';
			var character = letterScroll.currentWord.charAt(i);
			html += (character == ' ' ? '&nbsp;' : character)
			html += '</span>';
		}
		node.innerHTML = html;

		letterScroll._showCurrent();
	},

	_showCurrent : function() {
		window.setTimeout('letterScroll._next()', letterScroll.durationStable);
	},

	_next : function() {
		// array of the character indices which have not yet been set correctly
		letterScroll.notSetCharacters.length = 0;
		for (var i = 0; i < letterScroll.maxWordLength; i++) {
			letterScroll.notSetCharacters.push(i);
		}

		letterScroll.currentWordIndex++;
		if (letterScroll.currentWordIndex >= letterScroll.maxWordLength) {
			letterScroll.currentWordIndex = 0;
		}
		letterScroll.currentWord = letterScroll._padWord(letterScroll.words[letterScroll.currentWordIndex]);
		letterScroll.scrollCount = 0;
		letterScroll.interval = window.setInterval('letterScroll._change()', letterScroll.durationScrollStep);
	},

	_change : function() {
		if (letterScroll.notSetCharacters.length == 0) {
			window.clearInterval(letterScroll.interval)
			letterScroll._showCurrent();
			return;
		}
		letterScroll.scrollCount++;

		// choose one index which have not yet been set correctly
		var index = Math.round(Math.random() * (letterScroll.notSetCharacters.length - 1));
		var characterIndex = letterScroll.notSetCharacters[index];

		var newCharacter;
		if (letterScroll.scrollCount * letterScroll.durationScrollStep > letterScroll.durationScroll) {
			// select the target character
			newCharacter = letterScroll.currentWord.charAt(characterIndex);
			letterScroll.notSetCharacters.splice(index, 1);

		} else {
			// select a random character
			index = Math.round(Math.random() * (letterScroll.scrollCharacters.length - 1));
			newCharacter = letterScroll.scrollCharacters[index];

		}

		// replace one character not yet set correctly
		var node = document.getElementById('letter'+characterIndex);
		if (!node) alert(characterIndex);
		node.innerHTML = (newCharacter == ' ' ? '&nbsp;' : newCharacter);
	},

	_padWord : function(word) {
		var len = word.length;
		if (len < letterScroll.maxWordLength) {
			var padLeft = Math.floor((letterScroll.maxWordLength - len) / 2);
			for (var i = 0; i < padLeft; i++) {
				word = ' ' + word;
			}
			var padRight = Math.ceil((letterScroll.maxWordLength - len) / 2);
			for (var i = 0; i < padRight; i++) {
				word += ' ';
			}
		}
		return word;
	}

};
