Array.prototype.random = function() {
/**
Retorna um valor randômico de um array
*/
    return this[Math.floor((Math.random()*this.length))];
}

Array.prototype.chrArrayToString = function(sep) {
    var a = new String();
	var len = this.length;
    for (var i = 0; i < len; i++) {        
        a += this[i] 
		if (i+1<len) 	a += sep;
    }
    return a;    
}

Array.prototype.search = function(s,q){
/**
Multi-dimensional array search in javascript
*/
	var len = this.length;
	if (q) {
		s=s.toString();
		for(var i=0; i<len; i++){
			if(this[i].constructor == Array) if(this[i].search(s,q)) return true;
			if(this[i].toString().indexOf(s) != -1) return true;
		}
	}
	else {
		for(var i=0; i<len; i++){
			if(this[i].constructor == Array) if(this[i].search(s,q)) return true;
			if(this[i]===s) return true;
		}
	}
	return false;
}

String.prototype.replaceAt=function() {
  var rlen=(arguments[2]==null?1:arguments[2]);
  return this.substring(0,arguments[0])+arguments[1]+this.substring(arguments[0]+rlen);
}

String.prototype.formatCurrency = function(c) {
    var t = this; if(c == undefined) c = 2;
    var p, d = (t=t.split("."))[1].substr(0, c);
    for(p = (t=t[0]).length; (p-=3) > 1;) {
        t = t.substr(0,p) + "." + t.substr(p);
    }
    return t+","+d+Array(c+1-d.length).join(0);
}

String.prototype.tiraacento = function (word){
	var palavra = this.toLowerCase();
	palavra = palavra.replace(/[áàâãª]/g,'a');
	palavra = palavra.replace(/[ÁÀÂÃ]/g,"A");
	palavra = palavra.replace(/[éèê]/g,"e");
	palavra = palavra.replace(/[ÉÈÊ]/g,"E");
	palavra = palavra.replace(/[íìî]/g,"i");
	palavra = palavra.replace(/[óòôõº]/g,"o");
	palavra = palavra.replace(/[ÓÒÔÕ]/g,"O");
	palavra = palavra.replace(/[úùû]/g,"u");
	palavra = palavra.replace(/[ÚÙÛ]/g,"U");
	//palavra= palavra.replace(/ç/,"c");
	//string = str_replace("Ç","C");
	//string = string_replace(" ","");
	return palavra;
}

/* Construtor da classe */
function forca() {}

function executa(e){
    /* Correção para eventos quebrados da Microsoft */
    if(typeof(e)=='undefined')var e=window.event;
    source=e.target?e.target:e.srcElement;
    /* Correção para o bug do Konqueror/Safari */
    if(source.nodeType==3)source=source.parentNode	;

	/* Obtém a letra digitada */
	var letra=source.value.tiraacento();

	/* validação de entrada */
	var validentry=/[A-Za-zÀ-ú]/
	source.value="";
	if(!validentry.test(letra)) return false

	/* Se a letra ainda não está na lista de tentativas, adicione-a */
	if(!this.letrastentadas.search(letra)) {
		this.letrastentadas.push(letra);
		this.tries.innerHTML = "Letras tentadas: " + this.letrastentadas.chrArrayToString(',');
	}
	if (this.palavraminuscula.indexOf(letra) != -1){ 
				/* Achei a letra na palavra ! */
				this.mostraletras(letra);
		}else{ 
				this.divmessages.innerHTML = 'A palavra não contém a letra ' + letra;
				this.verificaerros(letra);
		}
	}

function verificaerros(letra){
		/* se tem 0 erros ou a letra ainda não está na lista de letras erradas */
		if (this.errors ==0 || !this.erradasletras.search(letra)){
			this.erradasletras.push(letra);
			this.erros++;
			}

		this.diverros.innerHTML = this.erros + ' erro(s)';

		/* número máximo de error artingido, reiniciar o jogo ? */
	if (this.erros>5){
		this.divmessages.innerHTML = 'Fim de jogo!<br /> A palavra era ' + this.palavraselecionada;
		var denovo = confirm("Quer jogar de novo?");
			if (denovo==true) this.init();
		}
	}

function mostraletras(caractere){
	/* em board[], temos um array do tamanho da palavra oculta.
		Se não foi achado ainda, board[caractere] =0
		Após achar, board[caractere] =1
		Depois de achado e exibido, board[caractere] =2
	*/
		for (var x=this.t-1; x>=0;x--){
			if (this.palavraminuscula.charAt(x) == caractere)	this.board[x]=1;
		}
	this.mostrapalavra();	//executado apenas uma vez! dããaãã (ver versões anteriores..)
}

function mostrapalavra(){
	for (var x=0; x<this.t;x++){
		if (this.board[x] & 1){
			var ch = this.selecionadaarray[x];
			this.wordoculta=this.wordoculta.replaceAt(x, ch);
			this.board[x] = 2;
		}
	}
	this.telaoculta.innerHTML = this.wordoculta;

	if (this.wordoculta==this.palavraselecionada){
		this.telaoculta.innerHTML = "Parabéns, você acertou! A palavra era " + this.palavraselecionada;
		var denovo = confirm("Quer jogar de novo?");
			if (denovo==true) this.init()
		}
	}

function iniciar(){
	this.erros=0;
	this.wordoculta=new String;
	this.erradasletras=new Array;
	this.letrastentadas=new Array;
	this.board=new Array;
	this.selecionadaarray=new Array;

	var palavras = new Array('Walter', 'Aline', 'Cecília', 'Rodrigo', 'Cidades', 'Coração', 'Freud', 'Jônatas', 
	'Rafael', 'Aprígio', 'javascript','venkman','mozilla','php','manga','mosquito', 'Nina', 'Lewis','Einstein');

//	var palavras = new Array("Mozilla","Marronzilla");

	this.size = document.getElementById('tamanho');
	this.divmessages = document.getElementById('messages');
	this.diverros=document.getElementById('erros');
	this.telaoculta=document.getElementById('palavraoculta');
	this.tries=document.getElementById('tentativas');

	this.palavraselecionada = palavras.random();
	this.palavraminuscula = this.palavraselecionada.tiraacento();
	this.t=this.palavraselecionada.length;

	this.wordoculta=this.palavraminuscula.replace(/[A-Za-zÀ-ú]/g,'_');
	for (var z=0;z<this.t;z++){
	   this.board[z]=0;
	   this.selecionadaarray[z] = this.palavraselecionada.charAt(z);
	}
	this.telaoculta.innerHTML = this.wordoculta;
	this.divmessages.innerHTML = 'Novo jogo iniciado';
	this.diverros.innerHTML = 'Nenhum erro até o momento';
	this.size.innerHTML = 'A palavra tem ' + this.t + ' letras';
	this.tries.innerHTML = "Letras tentadas:";
	}

forca.prototype.executa=executa
forca.prototype.verificaerros=verificaerros
forca.prototype.mostraletras=mostraletras
forca.prototype.mostrapalavra=mostrapalavra
forca.prototype.init=iniciar

function executaforca(e){
fo.executa(e);
}

function reinicio(){
fo.init();
}

window.onload = init

function init(){
fo = new forca();
fo.init();
var inputentry=document.getElementById('entrada');
inputentry.onkeyup=executaforca;
var novo=document.getElementById('new');
novo.onclick=reinicio
}