
/**
 * Contiene las inicializaciones necesarias para el
 * funcionamiento del motor personalizado (CSE)
 * utilizando la API AJAX de Google Search
 *
 * @url http://code.google.com/intl/es-ES/apis/customsearch/docs/api.html
 * @url http://code.google.com/intl/en/apis/ajaxsearch
 */

// Se carga las APIs de Google
google.load('search', '1.0');
google.load("language", "1");

var origen = "#tab-espana";

/**
 * Construye el buscador personalizado y
 * define los callbacks
 * @class MotorBusqueda
 * @contructor
 */
MotorNacional = function()
{
    this.busqueda = query;

    // Los ID de Google de los dos buscadores personalizados
    var buscadorid_engine_id = "018108820045510505441:iyjptr_offi";

    // BUSCADOR NACIONAL
    // Se crea el Control del Buscador de Google y lo configuramos
    this.motor = new google.search.SearchControl();
    this.motor.setResultSetSize(google.search.Search.LARGE_RESULTSET);

    // Definicion de opciones del buscador
    var opciones = new google.search.SearcherOptions();
    opciones.setExpandMode(GSearchControl.EXPAND_MODE_OPEN);

    // Creamos un buscador para toda la web, utiliza todos los filtros
    /*
    var buscador = new google.search.WebSearch();
    buscador.setSiteRestriction(buscadorid_engine_id, "_cse_filterall_default");
    buscador.setUserDefinedLabel("General");
    this.motor.addSearcher(buscador, opciones);
    */

    // Creamos un buscador para cada filtro
    var buscador = new google.search.WebSearch();
    buscador.setSiteRestriction(buscadorid_engine_id, "_cse_centros_de_investigacion");
    buscador.setUserDefinedLabel("Centros de Investigación");
    this.motor.addSearcher(buscador, opciones);

    // Creamos un buscador para cada filtro
    buscador = new google.search.WebSearch();
    buscador.setSiteRestriction(buscadorid_engine_id, "_cse_administraciones_publicas");
    buscador.setUserDefinedLabel("Administraciones Públicas");
    this.motor.addSearcher(buscador, opciones);


    // Creamos un buscador para toda la web
    /*
    var buscador = new google.search.WebSearch();
    buscador.setUserDefinedLabel("Sin Filtros");
    this.motor.addSearcher(buscador, opciones);
    */

    // Formulario de busqueda
    this.formulario = new google.search.SearchForm(true, $("#cse_formulario").get(0));
    this.formulario.setOnSubmitCallback(this, this.onSubmit);
    this.formulario.setOnClearCallback(this, this.onClear);
    this.motor.setSearchCompleteCallback(this, this.onSearchComplete);

    // Formulario de busqueda lateral
    this.formulario = new google.search.SearchForm(true, $("#cse_formulario").get(0));
    this.formulario.setOnSubmitCallback(this, MotorNacional.onSubmit);
    this.formulario.setOnClearCallback(this, MotorNacional.onClear);
    this.motor.setSearchCompleteCallback(this, MotorNacional.onSearchComplete);
    
    // Dibujado
    var draw_options = new google.search.DrawOptions();
    draw_options.setDrawMode(GSearchControl.DRAW_MODE_TABBED);
    this.motor.draw($("#cse_resultados").get(0), draw_options);

    // Lanzamos una busqueda inicial
    this.formulario.execute(this.busqueda);
};


MotorInternacional = function()
{
    this.busqueda = query;

    // Los ID de Google de los dos buscadores personalizados
    var engine_id = "001995006722246355132:rkps7deqeh4";

    // BUSCADOR NACIONAL
    // Se crea el Control del Buscador de Google y lo configuramos
    this.motor = new google.search.SearchControl();
    this.motor.setResultSetSize(google.search.Search.LARGE_RESULTSET);

    // Definicion de opciones del buscador
    var opciones = new google.search.SearcherOptions();
    opciones.setExpandMode(GSearchControl.EXPAND_MODE_OPEN);

    var buscador = new google.search.WebSearch();
    buscador.setSiteRestriction(engine_id, "_cse_centros_de_investigacion");
    buscador.setUserDefinedLabel("Centros de Investigación");
    this.motor.addSearcher(buscador, opciones);

    buscador = new google.search.WebSearch();
    buscador.setSiteRestriction(engine_id, "_cse_organismos_internacionales");
    buscador.setUserDefinedLabel("Organismos Internacionales");
    this.motor.addSearcher(buscador, opciones);

    // Formulario de busqueda
    this.formulario = new google.search.SearchForm(true, $("#cse_int_formulario").get(0));
    this.formulario.setOnSubmitCallback(this, this.onSubmit);
    this.formulario.setOnClearCallback(this, this.onClear);
    this.motor.setSearchCompleteCallback(this, this.onSearchComplete);
    

    // Formulario de busqueda lateral
    this.formulario = new google.search.SearchForm(true, $("#cse_int_formulario").get(0));
    this.formulario.setOnSubmitCallback(this, MotorInternacional.onSubmit);
    this.formulario.setOnClearCallback(this, MotorInternacional.onClear);
    this.motor.setSearchCompleteCallback(this, MotorInternacional.onSearchComplete);

    // Dibujado
    var draw_options = new google.search.DrawOptions();
    draw_options.setDrawMode(GSearchControl.DRAW_MODE_TABBED);
    this.motor.draw($("#cse_int_resultados").get(0), draw_options);

    // Lanzamos una busqueda inicial
    this.formulario.execute(this.busqueda);
};


/**
 * Construye el buscador personalizado y
 * define los callbacks
 * @class MotorBusqueda
 * @contructor
 */
MotorPublicaciones = function()
{
    this.busqueda = query;

    // Los ID de Google de los dos buscadores personalizados
    var buscadorid_engine_id = "018108820045510505441:iyjptr_offi";

    // BUSCADOR Publicaciones, por ahora el mismo que nacional
    // Se crea el Control del Buscador de Google y lo configuramos
    this.motor = new google.search.SearchControl();
    this.motor.setResultSetSize(google.search.Search.LARGE_RESULTSET);

    // Definicion de opciones del buscador
    var opciones = new google.search.SearcherOptions();
    opciones.setExpandMode(GSearchControl.EXPAND_MODE_OPEN);

    // Creamos un buscador para cada filtro
    buscador = new google.search.WebSearch();
    buscador.setSiteRestriction(buscadorid_engine_id, "_cse_publicaciones");
    buscador.setUserDefinedLabel("Todas las fuentes");
    this.motor.addSearcher(buscador, opciones);

    buscador = new google.search.WebSearch();
    buscador.setSiteRestriction(buscadorid_engine_id, "_cse_repositorios_oa");
    buscador.setUserDefinedLabel("Repositorios OA");
    this.motor.addSearcher(buscador, opciones);

    // Creamos un buscador para toda la web
    /*
    var buscador = new google.search.WebSearch();
    buscador.setUserDefinedLabel("Sin Filtros");
    this.motor.addSearcher(buscador, opciones);
    */

    // Formulario de busqueda
    this.formulario = new google.search.SearchForm(true, $("#cse_pub_formulario").get(0));
    this.formulario.setOnSubmitCallback(this, this.onSubmit);
    this.formulario.setOnClearCallback(this, this.onClear);
    this.motor.setSearchCompleteCallback(this, this.onSearchComplete);

    // Formulario de busqueda lateral
    this.formulario = new google.search.SearchForm(true, $("#cse_pub_formulario").get(0));
    this.formulario.setOnSubmitCallback(this, MotorPublicaciones.onSubmit);
    this.formulario.setOnClearCallback(this, MotorPublicaciones.onClear);
    this.motor.setSearchCompleteCallback(this, MotorPublicaciones.onSearchComplete);

    // Dibujado
    var draw_options = new google.search.DrawOptions();
    draw_options.setDrawMode(GSearchControl.DRAW_MODE_TABBED);
    this.motor.draw($("#cse_pub_resultados").get(0), draw_options);

    // Lanzamos una busqueda inicial
    this.formulario.execute(this.busqueda);
};


/**
 * Ejecuta el motor para una nueva busqueda
 * cuando se haga SUBMIT
 * @param {object} Formulario de busqueda
 * @member MotorBusqueda
 */
MotorNacional.onSubmit = MotorPublicaciones.onSubmit = MotorInternacional.onSubmit = function(form)
{
    var q = form.input.value;

	if (q && q!= "")
	{
		query = q;
	    this.motor.execute(q);
	}
	
	return false;
};

/**
* Limpia los resultados con se lanza
* el evento CLEAR.
* @param {object} Formulario de busqueda
* @member MotorBusqueda
*/
MotorNacional.onClear = MotorPublicaciones.onClear = MotorInternacional.onClear = function(form)
{
	this.motor.clearAllResults();
	query = "";
	form.input.value = "";
	return false;
};


MotorNacional.onSearchComplete = MotorPublicaciones.onSearchComplete = MotorInternacional.onSearchComplete = function()
{
    if ($(origen + " .gsc-results").css('display') == 'none')
        $(origen + " .gsc-results").html('<div style="padding: 30px;">No se han encontrado resultados.</div>').css("display","block");  
};

/**
 * Crea el buscador
 */
$(document).ready(function()
{
    var cse_nacional = new MotorNacional();
    var cse_internacional = new MotorInternacional();
    var cse_publicaciones = new MotorPublicaciones();

    /* Dialogo de sugerencias */

    $("#boton_sugerir").click(function()
    {
    	$("#form_sugerir").validate();
    	if($("#form_sugerir").valid())
    	{
    	    $("#form_sugerir").deliver(function(data, status)
    	    {
    		if ((status != "success") || (data == '0'))
    		    $("#dialogo_error").dialog('open');
    		else
    		    $("#dialogo_ok").dialog('open');
    	    });
    	}
    });
        
    $("#main-form").submit(function()
    {
        var q = $("#main-query").val().toLowerCase();

        if (($("input[name=multi]:checked").val() == "true") && (q !== ""))
        {
            // En este caso se realiza la traduccion
            traducir(q);
        }
        else
        {
            $(".gsc-results").html('<div style="text-align:center; padding: 30px;"><img src="images/loader.gif" alt="Cargando datos" /><p style="padding-top: 10px; font-size: 1.1em;">Realizando Busqueda...</p></div>');  
            
            $("input.gsc-input").val(q);
        
            // Se realiza la busqueda
            $(origen + " .gsc-search-box").submit();
        }
        
        return false;
    });
    
    /**
     * Realiza la traduccion
     */
    function traducir(q, callback)
    {
        // Deshabilita el boton de busqueda hasta que se haya realizado
        // las traducciones
        $("#main-button").attr("disabled", "disabled");
        $("#main-button").addClass('disabled');
        
        google.language.translate(q, "", 'es', function(result) 
        {                
            if (!result.error)
                $("#q_es").val(result.translation);
        });   
        
        google.language.translate(q, "", 'en', function(result) 
        {                
            if (!result.error)
                $("#q_en").val(result.translation);
        });  
    
        google.language.translate(q, "", 'fr', function(result) 
        {                
            if (!result.error)
                $("#q_fr").val(result.translation);
        });
        
        google.language.translate(q, "", 'de', function(result) 
        {                
            if (!result.error)
                $("#q_de").val(result.translation);
            
            // Finalmente se han recibido todos asi que llamamos al callback
            if (typeof callback === 'function')
                callback.apply();
            
            // Se reactiva el boton
            $("#main-button").removeAttr("disabled");
            $("#main-button").removeClass('disabled');
        });
    }
    
    
    // Boton de buscar con traducciones
    $("#multi-button").click(function()
    {
        var q = $("#main-query").val().toLowerCase();
        
        var es = $("#c_es").is(":checked") ? $("#q_es").val().split(' ').join('-') : "";
        var en = $("#c_en").is(":checked") ? $("#q_en").val().split(' ').join('-') : "";
        var fr = $("#c_fr").is(":checked") ? $("#q_fr").val().split(' ').join('-') : "";
        var de = $("#c_de").is(":checked") ? $("#q_de").val().split(' ').join('-') : "";

        // Query de busqueda con las traducciones
        $("input.gsc-input").val
        (   
            (es === "" ? "" : " OR (" + es + ")") +
            (en === "" ? "" : " OR (" + en + ")") + 
            (fr === "" ? "" : " OR (" + fr + ")") +
            (de === "" ? "" : " OR (" + de + ")")
        );
        
        $(".gsc-results").html('<div style="text-align:center; padding: 30px;"><img src="images/loader.gif" alt="Cargando datos" /><p style="padding-top: 10px; font-size: 1.1em;">Realizando Busqueda...</p></div>');  

        //alert($("input.gsc-input").val());
        
        // Se realiza la busqueda una vez hechas las traducciones
        $(origen + " .gsc-search-box").submit();
    });
    

    $("#boton_cancelar").click(function()
    {
        $("#dialogo_sugerir").dialog('close');
    });
    
    /**
     * Para que no recargue la pagina al realizar un submit sobre 
     * el formulario de google
     */
    $(".gsc-search-box").submit(function(){return false;});
    
    $("input[name=multi]").change(function()
    {
        if($(this).val() == 'true')
        {
            traducir($("#main-query").val().toLowerCase());
            $("#multilanguage-box").slideDown(200);     
            $("#main-button").val("Traducir");
        }
        else
        {
            $("#multilanguage-box").slideUp(200);
            $("#main-button").val("Buscar");
        }
    });
    
    // Valores por defecto
    $("input[name=multi]").removeAttr("checked");
    $("input[name=multi].default").attr("checked", "checked");
    $(".traduccion input[type=text]").val("");

    /* Pestañas */

    $("#tabs").tabs
    ({
    	// Chapuza para mantener el mismo valor en los input del buscador
    	// @todo Reestructurar todo, usar un objeto que gaurde los engines a utilizar
    	// y usar un solo input para todas las busquedas.
		select: function (event, ui)
		{
			var valor_origen = $(origen + " .gsc-input input").attr('value');
			var destino = $(ui.tab).attr('href');

			$(destino + " .gsc-input input").attr('value', valor_origen);

			origen = $(ui.tab).attr('href');

			// Ejecutamos busqueda
			$(destino + " .gsc-search-button input").click();
		}
	});

    $("#loader").hide();
    $("#tabs").show();
    
    $("#main-query").val(query);
});
        
