<commit_before>/*jslint indent:8, devel:true, browser:true, vars:true*/
/*global jQuery, $, Handlebars*/

// Esta es otra forma de escribir '$(document).ready()'
jQuery(function ($) {
        "use strict";

        // ajaxInProgress: La variable informa si hay una petición Ajax en proceso
        var     ajaxInProgress = false,
                ENTER_KEY = 13;

        // Tipos de llamadas Ajax y tiempo de cacheo de respuestas
        // FUTURE: Estas variables se utilizarán cuando haya diferentes tipos de peticiones Ajax. Por el momento solo hay una
        var     FORECAST_CALL = 0,
                LOCALIDAD_CALL = 1;

        // Objeto contenedor de utilidades.
        // Estas funciones, si su uso es lo suficientemente común, podrían ir en un archivo '.js' a parte.
        var util = {
                getDiaSemana: function (numDia) {
                        var dias = [    {short: "D", complete: "Domingo"},
                                        {short: "L", complete: "Lunes"},
                                        {short: "M", complete: "Martes"},
                                        {short: "X", complete: "Miércoles"},
                                        {short: "J", complete: "Jueves"},
                                        {short: "V", complete: "Viernes"},
                                        {short: "S", complete: "Sábado"}];
                        return dias[numDia];
                },
                // Cachea respuestas de servidor en LocalStorage (HTML5)
                // Funcionalidad para el cacheo de respuestas Ajax
                cache: {
                        CACHE_MINUTES: 0.1, //0 significa 'sin caché'
                        responses: {},
                        setResponse: function (key, obj) {
                                // Si no existe el objecto lo crea.
                                if (!localStorage.getItem(key)) {
                                        // En 'localStorage' se almacena la serialización de un objeto (toString), por lo que lo serializa antes para que se almacene correctamente (JSON.stringify)
                                        localStorage.setItem(key, JSON.stringify(obj));
                                }
                        },
                        getResponse: function (key) {
                                var antiguedadCache, obj;
                                // Retorna el objeto solo si existe y no es más antigo que CACHE_MINUTES
                                // En caso de ser antiguo lo borra
                                if (localStorage.getItem(key)) {
                                        obj = JSON.parse(localStorage.getItem(key));
                                        antiguedadCache = (Date.now() - new Date(obj.date).getTime()) / 60000;
                                        if (antiguedadCache <= this.CACHE_MINUTES) {
                                                return obj;
                                        } else {
                                                localStorage.removeItem(key);
                                                // Cada vez que caduque una respuesta hacer un barrido en busca de más respuestas caducadas
                                                this.deleteObsoleteResponses();
                                        }
                                }
                                return undefined;
                        },
                        // Recorre las propiedades del objeto 'responses' y borra las que están caducadas según CACHE_MINUTES
                        deleteObsoleteResponses: function () {
                                var property, antiguedadCache, obj;
                                for(property in localStorage){
                                        obj = JSON.parse(localStorage.getItem(property));
                                        antiguedadCache = (Date.now() - new Date(obj.date).getTime()) / 60000;
                                        if (antiguedadCache > this.CACHE_MINUTES) {
                                               localStorage.removeItem(property);
                                        }
                                };
                        }
                },
                // Se modifica la URL con la localidad consultada con el fin de que el enlace pueda ser almacenado como marcador/favorito
                // La misma función (pushState), además, genera historial
                historyHandler: function (newHash) {
                        var hash = window.location.hash;
                        if (!hash || (hash === "#")) {
                                window.history.pushState(null, "The Weathernode", "#/" + newHash);
                        } else {
                                // Si se está consultando la misma localidad (o se ha recargado la página -F5-) no se desea guardar en historial
                                if (hash.slice(2) !== newHash) {
                                        // NOTE: He obserbado que según el PC (mismo navegador) las URLs con espacios se codifican con %20 o no.
                                        // Esto es un problema, porque el método 'replace' no encuntra la cadena si tiene %20.
                                        // La solución es utilizar el método 'encodeURIComponent', pero si no lleva %20 tampoco lo encuentra
                                        // Estar atento...
                                        window.history.pushState(null, "The Weathernode", hash.replace(hash.slice(2), newHash));
                                }
                        }
                }
        };

        var App = {
                init: function () {
                        // Poner el foco en el primer campo de entrada visible
                        $("body").find("input[type=text]:visible:first").focus();
                        this.cacheElements();
                        this.bindEvents();
                        this.route();
                },
                cacheElements: function () {<commit_msg>Fix localStorage issue<commit_after>/*jslint indent:8, devel:true, browser:true, vars:true*/
/*global jQuery, $, Handlebars*/

// Esta es otra forma de escribir '$(document).ready()'
jQuery(function ($) {
        "use strict";

        // ajaxInProgress: La variable informa si hay una petición Ajax en proceso
        var     ajaxInProgress = false,
                ENTER_KEY = 13;

        // Tipos de llamadas Ajax y tiempo de cacheo de respuestas
        // FUTURE: Estas variables se utilizarán cuando haya diferentes tipos de peticiones Ajax. Por el momento solo hay una
        var     FORECAST_CALL = 0,
                LOCALIDAD_CALL = 1;

        // Objeto contenedor de utilidades.
        // Estas funciones, si su uso es lo suficientemente común, podrían ir en un archivo '.js' a parte.
        var util = {
                getDiaSemana: function (numDia) {
                        var dias = [    {short: "D", complete: "Domingo"},
                                        {short: "L", complete: "Lunes"},
                                        {short: "M", complete: "Martes"},
                                        {short: "X", complete: "Miércoles"},
                                        {short: "J", complete: "Jueves"},
                                        {short: "V", complete: "Viernes"},
                                        {short: "S", complete: "Sábado"}];
                        return dias[numDia];
                },
                // Cachea respuestas de servidor en LocalStorage (HTML5)
                // Funcionalidad para el cacheo de respuestas Ajax
                cache: {
                        CACHE_MINUTES: 0.1, //0 significa 'sin caché'
                        responses: {},
                        setResponse: function (key, obj) {
                                // Si no existe el objecto lo crea.
                                if (!localStorage.getItem(key)) {
                                        // En 'localStorage' se almacena la serialización de un objeto (toString), por lo que lo serializa antes para que se almacene correctamente (JSON.stringify)
                                        localStorage.setItem(key, JSON.stringify(obj));
                                }
                        },
                        getResponse: function (key) {
                                var antiguedadCache, obj;
                                // Retorna el objeto solo si existe y no es más antigo que CACHE_MINUTES
                                // En caso de ser antiguo lo borra
                                if (localStorage.getItem(key)) {
                                        obj = JSON.parse(localStorage.getItem(key));
                                        antiguedadCache = (Date.now() - new Date(obj.date).getTime()) / 60000;
                                        if (antiguedadCache <= this.CACHE_MINUTES) {
                                                return obj;
                                        } else {
                                                localStorage.removeItem(key);
                                                // Cada vez que caduque una respuesta hacer un barrido en busca de más respuestas caducadas
                                                this.deleteObsoleteResponses();
                                        }
                                }
                                return undefined;
                        },
                        // Recorre las propiedades del objeto 'responses' y borra las que están caducadas según CACHE_MINUTES
                        deleteObsoleteResponses: function () {
                                var key, antiguedadCache, obj;
                                for (key in localStorage) {
                                        if (typeof localStorage[key] !== "function" && localStorage.hasOwnProperty(key)) {
                                                obj = JSON.parse(localStorage.getItem(key));
                                                antiguedadCache = (Date.now() - new Date(obj.date).getTime()) / 60000;
                                                if (antiguedadCache > this.CACHE_MINUTES) {
                                                        localStorage.removeItem(key);
                                                }
                                        }
                                }
                        }
                },
                // Se modifica la URL con la localidad consultada con el fin de que el enlace pueda ser almacenado como marcador/favorito
                // La misma función (pushState), además, genera historial
                historyHandler: function (newHash) {
                        var hash = window.location.hash;
                        if (!hash || (hash === "#")) {
                                window.history.pushState(null, "The Weathernode", "#/" + newHash);
                        } else {
                                // Si se está consultando la misma localidad (o se ha recargado la página -F5-) no se desea guardar en historial
                                if (hash.slice(2) !== newHash) {
                                        // NOTE: He obserbado que según el PC (mismo navegador) las URLs con espacios se codifican con %20 o no.
                                        // Esto es un problema, porque el método 'replace' no encuntra la cadena si tiene %20.
                                        // La solución es utilizar el método 'encodeURIComponent', pero si no lleva %20 tampoco lo encuentra
                                        // Estar atento...
                                        window.history.pushState(null, "The Weathernode", hash.replace(hash.slice(2), newHash));
                                }
                        }
                }
        };

        var App = {
                init: function () {
                        // Poner el foco en el primer campo de entrada visible
                        $("body").find("input[type=text]:visible:first").focus();
                        this.cacheElements();
                        this.bindEvents();
                        this.route();
                },
                cacheElements: function () {
{'fraction_non_alphanumeric': 0.0779630829015544, 'fraction_numerical': 0.0045336787564766836, 'mean_word_length': 0.9714331311841685, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 5, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 110, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '222369', 'n_tokens_mistral': 2776, 'n_tokens_neox': 2614, 'n_words': 844}