﻿/*  @@ INDEX
    ----------------------------------

    @@ FINDER
    @@ CUSTOM DROPDOWN
    @@ FEATURES PICKER
    
*/


   
/* @@ FINDER (also activates location picker)
   ==================================================================== */

var __current_purposeID = 0;

function SetupFinder(showAnimations, startCollapsed, initialTabID, clientID, smartSearchBtnID, simpleSearchBtnID, childControls, url_locationPickerScriptFile, url_locationSuggestion, url_locationDetail, url_mapFlashFile, locationPicker_controlID, locationPicker_showFlashMap, locationPicker_showTooltip) {
    
    //"javascript:if (event.keyCode == 13) __doPostBack('{0}','')"
    
    $(document).ready(function() {
        $("#dFinder").SetupFinder({
            showAnimations: Boolean(showAnimations),
            startCollapsed: Boolean(startCollapsed),
            initialTabID: initialTabID,
            clientID: clientID,
            smartSearchBtnID: smartSearchBtnID,
            simpleSearchBtnID: simpleSearchBtnID,
            childControls: childControls,
            url_locationPickerScriptFile: url_locationPickerScriptFile,
            url_locationSuggestion: url_locationSuggestion,
            url_locationDetail: url_locationDetail,
            url_mapFlashFile: url_mapFlashFile,
            locationPicker_controlID: locationPicker_controlID,
            locationPicker_showFlashMap: locationPicker_showFlashMap,
            locationPicker_showTooltip: locationPicker_showTooltip
        });
    });
};


$.fn.SetupFinder = function(pluginSettings) {

    var defaultSettings = {
        showAnimations: true, 		//Se as transi›es (expand & collapse) s‹o feitas com animacoees
        startCollapsed: true, 		//Se o finder comea colapsado
        allowCollape: false,
        expandingSlideUp_speed: 200, 	//dura‹o da anima‹o ao expandir, slideUp
        expandingSlideDown_speed: 400, //dura‹o da anima‹o ao expandir, slideDown
        collapsingSlideUp_speed: 300, //dura‹o da anima‹o ao colapsar, slideUp
        collapsingSlideDown_speed: 200, //dura‹o da anima‹o ao colapsar, slideDown
        initialTabID: '',
        activeTabClass: 'active',
        clientID: '',
        smartSearchBtnID: '',
        simpleSearchBtnID: '',
        childControls: '',
        url_locationPickerScriptFile: '',
        url_locationSuggestion: '',
        url_locationDetail: '',
        url_mapFlashFile: '',
        locationPicker_controlID:'',
        locationPicker_showFlashMap: 'true',
        locationPicker_showTooltip: 'true'
    };
    var settings = $.extend(defaultSettings, pluginSettings);

    return this.each(function() {

        __current_purposeID = settings.initialTabID;

        var $FinderExpanded = $('#FinderExpanded'),
			$FinderCollapsed = $('#FinderCollapsed'),
			$tabsLinks = $('#FinderTabs a'),
			$currentTabHolder = $('#' + settings.clientID + '_hfCurrentTab'),
			$searchLink = $('#' + settings.clientID + '_lnkSmartSearch'),
			$textbox = $('#' + settings.clientID + '_txtSmartSearch'),
			$simpleSearchButton = $('#' + settings.simpleSearchBtnID);

        var $finderMode_Link = {
            expand: $('#expandFinder'),
            collapse: $('#collapseFinder')
        };

        var selectedValues = {
            location: $('#' + settings.locationPicker_controlID + ' #dPickedID input:first'),
            type: $('#ddlTypes input:first'),
            typologyMin: $('#ddlBedsMin input:first'),
            typologyMax: $('#ddlBedsMax input:first')
        };

        var ddlControls = {
            location: null,
            type: $('#ddlTypes > div:first'),
            typology: $('#ddlBeds > div:first'),
            typologyMin: $('#ddlBedsMin > div:first'),
            typologyMax: $('#ddlBedsMax > div:first')
        };

        var $dCarousel = $(".dCarousel");
        var $dScroller = $(".dScroller");
        var $nearProperties = $("#cyNearProperties");

        // tweek trimStart da barra que o ASP.NET acrescenta automaticamente ao href
        $tabsLinks.each(function() {
            var fixedHref = $(this).attr('href');
            if (fixedHref.startsWith("/"))
                fixedHref = fixedHref.substr(1);
            $(this).attr('href', fixedHref);
        });

        //
        $tabsLinks.each(function() {
            $(this).data('tabID', $(this).attr('class'));
        });


        var isExpanded = false;

        // Initial Setup
        ActivateTab($('.' + settings.initialTabID), true);

        if (settings.startCollapsed)
            CollapseFinder(false);
        else
            ExpandFinder(false);

        if (!settings.allowCollape)
            $finderMode_Link.collapse.hide();

        // end:InitialSetup


        // Click nos links das tabs
        $tabsLinks.click(function() {
            ActivateTab($(this), false);
            return false;
        });
        // end:LinkClick


        // Activa determinada tab    
        function ActivateTab($tabLink, firstTime) {

            try {

                // 1. obter o ID da nova tab (purpose)
                var id = $tabLink.data('tabID');

                // 2. atribuir o ID ao hiddenfield
                $currentTabHolder.val(id);
                __current_purposeID = id;

                $tabsLinks.removeClass(settings.activeTabClass);
                $tabLink.addClass(settings.activeTabClass);

                var tabID = $tabLink.attr('href');
                $('#contextContents > div').hide();
                $(tabID).show();

                // 8. disparar o reload das dropdowns que têm os seu valores dependentes desta dropdown (casayes.customdropdown.js)
                if (!firstTime) {
                    TriggerDependentDropDowns(settings.childControls, id);

                    //8.1. Reload deppendent controls with the purpose id
                    if ($dCarousel.length > 0) {
                        //trigger the function Reload Control in Properties Carousel control
                        $dCarousel.trigger("ReloadControl", id);
                    }
                    
                    //8.1. Reload deppendent controls with the purpose id
                    if ($dScroller.length > 0) {
                        //trigger the function Reload Control in Properties Scroller control
                        $dScroller.trigger("ReloadControl", id);
                    }
                    
                    //8.2. Reload deppendent controls with the purpose id
                    if ($nearProperties.length > 0) {
                        //trigger the function ReloadControl in Near Properties control
                        $nearProperties.trigger("ReloadControl", id);
                    }
                    
                      
                    // 9. expand finder if is collapsed
                    if($FinderExpanded.css("display")=="none"){
                        ExpandFinder(settings.showAnimations);
                    }

                }

                // 10. trigger features picker reload
                TriggerFeaturesPickerReload();
              
                
            }
            catch (e) {
            }
        };
        // end:ActivateTab



        // Click nos links de expandir e colapsar o finder
        $finderMode_Link.expand.click(function() {
            ExpandFinder(settings.showAnimations);
            return false;
        });
        $finderMode_Link.collapse.click(function() {
            CollapseFinder(settings.showAnimations);
            return false;
        });
        // end:LinkClick


        // Expande o finder
        function ExpandFinder(withAnimation) {
            if (withAnimation) {
                $finderMode_Link.expand.fadeOut('fast');
                $finderMode_Link.collapse.fadeOut('fast');
                $FinderCollapsed.slideUp(settings.expandingSlideUp_speed, function() {
                    $FinderExpanded.slideDown(settings.expandingSlideDown_speed, function() {

                        LoadLocationPicker();
                        TriggerDependentControls();
                        isExpanded = true;

                        if (settings.allowCollape)
                            $finderMode_Link.collapse.show();
                    });
                });
            }
            else {
                $FinderCollapsed.hide();
                $FinderExpanded.show();
                $finderMode_Link.expand.hide();
                if (settings.allowCollape)
                    $finderMode_Link.collapse.show();

                LoadLocationPicker();
                TriggerDependentControls();

                isExpanded = true;
            }



        };
        // end:ExpandFinder


        // Colapsa o finder
        function CollapseFinder(withAnimation) {
            if (withAnimation) {
                $finderMode_Link.expand.fadeOut('fast');
                $finderMode_Link.collapse.fadeOut('fast');
                $FinderExpanded.slideUp(settings.collapsingSlideUp_speed, function() {
                    $FinderCollapsed.slideDown(settings.collapsingSlideDown_speed, function() {
                        $finderMode_Link.expand.show();
                        isExpanded = false;
                    });
                });
            }
            else {
                $FinderExpanded.hide();
                $FinderCollapsed.show();
                $finderMode_Link.collapse.hide();
                isExpanded = false;
            }
        };
        // end:CollapseFinder

        function LoadLocationPicker() {
            // request LOCATION-PICKER scripts
            var scriptURL = settings.url_locationPickerScriptFile;
            $.getScript(scriptURL, function() {
                BuildLocationPicker(settings.url_locationSuggestion, settings.url_locationDetail, settings.url_mapFlashFile, settings.locationPicker_controlID, settings.locationPicker_showFlashMap, settings.locationPicker_showTooltip);
            });
        };

        function TriggerDependentControls() {
            // triger function from casayes.customdropdown.js
            var currentTab = $currentTabHolder.val()
            SetAsReady(settings.childControls, currentTab);
            SetAsReady_Features();
        };


        // Evitar a submissão da pesquisa no caso de não existirem palavras na textbox
        $searchLink.click(function() {
            if ($textbox.val().length == 0)
                return false;
        });


        // Tratamento da tecla enter
        $(document).keypress(function(e) {
            if (e.keyCode == 13) {
                if (!isExpanded)
                    if ($textbox.val().length > 0)
                    __doPostBack(settings.smartSearchBtnID, '');
            }
        });


        // Tratamento do SimpleSearch Submit
        $simpleSearchButton.click(function() {

            var hasLocation = false,
                hasType = false,
                hasTipology = false;

            var disabledLocation = false,
                disabledType = ddlControls.type.hasClass('disabled'),
                disabledTypology = (ddlControls.typologyMin.hasClass('disabled') && ddlControls.typologyMax.hasClass('disabled'));

            if ((selectedValues.location.val() != '/1/') && (selectedValues.location.val() != '')) {
                hasLocation = true;
            }

            if (Number(selectedValues.type.val()) > 0) {
                hasType = true;
            }

            if ((Number(selectedValues.typologyMin.val()) > -1) || (Number(selectedValues.typologyMax.val()) > -1)) {
                hasTipology = true;
            }


            if (!hasLocation || (!disabledType && !hasType) || (!disabledTypology && !hasTipology)) {
                ShowOperationFeedback(operationFeedback.status.error, 0, operationFeedback.types.finder_mandatory_fields);
                return false;
            }

            if ((selectedValues.typologyMin.val() > selectedValues.typologyMax.val()) && (selectedValues.typologyMax.val() >= 0)) {
                ShowOperationFeedback(operationFeedback.status.warning, 0, operationFeedback.types.finder_mandatory_fields);
                return false;
            }

        });


    });

};




/* @@ CUSTOM DROPDOWN
   ==================================================================== */
   

var _dropDown_cssclass = 'customDropDown';
var __current_typeID = 0; // WARNING!!!! esta variavel só pode ser actualizada pela ddlTypes


function Setup_CustomDropDown(cid_control, cid_selectedValue, cid_selectedText, ddl_width, dll_allowNulls, dll_zeroBased, ddl_isAutonomous, ddl_allwaysReload, ddl_enabled, implieFeatures, childControls, url_dataSource, requestTimeout, _autoStart, _autoPostBack, postBackQueryString, siblingRange_postBackQueryString, rangeAnchorDirection, languageID, userHistoryID, dependencyID, fromRefinerQueryString, queryStringSource, queryStringSourceValue, searchID, queryStringRootSearchID, queryStringParentSearchID) {

    var $ddlControl = $('#' + cid_control);

    $ddlControl.SetupCustomDropDown({
        cid_control: cid_control,
        cid_selectedValue: cid_selectedValue,
        cid_selectedText: cid_selectedText,
        ddl_width: ddl_width,
        dll_allowNulls: Boolean(dll_allowNulls),
        dll_zeroBased: Boolean(dll_zeroBased),
        ddl_isAutonomous: Boolean(ddl_isAutonomous),
        ddl_allwaysReload: Boolean(ddl_allwaysReload),
        ddl_defaultlyEnabled: Boolean(ddl_enabled),
        implieFeatures: Boolean(implieFeatures),
        childControls: childControls,
        url_dataSource: url_dataSource,
        requestTimeout: requestTimeout,
        ready: Boolean(_autoStart),
        autoPostBack: Boolean(_autoPostBack),
        postBackQueryString: postBackQueryString,
        siblingRange_postBackQueryString: siblingRange_postBackQueryString,
        rangeAnchorDirection: rangeAnchorDirection,
        languageID: languageID,
        userHistoryID: userHistoryID,
        dependencyID: dependencyID,
        fromRefinerQueryString: fromRefinerQueryString,
        queryStringSource: queryStringSource,
        queryStringSourceValue: queryStringSourceValue,
        searchID: searchID,
        queryStringRootSearchID: queryStringRootSearchID,
        queryStringParentSearchID: queryStringParentSearchID
    });
    
};


(function($) {
    $.fn.SetupCustomDropDown = function(pluginSettings) {

        var defaultSettings = {
            cid_control: '',
            cid_selectedValue: '',
            cid_selectedText: '',
            ddl_width: 100,
            dll_allowNulls: false,
            dll_zeroBased: false,
            ddl_isAutonomous: true,
            ddl_allwaysReload: false,
            ddl_defaultlyEnabled: true,
            implieFeatures: false,
            childControls: '',
            ddl_enabled: true,
            url_dataSource: '',
            requestTimeout: 7000,
            dependencyID: 0,
            css_classes: {
                control: 'customDropDown',
                control_selectedOption: 'selectedOption',
                control_selectedOption_text: 'text',
                control_selectedOption_arrow: 'arrow',
                control_options: 'options',
                control_loader: 'ddlloader',
                control_error: 'ddlerror',
                control_disabled: 'disabled'
            },
            ready: false,
            autoPostBack: false,
            postBackQueryString:'',
            siblingRange_postBackQueryString:'',
            rangeAnchorDirection: 0,
            languageID: 'pt-PT',
            userHistoryID: 0,
            fromRefinerQueryString: '',
            queryStringSource: '',
            queryStringSourceValue: '',
            searchID: 0,
            queryStringRootSearchID: '',
            queryStringParentSearchID: ''
        };
        var $settings = $.extend(defaultSettings, pluginSettings);
        
        return this.each(function() {

            __current_typeID = GetNullValue();
            var $stage = $(this);

            // @ EXTERNAL COMUNICATION SETUP
            // --------------------------------------------------------------------

            $(this).bind('ReloadControl', function(event, dependencyID) {
                        
                // 1. limpar a lista de opções
                DataUnbind();

                // 2. disparar o seu carregamento
                if (!$settings.ddl_isAutonomous || $settings.ddl_allwaysReload) {
                    RequestAndTriggerBindings(dependencyID);
                };
                
                /*
                30/09/2010: If comentado quando se alterou o mecanismo para suportar o allowNulls && zeroBased, para corrigir o bug das combos que não precisam de valor em branco
                if ((dependencyID > 0) || (dependencyID == 0 && !$settings.dll_allowNulls)) {
                    RequestAndTriggerBindings(dependencyID);
                }
                */

            });

            $(this).bind('ReadyIt', function(event, dependencyID) {
                              
                $settings.ready = true;
                
                if (dependencyID == 0) {
                    if ($settings.ddl_isAutonomous)
                        RequestAndTriggerBindings($settings.dependencyID);
                }
                else {
                    RequestAndTriggerBindings(dependencyID);
                }
                
            });
                        
            $(this).bind('SelectValue', function(event, value){
                                        
                var wait = window.setInterval(function(){
                    
                    var $valueLink = $('.options a', $stage).filter('[name=' + value + ']');
                    SelectOption($valueLink, false);
                    
                    clearInterval(wait);
                    
                }, 500);

            });



            // @ CONTROL BUILDING
            // --------------------------------------------------------------------

            var selectedOption = $('<div></div>').addClass($settings.css_classes.control_selectedOption);
            var selectedOption_text = $('<span></span>').addClass($settings.css_classes.control_selectedOption_text);
            var selectedOption_arrow = $('<span></span>').addClass($settings.css_classes.control_selectedOption_arrow);
            var selectedOption_loader = $('<span></span>').addClass($settings.css_classes.control_loader);
            var selectedOption_error = $('<span></span>').addClass($settings.css_classes.control_error);

            var selectedOption_selectedValue = $('#' + $settings.cid_selectedValue),
			    selectedOption_selectedText = $('#' + $settings.cid_selectedText);
			    
            var _initialSelectedValue = selectedOption_selectedValue.val();

            selectedOption.append(selectedOption_text)
					      .append(selectedOption_arrow)
					      .append(selectedOption_loader)
					      .append(selectedOption_error);

            $(this).addClass(_dropDown_cssclass)
                   .width($settings.ddl_width)
                   .prepend(selectedOption);


            var options = $('<div></div>').addClass($settings.css_classes.control_options).width($settings.ddl_width - 7);

            $(this).append(options);



            // @ INTERACTION SETUP
            // --------------------------------------------------------------------

            // clique na opção (collapse & expand)
            selectedOption.click(function() {
                if (options.is(':hidden'))
                    if ($settings.ddl_enabled)
                    DisplayOptions(true);
                else
                    DisplayOptions(false);
            });

            // hover na seta 
            selectedOption.hover(
				function() { if ($settings.ddl_enabled) selectedOption_arrow.addClass('hover'); }
			,
				function() { if (options.is(':hidden')) selectedOption_arrow.removeClass('hover'); }
			);

            // selecciono determinada opção
            function SelectOption($item, firstIteration) {
                                
                // 1. obtenho as informações da opção seleccionada
                var id = $item.attr('name'),
                    description = $item.text();
                    
                // 2. atribuo a informação aos controlos necessários ( hiddenFields[IDs] + visibleLabel )
                selectedOption_selectedValue.val(id);
                selectedOption_selectedText.val(description);
                selectedOption_text.text(description);

                if ($settings.implieFeatures) {
                    __current_typeID = id;
                }

                // 3. torno novamente visivel todas as opções, pois a que estava seleccionada anteriormente estava escondida na lista de opções disponíveis
                options.children('a').show();

                // 4. escondo a opção seleccionada da lista de opções
                $item.hide();

                // 5. collapso a lista de opções
                options.hide();

                // 6. retiro o efeito de controlo activo
                selectedOption_arrow.removeClass('hover');

                // 7. retiro o tweek que faz com que cada click fora da àrea de opções, as esconda
                $('body').unbind('click');

                if (!$settings.autoPostBack) {
                    // 8. disparar o reload das dropdowns que têm os seu valores dependentes desta dropdown
                    var dependencyID = $('#' + $settings.cid_selectedValue).val();
                    TriggerDependentDropDowns($settings.childControls, dependencyID);

                    // 9. ...
                    if ($settings.implieFeatures) {
                        TriggerFeaturesPickerReload();
                    }
                }
            

                if ($settings.autoPostBack && !firstIteration) {
                    
                    options.hide();
                    $('body').unbind('click');
                    
                    if ($settings.postBackQueryString != '') {
                        
                        // desabilitar controlo para evitar mais cliques enquanto o pedido não é processado    
                        $stage.fadeTo('fast', 0.2)
                        $stage.bind('click', function() {
                            return false;
                        })
                                                
                        var newURL;                     
                        
                        if ($settings.siblingRange_postBackQueryString == '') {
                            var qs = {}; 
                            qs[$settings.postBackQueryString] = id;
                            
                            if($settings.queryStringSourceValue>0) qs[$settings.queryStringSource] = $settings.queryStringSourceValue;
                            if ($settings.fromRefinerQueryString != '') {
                                qs[$settings.fromRefinerQueryString] = '1'
                            }
                            qs['page'] = '1';
                        
                            // search trail
                            qs[$settings.queryStringParentSearchID] = $settings.searchID;
                            if ($.jqURL.get($settings.queryStringRootSearchID) == undefined) {
                                qs[$settings.queryStringRootSearchID] = $settings.searchID;
                            }
                            
                            newURL = $.jqURL.set(qs);
                        } 
                        else {
                                                        
                            var qs = {}; 
                            var own_rangeValue = id;
                            var sibling_rangeValue = $.jqURL.get($settings.siblingRange_postBackQueryString);
                                                        
                            // se a propria combo corresponde ao valor minimo
                            if ($settings.rangeAnchorDirection == -1) {
                                // vejo se o irmão está definido e caso seja inferior, troco a queryString
                                if((sibling_rangeValue !== undefined) && (Number(own_rangeValue) > Number(sibling_rangeValue)) && (Number(own_rangeValue) != -1)) {
                                    qs[$settings.siblingRange_postBackQueryString] = own_rangeValue;
                                    qs[$settings.postBackQueryString] = sibling_rangeValue;
                                }
                                else {
                                    qs[$settings.postBackQueryString] = own_rangeValue;
                                }
                                if ($settings.fromRefinerQueryString != '') {
                                    qs[$settings.fromRefinerQueryString] = '1'
                                }
                                if($settings.queryStringSourceValue > 0 ) qs[$settings.queryStringSource] = $settings.queryStringSourceValue;
                                qs['page'] = '1';
                            }
                            else {
                                // vejo se o irmão está definido e caso seja superior, troco a queryString
                                if((sibling_rangeValue !== undefined) && (Number(own_rangeValue) < Number(sibling_rangeValue)) && (Number(own_rangeValue) != -1)) {
                                    qs[$settings.siblingRange_postBackQueryString] = own_rangeValue;
                                    qs[$settings.postBackQueryString] = sibling_rangeValue;
                                }
                                else {
                                    qs[$settings.postBackQueryString] = own_rangeValue;
                                }
                                if ($settings.fromRefinerQueryString != '') {
                                    qs[$settings.fromRefinerQueryString] = '1'
                                }
                                if($settings.queryStringSourceValue > 0 ) qs[$settings.queryStringSource] = $settings.queryStringSourceValue;
                                qs['page'] = '1';
                            }
                                                        
                            //console.log('own_rangeValue: ' + own_rangeValue);
                           // console.log('sibling_rangeValue: ' + sibling_rangeValue);

                            // search trail
                            qs[$settings.queryStringParentSearchID] = $settings.searchID;
                            if ($.jqURL.get($settings.queryStringRootSearchID) == undefined) {
                                qs[$settings.queryStringRootSearchID] = $settings.searchID;
                            }
                            
                            newURL = $.jqURL.set(qs);
                               
                        }


                                                                          
                        window.location = newURL;
                          
                    } else {
                        selectedOption_error.show();
                    }
                    
                }                 

            };

            // mostra/esconde as opções
            function DisplayOptions(display) {

                // 0. mostrar
                if (display) {
                    // 1. animo o aparecimento da lista de opções
                    options.slideDown("fast", function() {
                        // 1.1. quando terminar, faço o tweek para que cada click fora da àrea de opções, as esconda
                        $('body').one('click', function() {
                            // 1.1.1. ao esconder > retiro o efeito de controlo activo
                            selectedOption_arrow.removeClass('hover');
                            // 1.1.2. ao esconder > animo o desaparecimento da lista de opções
                            options.slideUp("fast");
                        });
                    });
                    // 2. quando terminar, acrescento o efeito de controlo activo, no caso de este estar enabled
                    if ($settings.ddl_enabled) { selectedOption_arrow.addClass('hover'); }
                }

                // 0. esconder
                else {
                    // 1. animo o desaparecimento da lista de opções
                    options.slideUp("fast");
                    // 2. retiro o efeito de controlo activo
                    if ($settings.ddl_enabled) { selectedOption_arrow.removeClass('hover'); }
                }
            }




            // @ DATA MANAGEMENT (REQUEST & LOAD)
            // --------------------------------------------------------------------
               
            function RequestAndTriggerBindings(myDependencyID) {
            
                /*
                if ($stage.attr('id') == 'ddlRefinerPriceMin' || $stage.attr('id') == 'ddlRefinerPriceMax') {
                    console.log(myDependencyID);
                }
                */

                if ($settings.ready) {

                    DataUnbind();
                    selectedOption_error.hide();
                    selectedOption_loader.show();

                    if ($settings.url_dataSource != '') {

                        $.ajax({
                            type: 'GET',
                            dataType: 'json',
                            processData: true,
                            timeout: $settings.requestTimeout,
                            url: $settings.url_dataSource,
                            data: {
                                dependencyID: myDependencyID,
                                languageID: $settings.languageID,
                                userHistoryID: $settings.userHistoryID
                            },
                            error: function(request, status, error) {
                                //alert('Error: ' + status);
                                selectedOption_loader.hide();
                                selectedOption_error.show();
                                DataUnbind();
                            },
                            success: function(data) {
                                if (data != null) {
                                    DataUnbind();
                                    DataBind(data);
                                }
                                else {
                                    selectedOption_loader.hide();
                                    selectedOption_error.show();
                                    DataUnbind();
                                }
                            }
                        });

                    }
                    else {
                        alert('DataSource URL not defined!');
                    }

                }

            };

            function DataBind(dataSource) {

                if (dataSource.records.length > 0) {

                    // 0. configurar opção branca
                    var whiteValue; ($settings.dll_zeroBased) ? whiteValue = '-1' : whiteValue = '0';
                    var whiteOption = $('<a href="#"></a>').attr('name', whiteValue).html('&nbsp;');

                    // 1. configurar as interacções com a opção
                    whiteOption.click(function() {
                        // 1.1. selecciono a opção
                        SelectOption($(this), false);
                        return false;
                    });

                    // 2. adicionr a opção branca à lista de opções (SE a ddl aceitar opções em branco)
                    if ($settings.dll_allowNulls) {
                        options.append(whiteOption);
                    }

                    // 3. percorrer o datasource
                    $.each(dataSource.records, function(index, record) {
                        // 3.1. configurar opção
                        var option = $('<a href="#"></a>')
                                     .attr('name', record.value)
                                     .text(record.text);
                        // 3.2. configurar as interacções com a opção
                        option.click(function() {
                            // 3.2.1. selecciono a opção
                            SelectOption($(this), false);
                            return false;
                        });
                        // 3.3. adicionar a opção à lista de opções
                        options.append(option);
                    });

                    // 4. seleccionar a opção por defeito
                    if (_initialSelectedValue > 0) {
                        SelectOption(options.children('a[name="' + _initialSelectedValue + '"]'), true);
                    }
                    else {
                        SelectOption(options.children('a[name="' + selectedOption_selectedValue.val() + '"]'), true);
                    }

                    // 5. habilitar controlo
                    if ($settings.ddl_defaultlyEnabled) {
                        $settings.ddl_enabled = true;
                        selectedOption.removeClass($settings.css_classes.control_disabled);
                    }

                }

                selectedOption_loader.hide();

            };


            function DataUnbind() {

                $settings.ddl_enabled = false;

                selectedOption.addClass($settings.css_classes.control_disabled);

                options.children().remove();

                // reset valores
                var whiteValue; ($settings.dll_zeroBased) ? whiteValue = -1 : whiteValue = 0;
                selectedOption_selectedValue.val(whiteValue);
                selectedOption_selectedText.val(whiteValue);
                selectedOption_text.text('');

            };

            function GetNullValue() {
                var whiteValue; ($settings.dll_zeroBased) ? whiteValue = -1 : whiteValue = 0;
                return whiteValue;
            };


            // @ INIT
            // --------------------------------------------------------
            DataUnbind();

            if ($settings.ddl_isAutonomous) {
                /*
                if ($stage.attr('id') == 'ddlRefinerPriceMin' || $stage.attr('id') == 'ddlRefinerPriceMax') {
                    console.log('is autonomous:' + $settings.ddl_isAutonomous);
                }
                */
                RequestAndTriggerBindings($settings.dependencyID);
            }

            /*
            // clique em cima da area da dropdown, não deve esconder as opções, apenas fora
            $(this).children('.dropdown').click(function(event) {
            event.stopPropagation();
            });            
            */

        });

    };
})(jQuery);


// @ EXTERNAL COMUNICATION HANDLERS
// --------------------------------------------------------------------

function TriggerDependentDropDowns(childControls, dependencyID) {

    var controls = childControls.split(',');
    for (var i = 0; i < controls.length; i++) {
        if (controls[i] != "") {
            $('#' + controls[i]).trigger('ReloadControl', dependencyID);
        }
    }

};

function SetAsReady(dependentControls, dependencyID) {

    // 1. controlos autonomos, são imediatamente carregados
    $('.' + _dropDown_cssclass).trigger('ReadyIt', 0);

    // 2. controlos dependentes, mas que ja tenham um dependency ID tb são carregados
    var controls = dependentControls.split(',');
    for (var i = 0; i < controls.length; i++) {
        if (controls[i] != "") {
            $('#' + controls[i]).trigger('ReadyIt', dependencyID);
        }
    }

}
   

/* @@ FEATURES PICKER
   ==================================================================== */   
   
var _featuresPicker_cssclass = 'featuresPicker';

function Setup_FeaturesPicker(cid_control, cid_selectedValue, url_dataSource, requestTimeout, maxResults, ready, propertyTypeID, searchPurposeID, autoPostBack, navigateURL, queryStringSource, queryStringSourceValue, languageID, searchID, queryStringRootSearchID, queryStringParentSearchID) {

    var $ddlControl = $('#' + cid_control);
    
    $ddlControl.SetupFeaturesPicker({
        cid_control: cid_control,
        cid_selectedValue: cid_selectedValue,
        url_dataSource: url_dataSource,
        requestTimeout: requestTimeout,
        maxResults: maxResults,
        ready: ready,
        propertyTypeID: propertyTypeID,
        searchPurposeID: searchPurposeID,
        autoPostBack: Boolean(autoPostBack),
        navigateURL: navigateURL,
        queryStringSource: queryStringSource,
        queryStringSourceValue: queryStringSourceValue,
        languageID: languageID,
        searchID: searchID,
        queryStringRootSearchID: queryStringRootSearchID,
        queryStringParentSearchID: queryStringParentSearchID
    });
   
};


(function($) {
    $.fn.SetupFeaturesPicker = function(pluginSettings) {

        var defaultSettings = {
            cid_control: '',
            cid_selectedValue: '',
            url_dataSource: '',
            requestTimeout: 7000,
            css_classes: {
                control: 'featuresPicker',
                control_loader: 'featuresLoader'
            },
            maxResults: 0,
            ready: false,
            propertyTypeID: 0,
            searchPurposeID: 0,
            autoPostBack: false,
            navigateURL: '',
            queryStringSource: '',
            queryStringSourceValue: '',
            languageID: 'pt-PT',
            searchID: 0,
            queryStringRootSearchID: '',
            queryStringParentSearchID: ''
        };
        var $settings = $.extend(defaultSettings, pluginSettings);


        return this.each(function() {

            var $stage = $(this)
            var $selectedValue = $('#' + $settings.cid_selectedValue);

            $(this).addClass(_featuresPicker_cssclass)

            var defaultSelectedValue = $selectedValue.val();

            //            var $loader = $('<span></span>').addClass($settings.css_classes.control_loader);
            //            $stage.append($loader);

    
            var purposeID, typeID;


            // @ EXTERNAL COMUNICATION SETUP
            // --------------------------------------------------------------------

            $(this).bind('ReloadFeaturesPicker', function(event) {

                purposeID = GetSearchPurposeID();
                typeID = GetPropertyTypeID();
                    
                RequestAndTriggerBindings(typeID, purposeID);

            });


            $(this).bind('ReadyFeaturesPicker', function(event, dependencyID) {
                $settings.ready = true;
            });




            // @ DATA MANAGEMENT (REQUEST & LOAD)
            // --------------------------------------------------------------------

            function RequestAndTriggerBindings(propertyTypeID, searchPurposeID) {

                if ($settings.ready) {

                    DataUnbind();

                    if ($settings.url_dataSource != '') {

                        $.ajax({
                            type: 'GET',
                            dataType: 'json',
                            processData: true,
                            timeout: $settings.requestTimeout,
                            url: $settings.url_dataSource,
                            data: {
                                propertyTypeID: propertyTypeID,
                                searchPurposeID: searchPurposeID,
                                languageID: $settings.languageID
                            },
                            error: function(request, status, error) {
                                //alert('Error: ' + status);
                            },
                            success: function(data) {
                                DataBind(data);
                            }
                        });

                    }
                    else {
                        alert('DataSource URL not defined!');
                    }

                }

            };


            function DataBind(dataSource) {

                if (dataSource.records.length > 0) {

                    var $ulFeatures = $('<ul></ul>');

                    $.each(dataSource.records, function(index, record) {

                        var $ckFeature_input = $('<input type="checkbox">').attr('id', $settings.cid_control + '_' + record.value);
                        var $ckFeature_label = $('<label></label>').attr('for', $settings.cid_control + '_' + record.value).text(record.text);
                        var $ckFeature = $('<li></li>').append($ckFeature_input).append($ckFeature_label);

                        var isSelected = false;
                        if ($selectedValue.val() != '') {
                            var vSelectedValues = $selectedValue.val().split(',');
                            $.each(vSelectedValues, function(index, val){
                                if (val == record.value) {
                                    isSelected = true;
                                }
                            });
                        }

                        if (isSelected) {
                            CheckTheBox($ckFeature_input, true);
                        }

                        $ckFeature_input.change(function() {
                            CheckTheBox($(this), false);
                        });

                        $ulFeatures.append($ckFeature);

                    });

                    $stage.append($ulFeatures);

                    $stage.slideDown();

                }

            };

            function DataUnbind() {
                $stage.children('ul').remove()
                $stage.hide();
                $selectedValue.val(defaultSelectedValue);
            };


            function CheckTheBox($ck, autoCheck) {

                // 1. obter o id da checkbox e o estado da mesma
                var ckID = $ck.attr('id').toString(); ckID = ckID.substr(ckID.indexOf('_') + 1, ckID.length - 1);
                var isChecked = $ck.is(':checked');

                if (!$settings.autoPostBack) {
                    StoreValues(ckID, isChecked);
                }
                else {
                    RedirectAsSearch(ckID, isChecked, autoCheck);
                }

                // 6. se a função foi invocada programaticamente, e não pelo click na checkbox, tenho que forçar a marcação da checkbox
                if (autoCheck) {
                    $ck.attr('checked', true);
                }

            };


            function StoreValues(ckID, isChecked) {

                // 2. obter o valor do hiddenfield de selectedValues
                var currentValues = $selectedValue.val();

                // 3. acrescentar ou remover o id da checkbox clicada dos selectedValues
                if (isChecked) {
                    // 3.1. acrescentar
                    currentValues += "," + ckID;
                }
                else {
                    if (currentValues.length > 0) {
                        // 3.2. remover
                        var values = currentValues.split(",");
                        var newValues = '';

                        if (values.length>0){
                            for (i = 0; i < values.length; i++) {
                                if (values[i] != ckID) {
                                    newValues += values[i] + ',';
                                }
                            }
                        }

                        if (newValues.endsWith(',')) {
                            newValues = newValues.substring(0, newValues.length - 1);
                        }
                        currentValues = newValues;
                       
                    }
                }

                // 4. remover o separador registo inicial, caso exista
                if (currentValues.startsWith(',')) {
                    currentValues = currentValues.substr(1);
                }

                // 5. atribuir o novo selectedValue ao hiddenfield
                $selectedValue.val(currentValues);


            };


            function RedirectAsSearch(ckID, isChecked, autoCheck) {

                if (!autoCheck) {

                    // desabilitar controlo para evitar mais cliques enquanto o pedido não é processado
                    $stage.fadeTo('fast', 0.5);
                    /*
                    $stage.bind('click', function() {
                        return false;
                    });
                    */

                    var currentURL = $.jqURL.url(),
                        featuresValues = $.jqURL.get('features');

                    if (featuresValues === undefined) {
                        featuresValues = '';
                    }
                    else {
                        // acrescento a virgula ao inicio
                        featuresValues = ',' + featuresValues;
                    }

                    // retiro a barra do final, caso exista (URL friendlys)
                    featuresValues = featuresValues.replace('/', '');


                    if (!isChecked) {
                        featuresValues = featuresValues.replace(',' + ckID, '');
                    }
                    else {
                        featuresValues += ',' + ckID
                    }


                    // removo a virgula ao inicio
                    if (featuresValues.startsWith(',')) {
                        featuresValues = featuresValues.substr(1);
                    }

                    var newURL;

                    if (featuresValues.length > 0) {
                        
                        var qsObj = {};
                        qsObj[$settings.queryStringSource] = $settings.queryStringSourceValue;
                        qsObj['features'] = featuresValues
                        qsObj['page'] = -1;

                        // search trail
                        qsObj[$settings.queryStringParentSearchID] = $settings.searchID;
                        if ($.jqURL.get($settings.queryStringRootSearchID) == undefined) {
                            qsObj[$settings.queryStringRootSearchID] = $settings.searchID;
                        }

                        newURL = $.jqURL.set(qsObj);
                    }
                    else {

                        newURL = $.jqURL.strip({
                            keys: 'features'
                        });
                    }

                    window.location = newURL;
                    
                }

            };


            // @ COMUNICATION WITH PARENT CONTROLS
            // --------------------------------------------------------------------


            function GetSearchPurposeID() {
                // se existe algum ID definido no controlo (ordenado pelo proprio servidor) uso-o
                if ($settings.searchPurposeID > 0){
                    return Number($settings.searchPurposeID);
                    }
                // senão uso o ID armazenado na variavel partilhada entre as tabs-do-finder e a dropdown-tipo-imovel                    
                else {
                    return Number(__current_purposeID);
                    }
            };

            function GetPropertyTypeID() {
                // se existe algum ID definido no controlo (ordenado pelo proprio servidor) uso-o
                if ($settings.propertyTypeID > 0)
                    return Number($settings.propertyTypeID);
                // senão uso o ID armazenado na variavel partilhada entre as tabs-do-finder e a dropdown-tipo-imovel                          
                else
                    return Number(__current_typeID);
            };



            // @ DATA MANAGEMENT (REQUEST & LOAD)
            // --------------------------------------------------------------------


            RequestAndTriggerBindings($settings.propertyTypeID, $settings.searchPurposeID);


        });

    };
})(jQuery);


// @ EXTERNAL COMUNICATION HANDLERS
// --------------------------------------------------------------------

function TriggerFeaturesPickerReload() {
    $('#cklFeatures').trigger('ReloadFeaturesPicker');
};


function SetAsReady_Features(dependentControls, dependencyID) {
    $('.' + _featuresPicker_cssclass).trigger('ReadyFeaturesPicker', 0);
}   




   
