function $(id) {
	if(!document.getElementById(id)) {
		return false;
	}
	return document.getElementById(id);
}

/** XHConn - Simple XMLHTTP Interface - bfults@gmail.com - 2005-04-08        **
 ** Code licensed under Creative Commons Attribution-ShareAlike License      **
 ** http://creativecommons.org/licenses/by-sa/2.0/                           **/
function XHConn() {
  var xmlhttp, bComplete = false;
  try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
  catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
  catch (e) { try { xmlhttp = new XMLHttpRequest(); }
  catch (e) { xmlhttp = false; }}}
  if (!xmlhttp) return null;
  this.connect = function(sURL, sMethod, sVars, fnDone)
  {
    if (!xmlhttp) return false;
    bComplete = false;
    sMethod = sMethod.toUpperCase();

    try {
      if (sMethod == "GET")
      {
	if (sVars != "") {
        	xmlhttp.open(sMethod, sURL+"?"+sVars, true);
	} else {
        	xmlhttp.open(sMethod, sURL, true);
	}
        sVars = "";
      }
      else
      {
        xmlhttp.open(sMethod, sURL, true);
        xmlhttp.setRequestHeader("Method", "POST "+sURL+" HTTP/1.1");
        xmlhttp.setRequestHeader("Content-Type",
          "application/x-www-form-urlencoded");
      }
      xmlhttp.onreadystatechange = function(){
        if (xmlhttp.readyState == 4 && !bComplete)
        {
          bComplete = true;
          fnDone(xmlhttp);
        }};
      xmlhttp.send(sVars);
    }
    catch(z) { return false; }
    return true;
  };
  return this;
}

function $C(myclassname) {
	txt ="";
	e = document.getElementsByTagName("body")[0]
	all =  e.all ? e.all : e.getElementsByTagName('*');
	arr = new Array();
	for (var i=0; i < all.length; i++) {		
		try {
			regexpClassName = new RegExp(myclassname + "\\b");
			if (all[i].className.match(regexpClassName)) {
				arr[arr.length] = all[i];
			}		
		} catch(e) {
			continue;
		}
	}	
	return arr
}

String.prototype.parseScripts = function () {	
        var text = this.valueOf(); 
        regexpTagScript = /(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)/gi;
        ret = text.match(regexpTagScript);
        if (ret != null) {
		for(var i = 0; i < ret.length; i++) {
			srcScript= ret[i].replace(regexpTagScript, "$1");
			try {
				eval(srcScript);
			} catch(e) {
				alert(e);                    
			}
		}
        }
}
	
function getChunk(url, layerId, func, method) {
	
	if(method == null) {
		method = "POST";
	}		
	
	if (typeof(arguments[2]) == "function") {
		var func = arguments[2];
	} else {
		var func = function(oXML) {return true}
	}
	var myConn = new XHConn();
	if (!myConn) alert("OOOPS!! XMLHTTP not found. Please upgrade your browser.");
	var sResult = function (oXML) {
		if (layerId.constructor == Array) {
			for (var i = 0; i < layerId.length; i++) {
				document.getElementById(layerId[i]).innerHTML=oXML.responseText;
			}
		} else {			
			document.getElementById(layerId).innerHTML=oXML.responseText;
			oXML.responseText.parseScripts();	
		}
		func(oXML);
	}
	
	var estado = myConn.connect(url, method, "", sResult);
	if(!estado) {
		//alert("pete");//TODO:controlar los errores de ajax
		//TODO: Pero ¡¡de otra manera po dio!!! 
	}
}

function SetCookie(cookieName,cookieValue,nDays) {
 var today = new Date();
 var expire = new Date();
 if (nDays==null || nDays==0) nDays=1;
 expire.setTime(today.getTime() + 3600000*24*nDays);
 document.cookie = cookieName+"="+escape(cookieValue)
                 + ";expires="+expire.toGMTString();
}

function ReadCookie(cookieName) {
 var theCookie=""+document.cookie;
 var ind=theCookie.indexOf(cookieName);
 if (ind==-1 || cookieName=="") return ""; 
 var ind1=theCookie.indexOf(';',ind);
 if (ind1==-1) ind1=theCookie.length; 
 return unescape(theCookie.substring(ind+cookieName.length+1,ind1));
}


function adnCommand(url, method, params, action, forceFunction) {

	//ultimo argumento es opcional y especifica si, en caso de fallo, lanza el alert o la función que se pasa como argumento action

	msgError = "Lo sentimos. Problemas técnicos transitorios. Por favor, vuelva a intentarlo dentro de unos minutos"
	if (typeof(action) == "function") {
		var func = action;
	} else {
		var func = function(oXML) {return true}
	}

	var myConn = new XHConn();

	if (!myConn) alert("OOOPS!! XMLHTTP not found. Please upgrade your browser.");
	var sResult = function (oXML) {	
		try {
			if(oXML.status != 200) {
				alert(oXML.status); return false;
			}
			var xmlStr = oXML.responseText;
			code = xmlStr.match(/code=\"([^\"]*)\"/m);
			message = xmlStr.match(/message=\"([^\"]*)\"/m);
			data = xmlStr.match(/data=\"([^\"]*)\"/m);
			if(data != null) {
				var ret = {"code": code[1], "data": data[1], "message": message[1]}
			} else {
				var ret = {"code": code[1], "message": message[1]}
			}
			
			if(code.length != 2) {
				alert(msgError);
				return false;
			}
			if (message.lenght < 2) { message[1] = "" }

			if (code[1] == 0) {
				func(ret)
			} else {
				if (!forceFunction) {
					if(message != "") alert(message[1]);
				} else {
					func(ret);
				}
			}
		      
		} catch (e){
			alert (e + " " + msgError);
		}
				
	}
	var estado = myConn.connect(url, method, params, sResult);
	if(!estado) {
		alert (msgError);
		//alert("pete");//TODO:controlar los errores de ajax
		//TODO: Pero ¡¡de otra manera po dio!!! 
	}
}
// pues que decir igual que el trim de php
function trim(s) {
         return s.replace( /^\s*/, "" ).replace( /\s*$/, "" );
}
	
// devuelve true o false al validar el email. str es el value del email
function validateEmail(str) {
	    var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	    str = trim(str);
	    return filter.test(str);
}
//valida fecha en formato YYYYY-MM-DD
function validateDate(str,format) {
		switch(format){
			case "YYYY-MM-DD":		
	    		var filter = /^(\d{4})(\/|-)(0[1-9]|1[012])\2([012][1-9]|3[01])$/;
	    		break;
			case "MM-DD-YYYY":		
	    		var filter = /^(0[1-9]|1[012])(\/|-)([012][1-9]|3[01])\2(\d{4})$/;
	    		break;
	    	default:  // DD-MM-YYYY
	    		var filter = /^([012][1-9]|3[01])(\/|-)(0[1-9]|1[012])\2(\d{4})$/; 
	    }
	    str = trim(str);
	    return filter.test(str);
}
// comprueba que una url esta bien formada
function validateUrl(str) {
		var filter = /^(http(s)?):\/\/([a-z0-9_%\?=&\-:\.\/])+$/;
		str = trim(str);
	    return filter.test(str);
}
// valida un dni es decir no nif ya que no admite letra
function validateDni(str) {
		var filter = /^\d{1,8}$/;
		str = trim(str);
	    return filter.test(str);	
}
// valida CP español
function validatePostalCodeES(str) {
		var filter = /^\d{5}$/;
		str = trim(str);
	    return filter.test(str);	
}
// valida que un nick sea correcto
function validateNick(str, caso) {
		if (!caso) {
			//Por defecto solo en minúscilas
			var filter = /^[a-z][a-z]([a-z0-9áéíóúçñ\-_])+$/;
		} else {
			//Segundo argumento, da igual el caso
			var filter = /^[a-z][a-z]([a-z0-9áéíóúçñ\-_])+$/i;
		}
		str = trim(str);
	    return filter.test(str);	
}
   
/**
* funcion para comprobar si una año es bisiesto
* argumento anyo > año extraido de la fecha introducida por el usuario
*/
function anyoBisiesto(anyo) {
    /*
    * primera condicion: si el resto de dividir el año entre 4 no es cero > el año no es bisiesto
    * es decir, obtenemos año modulo 4, teniendo que cumplirse anyo mod(4)=0 para bisiesto
    */
    if (anyo % 4 != 0)
        return false;
    else
    {
        if (anyo % 100 == 0)
        {
            /**
            * si el año es divisible por 4 y por 100 y divisible por 400 > es bisiesto
            */
            if (fin % 400 == 0)
            {
                return true;
            }
            /**
            * si es divisible por 4 y por 100 pero no lo es por 400 > no es bisiesto
            */
            else
            {
                return false;
            }
        }
        /**
        * si es divisible por 4 y no es divisible por 100 > el año es bisiesto
        */
        else
        {
            return true;
        }
    }
}

/**
* funcion principal de validacion de la fecha
* argumento fecha > cadena de texto de la fecha introducida por el usuario
*/
function validateDateSelect(dia,mes,anyo) {	     
   if(anyoBisiesto(anyo))
       febrero=29;
   else
       febrero=28;

   /**
   * si el mes seleccionado es febrero y el dia es mayor que el correspondiente 
   * al año seleccionado > alertamos y detenemos ejecucion
   */
   if ((mes==2) && (dia>febrero))  {      
        return false;
   }
   /**
   * si el mes seleccionado es de 30 dias y el dia seleccionado es mayor de 30 > alertamos y detenemos ejecucion
   */
   if (((mes==4) || (mes==6) || (mes==9) || (mes==11)) && (dia>30))   {       
        return false;
   }
   
   return true;    
} 
// add to boockmarks show/hide
function atob_sh (id, action) {
	if(action == 'show'){
		$('atob_' + id).style.display = 'block';
	} else {
		$('atob_' + id).style.display = 'none';
	}
}

function addtobookmarklayer(contentId,obj) {
	if(isAuthUser) {
		setAtributeElement(contentId);showLayerInPosition('guardar', findPosX(obj), findPosY(obj));
	} else {
		showLayerInPosition('capa_login', findPosX(obj), findPosY(obj));
	}	
}



Array.prototype.index = 0;
Array.prototype.next = function() {
    if (this.index >= this.length -1) {
        this.index = -1;
    }
    return this.valueOf()[++this.index];
}
Array.prototype.prev = function() {
    if (this.index <= 0) {
        this.index = this.length;
    }
    return this.valueOf()[this.index--];
}

function setAtributeElement(contentId) {
	$("guardarContentId").value = contentId;
}

function addElement(from,to) {
	if(trim($(from).value)=="") {
		alert("El tag está vacio");
	}
	else {
		var tags = $(from).value.split(",");
		for(var i=0; i < tags.length; i++) {
			if(trim(tags[i]) != "") {
				node = document.createElement( "LI" );	
				node.innerHTML = '<SPAN>' + trim(tags[i]) + '</SPAN><a href="#" onClick="deleteElement(this);return false">[x]</a>';
				$(to).appendChild( node );
			}
		}
		$(from).value = "";	
	}
}

function deleteElement(dead) {
	dead = dead.parentNode;
	dead.parentNode.removeChild(dead);	
}

function enviarTags(from){
	var li = $(from).getElementsByTagName("LI");
	var tags = new Array();
	for(var i=0;i < li.length; i++) {
		var span = li[i].getElementsByTagName("SPAN");	
		for(var j=0; j < span.length; j++) {			
			tags.push(encodeURIComponent(span[j].innerHTML));
			
		}
	}
	var url = "/bookmarks/addto/" + $("guardarContentId").value;
	adnCommand(url, "POST", "mytags="+tags.join("||"), function (ret) {
			   if(ret["code"] == 0) {
				   $('formBookmark').style.display = "none";
				   $('messageEnvio').style.display = "block";
			   } else {
				   alert(ret["message"]);
			   }
		   }, true);
	return false;
}
		   // hace lo mismo que hideLayer pero ademas borra los elementos del formulario
function closeDiv(divName,form) {		
	switch(divName) {
	case "guardar":
		$('formBookmark').style.display = "block";
		$('messageEnvio').style.display = "none";

		break;
	}

	var elements = form.elements;
	for (var i = 0; i < elements.length; i++) {
		switch(elements[i].type){
		case "hidden":
		case "text":
		case "textarea":
		case "password":
			elements[i].value = "";
			break;
		}
	}
	
	hideLayer(divName);	
}
	
// funciones para posicionamiento de capas
var coord_y=0;
var coord_x=0;

var ns6 = (parseFloat(navigator.appVersion) >= 5 && navigator.appName.indexOf("Netscape") >= 0) ? true : false;

function show_layer(capa, target){
	show(capa);
	if(ns6) {
	$(capa).style.left = findPosX($(target))  + "px";
	$(capa).style.top = findPosY($(target)) + "px";
	}
	else {
	$(capa).style.left = findPosX($(target));
	$(capa).style.top = findPosY($(target));
	}	
}

function showLayerInPosition(capa,posX,posY){
	show(capa);
	if(ns6) {
		$(capa).style.left = posX + "px";
		$(capa).style.top = (parseInt(posY)+10) + "px";
	}
	else {
		$(capa).style.left = posX;
		$(capa).style.top = parseInt(posY)+10;
	}
	if(capa=="guardar")
		getChunk("/bookmarks/gettags/"+$("guardarContentId").value, "tags_anadidos");	
}

function hideLayer(layer) {
	if(document.layers) {
		document.layers[layer].visibility = "hide";
	}
	else {
		$(layer).style.visibility = "hidden";
	}
}

function findPosX(obj) { 

	var curleft = 0;
	if(obj.offsetParent)
	    while(1)
	    {
	      curleft += obj.offsetLeft;
	      if(!obj.offsetParent)
	        break;
	      obj = obj.offsetParent;
	    }
	else if(obj.x)
	    curleft += obj.x;
	// correccion para que no se pierda por el lado izquierdo.
	if(curleft < 1) curleft=5;
	
	return curleft;
}

function findPosY(obj) {
	var curtop = 0;
	if(obj.offsetParent)
	    while(1)
	    {
	      curtop += obj.offsetTop;
	      if(!obj.offsetParent)
	        break;
	      obj = obj.offsetParent;
	    }
	else if(obj.y)
	    curtop += obj.y;
	return curtop;
}

function show(layer) {	
	if(document.layers)
	{
	pos_nn(layer);
	}
	else
	{
	if(ns6) pos_ns(layer);
	else pos_ie(layer);
	
	$(layer).style.visibility = "visible";
	}
}

function pos_ns(layer) {
	$(layer).style.top = coord_y+"px";
	$(layer).style.left = coord_x+"px";
}

function pos_ie(layer) {
	$(layer).style.top = coord_y;
	$(layer).style.left = coord_x;
}


function position(event){
	var x = event.clientX;
	var y = event.clientY;
	coord_y=y;
	coord_x=x;
}
// FIN funciones para posicionamiento de capas	

function articleShare(type) {
	var title = encodeURIComponent(window.document.title);
	var href = encodeURIComponent(window.document.location.href);
	var chunks = window.document.location.href.split('/');
	chunks[chunks.length-1] = chunks[chunks.length-1].replace(".html","");
	var keys = chunks[chunks.length-1].split('-');
	var keywords = "";
	for(var i=2; i<keys.length; i++) {
		if(i<keys.length-1) {
			keywords += keys[i]+' ';
		}
		else {
			keywords += keys[i];
		}
	}		
	
	keywords = encodeURIComponent(keywords);
	
	switch(type) {
		case 'meneame' :		
			url = 'http://meneame.net/submit.php?url='+href;
			break;
			
		case 'digg' :		
			url = 'http://digg.com/submit?phase=2&url='+href+'&title='+title;
			break;
			
		case 'delicious' :		
			url = 'http://del.icio.us/post?url='+href+'&title='+title;
			break;
			
		case 'technorati' :		
			url = 'http://www.technorati.com/search/'+keywords+'?sub=postcosm';
			break;
			
		case 'yahoo' :		
			url = 'http://myweb2.search.yahoo.com/myresults/bookmarklet?u='+href+'&t='+title+'&ei=UTF-8';
			break;
					
		case 'fresqui' :		
			url = 'http://tec.fresqui.com/post?url='+href+'&title='+title;			
	}
	
	var ventanaArticleShare = window.open(url);
	if(!ventanaArticleShare) {
		alert("Compruebe el bloqueo de ventanas de su navegador, \desactivelo e intententelo de nuevo");
	}
}	

function changeClass(from, to,status) {
	var misclass = $C(from);
	for(var i=0; i<misclass.length;i++) {
		misclass[i].className = to;
		misclass[i].style.display = 'block';
	}	
}

function addFriend(userId) {
        adnCommand("/user/commands/createFriendship/" + userId,"GET","", function (ret) {
                if (ret["code"] == 0) {
                        alert(ret["message"]);
                } else {
                        alert("Hubo un error procesando su petición. Discuple las molestias.")
                }
        });
}

function deleteClipping(content,user) {		
		adnCommand("/bookmarks/delete/"+content+"/"+user,"POST","",
			function (ret){				
				document.location.reload();
			}			
			);
}

var myFriendsToSendShared = new Array();
function addSendSharedFriend(nick) {
	if($('status_'+nick).value == 0) {
		$('friend_'+nick).style.border='2px solid #FFAA00';
		$('status_'+nick).value = 1;
		myFriendsToSendShared[myFriendsToSendShared.length] = nick;
	}
	else {
		$('friend_'+nick).style.border='2px solid #333';
		$('status_'+nick).value = 0;
		deleteIfExist(nick);		
	}
}

function deleteIfExist(nick) {
	for (var i=0;i< myFriendsToSendShared.length;i++) {
		if(myFriendsToSendShared[i] == nick) {
			myFriendsToSendShared.splice(i, 1);
		}
	}	
}

function unSelectFriend(nick) {
		$('friend_'+nick).style.border='2px solid #333';
		$('status_'+nick).value = 0;	
}

var dead = null;

function setLayerDeleteFriend(nickFriend,obj) {
	if(nick=="" || nickFriend==nick) return;
	var pos = window.document.location.href.indexOf("profile");
	var chunks = window.document.location.href.substring((parseInt(pos)+8),window.document.location.href.length).split('/');
	var userProfile = chunks[0];
	if(userProfile != nick) return;	
	dead = nickFriend;
	showLayerInPosition('capa_borrar_amigo', findPosX(obj), findPosY(obj)+20);
}

function deleteFriend() {
	if(nick != "") {
		if(confirm('¿Deseas borrar al amigo '+ dead +'?')) {
			deleteElement($('li_'+dead));		
			var old = $("deadFriend").innerHTML;
			$("deadFriend").innerHTML = "Eliminando ...";
			adnCommand("/user/commands/deleteFriend/"+dead,"GET",'',
				function (ret){
					hideLayer('capa_borrar_amigo');
					$("deadFriend").innerHTML = old;				
				});
		}
	}
}

function setLayerFriend(userNick,obj) {
	if(nick=="" || nick==userNick)  return;
	if(obj.src.indexOf("anonymous") != -1) return;
	var etiketa = $('capa_amigo').getElementsByTagName("IMG");
	etiketa[0].src = obj.src;
	etiketa[0].title = obj.title;
	
	etiketa = $('capa_amigo').getElementsByTagName("A");
	etiketa[1].innerHTML = "Hacerte amigo de " + obj.title;
	etiketa[1].href = "javascript:addFriend('" + obj.title +"')";
	etiketa[2].href = "/user/profile/" + obj.title;
	etiketa[3].href = "/user/profile/" + obj.title;
	etiketa[4].href = "/user/profile/" + obj.title;
	showLayerInPosition('capa_amigo', findPosX(obj)+10, findPosY(obj)+20);
}

function resetLayerFriend() {
	var etiketa = $('capa_amigo').getElementsByTagName("IMG");
	etiketa[0].src = "";
	etiketa[0].title = "";
	
	etiketa = $('capa_amigo').getElementsByTagName("A");
	etiketa[1].innerHTML = "";
	etiketa[1].href = "";
	etiketa[2].href = "";
	etiketa[3].href = "";
	etiketa[4].href = "";
	hideLayer('capa_amigo');	
}

function activateMakeFriend(elements,userNick)	{
	if(nick!="" && nick!=userNick) {
		for(var i=0; i < elements.length; i++) {
			if(id==elements[i]) continue;
			$("friend_"+elements[i]).style.display = "block";
		}
	}
}

function deactivateMakeFriend(elements)	{
	if(nick!="") {
		for(var i=0; i < elements.length; i++) {
			if(id==elements[i]) continue;
			$("friend_"+elements[i]).style.display = "none";
		}
	}
}

function activateMakeClipping(elements,userNick) {
	if(nick!="") {
		for(var i=0; i < elements.length; i++) {
			if(nick!="" && nick==userNick) {
				$("clippingDelete_"+elements[i]).style.display = "block";
				$("clippingSave_"+elements[i]).style.display = "none";
			}
			else {
				$("clippingSave_"+elements[i]).style.display = "block";
				$("clippingDelete_"+elements[i]).style.display = "none";
			}
		}
	}
}