ï»¿/**
 * Conjunto de funciones empleadas en el formulario de búsquedas
 * de biblio.unicen.edu.ar
 *
 * @author: Ing. Rubén A. Mansilla
 * @date: 13:27 04/11/2006
 * @version: 3.0
 * @copyright: 2006-2007, Biblioteca Central UNICEN
 *
 */

/**
 * Indica si el string pasado como parámetro está vacío
 * @param string str la cadena de la que se desea saber si es vacía
 * @return boolean true si el string pasado como parámetro está vacío
 */
function empty( str ) {
    return ( str == '' );
}

/**
 * Muestra al usuario el error pasado como parámetro
 * @param string message la cadena que contiene el error
 * @return void
 */
function showError( message ){
    alert( message );
}

/**
 * Elimina el contenido del elemento pasado como parámetro
 * @param domElement domElement a vaciar
 */
function clear( domElement ) {
     domElement.innerHTML = '';
}

/**
 * establece la clase que tendra el elemento
 * @param domElement domElement elemento al que se le aplicará el selector
 * @param string classSelector selector de la clase css
 * @return void
 */
function setCSSClass( domElement, classSelector ) {
    domElement.setAttribute( 'class', classSelector );

    // IE fix for class setting
    domElement.setAttribute( 'className', classSelector );
}

/**
 * Función invocada cuando la función remota está cargando la
 *       respuestas
 * @return void
 * @param string t stream enviado por el servidor como respuesta
 */
/*
function loading(){
    document.body.style.cursor = 'wait';
}
*/

/**
 * Función invocada cuando la función remota ha cargado la respuesta
 * @return void
 * @param string t stream enviado por el servidor como respuesta
 */
/*
function loaded(){
    document.body.style.cursor = 'default';
}
*/

/**
 * Acciones que deben llevarse a cabo antes de realizar el envío de los
 * datos del formulario
 */
function handleSubmit() {
    // =========================================================================
    // trim every user filled entry
    // =========================================================================
    trimAll();

    // =========================================================================
    // current kind of search verification
    // =========================================================================
    var hideClassSelector = 'hidden';
    var showClassSelector = 'show';

    var query = document.getElementById('query');

    // =========================================================================
    // fields validation
    // =========================================================================
    var correct = true;

    var emptyQueryError = 'Por favor, indique quÃ© desea buscar';

    if ( empty( query.value ) ) {
        correct = false;
        showError( emptyQueryError );
        query.focus();
    }

    // =========================================================================
    // remote request
    // =========================================================================
    if ( correct ) {
        //alert( 'Formato: ' +  document.getElementById( 'format' ).value );

        var requestForm = document.getElementById('searchForm');
        var requestPath = document.getElementById('p');
        var request     = requestForm.action + '?' + requestPath.name + '=' + requestPath.value;

        document.getElementById( 'db' ).value = document.getElementById( selectedResource ).value;

        var requestSetup = loadConfigurationFromForm( requestForm );

        queryCaptionFeedback( query.value, document.getElementById( 'field' ).value );

        getResultsFor( request, requestSetup );
    }

    return false;
}

// Fields mnemotecnics definition
var _AUTHOR      = '0';
var _TITLE       = '1';
var _SUBJECTS    = '2';
var _ANY         = '3';
var _PROVINCE    = '4';
var _KIND        = '5';
var _NO_FIELD    = 'none';

function decodifyField( field ) {
    var decodifiedField = '';
    switch( field )
    {
        case _AUTHOR:      decodifiedField = 'autor'; break;
        case _TITLE:       decodifiedField = 't&iacute;tulo'; break;
        case _SUBJECTS:    decodifiedField = 'temas'; break;
        case _ANY:         decodifiedField = 'cualquier campo'; break;
        case _PROVINCE:    decodifiedField = 'provincia'; break;
        case _KIND:        decodifiedField = 'g&eacute;nero teatral'; break;
        case _NO_FIELD:    decodifiedField = ''; break;
        default :          decodifiedField = 'cualquier campo'; break;
    }

    return decodifiedField;
}

function queryCaptionFeedback( query, field ) {
    var sentenceConnector = ' ';
    
    if ( field != _ANY )
        sentenceConnector = ' el campo ';

    document.getElementById( 'caption' ).innerHTML = 'buscando <strong id="queryLabel">' + query + '</strong>';

    decodifiedField = decodifyField( field );

    if ( decodifiedField != '' )
    {
        document.getElementById( 'caption' ).innerHTML += ' en' + sentenceConnector + '<strong id="targetFieldLabel">' + decodifiedField + '</strong>';
    }

    document.getElementById( 'caption' ).innerHTML += '...';
}

function sliceCaptionFeedback( query, field )
{
    var sentenceConnector = ' ';

    if ( field != _ANY )
        sentenceConnector = ' el campo ';

    document.getElementById( 'caption' ).innerHTML = 'recuperando resultados para <strong>' + query + '</strong> en' + sentenceConnector + '<strong>' + decodifyField( field ) + '</strong>...';
    //document.getElementById( 'caption' ).innerHTML = 'recuperando resultados...';
}

/**
 * Realiza una búsquedas en respuesta al clic del usuario sobre un enlace de un
 * resultado de una búsqueda previa
 * @param string query elemento a buscar
 * @param string field campo sobre el que realizar la búsqueda
 * @return bool false para impedir el envío del formulario
 */
function linkQuery( query, field ) {
    var requestForm  = document.getElementById('searchForm');
    var requestPath  = document.getElementById('p');
    var request      = requestForm.action + '?' + requestPath.name + '=' + requestPath.value;
    var db           = document.getElementById('db').value;
    var resourceType = document.getElementById('resource_type').value;

    var queryString = 'query=' + query + '&field=' + field + '&db=' + db + '&resource_type=' + resourceType;

    var requestSetup = {
        asynchronous: true,

        onSuccess:  success,
        onFailure:  failure,
        onLoading:  loading,
        onLoaded:   loaded,
        onComplete: completed,
        on404:      error404,

        method:     'post',
        postBody:   queryString
    }

    var requestSetup = loadConfigurationFromQueryString( queryString );

    //$( 'testCanvas' ).innerHTML = request + '&' + queryString;

    getResultsFor( request, requestSetup );

    // set focus to search button
    document.getElementById( 'submitBtn' ).focus();
    queryCaptionFeedback( query, field );

    return false;
}

function getQueryStringValue( qs, key, __defaultValue )
{
    params = qs.split( "&" );
    for ( i = 0; i < params.length; i++ )
    {
        __elements = params[i].split( "=" );
        if ( __elements[0] == key )
        {
            return __elements[1];
        }
    }
    
    return __defaultValue;
}

function urldecode( str )
{
    // Decodes URL-encoded string  
    // 
    // version: 1004.2314
    // discuss at: http://phpjs.org/functions/urldecode    // +   original by: Philip Peterson
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: AJ
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Brett Zamir (http://brett-zamir.me)    // +      input by: travc
    // +      input by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Lars Fischer
    // +      input by: Ratheous    // +   improved by: Orlando
    // +      reimplemented by: Brett Zamir (http://brett-zamir.me)
    // +      bugfixed by: Rob
    // %        note 1: info on what encoding functions to use from: http://xkr.us/articles/javascript/encode-compare/
    // %        note 2: Please be aware that this function expects to decode from UTF-8 encoded strings, as found on    // %        note 2: pages served as UTF-8
    // *     example 1: urldecode('Kevin+van+Zonneveld%21');
    // *     returns 1: 'Kevin van Zonneveld!'
    // *     example 2: urldecode('http%3A%2F%2Fkevin.vanzonneveld.net%2F');
    // *     returns 2: 'http://kevin.vanzonneveld.net/'    
    // *     example 3: urldecode('http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a');
    // *     returns 3: 'http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a'
    
    return decodeURIComponent(str.replace(/\+/g, '%20'));
}

function follow( url, queryField, targetField )
{
    var requestSetup = {
        method:    'get',
        async:     true,
        onRequest: loading,
        onSuccess: success,
        onFailure: failure
    };
    
    var __queryField  = queryField || 'query';
    var __targetField = targetField || 'field';

    try
    {
        $( 'queryLabel' ).innerHTML = urldecode( getPredefinedQueryDef( getQueryStringValue( url, __queryField, '--' ) ) );
        $( 'targetFieldLabel' ).innerHTML = decodifyField( getQueryStringValue( url, __targetField, '--' ) );
    }
    catch( noQueryLabelException )
    {
        // do nothing
    }

    getResultsFor( url, requestSetup );

    // set focus to search button
    // $( 'submitBtn' ).focus();
}

/**
 * Obtiene la siguiente página de resultados para la búsqueda actual
 * @param string query búsqueda actual
 * @param string field campo sobre el que se está realizando la búsqueda
 * @param int from índice del conjunto de resultados desde el que se desea
 *                 continuar mostrando los registros
 * @return bool false para impedir el envío del formulario
 */
function getPage( query, field, from ) {
    var requestForm  = document.getElementById( 'searchForm' );
    var requestPath  = document.getElementById( 'p' );
    var request      = requestForm.action + '?' + requestPath.name + '=' + requestPath.value;
    var db           = document.getElementById( 'db' ).value;
    var resourceType = document.getElementById('resource_type').value;

    var queryString = 'query=' + query + '&field=' + field + '&from=' + from + '&db=' + db + '&resource_type=' + resourceType;

    var requestSetup = loadConfigurationFromQueryString( queryString );

    getResultsFor( request, requestSetup );

    // set focus to search button
    document.getElementById( 'submitBtn' ).focus();
    sliceCaptionFeedback( query, field );

    return false;
}

/**
 * Maneja las acciones que deben realizarse cuando no se encuentra una imagen
 * @param DOMElement::Image imageObject el objeto imagen al que se le asigna
 *                                      el manejador del evento onerror
 * @return void
 */
function handleImageNotFound( imageObject ) {
    imageObject.src = 'img/no_available.gif';
}

/**
 * only for test purposes
 */
function isTest() {
    return false;
}

function testOut() {
var test = '';
    test += '<!-- =================================================== -->';
    test +=     '<div class=\"record\">';
    test +=     '<!-- =================================================== -->';
    test +=         '<div class=\"snapshot\">';
    test +=             '<img src=\"img/no_available.gif\" alt=\"\" title=\"\" />';
    test +=         '</div>';

    test +=         '<div class=\"itemDescription\">';
    test +=             '<h3>La Rosa</h3>';
    test +=             '<p class=\"author\">';
    test +=                 'por <a href=\"#null\" title=\"Buscar otras obras de Julio Beltzer\">Julio Beltzer</a>.';
    test +=                 '<span class=\"province\">';
    test +=                     '<a href=\"#null\" title=\"Buscar otras obras de Argentina, Santa Fe\">Argentina, Santa Fe</a>';
    test +=                 '</span>';
    test +=             '</p>';
    test +=             '<p class=\"dramaConcerns\">';
     test +=               '<a href=\"#null\" title=\"Buscar otras obras de este género\">Comedia</a>. 8 personajes: 7 femeninos, 1 marculino.';
    test +=             '</p>';
    test +=             '<ul class=\"subjects\">';
    test +=                 '<li class=\"first\"><a href=\"#null\" title=\"Buscar obras sobre el tema ARGENTINA\">ARGENTINA</a></li>';
    test +=                 '<li><a href=\"#null\" title=\"Buscar obras sobre el tema LITERATURA ARGENTINA\">LITERATURA ARGENTINA</a></li>';
    test +=                 '<li><a href=\"#null\" title=\"Buscar obras sobre el tema TEATRO\">TEATRO RRRRRRRRRRRRRRRRRRRRRRRRRR</a></li>';
    test +=                 '<li><a href=\"#null\" title=\"Buscar obras sobre el tema SIGLO XX-SEGUNDA MITAD\">SIGLO XX-SEGUNDA MITAD</a></li>';
    test +=                 '<li><a href=\"#null\" title=\"Buscar obras sobre el tema BUENOS AIRES\">BUENOS AIRES</a></li>';
    test +=                 '<li class=\"last\"><a href=\"#null\" title=\"Buscar obras sobre el tema TEXTOS TEATRALES\">TEXTOS TEATRALES</a></li>';
    test +=             '</ul>';
    test +=         '</div>';


    test +=         '<div class=\"recordDelimiter\">';
    test +=             '<hr />';
    test +=         '</div>';

    test +=     '</div>';'<!-- !record -->';


    var out = '';

        out +=      '<!-- =================================================== -->';
        out +=          '<div id="searchDigest">';
        out +=          '<!-- =================================================== -->';
        out +=              '<p>Expresi&oacute;n de b&uacute;squeda: <strong>nada</strong></p>';
        out +=              '<p>Total de resultados: <strong>1</strong></p>';
        out +=          '</div><!-- !searchDigest -->';
        
        out +=          '<hr />';


    for ( var i = 0; i < 40; i++ )
        out += test;

    return out;

}

/**
 * Acciones a realizar al reestablecer los valores del formulario
 */
function handleReset(){
    handleSearchType( FREE_SEARCH );
    var freeSearchInput   = document.getElementById('query');
    freeSearchInput.value = '';
}

/**
 * Muestra / oculta la trama de un determinado registro 
 * @param DOMElement domElement el elemento que contiene una referencia al
 * contenedor de la trama a mostrar
 * @return void
 */
function togglePlotView( domElement ) {
    var controllerProperties = domElement.getElementsByTagName('span');
    
    var controllerPrefix = 'plotControllerFor';

    var showCaption       = 'Mostrar resumen';
    var showClassSelector = 'plotControllerShowing';
    var hideCaption       = 'Ocultar resumen';
    var hideClassSelector = 'plotControllerHidding';
    
    var plotTargetId      = 'plotFor' + domElement.id.substring( controllerPrefix.length );
    var plotTargetElement = document.getElementById( plotTargetId );

    if ( plotTargetElement.style.display == 'none' ) {
        setCSSClass( domElement, showClassSelector );
        domElement.innerHTML = hideCaption;
        new Effect.BlindDown( plotTargetId );
    } else {
        setCSSClass( domElement, hideClassSelector );
        domElement.innerHTML = showCaption;
        new Effect.BlindUp( plotTargetId );
    }
}

/**
 * Muestra / oculta las existencias de un determinado registro
 * @param DOMElement domElement el elemento que contiene una referencia al
 * contenedor de lax existencias a mostrar
 * @return void
 */
function toggleExistencesView( domElement )
{
    var controllerProperties = domElement.getElementsByTagName('span');
    
    var controllerPrefix = 'plotControllerFor';

    var showCaption       = 'Mostrar existencias';
    var showClassSelector = 'plotControllerShowing';
    var hideCaption       = 'Ocultar existencias';
    var hideClassSelector = 'plotControllerHidding';
    
    var plotTargetId      = 'plotFor' + domElement.id.substring( controllerPrefix.length );
    var plotTargetElement = document.getElementById( plotTargetId );

    if ( plotTargetElement.style.display == 'none' ) {
        setCSSClass( domElement, showClassSelector );
        domElement.innerHTML = hideCaption;
        new Effect.BlindDown( plotTargetId );
    } else {
        setCSSClass( domElement, hideClassSelector );
        domElement.innerHTML = showCaption;
        new Effect.BlindUp( plotTargetId );
    }
}

/**
 *
 */
var FREE_SEARCH     = 'free';
var AUDIENCE_SEARCH = 'audience';

function handleSearchType( kindOfSearch ) {
    var freeSearchContainer     = document.getElementById('freeSearch');

    var freeSearchInput     = document.getElementById('query');

    var hideClassSelector = 'hidden';
    var showClassSelector = 'show';

    setCSSClass( freeSearchContainer, hideClassSelector );

    switch( kindOfSearch ) {
        case FREE_SEARCH:     setCSSClass( freeSearchContainer, showClassSelector ); freeSearchInput.focus(); break;
        case AUDIENCE_SEARCH: setCSSClass( audienceSearchContainer, showClassSelector ); audienceSearchInput.focus(); break;
        default:              setCSSClass( freeSearchContainer, showClassSelector ); freeSearchInput.focus(); break;
    }
}

/**
 *
 */
function handleSearchChoose() {
    switch( this.value ) {
        case '0':  handleSearchType( FREE_SEARCH ); break;
        case '1':  handleSearchType( FREE_SEARCH ); break;
        case '3':  handleSearchType( FREE_SEARCH ); break;
        case '6':  handleSearchType( AUDIENCE_SEARCH ); break;
        default: handleSearchType( FREE_SEARCH ); break;
    }
}

/**
 * Acciones que deben llevarse a cabo para mostrar la lista de géneros
 * dramáticos empleados en la base
 */
function loadKind() {
    // =========================================================================
    // remote request
    // =========================================================================
    var request     = 'index.php?p=kind';

    var queryString = '';

    var requestSetup = {
        asynchronous: false,
        method:       'post',
        postBody:     queryString
    }

    getResultsFor( request, requestSetup );

    return false;
}

/**
 *
 */
var BOOK_RESOURCE     = 'book';
var MAGAZINE_RESOURCE = 'magazine';
var CD_RESOURCE       = 'cd';

var BOOK_FORMAT       = 'book';
var MAGAZINE_FORMAT   = 'serial';

var selectedResource  = '';

function handleResourceType( resourceType ) {
    var booksList     = document.getElementById('books_dbs');
    var magazinesList = document.getElementById('magazines_dbs');
    var cdsList       = document.getElementById('cds_dbs');
    
    var resourceTypeLabel = document.getElementById('library_label');
    var desiredFormat     = document.getElementById('format');

    var hideClassSelector = 'hidden';
    var showClassSelector = 'show';

    setCSSClass( booksList, hideClassSelector );
    setCSSClass( magazinesList, hideClassSelector );
    setCSSClass( cdsList, hideClassSelector );

    switch( resourceType ) {
        case BOOK_RESOURCE:     
            setCSSClass( booksList, showClassSelector ); 
            resourceTypeLabel.setAttribute( 'for', booksList.id );
            selectedResource = booksList.id;
            booksList.focus();
            desiredFormat.value = BOOK_FORMAT;
            break;
        case MAGAZINE_RESOURCE:
            setCSSClass( magazinesList, showClassSelector );
            resourceTypeLabel.setAttribute( 'for', magazinesList.id );
            selectedResource = magazinesList.id;
            magazinesList.focus();
            desiredFormat.value = MAGAZINE_FORMAT;
            break;
        case CD_RESOURCE:
            setCSSClass( cdsList, showClassSelector );
            resourceTypeLabel.setAttribute( 'for', cdsList.id );
            selectedResource = cdsList.id;
            cdsList.focus();
            desiredFormat.value = BOOK_FORMAT;
            break;
        default:
            setCSSClass( booksList, showClassSelector );
            resourceTypeLabel.setAttribute( 'for', booksList.id );
            selectedResource = booksList.id;
            booksList.focus();
            desiredFormat.value = BOOK_FORMAT;
            break;
    }
}

/**
 *
 */
function handleResourceTypeChoose() {
    var bookLabel     = 'book';
    var magazineLabel = 'magazine';
    var cdLabel       = 'cd';

    switch( this.value ) {
        case bookLabel:      handleResourceType( BOOK_RESOURCE ); break;
        case magazineLabel:  handleResourceType( MAGAZINE_RESOURCE ); break;
        case cdLabel:        handleResourceType( CD_RESOURCE ); break;
        default:             handleResourceType( BOOK_RESOURCE ); break;
    }
}

/**
 *
 */
function getPredefinedQueryDef( query )
{
    var __predefinedQueryDefinitions = {
        'ELECTRONIC-THESIS-VET': 'Tesis digitales de la Facultad de Ciencias Veterinarias',
        'ELECTRONIC-THESIS-ECONOMICS': 'Tesis digitales de la Facultad de Ciencias Econ&oacute;micas',
        'ELECTRONIC-THESIS-HUMANISTICS': 'Tesis digitales de la Facultad de Ciencias Humanas'
    };

    return __predefinedQueryDefinitions[query] || query;
}

/**
 * Establecer el estado inicial para realizar una búsqueda
 * @return void
 * @param void
 */
function init()
{
    // ==========================================================================
    // resource type selector handler
    // ==========================================================================
    setCSSClass(
        document.getElementById( 'books_dbs' ),
        'show'
    );
    setCSSClass(
        document.getElementById( 'magazines_dbs' ),
        'hidden'
    );
    setCSSClass(
        document.getElementById( 'cds_dbs' ),
        'hidden'
    );
    document.getElementById('resource_type').onchange = handleResourceTypeChoose;
    selectedResource = 'books_dbs';
    document.getElementById( 'format' ).value = BOOK_FORMAT;

    // ==========================================================================
    // Hide initially empty results container
    // ==========================================================================
    setCSSClass(
        document.getElementById( 'results' ),
        'hidden'
    );

    // ==========================================================================
    // only for test purposes
    // ==========================================================================
    if ( isTest() )
        document.getElementById( 'results' ).innerHTML = testOut();

    // ==========================================================================
    // Initial focus
    // ==========================================================================
    document.getElementById('query').focus();

    // ==========================================================================
    // Field selector size
    // ==========================================================================
    var fieldSelector = document.getElementById('field');
    fieldSelector.size = fieldSelector.options.length;

    // ==========================================================================
    // Search type handlers
    // ==========================================================================
    document.getElementById('field').onchange = handleSearchChoose;

    // ==========================================================================
    // Form event handlers
    // ==========================================================================
    document.getElementById('searchForm').onsubmit = handleSubmit;
    document.getElementById('searchForm').onreset  = handleReset;
    
    // predefined queries
    if ( getQueryStringValue( document.location.href, 'predefined', '_ABSENT_' ) != '_ABSENT_' )
    {
        queryCaptionFeedback( getQueryStringValue( document.location.href, 'query', '--' ), getQueryStringValue( document.location.href, 'field', '3' ) );
        follow( document.location.href.replace( 'p=catalog', 'p=search' ), 'query' );
    }

    // top-search tool
    if ( getQueryStringValue( document.location.href, 'query', '_ABSENT_' ) != '_ABSENT_' )
    {
        queryCaptionFeedback( getQueryStringValue( document.location.href, 'query', '--' ), getQueryStringValue( document.location.href, 'field', '3' ) );
        follow( document.location.href.replace( 'p=catalog', 'p=search' ) );
    }
}

window.onload = init;