var req;
var req2;
var isIE = false;

/** VARIABLE PARA CONTROLAR EL BOTÓN ATRÁS DEL NAVEGADOR **/
var busquedaLanzada=false;// para controlar se se ha echo ya la petición de buscar o es un boton atras.
var temporizador; // variable global que se utiliza para controlar el temporizador de revision de url
var velocidadTemporizador=500;
var idHistorialActual=0; // proporciona historial de buscquedas
var idHistorialAnterior=0;
var idHistorialAnteriorIE=0;
var nomIframeHistorial = 'historial'
var sinHistorial = false

function loadXMLDoc(url, objFunction) 
{
	req = false;
    // branch for native XMLHttpRequest object
    if(window.XMLHttpRequest) {
		// La version 7 de IE entra por aqui
    	try {
			req = new XMLHttpRequest();
        } catch(e) {
			req = false;
        }
    // branch for IE/Windows ActiveX version
    } else if(window.ActiveXObject) {
		isIE = true;
       	try {
        	req = new ActiveXObject("Msxml2.XMLHTTP");
      	} catch(e) {
        	try {
          		req = new ActiveXObject("Microsoft.XMLHTTP");
        	} catch(e) {
          		req = false;
        	}
		}
    }
	if(req) {
		req.onreadystatechange = objFunction;
		req.open("GET", url, true);
		req.send("");
	}
}

function loadDoc(pagina, objFunction)
{
	try {		
		//Subir la página arriba del todo
		window.scroll(0,0);		
		cargaHistorial(pagina)		
		loadXMLDoc(pagina, objFunction);
		// interfiere en otro navegadores por 
		// el uso del hash para rellenar el historial
	}
	catch(e) {
		var msg = (typeof e == "string") ? e : ((e.message) ? e.message : "Error desconocido");
		alert("Imposible obtener datos XML:\n" + msg+ " "+pagina);
		return;
	}
}


function loadXMLDoc2(url, objFunction) 
{
	req2 = false;
    // branch for native XMLHttpRequest object
    if(window.XMLHttpRequest) {
		// La version 7 de IE entra por aqui
    	try {
			req2 = new XMLHttpRequest();
        } catch(e) {
			req2 = false;
        }
    // branch for IE/Windows ActiveX version
    } else if(window.ActiveXObject) {
		isIE = true;
       	try {
        	req2 = new ActiveXObject("Msxml2.XMLHTTP");
      	} catch(e) {
        	try {
          		req2 = new ActiveXObject("Microsoft.XMLHTTP");
        	} catch(e) {
          		req2 = false;
        	}
		}
    }
	if(req2) {
		req2.onreadystatechange = objFunction;
		req2.open("GET", url, true);
		req2.send("");
	}
}

function loadDoc2(pagina, objFunction)
{
	try {
		loadXMLDoc2(pagina, objFunction);
	}
	catch(e) {
		var msg = (typeof e == "string") ? e : ((e.message) ? e.message : "Error desconocido");
		alert("Imposible obtener datos XML:\n" + msg+ " "+pagina);
		return;
	}
}

/*
function getElementTextNSBK(prefix, local, parentElem, index) 
{
    var result = "";    
    if ((prefix && isIE) || window.ActiveXObject) {
        // IE/Windows way of handling namespaces
		//alert(prefix + ":" + local + "["+index+"]"); // content:encoded[0]
		if (parentElem != null)
	        result = parentElem.getElementsByTagName(prefix + ":" + local)[index];
    } else {
        // the namespace versions of this method 
        // (getElementsByTagNameNS()) operate
        // differently in Safari and Mozilla, but both
        // return value with just local name, provided 
        // there aren't conflicts with non-namespace element
        // names        
		if (parentElem != null)
	        result = parentElem.getElementsByTagName(local)[index];
    }    
    if (result) {
        // get text, accounting for possible
        // whitespace (carriage return) text nodes 
        if (result.childNodes.length > 1) {
            return result.childNodes[1].nodeValue;
        } else {
            return result.firstChild.nodeValue;    		
        }
    } 
	else {
        return 'Error interno';
    }
} */

function getElementTextNS(prefix, local, parentElem, index) 
{
    var result = "";
	    
	if (parentElem != null)
	        result = parentElem.getElementsByTagName(prefix + ":" + local)[index];
    if (typeof(result) == 'undefined') {
		if (parentElem != null)
	        result = parentElem.getElementsByTagName(local)[index];
	    }        
    if (result) {
        // get text, accounting for possible
        // whitespace (carriage return) text nodes 
        if (result.childNodes.length > 1) {
            return result.childNodes[1].nodeValue;
        } else {
            return result.firstChild.nodeValue;    		
        }
    } 
	else {
        return 'Error interno';
    }
}


function formToString(formulario) {

formu = document.forms[formulario];

salida=formu.action+'?';

for (i=0; i<formu.elements.length; i++)  {
    //alert('Tipo:'+formu.elements[i].type+" checked "+formu.elements[i].checked);
	if ((formu.elements[i].type=='checkbox' || formu.elements[i].type=='radio') && formu.elements[i].checked == false)
	   continue
	else salida += formu.elements[i].name+'='+escape(formu.elements[i].value)+'&';
	}

return salida;


}

/**
 * Detectar IE, mediante objetos
 */
function esNavegadorIE(){
	
	// este componente solo tiene Internet Explorer apartir de la versión 5.5
	if (window.ActiveXObject) {
		return true;
	}
	else{
		return false;
	}
}


/**
 *  Este es el sistema que vigila las url's en busca de cambios.
 */
function GuardianUrl(){
	temporitzador=setTimeout("GuardianUrl()",velocidadTemporizador); //1000= 1 seg.
	//repite esa funcion cada tanto tiempo. para pararlo se utilizatria un clearTimeout(variable_de_tiempo)
	
	// consiguiendo el HASH de las rutas pagina principal e IFRAME.
		// HASH URL NORMAL CASO FirefoxF3	
		var urlActual = window.location.toString();
	    var busquedaUrl = window.location.hash.substr(1); // Nos devuelve el string de detras de la # de la url
		// HASH URL IFRAME CASO IE7,IE6
		var urlActualIframe = top.document.getElementById(nomIframeHistorial).contentWindow.document.location; 
		var busquedaUrlIE = String(urlActualIframe.hash.substr(1)); // lo mismo pero del iframe.
	
	// Debuguear
	/*	var contadorHistori = history.length;
		var urlIframe= Obtenir("historial").src
		var texto= CrearTexto(contadorHistori +' hisotories ||urlIFRAME:'+urlIframe + ' || hasIFrame: '+busquedaUrlIE);
		ReemplazarContenidoNodo("contingutCarrito",texto);
	*/
		
	//siempre va a pasar que: el de la ur es menor o igual al Actual + Diferente al ultimo mirado (primer if detecta si ha cambiado la url en alguno de los 2 sistemas IE o FF3)	
	if( (busquedaUrlIE!= idHistorialAnteriorIE && idHistorialAnteriorIE !="" ) || busquedaUrl!=idHistorialActual && idHistorialAnterior!=busquedaUrl && busquedaUrl!="" && idHistorialActual!=""){
		if(!busquedaLanzada){
			//si no se ha lanzado la busqueda querrá decir que es un botón atras o alante.
 			//No meter en el historial las vueltras atrás
			sinHistorial = true
			
				if (esNavegadorIE()) {
				     	//alert(busquedaUrlIE)
						irPagina(busquedaUrlIE) 				     	
			  		 }
  				else {
				    //alert(busquedaUrl)  				    					
				    irPagina(busquedaUrl)  					
  					
  					}  					
  				sinHistorial = false	  					
			}
		}else{
			//este caso es para cuando existe un cambio de url, pero ha sido provocado por nosotros, no e sun boton atras! desactivamos el flag!
			busquedaLanzada=false;
		}

	// despues de lanzar o no la busqueda igualo el cambio de las urls.
	if (busquedaUrl!="")idHistorialAnterior=busquedaUrl;
	//if (busquedaUrlIE!="")
	idHistorialAnteriorIE= busquedaUrlIE;
}


/* 
 * Carga el history del navegador 				 
 */
function cargaHistorial(url){
			
	if (sinHistorial) return;			
			
   	idHistorialActual++;//contador para explorer
	var busqueda=url;
	
	// Ahora segun el navegador cambiamos la ur del iframe o la del document
	if (esNavegadorIE() && busqueda!=idHistorialAnteriorIE){
					
			var rutaExterna= ObtenerRutaExterna();
			//Obtenir("historial").src=rutaExterna + "/historial.php?paginaActual=" + idHistorialActual+ "#"+idHistorialActual;										
			document.getElementById(nomIframeHistorial).src=rutaExterna + "/htmlNew/ajax/historial.php?paginaActual=" + idHistorialActual+ "#"+busqueda;

			busquedaLanzada=true;//indica al guardianURL que esta peticion se ha realizado ya.
	
	}else if (!esNavegadorIE() && busqueda!=idHistorialAnterior){
		window.location=LimpiarUrl(window.location)+'#'+busqueda;		

		busquedaLanzada=true;//indica al guardianURL que esta peticion se ha realizado ya.
	}

}



function LimpiarUrl(){
	var urlSinId='';
	// buscando la #
	var urlActual= new String(window.location);
	urlSinId = urlActual.replace(/(\#[\w |\W ]{0,}){0,}/g,'');
	/* 
	 * Finalmente la expresion regular la he cambiado por esta otra donde:
	 * (\#[\w |\W ]{0,}){0,}
	 * incluimos un parentesis (\#[\w |\W ]{0,}) este agrupa  toda la espresion que contiene y permite darle un grado de repeticiones.
	 * asi remplazar?amos ejemplos del estiolo #dsfksdf #sewerwe Quizas no sea necesario, pero por si acaso.
	 * ahora hemos introducido entre los primeros corchetes [\w | \W ] -> los espacios influyen y decien que puedan existir. 
	 * Aqui decimos que puede venir o caracteres alfan?mercos o no alfa numericos que es lo mismo que decir que puedes poner cualquier cosas
	 * con unas repeticiones de 0 o mas... asi que # sola tambien se sustituiria.
	 * 
	 * Para aprender a probar expresiones regulares e smuy util esta p?gina: http://regexpal.com/ donde se puede probar al vuelo las espresiones que queramos.
	 * 
	 * antigua expresion.
	 * en java escript toda regExp va entre dos / /
		en este caso a espresion completa es: \#[\w]{0,}
		donde  \# siginifica el caracter almohadilla que al ser especial necesita escaparse
		[\w] significa que el siguiente caracter es cualquier caracter alfanum?rico
		{0,} que significa que la anterior expresion se repinte 0 o mas veces, asi
		[\w]{0,} significa cualquier cadena de caracteres desde la amoadilla
		
	*/
	
	//urlSinId = RUTA_EXTERNA;//window.location.hash.substr(0);
	//ReemplazarContenidoNodo("provas",'url:'+urlSinId);
	
	return urlSinId;
}



function ObtenerRutaExterna(){
	
 		//existe el problema de across domain denegation Script
		 var protocoloUrlPrincipal='http:';//pordefecto usamos http:
		 if (document.location.protocol =='https:') protocoloUrlPrincipal='https:'; // si exste https lo propagamos
		 var dominioUrlPrincipal=document.location.host;
		 //alert('url: '+protocoloUrlPrincipal+"//"+dominioUrlPrincipal)
		 return protocoloUrlPrincipal+"//"+dominioUrlPrincipal+'/';
}





