function arribaLosCorazones(e) {
  var y = 0;
  while (e != null) {
    y += e.offsetTop;
    e= e.offsetParent;
  }
  scrollTo(0,y);
}

String.prototype.isDigitCharAt = function(j) {
  var codigo = this.charCodeAt(j);
  if (codigo > 47 && codigo < 58) return true;
  else return false;
}

////////////////////////////////////////////////////////////////////////////7

var numeroComentariosAnalizados;
var comentarios;
var escritoresDelDia;
var noRegistrados;
var numeroDeComentarios;
var ancla;
var panel;
var cero;
var ultimoElementoDestacado;

////////////////////////////////////////////////////////////////////////////77

function MetaComentario(divCommentBody, indice){
  this.indice = indice;
  this.divCommentBody  = divCommentBody;
  this.div             = this.divCommentBody.parentNode;
  this.pCommentData    = this.div.getElementsByTagName("P")[0];
  this.pContent        = this.divCommentBody.getElementsByTagName("P")[0];
  this.spanIndice      = document.createElement('SPAN');
  this.referencia      = undefined;
  this.extraerProfileNickPid();
}


MetaComentario.prototype.extraerProfileNickPid = function() {
  //Determinaciï¿½n del nick  y el profile
  var b = this.pCommentData.getElementsByTagName("B")[0];
  var as = b.getElementsByTagName('A');
  if (as.length >0) {
    var aux = as[0].href;
    this.profile = aux.substring(aux.lastIndexOf('/')+1);
	this.nick    = as[0].firstChild.nodeValue;
  }
  else {
    var spans    = b.getElementsByTagName('SPAN');
	this.profile = null;
	this.nick    = spans[1].firstChild.nodeValue; 
  }
  
  //Determinaciï¿½n del pid (provisional)
  var spanItemControl = this.divCommentBody.getElementsByTagName("SPAN")[0];
  var cl = spanItemControl.className;
  var posPid = cl.indexOf("pid-"); 
  if (posPid != -1) {
    this.pid = cl.substring(posPid);
  }
  else {
     this.pid = null;
  }
}

MetaComentario.prototype.preparar =  function() {
	this.spanIndice.appendChild(document.createTextNode("["+this.indice+"] "));
    this.pCommentData.insertBefore(this.spanIndice,this.pCommentData.firstChild);
    var sty = this.div.style;
    if (this.pid == pidInvitado) {
	  sty.backgroundColor = "#a0e0f0";
	  sty.borderBottom = "solid black 1px";
	  sty.borderRight = "solid black 1px";
	  sty.marginTop    = "8px";
	  sty.marginBottom = "8px";
    }
    else if(this.pid==pidAdmin) {
	  sty.backgroundColor = "#f0f0a0";
	  //sty.border  = "dashed grey 1px";
	  sty.marginTop    = "8px";
	  sty.marginBottom = "8px";
    }
	else if(this.nick=="El Relojero") {
	  var aux = this.pContent.firstChild;
	  if (aux.nodeType == 3 && aux.nodeValue.charAt(0) == '.') {
	      aux.nodeValue = aux.nodeValue.substring(1);
	  	  sty.backgroundColor = "#f0fff0";
	      //sty.border  = "dashed grey 1px";
	      sty.marginTop    = "8px";
	      sty.marginBottom = "8px";
	  }
	}
	
    var im = this.pCommentData.getElementsByTagName("IMG")[0];

	im.profile = this.profile;
    im.onclick                 = taparEscritor;
	
	return this;
}

MetaComentario.prototype.valido = function() {
  if (this.profile != null) { 
    for (var j=0; j<escribientes.length; j++) {
      if (escribientes[j].pid==this.pid && escribientes[j].nick == this.nick) {
	    return true;
	  }
    }
	return false;
  }
  return false;
}

MetaComentario.prototype.tapar = function() {
  this.div.style.display = 'none';
  return this;
}

MetaComentario.prototype.destapar = function() {
  this.div.style.display = '';
  return this;
}

MetaComentario.prototype.top= function() {
  arribaLosCorazones(this.div);
  return this;
}

MetaComentario.prototype.extraerReferencia = function(textNode) {
  var aux = textNode.nodeValue;
  var p1   = 0;
  switch (aux.charAt(p1)) {
    case '[':
	case '(':
	   p1++;
  }
  var p2 = p1;
  if (aux.isDigitCharAt(p2)) {
    while (aux.isDigitCharAt(p2)) p2++;
	switch (aux.charAt(p2)) {
	    case ']':
	    case ')':
	    case ',':
	    case ' ':
	    case '':
	      var indiceReferenciado = Number(aux.substring(p1,p2));
	      if (indiceReferenciado < this.indice) {
		    if (indiceReferenciado == 0) {
              this.referencia = indiceReferenciado;
              this.marcarConversacion('referenciante');
			}
			else if (comentarios[indiceReferenciado]) {
		      this.referencia = indiceReferenciado;
			  this.marcarConversacion('referenciante');
			  comentarios[indiceReferenciado].marcarConversacion('referenciado');
			}
		  }
	
	}
  }
}

MetaComentario.prototype.marcarConversacion = function(tipo) {
  this.spanIndice.style.fontWeight='bolder';
  //this.spanIndice.style.fontSize='15px';
  this.pCommentData.indice   = this.indice;
  this.pCommentData.onclick  = mostrarConversacion;
  var aux; 
  switch (tipo) {
    case 'referenciante':
	  aux = '\u2191'
	  break;
    case 'referenciado':
	  aux= '\u2193'
	  break;
  }
  var aux2 = document.createElement('SPAN');
  aux2.appendChild(document.createTextNode(aux));
  aux2.style.fontSize="14px";
  aux2.style.color='#0000ff';
  this.pCommentData.insertBefore(aux2,this.spanIndice.nextSibling);
  return this;
}


MetaComentario.prototype.mejorar = function() {
  var cursor = this.pContent.firstChild;
  if (cursor.nodeType == 3) this.extraerReferencia(cursor);
  while (cursor) {
    if (cursor.nodeType == 3) {
      var encantamiento = Mago.encantar(cursor.nodeValue);
	  if (encantamiento) {
	    cursor.nodeValue = encantamiento.cabeza;

		var colaTextNode = document.createTextNode(encantamiento.cola);
	    cursor.parentNode.insertBefore(colaTextNode,cursor.nextSibling);
	    cursor.parentNode.insertBefore(encantamiento.corazon,cursor.nextSibling);
	    cursor = colaTextNode;
		continue;
	  }
    }  
    cursor = cursor.nextSibling;
  }
}





//////////////////////////////////////////////////////////////////////////////////////////////////////////////7

var Mago = {};

Mago.encantar = function(texto) {
  var r = null;
  if (r = Mago.url(texto)) return r;
  if (r = Mago.latex(texto)) return r;
  if (r = Mago.cita(texto)) return r;
  return r;
}

Mago.url = function(texto) {
  var r = null; 
  var p0 = texto.indexOf("http://");
  if (p0 != -1) {
    var p1 = p0+7;
	var p2 = texto.indexOf(" ",p1);
	if (p2 == -1) p2 = texto.length;
    r = new Object();
	r.cabeza  = texto.substring(0,p0);
	r.cola    = texto.substring(p2);
	r.corazon = document.createElement("A");
	var aux = texto.substring(p0,p2);
    r.corazon.href=aux;
	r.corazon.target='_blank';
	r.corazon.appendChild(document.createTextNode(aux));
	var ext = aux.slice(-4).toLowerCase();
	if ( ext == '.jpg' || ext == '.png' ) {
	  r.corazon.onclick = Mago.convertirEnImagen;
	}
	else if (aux.indexOf('http://www.youtube.com/watch?v=') == 0 && !window.attachEvent) {
	  r.corazon.onclick = Mago.convertirEnYoutube; 
	}
  }
  return r;
}

Mago.convertirEnImagen = function() {
  var im = document.createElement('IMG');
  im.src = this.href;
  im.style.display="block";
  im.style.marginLeft="auto";
  im.style.marginRight="auto";
  //im.style.maxWidth = "320px";
  this.replaceChild(im, this.firstChild);
  this.onclick = null;
  return false;
}

Mago.convertirEnYoutube = function() {
  var x = this.href.substring(31); // 'http://www.youtube.com/watch?v='.length == 31
  this.parentNode.appendChild(document.createElement('BR'));
  this.parentNode.appendChild(document.createElement('BR'));
  var div = this.parentNode.appendChild(document.createElement('DIV'));
  div.innerHTML = '<center><object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/'+x+'&hl=en"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/'+x+'&hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object></center>';
  //this.parentNode.appendChild(div);

  
/*
  obj.width  = 425;
  obj.height = 355;
  var param;
  param = obj.appendChild(document.createElement('PARAM'));
  param.name  ='movie';
  param.value ='http://www.youtube.com/v/'+x;
  param = obj.appendChild(document.createElement('PARAM'));
  param.name  ='wmode';
  param.value ='transparent';
  this.parentNode.appendChild(obj);
*/
  this.onclick = null;
  return false;
}


Mago.cita   = function(texto) {
  var r = null;
  var p0 = texto.indexOf("[[");
  if (p0 != -1) {
    var p1 = p0+2;
	var p2 = texto.indexOf("]]",p1);
	if (p2 !=-1) {
	  r = new Object();
	  r.cabeza  = texto.substring(0,p0);
	  r.cola    = texto.substring(p2+2);
	  r.corazon = document.createElement("BLOCKQUOTE");
      r.corazon.appendChild(document.createTextNode(texto.substring(p1,p2)));
    }
  }
  return r;
}

Mago.latex  = function(texto) {
  var r = null;
  var p0 = texto.indexOf("$$");
  if (p0 != -1) {
    var p1 = p0+2;
	var p2 = texto.indexOf("$$",p1);
	if (p2 !=-1) {
	  r = new Object();
	  r.cabeza  = texto.substring(0,p0);
	  r.cola    = texto.substring(p2+2);
	  r.corazon = document.createElement("IMG");

      var url = texto.substring(p1,p2); 
      url = "http://www.forkosh.dreamhost.com/mathtex.cgi?"+url;
	  r.corazon.src = url;
	  r.corazon.style.display="block";
	  r.corazon.style.marginLeft="auto";
	  r.corazon.style.marginRight="auto";
	  if (r.corazon.width>320) r.corazon.style.width="320px";
    }
  }
  return r;
}





//////////////////////////////////////////////////////////////////////////////////////////////////////////////7



function extraerElementoConIdComments(element) {
    var e = null;
	if (!element) { 
	  e = document.getElementById('comments');
	}
	else {
	  var divs = element.getElementsByTagName('DIV');
	  for (var j = 0, len = divs.length; j< len; j++) {
	    if (divs[j].id = 'comments') {
		  e = divs[j];
		  break;
		}
	  }
	}
	return e;
}

function extraerNumeroDeComentarios(element) {
	var e = extraerElementoConIdComments(element);
    var tot = e.firstChild.nodeValue;
    var q = tot.indexOf(":");
    tot = parseInt(tot.substring(q+1));
	return tot;
}

function extraerAncla() {
  var divs = document.getElementsByTagName('DIV');
  for (var j = 0, len = divs.length; j< len; j++) {
	 if (divs[j].className == 'data-comments') {
		  return divs[j];
     }
  }
  return null;
}

function getHref() {
  var href= window.location.href;
  if (window.location.hash) {
    var qq = window.location.href.indexOf("#");
    href = href.substring(0,qq);
  }
  return href;
}



function procesarPaginasExtra(totalPaginas) {

  var href= getHref()+"?commentPage=";
 
  var xhr = window.XMLHttpRequest ? new window.XMLHttpRequest() : 
                                    new ActiveXObject("Microsoft.XMLHTTP");
  var indice = 2;	
  send();
  
  function send() {
    xhr.open("GET",href+indice);
	xhr.onreadystatechange = onStateChange;
	xhr.send(null);
  }
  
  function onStateChange() {
    if (xhr.readyState == 4) {
	  if (xhr.status == 200) {
	    insertarPagina(xhr.responseText);
		if (indice < totalPaginas) {  
		  indice++;
		  setTimeout(send,0);
		}
		else {
		  setTimeout(accionFinal,0); 
		}
	  }
	}
  }
}

function insertarPagina(html) {
    var div  = document.createElement("div");
    var p1,p2;
    p1 = html.indexOf('<div id="comments">');
    p1 = html.indexOf('<div',p1+10);
    p2 = html.indexOf('<div class="data-comments">');
    div.innerHTML = html.substring(p1,p2);
    procesarPagina(div);
    while(div.firstChild) insertarComentario(div.firstChild);
}

function insertarComentario(div) {
  var padreAncla = ancla.parentNode;
  padreAncla.insertBefore(div,ancla);
}

function procesarPagina(div) {
  var lis = div.getElementsByTagName('DIV');
  var j    = 0;
  while (j < lis.length) {
    var e = lis[j]; 
    if (e.className == 'comment-body') {
	  numeroComentariosAnalizados++;
	  var c = new MetaComentario(e,numeroComentariosAnalizados);
 	  if (c.valido()) {
	  	c.preparar();
        comentarios.push(c);
        if (escritoresDelDia[c.profile] === undefined) {
          escritoresDelDia[c.profile] = new Array();
        }
        escritoresDelDia[c.profile].push(c);
		j++;
	  }
	  else {
	    comentarios.push(null);
	    if (noRegistrados[c.profile] === undefined) {
          noRegistrados[c.profile] = {nick:c.nick,pid:c.pid};
        }
        c.div.parentNode.removeChild(c.div);	    
	  }
    }
	else {
	  j++;
	}
  }
}

	
function main() {
  numeroComentariosAnalizados = 0;
  comentarios      = new Array();
  comentarios.push(null);
  escritoresDelDia = new Object();
  noRegistrados    = new Object();
  procesarPagina(document.body);
  numeroDeComentarios = extraerNumeroDeComentarios();
  numeroDePaginas     = Math.floor(numeroDeComentarios/200)+1;
  ancla = extraerAncla();
  if (numeroDePaginas>1) {
    document.body.style.backgroundColor = "#e0e0ff";
    //prepararPanelLateral();
    procesarPaginasExtra(numeroDePaginas,ancla);
  }
  else {
    accionFinal();
  }

  cero = document.getElementById('editado');
  cero.onclick = mostrarConversacionCero;
}



function accionFinal() {
  prepararPanelLateral();
  document.body.style.backgroundColor = "#f0fff0";
  for (var j=0, len=comentarios.length;j<len;j++) {
    var q = comentarios[j];
	if(q) q.mejorar();
  }
  document.body.style.backgroundColor = "";
  prepararBotonLogUsuarios();
}

function prepararPanelLateral() {
  var menu = document.getElementById("menu");
  panel = menu.appendChild(document.createElement("div"));
  //listado.style.border = "1px solid blue";
  panel.style.cursor = "help";
  var h5 = panel.appendChild(document.createElement("h5"));
  h5.appendChild(document.createTextNode("Han intervenido en esta hoja  (por orden de aparici\u00F3n):"));
  h5.onclick = conmutarFlotacionPanelLateral;
  for (var profile in escritoresDelDia) {
    var nick = escritoresDelDia[profile][0].nick;
    var div= panel.appendChild(document.createElement("div"));
    div.appendChild(document.createTextNode(nick));
    div.profile = profile;
	div.onclick = destacarEscritor;
  }
} 

function prepararBotonLogUsuarios() {
  var menu = document.getElementById("menu");
  var xin = menu.appendChild(document.createElement("div"));
  xin.style.position='absolute';
  xin.style.top ='0px';
  xin.style.left='0px';
  xin.style.width ='10px';
  xin.style.height='10px';
  xin.style.cursor='move';
  xin.onclick = crearLog;
}


function crearLog() {
  var nw  = open("","cosa","left=20,top=20,width=1000,height=500,toolbar=1,resizable=1,scrollbars=1");
  var doc = nw.document;
  doc.body.appendChild(doc.createElement("H2")).appendChild(doc.createTextNode("No registrados"));
  for (var p in noRegistrados) {
    var n = noRegistrados[p];
	if (n.pid) {
      var texto ="{'nick':'"+n.nick+"','profile':'"+p+"','pid':'"+n.pid+"'},";
	  var div = doc.body.appendChild(doc.createElement("DIV"));
	  div.appendChild(doc.createTextNode(texto));
	}
  }
  doc.body.appendChild(doc.createElement("H2")).appendChild(doc.createTextNode("Registrados"));
  for (var p in escritoresDelDia) {
    var n = escritoresDelDia[p][0];
    var texto ="{'nick':'"+n.nick+"','profile':'"+p+"','pid':'"+n.pid+"'},";
	var div = doc.body.appendChild(doc.createElement("DIV"));
	div.appendChild(doc.createTextNode(texto));
  }
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

function flotarPanelLateral() {
  var sty = panel.style;
  sty.border          = '1px solid #a0a0f0';
  sty.position        = 'fixed';
  sty.top             = '10px';
  sty.right           = '10px';
  sty.backgroundColor = '#f0f0a0'; 
  sty.padding         = '8px';
  sty.height          = '400px';
  sty.overflow        = 'auto';
 
}

function desflotarPanelLateral() {
  var sty = panel.style;
  sty.border          = '';
  sty.position        = '';
  sty.top             = '';
  sty.right           = '';
  sty.backgroundColor = ''; 
  sty.padding         = '';
  sty.height          = '';
  sty.overflow        = '';

}

function conmutarFlotacionPanelLateral(event) {
  event = event || window.event;
  panel.style.position == '' ? flotarPanelLateral():desflotarPanelLateral();
  return stop(event);
}


function destacarEscritor(event) {
  event = event || window.event;
  var profileDestacado = this.profile;
  for (var j=0, len = comentarios.length; j<len;j++) {
    var c = comentarios[j];
	if (c) {
	  if (c.profile == profileDestacado) {
	    c.destapar();
	  }
	  else {
        c.tapar();
	  }
	}
  }
  escritoresDelDia[profileDestacado][0].top();
  flotarPanelLateral();
  document.body.onclick = destaparTodos;
  return stop(event);
}

//////////////////////////////////////////////////////////////////////////////////////////////7


function mostrarConversacion(event) {
  if (event) {
    if (event.target.tagName == 'A') return true;
  }
  else {
    event = window.event;
    if (event.srcElement.tagName == 'A') return true;  
  }
  taparTodos();
  var c = comentarios[this.indice];

  c.destapar();
  if (c.referencia) alfa(c.referencia);
  beta(c.indice);
  ultimoElementoDestacado = c;
  c.top();
  document.body.onclick = destaparTodos;
  return stop(event);
}

function alfa(indice) {
  var c = comentarios[indice];
  c.destapar();
  if (c.referencia) alfa(c.referencia);
}

function beta(indice) {
  for (var j=indice+1, len =comentarios.length; j<len;j++) {
    var q = comentarios[j];
    if (q && q.referencia == indice) {
	  q.destapar();
	  beta(j);
	}
  }
}

function mostrarConversacionCero(event) {
  event = event || window.event;
  taparTodos();
  beta(0);
  arribaLosCorazones(cero);
  document.body.onclick = destaparTodos;
  return stop(event);
}


function taparEscritor(event) {
  event = event || window.event;
  var cs = escritoresDelDia[this.profile];
  for(var j=0, len = cs.length; j<len;j++) cs[j].tapar();
  document.body.onclick = destaparTodos;
  return stop(event);
}

function taparTodos() {
  for (var j=0, len =comentarios.length; j<len;j++) {
    var q = comentarios[j];
    if (q) q.tapar();
  }
}

function destaparTodos(event) {
  event = event || window.event;
  for (var j=0, len =comentarios.length; j<len;j++) {
    var q = comentarios[j];
    if (q) q.destapar();
  }
  //desflotarPanelLateral();
  ultimoElementoDestacado.top();
  document.body.onclick = null;
  //return stop(event);
}

function stop(event) {
   if (event) { 
    if (event.stopPropagation) {
        event.stopPropagation();
		event.preventDefault();
    } else {
        event.cancelBubble = true;
        event.returnValue = false;
	}
	}
	return false;
}






main();

