<?php

ignore_user_abort(false); // CUIDADO CON ESTO EN EL PANEL
require_once('../framework/loaders/configuration.php');

// NO estamos en el epanel
if (app_part == 'site') {

    if (is_file(template_base . 'configurable/constantes.php'))
        include template_base . 'configurable/constantes.php';

    require_once(FRAMEWORK_PATH . 'controlador.class.php');

    // MINIMOS PARA LA MINI CESTA
    if (!function_exists('showSubmitButton')) {
        // Cargamos el form generator de la plantilla
        Controlador::includeFromTemplateOrAlternative('framework/formGenerator.php');

        // Y del framework por si faltasen funciones
        include FRAMEWORK_PATH . 'formGenerator.php';
    }
}

require_once(FRAMEWORK_PATH . 'cache.php');
require_once(FRAMEWORK_PATH . 'rewrite.php');
require_once '../model/menu_web.php';
require_once '../model/ordenacion.php';


set_time_limit(10); // Por defecto 30 segundos para cargar... en los sitios que necesitemos le daremos mas
//if (isset($_SESSION['unidades_cesta']) and $_SESSION['unidades_cesta'] > 0) $_SESSION['unidades_cesta'] = 0;

class Aplicacion extends Controlador {

    static function comprobarIdioma() {
        // Funcion que se encarga de actualizar correctamente el $_SESSION['idioma'];
        $analize = "";
        if (isset($_GET['idioma']) and $_GET['idioma'] != "") {
            $analize = $_GET['idioma'];
        } else {
            // Si alguien quita /es o /cat ... cuando cambie de idioma (con las banderas) se AÃADE AL FINAL ?idioma=
            // Si pasa esto, averiguaremos el GET
            $analize = Rewrite::averiguaGetEnReescritura(idioma_get, true);

            // Si no se ha encontrado get, cogemos el idioma de la SESSION
            if ($analize == "" and isset($_SESSION['idioma']))
                $analize = $_SESSION['idioma'];
        }


        $original = isset($_SESSION['idioma']) ? $_SESSION['idioma'] : '';

        $idiomas = Conf::$idiomas; // Cargamos los idiomas
        // Confirmamos que el idioma deseado es correcto (aun que sea una SESSION, confirmamos que sea correcta)
        if (isset($idiomas[$analize]))
            $_SESSION['idioma'] = Controlador::normaliza($analize);
        /*
          // El idioma de la sesion se carga automaticamente
          else {
          // Idioma por defecto, si tenemos el mismo idioma que usa de navegador lo asignaremos
          //$autolang = substr($_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 2); // Idioma del PC/Navegador
          //$_SESSION['idioma'] = isset($idiomas[$autolang]) ? Controlador::normaliza ($autolang) : key($idiomas); // Si el idioma existe, lo asignamos, si no cogemos el de defecto

          // Cargamos el idioma "preferido" del usuario
          Conf::idiomaActual();
          } */

        // Actualizamos el idioma del cliente para cambiarlo en la BD
        if (isset($_SESSION['cliente_id']) and $original != $_SESSION['idioma']) {
            require_once '../model/clientes.php';
            $cliente = ClientesMapper::getByID($_SESSION['cliente_id']);
            $cliente->idioma = $_SESSION['idioma'];
            ClientesMapper::update($cliente);
        }

        Aplicacion::cargaIdiomas();
    }

    static function cargaIdiomas() {
        /* Aplicacion::load_metas();
          //Constantes de idioma

          Aplicacion::loadConstantes('constantes.php');
          $constantes = 'view/idiomas/'.$_SESSION['idioma'].'/constantes.php'; */

        //Cargamos el idioma
        $lang_constantes = dir_app . 'view/idiomas/' . $_SESSION['idioma'] . '/constantes.php';
        if (is_file($lang_constantes))
            include ($lang_constantes);
        else
            include (dir_app . 'view/idiomas/' . Conf::idiomaDefecto() . '/constantes.php');

        // Constantes del ecommerce
        if (Conf::$ecommerce) {
            $lang_constantes = dir_app.'view/idiomas/' . $_SESSION['idioma'] . '/constantes_ecommerce.php';
            if (is_file($lang_constantes)) include ($lang_constantes);
            else include (dir_app.'view/idiomas/' . Conf::idiomaDefecto() . '/constantes_ecommerce.php');
        }

        // La plantilla tiene idioma compatible
        if (is_file(template_base . 'lang/' . Conf::idiomaActual() . '.php'))
            include template_base . 'lang/' . Conf::idiomaActual() . '.php';
        //Controlador::includeFromTemplateOrAlternativeFromTemplate('lang/'.Conf::idiomaActual().'.php', 'lang/'.Conf::idiomaDefecto().'.php');
    }

    static public function preparaSubtitulo($actual, $titulos = null) {
        /*
          Esta funcion devuelve el subtitulo de alguna seccion (dedicada para productos, pero compatible con apartados)
          NOTA: Si SOLO es un TITULO (sin subtitulos) se puede usar directamente "define ('subtit', 'titulo');"
         */
        if (!defined('subtit')) {

            $subtit = $actual; // Titulo principal

            if ($titulos and !empty($titulos)) {
                // Hay titulos por mostrar
                $tot = 0;
                // Recorremos todos
                foreach ($titulos as $titulo) {
                    if ($titulo != '') { // Si tiene texto
                        // primero "(" o otro (->)
                        if ($tot == 0)
                            $subtit .= ' (';
                        else
                            $subtit .= ' -> ';

                        // Concatenamos
                        $subtit .= $titulo;
                        $tot ++;
                    }
                }

                if ($tot > 0)
                    $subtit .= ')'; // Fin del texto y bucle
            }

            define('subtit', $subtit);
        }
    }

    static function loadTexto($autoinclude, $id, $archivo = '', $dir = 'apartados/textos/') {
        /* Esta funcion comprueba de que exista un archivo de texto dinamico 
          $autoinclude	= true/false: incluira el archivo SI EXISTE
          $archivo 		= OPCIONAL nombre generico (por ejemplo "foot_dinamico")
          $ditr 				= OPCIONAL directorio donde se encuentra el archivo

          El script generara el siguiente nombre y lo incluira o devolvera como cadena:
          $dir$archivo_ID_IDIOMA.html;
         */

        $archivo = $dir . $archivo . '_' . $id . '_' . $_SESSION['idioma'] . '.html';
        $filename = dir_app . $archivo;

        if (is_file($filename)) {
            // El archivo existe

            if ($autoinclude) {
                // LO vamos a autoincluir
                include ($filename);
            } else {
                // Solo devolvemos la ruta (como si fuera true)
                return (http_site . $archivo);
            }
        }
    }

    static function dourl($url_original = '', $noprint = '', $extra_val = array()) {
        if ($GLOBALS['mod_rewrite']) {
            //Si las URLS amigables estan activas...
            //$desfragmentada=explode('&',$url_original)
            switch ($url_original) {
                case 'newsletter.php':
                    $url_final = 'newsletter';
                    break;

                /*case 'fin_tpv.php':
                    $url_final = 'pedido_finalizado';
                    break;*/

                case 'catalogo.php?logout=true':
                    $url_final = 'desconectado';
                    break;

                case 'clientes.php?seccion=registro':
                //case 'panel.php?seccion=registro':
                    $url_final = 'registro';
                    break;

                case 'clientes.php':
                case 'clientes.php?seccion=cuenta':
                    $url_final = 'mi_cuenta';
                    break;
                
                case 'apartado.php?id=2':
                //case 'panel.php?seccion=contacto':
                    $url_final = 'contacto';
                    break;

                case 'panel.php?seccion=logout':
                    $url_final = 'desconectar';
                    break;

                //case 'panel.php?seccion=pedidos':
                case 'pedidos_cliente.php':
                    $url_final = 'mis_pedidos';
                    break;

                case 'catalogo.php?seccion=catalogo&mi_cesta=true':
                //case 'panel.php?seccion=catalogo&mi_cesta=true':
                    $url_final = 'cesta';
                    break;

                case 'controladores/buscador.php':
                    $url_final = 'buscar';
                    break;

                case 'catalogo.php?aviso=diferencia&cesta_editada=true':
                    $url_final = 'inicio-login/edit_cesta';
                    break;

                case 'catalogo.php?aviso=diferencia':
                    $url_final = 'inicio-login';
                    break;
                case 'site/controladores/catalogo.php?seccion=catalogo&categoria=1&cms=nuestras_marcas':
                    $url_final = 'nuestras_marcas';
                    break;

                case 'catalogo.php':
                //case 'panel.php':
                case '';
                    $url_final = ' '; // Si lo dejamos vacio no funciona, con un espacio nos cargara el inicio
                    break;

                default:
                    $auto_reemplazar = true;
                    break;
            }

            /*
              DINAMICAS
             */
            //Si no es una url estatica, se auto creara
            if (isset($auto_reemplazar) and $auto_reemplazar) {
                //Reescritura para catalogo
                // /i hace que no se distingan mayusuclas de minusculas
                $url_final = $url_original;

                //Si es sobre el catalogo (de productos)
                if (strpos($url_final, "catalogo.php?seccion=catalogo") !== false 
                        //|| strpos($url_final, "panel.php?seccion=catalogo") !== false
                        ) {

                    // Limpiamos la variable de posibles codigos inservibles
                    $url_final = str_replace('&index=0', '', $url_final);

                    //Generamos las variables que necesitamos para nuestra URL
                    @list($http_controlador, $categoria, $producto) = explode("&", $url_final);
                    //Solo necesitamos hacer explode a las categorias y productos

                    $categoria = explode('=', $categoria);

                    //$extra_val['cat']	=  preg_replace('([^A-Za-z0-9_\-])', '', $extra_val['cat']);
                    $extra_val['cat'] = isset($extra_val['cat']) ? aplicacion::normaliza($extra_val['cat']) : '';


                    $producto = explode('=', $producto);
                    //AVISO: $producto se puede confundir con $type, por eso se hace una comprobaciÃ³n sobre la url para conocer que estamos usando
                    //Si queremos poner el nombre de la categoria / producto
                    if ($extra_val['cat'] != "" and $categoria['1'] > 0) {
                        $categoria['1'] .= '-' . $extra_val['cat'];
                    }
                    if (isset($extra_val['prod']) and $extra_val['prod'] != "" and $producto['1'] > 0) {
                        $producto['1'] .= '-' . aplicacion::normaliza($extra_val['prod']);
                    }

                    //Creamos semi manualmente la URL (para evitar problemas)
                    //Type == view muestra la descripcion de la categoria
                    //"catalogo.php?seccion=catalogo&categoria=$id_categoria&prodadd=".$_POST['id_producto']:


                    if (strpos($url_final, "type=view") !== false) {
                        $url_final = 'catalogo-view/' . $categoria['1'];
                    } elseif ($producto['0'] == "prodadd") {
                        $url_final = 'catalogo/' . $categoria['1'] . '/add-' . $producto['1'];
                    } else {
                        if ($producto['0'] == 'marca')
                            $url_final = 'catalogo/' . $categoria['1'] . '/marca-' . $producto['1']; // SI es una marca (leeremos la etiqueta)
                        else {
                            if (isset($categoria['1'])) {
                                $url_final = 'catalogo/' . $categoria['1'] . '/'; // En caso contrario (es un producto)
                            }
                            if (isset($producto[1])) {
                                $url_final .= $producto['1']; // En caso contrario (es un producto)
                            }
                        }
                    }
                } else if (strpos($url_final, "pedidos_cliente.php") !== false) {
                    //Generamos las variables que necesitamos para nuestra URL
                    
                    @list($pedido, $tipo) = explode("&", Stringer::getStringBetween($url_final, '?'));

                    //Cogemos la informacion importante
                    $pedido = explode('=', $pedido);
                    $tipo = explode('=', $tipo);

                    if ($pedido[0] == 'factura') {
                        $url_final = 'factura-' . $pedido['1'];
                    } else {
                        if (isset($tipo['1']) and $tipo['1'] != "") {
                            $url_final = 'pedido-' . $pedido['1'] . '/' . $tipo['0'];
                        } else {
                            $url_final = 'pedido-' . $pedido['1'];
                        }
                    }
                } else if (strpos($url_final, "apartados.php?id=") !== false) {
                    //Generamos las variables que necesitamos para nuestra URL
                    $campos = explode("?", $url_final);
                    $id = end(explode('=', end($campos)));

                    if (is_numeric($id)) {
                        $url_final = 'apartado-' . $id;
                    } else {
                        $url_final = '';
                    }
                } /*else if (strpos($url_final, "fin_tpv.php?num_pedido") !== false) {
                    //Generamos las variables que necesitamos para nuestra URL
                    list($http_controlador, $tipo) = explode("&", $url_final);
                    //Cogemos la informacion importante
                    //$url_final=$pedido;
                    $pedido = explode('=', $http_controlador);

                    $tipo = explode('=', $tipo);


                    if ($tipo['1'] == "1") { // Si es una factura, la trataremos directamente como tal (total, es una mascara)
                        $url_final = 'pdf/factura-' . $pedido['1'];
                    } else {
                        $url_final = 'pdf/pedido-' . $pedido['1'];
                    }
                }*/ else {
                    $url_final = ''; //Formateamos para saber que no debemos hacer cambios
                }

                $url_final = str_replace(' ', '-', $url_final);
            }

            /*
              FIN DINAMICAS
             */
        } elseif ($url_original == '') {
            $url_final = 'catalogo.php';
        }


        if (!isset($url_final) or !$url_final) {
            //NO se ha reemplazado con NADA
            $url_final = http_controlador . trim($url_original);
        } else {
            $url_final = http_root . Conf::idiomaActual() . '/' . strtolower(trim($url_final));
        }



        //Imprimimos el resultado
        if (!$noprint) {
            //Si queremos autoimprimir la URL
            echo $url_final;
        } else {
            //No queremos imprimirla (para guardarla en otra variable, etc...)
            return $url_final;
        }
    }

    function ids_inversa($objetivo, $tipo = 0, $nivel = 0) {
        /* Esta funcion recorre todos las categorias padre de una categoria o producto y los devuelve en: $array[id] = true; // Para saber si se debe automostrar esa categoria
          TIPOS:
          0: Categoria
          1: Producto

         */
        if (is_numeric($objetivo) and $objetivo) { // El objetivo cumple los requisitos minimos numericos
            $nivel ++;

            // Busco al propio objeto para conocer el padre
            if ($tipo == 1) {
                $padre = ProductosMapper::getByID($objetivo);
            } else {
                $padre = CategoriasMapper::getById($objetivo);
            }

            // El padre es mayor de 0...
            if ($padre->id_padre > 0) {
                $return = $this->ids_inversa($padre->id_padre, 0, $nivel); // Recursivamos la consulta
            }

            if ($nivel > 0) { // Con esto podemos controlar la cantidad de sub categorias que se abriran (por si queremos solo mostrar el nivel actual y NO el SUBNIVEL de forma automatica (poniendo 1))
                $return[$padre->id] = true; // Aqui marcamos cual es el padre, si lo ponemos antes de la otra consulta se cargara el array....
            }
        } else { // El objetivo no cumple las condiciones numericas
            return array();
        }

        return $return;
    }

    function generarDatosPlantilla() {
        throw new Exception("GenerarDatosPlantilla obsoleto");
        //Aplicacion::cargaIdiomas();

        /* obtener menu */
        /* include_once ('../model/novedades.php');

          $novedades = NovedadesMapper::getByID(1);

          $this->novedades = $novedades; */
    }

    function createRandomPassword() {
        $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz0123456789";
        srand((double) microtime() * 1000000);
        $i = 0;
        $pass = '';
        while ($i <= 9) {
            $num = rand() % 33;
            $tmp = substr($chars, $num, 1);
            $pass = $pass . $tmp;
            $i++;
        }
        return $pass;
    }

}

Aplicacion::comprobarIdioma();


if (!Conf::$ecommerce) {
    // Si no tenemos el ecommerce activo hacemos un puente
    abstract class acciones_cesta extends Aplicacion { }
} else {
    // Cargamos la class buena
    require_once ('acciones_cesta.php');
}
?>