/**
 * @fileOverview Namespace base de la librería js Dome.
 */
if (typeof dome == "undefined" || !dome) {
    /**
     * @name dome
     * @namespace  Namespace base de la librería js Dome
     * @constructor
     */
    var dome = {
        /**
         * @memberOf dome
         * @constant
         * @type {String}
         * @private
         * @static
         */
        jsPath: "jsdome/dome",

        /*-*
         * @memberOf dome
         * @constant
         * @type {String}
         * @private
         * @static
         *
         * @deprecated  Este atributo ya no se debe utilizar. Mantener a false.
         *
         * Indica si se está en desarrollo. Ahora mismo sólo se utiliza para forzar que al hacer el include de
         * los archivos js se utilice el objecto ActiveX en vez de la implementación XMLHttpRequest de Explorer
         * porque no permite acceder al sistema de ficheros local.
         */
        isDev: false,

        /**
         * Devuelve el namespace especificado. Si el namespace no existe entonces se crea. Los nombres de
         * los namespaces no pueden contener ninguna palabra reservada (Aunque en algunos navegadores puede que funcione
         * no es compatible con todos). Está función es para uso interno de la librería, en pocos casos será
         * necesaria fuera de ella.
         * <p />
         * Cuando se crea un namespace, éste se genera siempre bajo el namespace base dome. De este modo las dos siguientes
         * instrucciones crearían el mismo namespace <tt>dome.util</tt>.
         * <pre>
         *    dome.namespace("dome.util");
         *    dome.namespace("util");
         * </pre>
         *
         *
         * @param {String}   namespace   Nombre del namespace.
         *
         * @return {Object}  Referencia al namespace especificado.
         *
         * @static
         */
        namespace: function (namespace) {
            if (namespace == null) {
                return null;
            }

            var name = namespace.split(".");
            var actual = dome;

            var i = (name[0] == "dome" ? 1 : 0);
            while (i < name.length) {
                if (typeof actual[name[i]] == "undefined") {
                    actual[name[i]] = {};
                }
                actual = actual[name[i]];
                i++;
            }

            return actual;
        },

        /**
         * Inserta en el documento el archivo js requerido para incluir la clase especificada.
         *
         * @param {String}   path      Nombre completo de la clase que se quiere incluir.
         * @param {String}   basedir   Directorio base de los js, si no se indica se utilizará jsPath. Debe terminar en "/".
         *
         * @static
         */
        include: function (path, basedir) {

             /* Se cambia para hacer la petición mediante Ajax porque es la única forma de que sea síncrono.
             * No se usa el objeto Xhr porque no debe tener dependencias. También porque se quiere
             * soportar lectura desde fichero. */
            function getResource(url) {
                var ieActiveX = (dome.userAgent().ie > 0 && dome.isDev);
                var xmlhttp = (window.XMLHttpRequest && !ieActiveX) ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
                if (xmlhttp == null) {
                    alert("Your browser does not support XMLHTTP.");
                    return null;
                }
                try {
                    xmlhttp.open("GET", url, false);
                    xmlhttp.send(null);
                    return xmlhttp.responseText;
                } catch (ex) {
                    alert("URL: " + url + "\n" + ex);
                    return "";
                }
            }

            /* Comrpueba si el objeto ya está cargado. Si es así lo devuelve, sino retorna null */
            function getObject(path) {
               var name = path.split(".");
               var obj = eval("typeof " + name[0] + " == 'undefined' ? null : " + name[0] + ";");
               var i = 1;
               while (i < name.length && obj) {
                    obj = (typeof obj[name[i]] == "undefined") ? null : obj[name[i]];
                    i++;
                }
                return obj;
            }

            if (!getObject(path)) {
                var base = document.getElementsByTagName("head")[0].getElementsByTagName("base");
                var url = ((base && base[0]) ? base[0].href + "/" : "");
                if (url == ""){
                    var pathurl = "";
                    var pathname = document.location.pathname.split('/');
                    if (document.location.pathname.length > 1) {
                        for (var i = 0; i < pathname.length - 1; i++) {
                            pathurl += pathname[i] + "/";
                        }
                    }
                    url += document.location.protocol + "//" + document.location.host + "/" + pathurl;
                }
                url += (basedir ? basedir + "/" : dome.jsPath) + path.replace("dome", "/").replace(/\./g, "/") + ".js";
                var scriptSrc = getResource(url);

                eval(scriptSrc);
            }
        },

        /**
         * Informa de la versión del navegador. El valor de la versión es un <code>float</code> por lo que
         * se puede utilizar fácilmente tanto en una expresión booleana como para comprobar un determinado
         * rango de versiones. Debido a esto, parte de la granularidad en la información de la versión puede
         * perderse (p.e., Gecko 1.8.0.9 se informa como 1.8).
         *
         * <b>Importante:</b> Esta función no se debe utilizar a menos que sea inevitable. Escribir código
         * en función del navegador siempre es una mala práctica. En vez de ello lo que se debería hacer
         * es detectar las características de cada navegador. Por ejemplo:
         * <pre>
         *    if (obj.addEventListener) { // W3C
         *       obj.addEventListener(evType, func, useCapture);
         *       return true;
         *    } else if (obj.attachEvent) { // IE
         *       return obj.attachEvent("on"+evType, func);
         *    }
         * </pre>
         *
         * @static
         */
        userAgent: function () {
            /*
             * Extraido de YUI: http://developer.yahoo.com/yui/docs/Env.js.html
             */
            var result = {
                /**
                 * Internet Explorer version number or 0.  Example: 6
                 * @private
                 * @type float
                 */
                ie: 0,
                /**
                 * Opera version number or 0.  Example: 9.2
                 * @private
                 * @type float
                 */
                opera: 0,
                /**
                 * Gecko engine revision number.  Will evaluate to 1 if Gecko
                 * is detected but the revision could not be found. Other browsers
                 * will be 0.  Example: 1.8
                 * <pre>
                 * Firefox 1.0.0.4: 1.7.8   <-- Reports 1.7
                 * Firefox 1.5.0.9: 1.8.0.9 <-- Reports 1.8
                 * Firefox 2.0.0.3: 1.8.1.3 <-- Reports 1.8
                 * Firefox 3 alpha: 1.9a4   <-- Reports 1.9
                 * </pre>
                 * @private
                 * @type float
                 */
                gecko: 0,
                /**
                 * AppleWebKit version.  KHTML browsers that are not WebKit browsers
                 * will evaluate to 1, other browsers 0.  Example: 418.9.1
                 * <pre>
                 * Safari 1.3.2 (312.6): 312.8.1 <-- Reports 312.8 -- currently the
                 *                                   latest available for Mac OSX 10.3.
                 * Safari 2.0.2:         416     <-- hasOwnProperty introduced
                 * Safari 2.0.4:         418     <-- preventDefault fixed
                 * Safari 2.0.4 (419.3): 418.9.1 <-- One version of Safari may run
                 *                                   different versions of webkit
                 * Safari 2.0.4 (419.3): 419     <-- Tiger installations that have been
                 *                                   updated, but not updated
                 *                                   to the latest patch.
                 * Webkit 212 nightly:   522+    <-- Safari 3.0 precursor (with native SVG
                 *                                   and many major issues fixed).
                 * Safari 3.0.4 (523.12):523.12  <-- First Tiger release - automatic update
                 *                                   from 2.x via the 10.4.11 OS patch
                 * Webkit nightly 1/2008:525+    <-- Supports DOMContentLoaded event
                 *
                 * </pre>
                 * http://developer.apple.com/internet/safari/uamatrix.html
                 * @private webkit
                 * @type float
                 */
                webkit: 0,
                /**
                 * The mobile property will be set to a string containing any relevant
                 * user agent information when a modern mobile browser is detected.
                 * Currently limited to Safari on the iPhone/iPod Touch, Nokia N-series
                 * devices with the WebKit-based browser, and Opera Mini.
                 * @private
                 * @type string
                 */
                mobile: null
            };

            var ua = navigator.userAgent;
            var v;

         // Modern KHTML browsers should qualify as Safari X-Grade
            if ((/KHTML/).test(ua)) {
                result.webkit = 1;
            }

         // Modern WebKit browsers are at least X-Grade
            v = ua.match(/AppleWebKit\/([^\s]*)/);
            if (v && v[1]) {
                result.webkit = parseFloat(v[1]);

            // Mobile browser check
                if (/ Mobile\//.test(ua)) {
                    result.mobile = "Apple"; // iPhone or iPod Touch
                } else {
                    v = ua.match(/NokiaN[^\/]*/);
                    if (v) {
                        result.mobile = v[0]; // Nokia N-series, ex: NokiaN95
                    }
                }
            }

            if (!result.webkit) { // not webkit
                // todo check Opera/8.01 (J2ME/MIDP; Opera Mini/2.0.4509/1316; fi; U; ssr)
                v = ua.match(/Opera[\s\/]([^\s]*)/);
                if (v && v[1]) {
                    result.opera = parseFloat(v[1]);
                    v = ua.match(/Opera Mini[^;]*/);
                    if (v) {
                        result.mobile = v[0]; // ex: Opera Mini/2.0.4509/1316
                    }
                } else { // not opera or webkit
                    v = ua.match(/MSIE\s([^;]*)/);
                    if (v && v[1]) {
                        result.ie = parseFloat(v[1]);
                    } else { // not opera, webkit, or ie
                        v = ua.match(/Gecko\/([^\s]*)/);
                        if (v) {
                            result.gecko = 1; // Gecko detected, look for revision
                            v = ua.match(/rv:([^\s\)]*)/);
                            if (v && v[1]) {
                                result.gecko = parseFloat(v[1]);
                            }
                        }
                    }
                }
            }

            return result;
        }

    };

}

    /**#@+
     * @memberOf dome
     * @namespace
     */
    /** @name dome.util */
    /** @name dome.slider */
    /** @name dome.form */
    /** @name dome.distri */
    /** @name dome.distri.i18n */
    /** @name dome.tooltip */
    /** @name dome.image */
    /** @name dome.fx */
    /** @name dome.fx.easing */
    /**#@-*/
