﻿/**
 * @constant FRWK_JS_PATH Define la ruta al Framework
 */
var FRWK_JS_PATH = "/js/"

/**
 * Funcion para simular NameSpacing en JS
 * @function
 * @param {string} ns Nombre del Namespace
 * @example registerNameSpace("Despegar.SearchBox")
 */
function registerNameSpace(ns)
{
	var nsParts = ns.split(".");
	var root = window;

	for(var i=0; i<nsParts.length; i++)
	{
		if(typeof root[nsParts[i]] == "undefined")
		root[nsParts[i]] = new Object();

		root = root[nsParts[i]];
	}
}

/**
 * Carga un srcipt externo y lo ejecuta en forma sincronica
 * @function
 * @param {string} jsPath
 * @return void
 */
function loadJS(jsPath)
{
	
	xmlhttp=null;
	if (window.XMLHttpRequest)
	{// code for IE7, Firefox, Opera, etc.
		xmlhttp=new XMLHttpRequest();
	}
	else if (window.ActiveXObject)
	{// code for IE6, IE5
		xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
	}
	
    headTag = document.getElementsByTagName("head")[0];  
    var scriptTag = document.createElement("script");  
    scriptTag.setAttribute("type", "text/javascript"); 
    scriptTag.setAttribute("charset", "utf-8"); 
	
	if (xmlhttp!=null)
	{
		xmlhttp.open("GET",jsPath,false);
		//xmlhttp.setRequestHeader("Content-Type", "application/x-javascript; charset=UTF-8");

		xmlhttp.send(null);

		var scriptContent = "//START of '" + jsPath + "' file \n"
		scriptContent += xmlhttp.responseText;
		scriptContent += "//END of '" + jsPath + "' file \n";
		
		
		if(xmlhttp.status == 200)
		{
			scriptTag.text = scriptContent;
		}
		else
		{
			scriptTag.text = "//ERROR al cargar archivo '" + jsPath + "' (" + xmlhttp.statusText + ")\n"
		}
	}
	else
	{
		scriptTag.text = "//ERROR al cargar archivo '" + jsPath + "' (no se pudo instanciar XMLHttpRequest)\n"
	}
	headTag.appendChild(scriptTag);
}


/**
 * Parsea la el nombre de la clase, y retorna el path fisico
 * al archivo que la contiene
 * @param {Object} sClassName
 * @return {string} Path al archivo JS que contiene la clase
 */
function getJSClassPath(sClassName)
{
    var sPath = "";
    var aClassParts = sClassName.split(".");
    for(var i = 0; i < aClassParts.length; i++)
    {
        sPath += aClassParts[i];
        if(i<aClassParts.length - 1)
        {
            sPath += "/";
        }
    }
    sPath += ".js";
    return FRWK_JS_PATH + sPath;
}

/**
 * Carga un archivo JS no definido en el Framework Generico
 * Creada principalmente para que sea compatible con el esquema 
 * de post build que copia el contenido de los archivos 
 * referenciados directamente en los paquetes
 * 
 * @function
 * @param {string} jsPath Path relativo a la carpeta "custom" del framework, sin poner "/" al final.
 * @example loadJSClass("vuelos/resultado.js")
 * @requires loadJS
 */
function loadCustomJS(jsPath) 
{
    loadJS(FRWK_JS_PATH + "custom/" + jsPath);  
}

/**
 * Carga una clase definida en un srcipt externo. Esta funcion
 * es compatible con el esquema de post build que copia el
 * contenido de los archivos referenciados directamente en los 
 * paquetes
 * 
 * @function
 * @param {string} ns Nombre completo de la clase
 * @example loadJSClass("Despegar.SearchBox.Box")
 * @requires loadJS
 * @requires getJSClassPath
 */
function loadJSClass(sClassName) 
{
    loadJS(getJSClassPath(sClassName));  
}

/**
 * Funcion que se bindea con window.onerror, que se encargara de
 * hacer el handle de los errores javascript
 * @param {string} message
 * @param {string} url
 * @param {string} line
 */
function despegarErrorHandler(message, url, line)
{
	if(Despegar != null && Despegar.ExceptionHandler != undefined)
	{
		oHandler = new Despegar.ExceptionHandler(message, url, line);
		oHandler.showErrorForm();
	}
	return false;
}
/**
 * Bindeo window.onerror con la funcion despegarErrorHandler
 * e instancio el Stack global de errores
 */
//window.onerror = despegarErrorHandler;
window.globalStack = new Array();



