(function($){

    /**
	 * Event handler para iterceptar clicks sobre miniaturas que
	 * alternan el estado de visibilidad de la imagen asociada.
	 */
    function alternarImagen(event){
        event.preventDefault();
        var $anchor=$(this);
        var ocultar=$anchor.hasClass('js-ocultar');
        var href = $anchor.attr('href');
        var $modelo = $anchor.closest('.modelo');
        $modelo.find('li.modelo-miniatura>a').removeClass('js-ocultar').addClass('js-ver');
        var $fotos=$modelo.find('li.modelo-foto');
        $fotos.hide()
        if (!ocultar){
            $fotos.filter(':has(img[src="' + href+ '"])').each(function(){
                $(this).fadeIn('slow');
            });
            $anchor.removeClass('js-ver').addClass('js-ocultar');
        }
        return false;
    }

    /**
	 * Event handler para interceptar clicks en enlaces contenidos
	 * en un modelo para ver la informacion detallada del mismo embebida
	 * en la misma pagina.
	 */
    function verItem(event){
        //event.preventDefault();
        var $anchor=$(this);
        var href=$anchor.attr('href');
        var uri=new jsUri(href);
        uri.replaceQueryParam('ajaxRequest','true');
        var itemId=uri.getQueryParamValue('id');
        var itemCd;
        var $modeloDiv;
        var $modeloDialogo;
        var $esteModeloDiv;
        var noDialogo=$anchor.hasClass('js-no-dialog');
        var title=$anchor.text();
        var reutilizarDialogo=false;
        var $modeloDivDialogo;
        if(!itemId){
            itemCd=uri.getQueryParamValue('cd')
            if (!itemCd){
                return false; //nada que hacer
            }
        }
        if (itemId){
            $modeloDiv=$anchor.closest('#modelo' + itemId ).eq(0);
        } else {
            $esteModeloDiv=$anchor.closest('.modelo-div');
            if ($esteModeloDiv.find('.modelo-cd:first').text()==itemCd){
                $modeloDiv=$esteModeloDiv;
                itemId=$modeloDiv.attr('id').replace('modelo','');
            }
        }
        if ($modeloDiv && $modeloDiv.size()>0 && $anchor.hasClass('js-in-place')) {
            /* Modelo es padre del enlace, asi que mostrar embebido */
            $modeloDiv
            .loading(true)
            .load(
                uri.toString() + ' #modelo' + itemId + '>*',
                function() {
                    $(this)
                    .prepararModelo()
                    .loading(false);
                });
            return false;
        }
        /*Si estamos en un dialogo, lo cerramos*/
        $modeloDialogo=$anchor.closest('.modelo-dialog').eq(0);
        if ($modeloDialogo.size()>0) {
            if ($modeloDiv && $modeloDiv.length){
                $modeloDivDialogo=$modeloDiv.closest('.modelo-dialog').eq(0);
            }
            if ($modeloDivDialogo && $modeloDivDialogo.size()>0 ){
                /* salvo si ya esta mostrando el modelo que queremos */
                reutilizarDialogo= ($modeloDialogo.get(0) === $modeloDivDialogo.get(0));
            }
            if (!reutilizarDialogo){
                $modeloDialogo.dialog('destroy').remove();
                $modeloDialogo=null;
                $anchor=null;
                if ($modeloDiv && $modeloDiv.height()==0){
                    //Estaba dentro del dialogo y la hemos eliminado
                    $modeloDiv=null;
                }
            }
        }

        if (!$modeloDiv || $modeloDiv.length==0){
            /*Buscamos en toda la pagina, no solo en ancestros*/
            if (itemId) {
                $modeloDiv=$('#modelo' + itemId);
            } else {
                $modeloDiv=$('.modelo-cd').filter(function(){
                    return $(this).text()==itemCd;
                })
                .closest('.modelo');
            }
        }
			
        if ($modeloDiv && $modeloDiv.size()>0){
            $modeloDiv.navegarAYResaltar();
        } else {
            if (noDialogo){
                /*
                 * Si el enlace prefiere que se redireccione (ej descatalogados)
                 * seguir proceso normal.
                 */
                return true;
            }
            $('<div class="modelo-dialog"></div>')
            .appendTo('body')
            .attr("title",title)
            .load( uri.toString()+ ' .modelo-div', function(){
                var $modeloDiv=$(this);
                $modeloDiv
                .prepararModelo()
                .dialog({
                    modal:true,
                    closeOnEscape:true,
                    draggable:true,
                    resizable:true,
                    height: 'auto',
                    width: 'auto',
                    bgiframe: false,
                    buttons:{
                        "Ok": function(){
                            $(this).remove();
                        }
                    },
                    close:function(){
                        $(this).remove();
                    }
                });
            })
        }
        event.preventDefault();
        return false;
    }

    $.fn.prepararModelo= function(){
        return this.each(function(){
            var $modelo=$(this);
            $modelo
            .find('.modelo-miniaturas').show().end()
            .find('.modelo-foto').hide().end()
            .find('a.js-ver-img').eq(0).click().end()
            .find('.modelo-contenido span.item-cd').not(':has(a.js-ver-item)').each(function(){
                var $span=$(this);
                var itemCd=$span.text();
                var $anchor=$('<a class="js-ver-item" href="verItem.action?cd='+itemCd+'">'+itemCd+'</a>');
                $span.empty().append($anchor);
            }).end();
        });
    };
    
    var onDocumentReady=function onDocumentReady(){
        $('body')
        .delegate('a.js-ver-img','click',alternarImagen)
        .delegate('a.js-ver-item','click',verItem);
        $(".modelo-div > .modelo").prepararModelo();
    }

    $(document).ready(onDocumentReady);
	
})(jQuery);

