
constImgFoldPlus  = 'images/foldpoint-plus.gif';
constImgFoldMinus = 'images/foldpoint-minus.gif';

var gstrOriginalHTML = '';

function ckb_toggle_box_visibility()
{
	var pre = document.getElementsByTagName('PRE')[0];

	if(gstrOriginalHTML.length == 0) 
	{
		gstrOriginalHTML = pre.innerHTML; // backup.

		ckb_draw_blocks(0);
		ckb_draw_blocks(1);
		//ckb_draw_blocks(2); //ta dando problema
		
		
		var imgs = document.body.getElementsByTagName('IMG');

		for(i = 0;i < imgs.length;i++) 
		{
			if(imgs[i].className == 'foldpoint') {
				imgs[i].click();
			}
			// ja comeca fechado pois faz mais sentido que a opcao 'folding' ja esconda os blocos de texto....eh o que
			// se espera por folding...
		}
	}
	else {
		pre.innerHTML = '<pre>'+gstrOriginalHTML+'</pre>'; // *NOTE* extra <pre>s for ie compatibility

		gstrOriginalHTML = '';
	}
}

function ckb_preload_images()
{
// *BEGIN* image preload. this technique of image preload is not enough when the image is shown while it hasn't 
// finished loading, but it does force the loading right from the start, if that's all you need.
	var imgFoldPlus  = new Image();
	var imgFoldMinus = new Image();

	imgFoldPlus.src  = constImgFoldPlus;
	imgFoldMinus.src = constImgFoldMinus;
// *END* image preload
}

function ckb_generate_block_html(nIndentLevel) 
{
	var rand = parseInt(Math.random()*10000);

	return(
		'<img src=\"'+constImgFoldMinus+'\" class= \"foldpoint\" onclick=\"ckb_openclose_div('+rand+')\" id=\"fold'+rand+'\" />'+
		'<div class=\"boxindent level'+nIndentLevel+'\" id=\"block'+rand+'\">'
	);
}

function ckb_check_block_content(strText, nPos, nIndentLevel)
// *DESCRIPTION* avanca ate achar o primeiro caractere nao-blank do bloco.
// retorna se o bloco tem ou nao tem conteudo.(ta vazio ou nao).
// *ASSUMPTION* j esta exatamente no linefeed at the end of the line that contains the colon
{
	var cntSpace = 0;
	var cntIndentLevel = 0;
	var j = nPos;
	var c = strText.charAt(nPos);

	while(j < strText.length) 
	{	
		if(c == ' ') 
		{
			if(++cntSpace == 6) { // *DEFAULT*
				cntIndentLevel++;

				cntSpace = 0;
			}
		}
		else if(c == '\n' || c == '\r') {
			cntSpace = cntIndent = 0;
		}
		else // caractere nao blank.
		{
			//alert('cntIndentLevel '+cntIndentLevel+' x '+(nIndentLevels + 1)+' nIndentLevels');
			if(cntIndentLevel == (nIndentLevel + 1)) {
				return j;
			}
			return -1; //  bloco nao tem conteudo ou o conteudo nao esta indentado corretamente
		}
		c = strText.charAt(++j);
	}
	return -1; //  bloco nao tem conteudo (apenas)
}

function ckb_draw_blocks(nIndentLevel)
{
	var pre        = document.getElementsByTagName('PRE')[0];
	var strText    = pre.innerText || pre.textContent; // *NOTE* cross-browser
	var cntSpace   = 0;
	var cntIndent  = 0;
	var cLast      = 0;
	var bInBlock   = false;
	var bInHTMLTag = false;
	
	for(i = 0;i < strText.length;i++) 
	{
		var cAux = strText.charAt(i);
		
		if(cAux == ' ') 
		{
			if(++cntSpace == 6) { // *DEFAULT*
				cntIndent++;

				cntSpace = 0;
			}
		}
		if(cAux == '\n') {
			cntSpace = cntIndent = 0;
		}
		if(cntIndent <= nIndentLevel) // falar do porque do <= que e importante
		{
			if(bInBlock == true) 
			{
				if(cAux != ' ' && cAux != '\n' && cAux != '\r') // caractere nao-blank do ckb.. // *DESCRIPTION* cabou o bloco...
				{ 
					//alert('\"'+strText.substring(0,i+1)+'\" <- I');
					// o i esta em um primeiro caractere nao-blank da primeira linha fora do bloco
					// vamos rebobinar ate achar o ultimo caractere nao blank do bloco.
					
					var j = i - 1;
	
					while(strText.charAt(j) == ' ' || strText.charAt(j) == '\n' || strText.charAt(j) == '\r') {
						j--;
					}
					//alert('\"'+strText.substring(0,j+1)+'\" <- J');
					
					insert_in_html(pre,j+1,'</div>'); // nao muda o strtext..isso que eh bom dessa funcao
					//insert_in_html(pre,j,'|');
					
					bInBlock = false;
					
					i = j;
				}
				// *TODO* else recursao vai aqui parece...
			}
			else // *DESCRIPTION* we are outside any blocks
			{
				if(cAux == ':' && cLast != ' ')
				{
					var bFoundBlock = true; // *DESCRIPTION* we assume right away that we will find a block
					var j = i + 1;

					while(strText.charAt(j) != '\n' && strText.charAt(j) != '\r')
					// *DESCRIPTION* will detect if the colon is introducing a new block or not.
					// falar da necessidade do \r pro internet explorer
					{
						if(strText.charAt(j) != ' ') {
							bFoundBlock = false; // *DESCRIPTION* we don't have a block
	
							break;
						}
						j++;
					}
					if(bFoundBlock)
					{
						//alert('INFO: Possibility of having found a block.');
						cntIndent++; // *DESCRIPTION* a new block increases the indentation level
						// *NOTE* neste ponto j esta exatamente no linefeed da linha contendo os dois-pontos
						//alert('\"'+strText.substring(0,j+1)+'\" <- J');
						if((j = ckb_check_block_content(strText,j,nIndentLevel)) > 0)
						{
							//alert('\"'+strText.substring(0,j+1)+'\" <- J');
							
							insert_in_html(pre,j - (6 * (nIndentLevel + 1)),ckb_generate_block_html(nIndentLevel));
							//insert_in_html(pre,j,'|');
							
							i = j;
	
							bInBlock = true; // *DESCRIPTION* we are now inside a block
							
							//alert('\"'+strText.substring(0,j+1)+'\" <- J');
						}
						// else bloco nao tinha conteudo valido..
					}
				}
				else { // nao eh caractere especial do ckb..

				}
			}
			cLast = cAux;
		}
	}
}

function insert_in_html(tag, pos, strInsert)
// *DESCRIPTION* falar que nao precisa cuidar de nao haver chave que nao esta sendo fechada pois 
// a aplicacao garante isso bla bla bla se nao me engano usa o comentario description para isso. o 
// pos eh a posicao na string (a partir de onde) que insere o tag
{
	var strHTML       = tag.innerHTML;
	var bInTag        = false;
	var cntTagChars   = 0;
	var cntNestedTags = 0;
	var x             = 0;

	for(i = 0;i < strHTML.length;i++) 
	{
		c = strHTML.charAt(i);
		
		testBody:
		{
			if(bInTag == false && c == '<') {
				bInTag = true;

				cntTagChars++;
				
				break testBody;
			}
			if(bInTag == true)
			{
				if(c == '<') {
					cntNestedTags++;
				}
				if(c == '>') {
					if(cntNestedTags == 0) {
						bInTag = false;
					}
					else {
						cntNestedTags--;
					}
				}
				cntTagChars++;
				
				//if(strHTML.charAt(i - 1)!='<'){if(i % 10 == 0) {alert(strHTML.substring(i,i + 10));}}
				
				break testBody;
			}
			// nesse ponto ja esta fora de uma tag
			if(x == pos)
			{
				x = pos + cntTagChars;
				
				strAux1 = strHTML.substr(0,x); // *NOTE* de 0 ate j nao inclui o j
				strAux2 = strHTML.substr(x,strHTML.length);
				//alert('ate o inicio do bloco:\n\"'+strAux1+'\"'); 
				//alert('do fim do bloco ao fim do texto:\n\"'+strAux2+'\"'); 
				tag.innerHTML = '<pre>'+(strAux1 + strInsert + strAux2)+'</pre>';
				// *INFO* ie collapses adjacent blanks into a single space when updating <pre> with new contents,
				// because ie does not respect the special elements with any value but normal for the white-space 
				// css property. wrapping the string with a <pre> makes sure that ie preformats all blank characters
				// and it does not affect firefox.
				return cntTagChars;
			}
			x++;	
		}
	}	
}

function ckb_openclose_div(id)
{
	var img = document.getElementById('fold'+id);
	var div = document.getElementById('block'+id);

	if(div.style.display == 'none') 
	{
		div.style.display = 'block';

		img.src = constImgFoldMinus;
		
		if(document.getElementById('treecontainer') == null) {	
		// *TEMPORARY* o firefox precisa de um ajuste quando a imagem foldpoint tem marginbottom -11px, senao ela desce. 
		// a imagem foldpoint so tem -11px nas paginas que nao contem treecontainer.
			img.style.margin = '0px 0px -11px 0px'; // *NOTE* esse ajuste nao afeta o ie
		}
	}
	else 
	{
		div.style.display = 'none';

		img.src = constImgFoldPlus;

		if(document.getElementById('treecontainer') == null) {	
		// *TEMPORARY* o firefox precisa de um ajuste quando a imagem foldpoint tem marginbottom -11px, senao ela desce. 
		// a imagem foldpoint so tem -11px nas paginas que nao contem treecontainer.
			img.style.margin = '0'; // *NOTE* esse ajuste nao afeta o ie
		}
	}
	// *INFO* a imagem do foldpointplus deve chamar mais atencao visualmente do que o minus, que ja esta aberto.
	// mostrar que pode ser aberto e mais importante do que mostrar que pode ser fechado.
}


var min=8;
var max=18;
function increaseFontSize() {
   var p = document.getElementsByTagName('PRE');
   for(i=0;i<p.length;i++) {
      if(p[i].style.fontSize) {
         var s = parseInt(p[i].style.fontSize.replace("px",""));
      } else {
         var s = 12;
      }
      if(s!=max) {
         s += 1;
      }
      p[i].style.fontSize = s+"px"
   }
}
function decreaseFontSize() {
   var p = document.getElementsByTagName('PRE');
   for(i=0;i<p.length;i++) {
      if(p[i].style.fontSize) {
         var s = parseInt(p[i].style.fontSize.replace("px",""));
      } else {
         var s = 12;
      }
      if(s!=min) {
         s -= 1;
      }
      p[i].style.fontSize = s+"px"
   }   
}

/*function ckb_is_forbidden_char(c) // checa se tem caractere ascii proibidio no texto
{
	//if(c == ' ' || 

}

if(bInHTMLTag) continue;

		if(cAux == '<') { // html tag (or html comment), ignore.
			bInHTMLTag = true;
			alert(strText.substring(i,i+7));
			continue;
		}
		if(cAux == '>') {
			bInHTMLTag = false;
			alert(cAux);
			continue;
		}

*/




