/**
 * csd-applet-commons.js
 * @version 0.1.0.M4
 * @author cfillol
 * 
 * @projectDescription
 * Elementos de uso común en todos los módulos de csd-applet-signer.
 * Contiene: 
 *	- Un serializador/deserializador de objetos	Java-JSON.
 *	- Una clase Javascript para referenciar ficheros.
 *	- Una clase Javascript para encapsular el resultado de invocar a
 *	un applet (Valor de retorno o excepción producida).
 *
 */


/**
 * Funcion para trabajar con namespaces
 */
if (!window.es) window.es = {};
if (!window.es.csd) window.es.csd = {};
es.csd.namespace = function() {
   var a=arguments, o=null, i, j, d, rt;
   for (i=0; i<a.length; ++i) {
       d=a[i].split(".");
       rt = d[0];
       eval('if (typeof ' + rt + ' == "undefined"){' + rt + ' = {};} o = ' + rt + ';');
       for (j=1; j<d.length; ++j) {
           o[d[j]]=o[d[j]] || {};
           o=o[d[j]];
      }
  }
}

/**
 * Devuelve la referencia al namespace.
 * Si no existe devuelve null.
 */
es.csd.getNamespace = function(namespace) {
   var ns = null;
   try { 
	   ns = eval('('+namespace+')');
   } catch(e) { }
   return (ns?ns:null); // Devolvemos null si ns es undefined
}


/**
 * Devuelve un id único para este dominio
 * @return {String} id
 */
es.csd.getId = function() {
	return "csd-"+(top.es.csd.idCounter++);
}

/**
 * Inicializamos el contador de ids únicos
 */
es.csd.namespace("top.es.csd");
if (!top.es.csd.idCounter) top.es.csd.idCounter = 1;


/**
 * Devuelve <protocol>://<host>[:<port>] relativo a la
 * ruta de la ventana actual
 * 
 * @param url
 * @return {String} base de la url
 */
es.csd.getBaseUrl = function() {
	var baseUrl = [
		window.location.protocol,'//',
		window.location.host
	].join('');
	
	return baseUrl;
}

/**
 * Devuelve <protocol>://<host>[:<port>]/webapp relativo a la
 * ruta de la ventana actual, donde webapp se refiere al nombre
 * de la aplicación web
 * 
 * @param url
 * @return {String} base de la url
 */
es.csd.getAppBaseUrl = function() {
	var baseAppUrl = [
		window.location.protocol,'//',
		window.location.host,
		window.location.pathname.split('/')[0]
	].join('');
	
	return baseAppUrl;
}

/**
 * 
 */
es.csd.resolveUrl = function(url) {
	if (url.substring(0,1)=='/') {
		// Soportamos rutas relativas al dominio
		url = es.csd.getBaseUrl() + url;
	} else if (url.indexOf('://')==-1) {
		// Soportamos rutas relativas a la página actual
		var pwd = window.location.pathname;
		var lastBarInd = pwd.lastIndexOf('/');
		if (lastBarInd != -1) {
			pwd = pwd.substring(0,lastBarInd);
			url = es.csd.getBaseUrl() + pwd + '/' + url;
		}
	}
	
	return url;
}
		
var isIE = (navigator.appName.indexOf("Microsoft")!=-1);
 
///////////////////////////////////////
// Métodos para emascarar la pantalla y evitar que el 
// usuario pulse nada mientras se lleva a cabo un proceso
//

document.write('<div id="mask" class="mask" style="display:none"><table align="center" style="height:100%;"><tr><td valign="middle" align="center"><div class="maskMsg"><table><tr><td><img src="/few/src/main/webapp/img/loading.gif" /></td><td id="maskMsg"></td></tr></table></div></td></tr></table></div>');

function mask(msg) {
	var mask = document.getElementById('mask');
	var maskMsg = document.getElementById('maskMsg');
	//maskMsg.innerHTML = msg;
	mask.style.display = 'block';
}

function unmask() {
	var mask = document.getElementById('mask');
	mask.style.display = 'none';
}


///////////////////////////////////////
// Métodos para navegar por el dom HTML
//

/**
 * Dado un elemento del dom y un nombre de etiqueta HTML, 
 * devuelve el primer predecesor en la pirámede de jerarquía 
 * cuyo tag coincide con el indicado.
 */
function getParent(domEl, tagName) {
	var upperTagName = tagName.toUpperCase();
	while (domEl.parentNode) {
		domEl = domEl.parentNode;
		if (domEl.tagName && 
			domEl.tagName.toUpperCase() == upperTagName) {
			return domEl;
		}
	}
	return null;
}

/**
 * Dado un elemento del dom y un nombre de etiqueta HTML, 
 * devuelve el primer nodo hermano encontrado a la izquierda 
 * cuyo tag coincide con el indicado.
 */
function getPrev(domEl, tagName) {
	var upperTagName = tagName.toUpperCase();
	while (domEl.previousSibling) {
		domEl = domEl.previousSibling;
		if (domEl.tagName && 
			domEl.tagName.toUpperCase() == upperTagName) {
			return domEl;
		}
	}
	return null;
}

/**
 * Dado un elemento del dom y un nombre de etiqueta HTML, 
 * devuelve el primer nodo hermano encontrado a la derecha 
 * cuyo tag coincide con el indicado.
 */
function getNext(domEl, tagName) {
	var upperTagName = tagName.toUpperCase();
	while (domEl.nextSibling) {
		domEl = domEl.nextSibling;
		if (domEl.tagName && 
			domEl.tagName.toUpperCase() == upperTagName) {
			return domEl;
		}
	}
	return null;
}

/**
 * Dado un elemento del dom y un nombre de etiqueta HTML, 
 * devuelve el primer sucesor en la pirámede de jerarquía 
 * cuyo tag coincide con el indicado.
 */
function getChild(domEl, tagName) {
	if (!domEl.firstChild) return null;
	var upperTagName = tagName.toUpperCase();
	domEl = domEl.firstChild;
	
	while (domEl) {
		if (domEl.tagName && 
			domEl.tagName.toUpperCase() == upperTagName) {
			return domEl;
		}
		domEl = domEl.nextSibling;
	}
	return null;
}


//////////////////////////////////////////////
// Cambiamos el stilo de los elementos con foco
// con jquery

es.csd.addFocusStyle = function() {
    $('input').focus(function() {
        $(this).addClass("focus");
    });
     
    $('input').blur(function() {
        $(this).removeClass("focus");
    });
    
    $('textarea').focus(function() {
        $(this).addClass("focus");
    });
     
    $('textarea').blur(function() {
        $(this).removeClass("focus");
    });
    
    $('select').mousedown(function() {
       this._focus = true;
       $(this).addClass("focus");
    });
    
    $('select').focus(function() {
       if (!this._focus) $(this).addClass("focus");
    });
    
    $('select').blur(function() {
        this._focus = false;
        $(this).removeClass("focus");
    });
}

$(document).ready(es.csd.addFocusStyle)


//////////////////////////////////////////////
// Eventos few de inicio y fin de request

es.csd.namespace("es.csd.few");

es.csd.few.onInitializeRequest = function(sender, eventArgs) {
    mask('Cargando ...');
}

es.csd.few.onEndRequest = function(sender, eventArgs) {
    unmask();
    es.csd.addFocusStyle();
}
