
function Hijax() {

 var container,url,canvas,data,loading,callback,request,blnFading=false,menus,updateTitle;

 this.setContainer = function(value) {
  container = value;
 };
 this.setUrl = function(value) {
  url = value;
 };
 this.setCanvas = function(value) {
  canvas = value;
 };
 this.setLoading = function(value) {
  loading = value;
 };
 this.setCallback = function(value) {
  callback = value;
 };
 this.setUpdateTitle = function(value) {
  updateTitle = value;
 }; 
 this.blnFading=blnFading;
 this.setMenus = function(value) {
  menus = value;
 }; 
 
 this.captureData = function() {
  if(container.nodeName.toLowerCase()=="form"){
   container.onsubmit = function() {
    var query = "";
    for (var i=0; i<this.elements.length; i++) {
     query+= this.elements[i].name;
     query+= "=";
     query+= encodeURIComponent(this.elements[i].value);
     query+= "&";
    }
    data = query + "&ajax=true";
    url = this.action;
    return !start();
   };
  } else {
   var links = container.getElementsByTagName("a");
   for (var i=0; i<links.length; i++) {
    links[i].onclick = function() {
     url=this.getAttribute("href") + "&ajax=true";
     execOpcio(this.getAttribute("href"));  
     dhtmlHistory.add(this.getAttribute("id"),( this.innerText?this.innerText:this.textContent?this.textContent:"" ));
     var blnResult=start();
     return !blnResult;
    };
   }
   links = null;
  }
 };

 var start = function() {
  request = getHTTPObject();
  if (!request || !url) {
   return false;
  } else {
   initiateRequest();
   return true;
  }
 };

 var getHTTPObject = function() {
  var xmlhttp = false;
  if (window.XMLHttpRequest) {
   xmlhttp = new XMLHttpRequest();
  } else if(window.ActiveXObject) {
   try {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
   } catch (e) {
    try {
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (e) {
     xmlhttp = false;
    }
   }
  }
  return xmlhttp;
 };

 var initiateRequest = function() {
  if(loading && url.indexOf('nomesMenu')==-1){
   loading();
  }
  request.onreadystatechange = completeRequest;
  if(data){
   request.open("POST", url, true);
   request.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=UTF-8");
   request.send(data);
  }else{
   request.open("GET", url, true);
   request.send(null);
  }
 };

 var completeRequest = function() {
  if (request.readyState == 4) {
   if( (request.status == 200 || request.status == 304) || (request.status == 404 && request.responseText!=null && ""!=request.responseText))  {
    if (menus && request.responseText.indexOf('<ul class="menu')==0){  
        menus.innerHTML = request.responseText;
        updateTitle(url);
        webEmp();
    }else if(canvas){	
        var strResponse=request.responseText;
        canvas.innerHTML = strResponse;
        for(var nScript=0;nScript<5;nScript++){
            if(strResponse.indexOf('//script' + (nScript+1))>0){
                var nIndex=strResponse.indexOf('//script' + (nScript+1));
                var strJS=request.responseText.substring(nIndex,strResponse.indexOf('</SCRIPT>',nIndex));
                eval(strJS);
            }
        }
    }
    if(callback){
     callback(url);
    }
    if(url.indexOf('nomesMenu=true')==-1){	
        url=url + "&nomesMenu=true";
        start();
    }
   }else if(request.status == 404){
    alert('Error al processar dades des del web:\n' + url);
   }
  }
 };

}

function webEmp(){

 var prepareAnchor = function(element) {
     
  var xhr = new Hijax();
  //Determinem la URL actual
  var currentURL=window.location.href;
  
  if(currentURL!=null && currentURL.length>0 && currentURL.indexOf("?")>0)
      currentURL=currentURL.split("?")[0];
  
  xhr.setContainer(element);
  xhr.setUrl(currentURL);
  xhr.setCanvas(document.getElementById("contingut"));
  xhr.setMenus(document.getElementById("menu"));
  xhr.setLoading(function() {
   displayLoading(document.getElementById("contingut"));
  });
  xhr.setCallback(function(url) {
   if(xhr.blnFading)
       fadeUp(document.getElementById("contingut"),255,255,204);
  
    if(document.getElementById('theForm')){
	prepareAnchor(document.getElementById('theForm'));
    }
  });
  xhr.setUpdateTitle(function(url){
    var ulObjs=document.getElementById('menu').getElementsByTagName('UL');    
    for(var nUl=0;nUl<ulObjs.length;nUl++){
        var navRoot=ulObjs[nUl];
        for (i=0; i<navRoot.childNodes.length; i++) {
            node = navRoot.childNodes[i].childNodes[0];
            if(node.nodeName=="A"){
                if((node.href + '&ajax=true&nomesMenu=true').indexOf(url)>=0){
                    //Actualitzem el title de la p�gina i els enlla�os dels idiomes
                    if(document.title.indexOf('-')>0){
                    //canvio el title parcialement!
                    document.title=document.title.substring(0,document.title.indexOf('-') + 1 ) + " " + node.text;
                    }else{
                    //canvio el title sencer!
                    document.title=node.text;
                    }
                }
            }
        }
    }      
  });
  xhr.captureData();
 };

 var displayLoading = function(element) {
  var image = document.createElement("img");
  image.setAttribute("alt","carregant...");
  image.setAttribute("src","../../img/loading.gif");
  image.className = "loading";
  element.innerHTML="";
  element.appendChild(image);
 };

 var fadeUp = function(element,red,green,blue) {
  if (element.fade) {
   clearTimeout(element.fade);
  }
  element.style.backgroundColor = "rgb("+red+","+green+","+blue+")";
  if (red == 255 && green == 255 && blue == 255) {
   return;
  }
  var newred = red + Math.ceil((255 - red)/10);
  var newgreen = green + Math.ceil((255 - green)/10);
  var newblue = blue + Math.ceil((255 - blue)/10);
  var repeat = function() {
   fadeUp(element,newred,newgreen,newblue)
  };
  element.fade = setTimeout(repeat,100);
 };
 prepareAnchor(document.getElementById('menu'));
}

function addEvent(obj, evType, fn, useCapture){
	if (obj.addEventListener){
		obj.addEventListener(evType, fn, useCapture);
		return true;
	}else if (obj.attachEvent){
		var r = obj.attachEvent("on"+evType, fn);
		return r;
	}
	else{
		alert("No es pot carregar la seqüència d'imatges.");
	}
}

var gestionaHistory = function(historyData,newLocation){  
    if(document.getElementById(historyData)!=null){
        document.getElementById(historyData).onclick();
    }else if(historyData==null && (newLocation==null || ""==newLocation))
        document.getElementById("aPrimer").onclick();
}

function initHijaxHistory(){
    dhtmlHistory.initialize();
    dhtmlHistory.addListener(gestionaHistory);
    webEmp();
}

addEvent(window, 'load', initHijaxHistory);
dhtmlHistory.create();
