﻿//Permitir arrastar items dos favoritos
var DragPercursos = function () {
	$('.individual-line > .item').draggable({
		helper: 'clone',
		revert: 'invalid',
		appendTo: 'body',
		start: function (event, ui) {
			$(ui.helper).css({ background: '#e5e5e5' });
		}
	});
};

//Desenhar tudo dos favoritos, e associar clicks etc
var DrawnFavoritos = function () {
	if ($('.guiafavoritos').length) { //CAROUSSEL PARA O GUIA DE FAVORTIOS, VERTICAL
			$(".guiafavoritos").scrollable({
				vertical: true,
				circular: false
			});
		}
		
	//Caso exista o planeador de percursos, activar o drag and drop do guia
	if ($("#CloningDivs").length) {
		DragPercursos();
	};
}
	
$(document).ready(function () {
	
	//Necessário para o percursos e roteiros confirmar a escolha do user
	$("a.MenuPRWPItem").fancybox();
	
	DrawnFavoritos();
    
	if ($('.modulo-omeuguia').length) {													//SE EXISITR NA PAGINA O MODULO "O MEU GUIA"
        $('.modulo-guiafavoritos').hide(); 											//ESCONDE O GUIA FAVORITOS	

        $('.modulo-omeuguia-titulo').live('click', function () {								//AO CLICAR NO TITULO
            if ($('.modulo-omeuguia-titulo').hasClass('activo')) {						//VERIFICA SE ESTA ACTIVO, SE TIVER
                $('.modulo-guiafavoritos').slideUp('fast'); 							//FECHA OS FAVORTOS E
                $('.modulo-omeuguia-titulo').removeClass('activo'); 					//E RETIRA A CLASS ACTIVO
            } else {
                $('.modulo-guiafavoritos').slideDown('fast'); 						//CASO NAO TENHA A CLASS ACTIVO ABRE OS FAVORITOS E
                $('.modulo-omeuguia-titulo').addClass('activo'); 					//ADICIONA A CLASS ACTIVO
            };
            return false; 															//PREVINE O CLICK DO <A HREF>
        });
    };
	
	//Se estiver na página do gerador de percurso, expande o guia
	if($('#CloningDivs').length){
		$('.modulo-guiafavoritos').slideDown('fast'); 						
        $('.modulo-omeuguia-titulo').addClass('activo');
	}
	
    //Adicionar items ao guia (favoritos)  
    var AdicionarItemGuia = function (ImgSrc, txtDesc, txtTitulo, lnkEvento, txtUniqueId, tipoItem) {
        //Verificar se o item já existe nos favoritos, se sim nao faz nada
        if ($(".guiafavoritos > .items > .individual-line:not(.cloned) > .item > .ItemId.:contains('" + txtUniqueId + "')").length && $(".guiafavoritos > .items > .individual-line:not(.cloned) > .item > .ItemType.:contains('" + tipoItem + "')").length) {
			return false;
        }
		
        //Caso o guia esteja minimiziado, restaurar
        if (!$('.modulo-omeuguia-titulo').hasClass('activo')) {
            $('.modulo-omeuguia-titulo').click();
        }
        //Verificar se o ultimo container de favoritos tem 5 items se sim entao criar um novo senao adiciona lá mais 1 elemento
        //o cloned tem a ver com ser scrollable, o scrollable tem api para adicionar items (addItem) mas não scroll de 5 em 5, etc
        var lastContainer = $(".guiafavoritos > .items > .individual-line:not(.cloned):last");
        var newItem = null;
        if (lastContainer.children(".item").length == 5) {
            newItem = $("#ContainerGuia > .individual-line").clone();
            newItem.insertAfter(lastContainer);
            newItem = newItem.children(".item");
        }
        else {
            newItem = $("#ContainerGuia > .individual-line > .item").clone();
            newItem.appendTo(lastContainer);
        }
        //scroll para ultimo item
        $(".guiafavoritos").data("scrollable").end();
        //Atribuir valores ao novo item
        newItem.children(".ItemId").text(txtUniqueId);
        newItem.children(".ItemType").text(tipoItem);
		newItem.children("span.ItemTitle").text(txtTitulo);
        var childA = newItem.children("a");
        childA.attr("href", lnkEvento);
        childA.children("img").attr("src", ImgSrc);
        childA.children("img").attr("alt", txtTitulo);
		//No titulo se for maior que 30 tem de truncar
		if(txtTitulo.length > 30){ //NOTE isto também está no Common UIHelper método GetTruncatedForTituloGuiaFavoritos portanto alterando aqui tem de se alterar lá
			childA.children("#titulo").text(txtTitulo.substring(0,30) + " ...");
		}
		else
		{
			childA.children("#titulo").text(txtTitulo);
		}
        childA.children("#desc").text(txtDesc);
        //actualizar numero de favoritos
        $(".numero-favoritos").text(parseInt($(".numero-favoritos").text()) + 1);
    };

    //Adicionar item aos favoritos (detalhe evento/poi)
    $(".adicionar-aoguia").live('click', function () {
        var data = $(this).nextAll("input");
        var ImgSrc = data.eq(1).val();
        var txtDesc = data.eq(4).val();
        var txtTitulo = data.eq(0).val();
        var lnkEvento = data.eq(2).val();
        var txtUniqueId = data.eq(3).val();
        var tipoItem = data.eq(5).val();
        AdicionarItemGuia(ImgSrc, txtDesc, txtTitulo, lnkEvento, txtUniqueId, tipoItem);
    });

    //Adicionar items ao guia (favoritos) (listagem eventos)  tem de usar o live porque faz postbacks com updatepanel
    $(".listagem-adicionar-guia").live('click', function () {
        var item = $(this).parent();
        //Verificar se é POI, Evento, etc
        var tipoItem = item.children(".itemType").text();
        if (tipoItem == 1) {//Eventos
			var NoImgGuia = $('.listagem-agenda > #hdnEvGuiaNoImgUrl').val();
			var NoImg = $('.listagem-agenda > #hdnEvNoImgUrl').val();
			var ImgUrl = item.children("img").attr("src");
			var ImgSrc = ImgUrl.replace(/^(.+)_thumb\.([^.]+)$/, "$1_icon.$2");
			if(ImgUrl == NoImg)
				ImgSrc = NoImgGuia;
            var txtDesc = item.children(".listagem-agenda-descricao").text();
            var txtTitulo = item.children("img").attr("title");
            var lnkEvento = item.children(".listagem-agenda-titulo").children("a").attr("href");
            var txtUniqueId = item.children(".itemId").text();
            AdicionarItemGuia(ImgSrc, txtDesc, txtTitulo, lnkEvento, txtUniqueId, tipoItem);
        }
        else if (tipoItem == 3) { //Oportunidades
			var ImgSrc;
			var NoImgGuia = $('.listagem-agenda > #hdnEvGuiaNoImgUrl').val();
			var NoImg = $('.listagem-agenda > #hdnEvNoImgUrl').val();
			if(item.children("img").length) {
				var ImgUrl = item.children("img").attr("src");
				ImgSrc = ImgUrl.replace(/^(.+)_thumb\.([^.]+)$/, "$1_icon.$2");
				if(ImgUrl == NoImg)
					ImgSrc = NoImgGuia;
			}
			else
				ImgSrc = NoImgGuia;
            var txtDesc = item.children(".listagem-hoteis-descricao").text();
            var txtTitulo = item.children("span.itemTitle").text();
            var lnkEvento = item.children("a.listagem-hoteis-titulo").attr("href");
            var txtUniqueId = item.children(".itemId").text();
            AdicionarItemGuia(ImgSrc, txtDesc, txtTitulo, lnkEvento, txtUniqueId, tipoItem);
        }
		else if (tipoItem == 4) { //Circuito
            var ImgSrc = item.children("img").attr("src").replace(/^(.+)_thumb\.([^.]+)$/, "$1_icon.$2");
            var txtDesc = item.children(".listagem-hoteis-descricao").text();
            var txtTitulo = item.children("span.itemTitle").text();
            var lnkEvento = item.children("a.listagem-hoteis-titulo").attr("href");
            var txtUniqueId = item.children(".itemId").text();
            AdicionarItemGuia(ImgSrc, txtDesc, txtTitulo, lnkEvento, txtUniqueId, tipoItem);
        }
		else { //POIs
            var ImgSrc = "";
            if (item.parent().children(".coluna_imagem").length)
                ImgSrc = item.parent().children(".coluna_imagem").children("img").attr("src").replace(/^(.+)_thumb\.([^.]+)$/, "$1_icon.$2");
            else
                ImgSrc = item.children(".noIconImageUrl").text();
            var txtDesc = item.children(".listagem-hoteis-descricao").text();
            var txtTitulo = item.children(".listagem-hoteis-titulo").text();
            var lnkEvento = item.children("a").attr("href");
            var txtUniqueId = item.children(".itemId").text();
            AdicionarItemGuia(ImgSrc, txtDesc, txtTitulo, lnkEvento, txtUniqueId, tipoItem);
        }
    });


    $(".modulo-guiafavoritos > .favoritos-delete-all").live('click', function () {

        //Alteraçao Nuno Dev
        //$(this).parent().children(".guiafavoritos").children(".items").children(".individual-line").remove();
        var items = $(this).parent().find(".items");
        items.children().remove();
        items.append('<div class="individual-line"></div>');
        $(".numero-favoritos").text(0);
        //Agora que removeu o item, invocar o server side para remover da sessão, teve de ser meio HACK devido a questões de design (css etc)
        var linkPostBack = $("#AuxDelete > a").eq(1).attr("href");
        eval(linkPostBack);
        return false;
    });

    //Remover 1 item guia favoritos, tem de usar o live porque faz postbacks com updatepanel
    $(".removerX").live('click', function () {
        //Quando remove 1 item tem de puxar os de baixo para cima, caso existam items abaixo
        var topContainer = $(this).parent().parent();
        if (topContainer.next(".individual-line:not(.cloned)").length) {
            var previousDiv = topContainer;
            $.each(topContainer.nextAll(".individual-line:not(.cloned)"), function (key, value) {
                //Ir ao object (value) e mover o primeiro item para o container anterior
                $(value).children(".item").eq(0).appendTo(previousDiv);
                previousDiv = $(value);
            });
            //Se o ultimo ficou sem items entao elimina o container
            if (!previousDiv.children().length) {
                previousDiv.remove();
            }
            $(this).parent().remove();
        }
        else {
            //Caso o user estivesse no ultimo e só tiver 1 item, vai o eliminar e entao tem de fazer o scroll para o anterior
            //Se o ultimo ficou sem items entao elimina o container
            //apenas elimina caso existam mais, se for o unico entao nao elimina
            if (topContainer.parent().children(".individual-line:not(.cloned)").length > 1 && topContainer.children().length == 1) {
                topContainer.remove();
                $(".guiafavoritos").data("scrollable").prev();
            }
            else {
                $(this).parent().remove();
            }
        }
        //actualizar numero de favoritos
        $(".numero-favoritos").text(parseInt($(".numero-favoritos").text()) - 1);
        //Agora que removeu o item, invocar o server side para remover da sessão, teve de ser meio HACK devido a questões de design (css etc)
        var linkPostBack = $("#AuxDelete > a").attr("href");
        var inputId = $("#AuxDelete > input");
        //Acrescentar o uniqueid do evento num campo escondido e efectuar postback
        inputId.val($(this).parent().children(".ItemId").text());
        eval(linkPostBack);
    });


    /**********************************************************************
    Código para gerador de percurso drag and drop
    **********************************************************************/

    var CriarSortableListPercurso = function () {
        //Faz o drag and drop entre elementos do gerador de percurso (Dia 1, Dia 2, etc)
        $(".listagem-percursos").sortable({
            connectWith: ".listagem-percursos",
            zIndex: 10,
            opacity: 0.6,
            //containment: $(".coluna-central").length ? ".coluna-central" : "document",
            containment: "body",
            helper: "clone",
            items: $(".listagem-percursos-item").has("span"),
            receive: function (event, ui) {
                var emptyDayDiv = $(ui.item).parent().children('#vazio');
                if (emptyDayDiv.length == 1) //Significa que moveu o item para um dia vazio
                    emptyDayDiv.remove();
                //Verificar se o item já existe no dia onde fez o drop, se sim nao faz nada
                var itemId = $(ui.item).children(".ItemId").text();
                if ($(this).children(".listagem-percursos-item").children(".ItemId:contains('" + itemId + "')").length > 1) {
                    $(ui.sender).sortable('cancel');
                    return;
                }
                var oldDayDiv = $(ui.sender).find(".listagem-percursos-item");
                if (oldDayDiv.length == 0) { //Significa que a lista onde estava ficou vazia 
                    var newEmptyDay = $("#CloningDivs").find("#vazio").clone();
                    newEmptyDay.appendTo($(ui.sender));
                }
            },
            stop: function (event, ui) {
                //Alterar o número dos eventos 
                GerarNumerosPercurso();
            }
        }).disableSelection();
    };

    CriarSortableListPercurso();

    //Remover evento/poi de determinado dia.
    //NOTA usa o live porque existem elementos criados dinamicamente
    $(".listagem-percursos-item").find(".link.hover.remover").live('click', function () {
        var dayDiv = $(this).parent().parent().parent();
        //remover o planeamento em questão
        $(this).parent().parent().remove();
        //adicionar um dia vazio caso tenha ficado sem planeamento
        var actualDay = dayDiv.find(".listagem-percursos-item");
        if (actualDay.length == 0) { //Significa que a lista onde estava ficou vazia 
            var newEmptyDay = $("#CloningDivs").find("#vazio").clone();
            newEmptyDay.appendTo(dayDiv);
        }
        //gerar numeros para o planeamento
        GerarNumerosPercurso();
        return false;
    });

    //Remover todos os eventos/pois de um determinado dia
    //NOTA usa o live porque existem elementos criados dinamicamente
    $(".listagem-percursos-dia").find(".link.hover.remover").live('click', function () {
        var dayDiv = $(this).parent().parent();
        //var diaActual = dayDiv.find(".titulo > #NumeroDia").text();
        var ultimoDia = dayDiv.parent().find(".listagem-percursos-dia");
        //Verificar se o proximo dia é o último se sim entao remover o actual (ou seja se só tem 1 item)
        if (ultimoDia.length != 2) {  //código para nao limpar caso o actual nao seja o dia 1 (existe sempre +1 dia que é o ultimo mas está escondido)
            //primeiro remove o clearFix e de seguida o dia
            dayDiv.next(".clearFix").remove();
            dayDiv.remove();
            var ultimoDiaElement = $(".listagem-percursos-empty");
            //Se o ultimo dia estava escondido é porque já tinha 7 dias, agora ao remover 1 tem de ficar visivel
            if (!ultimoDiaElement.is(":visible")) {
                ultimoDiaElement.css({ display: 'block' });
            }
            //Mudar o número do último dia (menos 1)
            ultimoDia = $(".listagem-percursos-empty").find(".titulo > #NumeroDia");
            ultimoDia.text(ultimoDia.text() - 1);
            //Actualizar label com numero dias
            var numeroDias = parseInt(ultimoDia.text()) - 1;
            $(".coluna-direita > .select-personalizada > span").text(numeroDias);
            $(".coluna-direita > .select-personalizada > input:hidden").val(numeroDias);
        }
        //Caso tenha lá items remover e adicionar um em branco
        else if (dayDiv.children(".listagem-percursos-item").has("span").length) {
            //remover o planeamento para o dia em questão
            dayDiv.children(".listagem-percursos-item").remove();
            //adicionar um dia vazio 
            var actualDay = dayDiv.find(".listagem-percursos-item");
            var newEmptyDay = $("#CloningDivs").find("#vazio").clone();
            newEmptyDay.appendTo(dayDiv);
        }
        //gerar numeros para o planeamento
        GerarNumerosPercurso();
		GerarDiasPercurso();
        return false;
    });


    //Adicionar um novo dia
    $(".listagem-percursos-dia").find(".link.hover.adicionar").click(function () {
        var actualDay = $(this).parent().parent();
        var newEmptyDay = $("#CloningDivs").children().clone();
        newEmptyDay.insertAfter(actualDay.prev());
        //alterar numero do dia (+1)
        var ultimoDia = actualDay.find(".titulo > #NumeroDia");
        newEmptyDay.find(".titulo > #NumeroDia").text(ultimoDia.text());
        ultimoDia.text(parseInt(ultimoDia.text()) + 1);

        //Se tem 7 no total então esconder a opção de adicionar dia (tem 1 escondido)
        if ($(".listagem-percursos").length == 8) {
            actualDay.css({ display: 'none' });
        }

        //Actualizar label com numero dias
        var numeroDias = parseInt(ultimoDia.text()) - 1;
        $(".coluna-direita > .select-personalizada > span").text(numeroDias);
        $(".coluna-direita > .select-personalizada > input:hidden").val(numeroDias);

        //Bind do sortable nas listas, como tem novas listas tem de ter um rebind
        //Antes não tinha uma function e fazia o sortable('refresh') mas não funcionava
        CriarSortableListPercurso();
        //Bind dos items do guia para poder arrastar para o novo dia
        BindDragItemsGuia();
        return false;
    });


    //Gerar números para cada evento/poi do planeamento (1,2,3,4,5,6....,n)
    var GerarNumerosPercurso = function () {
        var hidden = $(".gerador-percursos-botoes > :hidden").get(0);
        hidden.value = "";

        $(".listagem-percursos-item").has("span").each(function (index) {
            var ordem = index + 1;
            $(this).find(".num-imagem").text(ordem);
            //var dia = $(this).parent().children(".listagem-percursos-dia").children(".titulo").children("#NumeroDia").text();
            var dia = $(this).parent().find("#NumeroDia").text();
            var ItemId = $(this).find(".ItemId").text();
            var itemType = $(this).find(".ItemType").text();

            hidden.value += (dia + ',' + ItemId + ',' + itemType + ',' + ordem + ';');
        })
    };
	
	var GerarDiasPercurso = function () {
		$(".listagem-percursos-geral > .listagem-percursos > .listagem-percursos-dia > .titulo > #NumeroDia").each(function (index) {
			$(this).text(index + 1);
		})
	};

    /**********************************************************************
    Fim Código para gerador de percurso drag and drop
    **********************************************************************/


    /**********************************************************************
    Código para arrastar items dos favoritos para o gerador de percurso
    **********************************************************************/

    //Permitir largar items na lista de percurso e quando o fizer, criar um novo item nos percursos
    var BindDragItemsGuia = function () {
        $('.listagem-percursos').droppable({
            accept: '.individual-line > .item',
            drop: function (event, ui) {
                //Sacar id, imagem e descricao
                var evId = $(ui.draggable).children('.ItemId').text();
                var itemType = $(ui.draggable).children('.ItemType').text();
				var itemTitle = $(ui.draggable).children('.ItemTitle').text();
                //Verificar se o item já existe no dia onde fez o drop, se sim nao faz nada
				//TODO Isto com vários tipos de dados tem de verificar também o tipo e não só o id
                if ($(this).children(".listagem-percursos-item").children(".ItemId:contains('" + evId + "')").length) {
                    return;
                }
                var evData = $(ui.draggable).children('a');
                var evImg = evData.children('img');
                var evTitulo = itemTitle;
                var evDesc = evData.children('#desc').text();
				var itemDetailUrl = evData.attr("href");
                //Só interressa alterar a parte final da imagem antes da extensao de _fav para _thumb 
                var evImgSrc = evImg.attr("src").replace(/^(.+)_icon\.([^.]+)$/, "$1_thumb.$2");
                //Criar novo elemento, alterar a classe para a final e preencher dados
                var newEmptyDay = $("#CloningDivsItem").children().clone();
                newEmptyDay.attr("class", "listagem-percursos-item");
                //Isto está feito seguindo a estrutura actual se mudar tem de se alterar este código
                newEmptyDay.children().eq(1).attr("src", evImgSrc);
                newEmptyDay.children().eq(1).attr("alt", evImg.attr("alt"));
                newEmptyDay.children().eq(1).attr("title", evImg.attr("alt"));
                newEmptyDay.children().eq(2).text(evTitulo);
				newEmptyDay.children().eq(2).attr("href", itemDetailUrl);
                newEmptyDay.children().eq(3).text(evDesc);
                newEmptyDay.children().eq(4).text(evId);
                newEmptyDay.children().eq(5).text(itemType);
                //Se fez o drop numa lista vazia então tem de apagar o dia vazio da mesma
                if ($(this).children('#vazio').length == 1)
                    $(this).children('#vazio').remove();
                //adicionar novo item
                newEmptyDay.appendTo(this);

                //Efectuar bind deste novo elemento para ser sortable e gerar números
                GerarNumerosPercurso();
                CriarSortableListPercurso();
            }
        });
    };

    BindDragItemsGuia();


    /**********************************************************************
    Fim Código para arrastar items dos favoritos para o gerador de percurso
    **********************************************************************/

}); 	
