///////////////////////////////////////////////////////////////////////////////////////////////////////
// FUNCIONAMIENTO DE LA COOKIE DE EUSKADI.NET
// Utilizacion:
//		La cookie de Euskadi.net controla dos parametros:
//			- Codigo del portal
//			- Idioma
// Estructura:
//			[codPortal_idioma]
// Comportamiento:
//		La funcion r01RedirectIndex(prehomeRedirect) carga los valores de los portales
//		para obtener la redirección correspondiente cuando se introduce el sólo el dominio.
//		En caso de que no haya datos cargados para el dominio, redireccionará a la página
//		pasada como parámetro (Formato de la variable pageRedirect: /codPortal-codPagina/idioma/).
//
//		La redirección se hará a la página de prehome en caso de estar configurada para el portal,
//		siempre que no se venga del mismo portal o los portales origen y destino no reusen ambos las cookies.
//
//		En cualquiera de estos dos casos (mismo portal de origen que destino o ambos reusan cookies),
//		se redirigirá a la página Home siempre que exista una configuración
//		de home para ese portal e idioma. Si no existiese, redirigirá a la Home de otro idioma o en su defecto
//		a la prehome.
//
///////////////////////////////////////////////////////////////////////////////////////////////////////
/**
 * Objeto que contiene toda la informacion sobre un portal
 * Oid del portal
 *	Dominio
 *	Indica si se trata del dominio principal de la red de portales
 *	Si se reutiliza la cookie del portal principal
 *	codPortal-codPagina
 *	Array de paginas principales para cada idioma
 (se entra con el codigo de idioma
 */
function r01PortalInfo(newPortalOid, newDomain, newIsMainDomain,
		newReuseCookie, newCodPreHome, newLangPages, newContentPreviewPage) {
	this.domain = r01gTrim(newDomain);
	this.portalOid = r01gTrim(newPortalOid);
	this.isMainDomain = newIsMainDomain;
	this.reuseCookie = newReuseCookie;
	this.codPreHome = r01gTrim(newCodPreHome);
	this.contentPreviewPage = r01gTrim(newContentPreviewPage);
	if (newLangPages != null) {
		this.languages = new Array();
		// Los codigos de paginas por idioma vienen en una cadena como
		//		idioma=codPortal-codPagina,idioma=codPortal-codPagina,etc
		var langPagesSplitted = newLangPages.split(",");
		var currLangSplitted = null;
		for ( var i = 0; i < langPagesSplitted.length; i++) {
			currLangSplitted = langPagesSplitted[i].split("=");
			if (currLangSplitted.length == 2) {
				this.languages[i] = new Array(r01gTrim(currLangSplitted[0]),
						r01gTrim(currLangSplitted[1]));
			} else {
				throw "Error en la definicion de la informacion del portal!!!";
			}
		}
	}
}
/*
 * Redirige a la prehome o a la home de un portal dependiedo de la cookie
 */
function r01RedirectIndex(pageRedirect) {
	var url = window.location.href; //Url pedida
	var domain = r01FormatURL(url); //dominio formateado
	try {
		//Obtener información del portal al que se accede
		var portalInfoToRedirect = r01FindPortalInfoWithPortalDomain(domain);

		if (portalInfoToRedirect == null || portalInfoToRedirect == "undefined") {
			try {
				if (pageRedirect != null && pageRedirect != "undefined") {
					if (pageRedirect.substring(0, 1) != "/")
						pageRedirect = "/" + pageRedirect;
					window.location.href = pageRedirect;
				} else {
					return null;
				}
			} catch (e) {
				return null;
			}
		}

		//Obtiene cookie (es de la forma 'portalOid:lang')
		var cookieValue = r01readCookie("r01euskadiCookie");

		//Si no hay cookie
		if (cookieValue == null || cookieValue == "undefined"
				|| cookieValue.indexOf("_") == -1) {
			//Redirigir a prehome
			return r01RedirectPrehome(portalInfoToRedirect);
		}

		//Desglosamos cookie y obtenemos información del portal de la cookie
		var arrCookie = cookieValue.split("_");
		var portalCookie = arrCookie[0];
		var langCookie = arrCookie[1];
		var portalInfoCookie = r01FindPortalInfoWithPortaOid(portalCookie);

		//Si el portal al que se dirige está en la cookie
		if (portalInfoToRedirect.portalOid == portalCookie) {
			if (portalInfoToRedirect.reuseCookie) {
				//Redirigir a home con idioma de cookie
				return r01RedirectHome(portalInfoToRedirect, langCookie);
			} else {
				// Redirigir a la prehome
				return r01RedirectPrehome(portalInfoToRedirect);
			}
		}

		//reusa cookie?
		if (portalInfoToRedirect.reuseCookie) {
			//Si el portal de la cookie tambien reusa
			if (portalInfoCookie.reuseCookie) {
				//Redirigir a home con idioma de cookie
				return r01RedirectHome(portalInfoToRedirect, langCookie);
			} else {
				//Redirigir a prehome
				return r01RedirectPrehome(portalInfoToRedirect);
			}
		} else {
			//Redirigir a prehome
			return r01RedirectPrehome(portalInfoToRedirect);
		}
	} catch (e) {
		//Redirigir a prehome
		return r01RedirectPrehome(portalInfoToRedirect);
	}
}
/*
 * Redirige a la prehome del portal
 */
function r01RedirectPrehome(portalInfo) {
	try {
		window.location.href = "/" + portalInfo.codPreHome;
	} catch (e) {
		return null;
	}
}
/*
 * Redirige a la home del portal
 * Si no se define en el idioma correspondiente redirige a la prehome
 */
function r01RedirectHome(portalInfo, lang) {
	try {
		var homePage = null;
		for ( var i = 0; i < portalInfo.languages.length; i++) {
			if (portalInfo.languages[i][0] == lang
					&& portalInfo.languages[i][1] != null
					&& portalInfo.languages[i][1] != undefined
					&& (portalInfo.languages[i][1]).replace(/ /g, "").length != 0) {
				homePage = "/" + portalInfo.languages[i][1] + "/" + lang;
				break;
			}
		}
		if (homePage != null) {
			window.location.href = homePage;
		} else {
			window.location.href = "/" + portalInfo.codPreHome;
		}
	} catch (e) {
		return null;
	}
}
/*
 * Devuelve la página contenedora por defecto
 */
function r01DefaultContainerPage(currentPage, isErrorPage) {

	// Se obtiene el dominio para buscar en el r01portalCookies.js la pagina contenedora por defecto
	var url = window.location.href; //Url pedida
	var domain = r01FormatURL(url); //dominio (sin http,www)

	try {
		//Obtener información del portal al que se accede
		var portalInfo = r01FindPortalInfoWithPortalDomain(domain);
		if (portalInfo == null || portalInfo == "undefined") {
			return null;
		} else {

			// Pagina contenedora por defecto:
			//  - Si coincide con la pagina actual y el fallo ha sido al obtener la pagina 
			//    (y no un componente de la misma) ==> Se redireccionara a la pagina por defecto
			//  - Si el error es al obtener un componente de la pagina o una pagina del portal 
			//    que no coincide con la pagina contenedora, el documento de error se empotrara en 
			//    la pagina contenedora por defecto para ese dominio
			var containerPage = portalInfo.contentPreviewPage;
			if (currentPage == portalInfo.contentPreviewPage
					&& isErrorPage == true) {
				alert('Página actual es la de por defecto');
				return 'defaultErrorPage';
			} else {
				return containerPage;
			}
		}
	} catch (e) {
		//Redirigir a prehome
		return null;
	}
}
/*
 * Devuelve el objeto portalInfo a partir del dominio
 */
function r01FindPortalInfoWithPortalDomain(urlDomain) {
	for ( var i = 0; i < r01PortalPagesInfoArray.length; i++) {
		var domainArr = r01PortalPagesInfoArray[i].domain.split(";");
		for ( var j = 0; j < domainArr.length; j++) {
			if (exactMatch(r01FormatURL(domainArr[j]), urlDomain)) {
				return r01PortalPagesInfoArray[i];
			}
		}

	}
	return null;
}
/*
 * Devuelve el objeto portalInfo a partir del oid del portal
 */
function r01FindPortalInfoWithPortaOid(portalOid) {
	for (var i = 0; i < r01PortalPagesInfoArray.length; i++) {
		if (r01PortalPagesInfoArray[i].portalOid == portalOid) {
			return r01PortalPagesInfoArray[i];
		}
	}
	return null;
}
/**
 * r01gTrim
 * Descripcion: devuelve una cadena sin espacios al comienzo y al final
 * @param str 	cadena
 * @return str
 */
function r01gTrim(str) {
	try {
		return str.replace(/^\s+|\s+$/g, "");
	}
	catch (e) {
		return str;
	}
}
/**
 * Formatea el dominio con las reglas a seguir correctas:
 * 1- coincidencia protocolo (url con "http" o "https" no son iguales)
 * 2- coincidencia 3w (url con "www" o "www1" no son iguales)
 * 3- coincidencia sin protocolo (busca url de "http" y por dns)
 * El prototipo de busqueda es <protocolo>://<dns> (e.j."http://opendata.euskadi.net") 
 * @param domain: el dominio a formatear
 */
function r01FormatURL(domain) {
	var host = domain;
	if(host.match("https:") == null) {
		host = splitProtocol(host);
		host = format3W(host);
		host = "http://"+host;
	}else {  
		host = splitProtocol(host);
		host = format3W(host);
		host = "https://"+host;
	}
	return host;
}
/**
 * Elimina (si lo tiene) el protocolo del dominio
 * @param url: el dominio a formatear
 */
function splitProtocol(url) { 
//si tiene "http:" lo quitamos 
	if (url.match("/") != null) { 
		url = url.split("/");
		//comprobacion para el caso que url sea tipo: "www.kontsumobide.euskadi.net/"
		if(url[2] == null || url[2] == "") { 
			for(var i = 0; i < url.length; i++) {  
				if(url[i] != "" || url[i].match("http") == null ) {
				url=url[i];
				break;
				}
			}
		}else {  
		url = url[2];
		}		
	}
	return url;
 }
/**
 * formatea el dominio para ignorar/incluir el www dependiendo si tiene num. o no
 * E.J. "www1.uragentzia.euskadi.net" mantenemos WWW1 como patron de coincidencia 
 * @param dns: texto donde buscar coincidencia
 */
function format3W(dns) { 
		//si tiene www[0-9] lo dejamos como esta
		if(dns.match("www[0-9]") == null) { 
			 if(dns.match("www")!=null) { 
				dns = dns.slice(dns.indexOf(".")+1,dns.length);
			}
		}
		return dns;
 }
/**
 * Busca una coincidencia exacta entre dos DNS
 * @param textTested: texto donde buscar coincidencia
 * @param textPatt: texto con el patron de busqueda
 */
 function exactMatch(textTested, textPatt) { 
	var patt=new RegExp("^"+textPatt+"$");
	return patt.test(textTested);
 }
///////////////////////////////////////////////////////////////////////////////////////
//                 FUNCIONES GENERALES PARA COOKIES
//////////////////////////////////////////////////////////////////////////////////////
/**
 * Crear una cookie que expira en el numero de dias indicad
 * @param name: El nombre de la cookie
 * @param value: El valor de la cookie
 * @param days: El numero de dias para que la cookie expire
 */
function r01createCookie(name, value, days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
		var expires = "; expires=" + date.toGMTString();
	} else {
		var expires = "";
	}
	// Establecer la cookie
	document.cookie = name + "=" + value + expires + "; path=/";
}
/**
 * Leer el valor de la cookie con el nombre dado
 * @param name: El nombre de la cookie a leer
 */
function r01readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(";");
	for (var i = 0; i < ca.length; i++) {
		var c = ca[i];
		while (c.charAt(0) == " ") {
			c = c.substring(1, c.length);
		}	// Eliminar caracteres en blanco...
		if (c.indexOf(nameEQ) == 0) {
			return c.substring(nameEQ.length, c.length);
		}
	}
	return null;
}
/**
 * Elimina una cookie
 * @param name: El nombre de la cookie a borrar
 */
function r01eraseCookie(name) {
	r01createCookie(name, "", -1);	// Simplemente poner la cookie en blanco y su expiracion a -1
}

