jQuery(document).ready(function(){

    var selectedPractices, selectedPracticeTemplate, practiceSelectorButton;

    function initPracticeSelector()
    {
        var fieldBox = jQuery('form .practiceSelectorFieldBox');
        if (!fieldBox.size())
        {
            return;
        }

        var practiceDropdown =  fieldBox.find('select');
        if (!practiceDropdown.size())
        {
            return;
        }

        var url = getPracticesSelectorUrl();
        if (!url)
        {
            return;
        }

        selectedPractices = jQuery('.selectedPractices');
        selectedPractices.removeClass('selectedPracticesHidden');

        // create button
        var labelHtml = practiceDropdown.parents('.fieldBox:first').find('label').html();
        var button    = jQuery('<button type="button" class="practiceSelectorButton"><span>' + labelHtml + ':</span></button>');
        button.click(openPracticeSelector);
        practiceDropdown.replaceWith(button);

        practiceSelectorButton = button;

        // remove template from DOM and store in variable
        selectedPracticeTemplate = jQuery('.selectedPracticeTemplate');
        selectedPracticeTemplate.remove().removeClass('selectedPracticeTemplate');
    }

    function openPracticeSelector()
    {
        if (!jQuery('.practiceSelector').size())
        {
            return loadPracticeSelector();
        }

        showPracticeSelector();
    }

    function getPracticesSelectorUrl()
    {
        var url = jQuery('.mainMenuBox li.practices-section a').attr('href');
        if (!url)
        {
            return null;
        }

        url = url.concat('?block=practiceSelectorDialog&random='.concat(Math.random().toString()));

        return url;
    }

    function loadPracticeSelector()
    {
        var url = getPracticesSelectorUrl();
        if (!url)
        {
            return;
        }

        var selector = jQuery('<div class="box practiceSelector hiddenPracticeSelector"></div>');
        selector.appendTo('body > .mainContainer');

        // selector.load( url, null, loadPracticeSelectorCallback );
        jQuery.get(url,null,loadPracticeSelectorCallback);
    }

    function loadPracticeSelectorCallback(data, textStatus, XMLHttpRequest)
    {
        jQuery('.practiceSelector').html('<div>'.concat(data, '</div>'));

        var toolBox = jQuery('.practiceSelector .toolBox');
        toolBox.find('.checkAll').click( checkAll );
        toolBox.find('.uncheckAll').click( uncheckAll );

        jQuery('.practiceSelectorTree .group h4').click(function(e){

            var group = jQuery(this).parents('li.group:first');

            var unCheckedItemsExist = !!group.find('input[type=checkbox]').not(':checked').size();
            if (unCheckedItemsExist)
            {
                checkAll(e, group);
            }
            else
            {
                uncheckAll(e, group);
            }

        });

        jQuery('.practiceSelector .practiceSelectorOk').click( closePracticeSelector );

        showPracticeSelector();
    }

    function showPracticeSelector()
    {
        initSelectorValues();

        var mainContainer = jQuery('body > .mainContainer');

        var headerHeight = mainContainer.find('.header').outerHeight(true);
        var footerHeight = jQuery('body > .footerContainer').outerHeight();
        var pageHeight   = mainContainer.height() - footerHeight - headerHeight;

        var selectorHeight = jQuery('.practiceSelector').outerHeight(true);

        if (selectorHeight > pageHeight)
        {
            // page not high enough for dialog to be shown
            mainContainer.height( selectorHeight + footerHeight + headerHeight )
        }

        var css = { 'top' : headerHeight + 'px' };
        jQuery('.practiceSelector').css(css).removeClass('hiddenPracticeSelector');

        hideWindowedControls();

        jQuery(document).bind('keyup', practiceSelectorKeyHandler);

        practiceSelectorButton.blur();
    }

    function closePracticeSelector()
    {
        setSelectorValues();

        hidePracticeSelector();
    }

    function hidePracticeSelector()
    {
        jQuery('.practiceSelector').addClass('hiddenPracticeSelector');
        jQuery('body > .mainContainer').height('auto');

        restoreWindowedControls();

        jQuery(document).unbind('keyup', practiceSelectorKeyHandler);

        // practiceSelectorButton.focus();
    }

    function practiceSelectorKeyHandler(e)
    {
        if (e.which == 13)
        {
            closePracticeSelector();
            e.preventDefault();
            e.stopImmediatePropagation();
            return false;
        }

        if (e.which == 27)
        {
            hidePracticeSelector();
            e.preventDefault();
            e.stopImmediatePropagation();
            return false;
        }
    }



    function massCheck(on, container)
    {
        if (typeof container == 'undefined')
        {
            container = '.practiceSelectorTree';
        }
        container = jQuery(container);

        var boxes = container.find('input[type=checkbox]');


        if (on)
        {

            boxes.attr('checked', 'checked');
        }
        else
        {
            boxes.removeAttr('checked');
        }
    }

    function checkAll( e, container )
    {
        massCheck(true, container);
        this.blur();
    }

    function uncheckAll( e, container)
    {
        massCheck(false, container);
        this.blur();
    }

    function setSelectorValues()
    {
        // copy values from dialog to original form
        selectedPractices.empty();

        var checkboxes = jQuery('.practiceSelector input[type=checkbox]');
        var checkedCheckboxes = checkboxes.filter(':checked');


        if (
            (checkedCheckboxes.size() == 0)
            ||
            (checkedCheckboxes.size() == checkboxes.size())
        )
        {
            var item = selectedPracticeTemplate.clone(true);
            item.find('input').remove();
            item.find('.name').html(jQuery('.allPractices').val());
            selectedPractices.append(item);
            return;
        }

        checkedCheckboxes.each(function()
        {
            var item = selectedPracticeTemplate.clone(true);
            item.find('input').val(this.value);
            item.find('.name').html(jQuery(this).parents('li:first').find('label').html());
            selectedPractices.append(item);
        });

        return;
    }

    function initSelectorValues()
    {
        // check items in dialog according to fields in the form
        var checkboxes = jQuery('.practiceSelector input[type=checkbox]');

        var values = [];

        selectedPractices.find('.selectedPractice input[type=hidden]').each(function(){
             values[values.length] = this.value;
        });

        var filter = function(index)
        {
            if (jQuery.inArray(this.value, values) === -1)
            {
                return false;
            }
            return true;
        }

        checkboxes.removeAttr('checked');
        if (values.length > 0)
        {
            checkboxes.filter(filter).attr('checked', 'checked');
        }

        return;

    }


    function getWindowedControls()
    {
        return jQuery('select').add('object');
    }

    function hideWindowedControls()
    {
        if (typeof lawinIe6 == 'undefined')
        {
            return false;
        }

        getWindowedControls().each(function(){
            this.originalVisibility = this.currentStyle.visibility;
            this.style.visibility = 'hidden';
        });
    }

    function restoreWindowedControls()
    {
        if (typeof lawinIe6 == 'undefined')
        {
            return false;
        }
        getWindowedControls().each(function(){
            this.style.visibility = this.originalVisibility;

        });
    }

    initPracticeSelector();

});



