/**
 * Created by alex on 4/8/14.
 */


var toggleables = {

    toggleAnchor : null,

    hideElements : function(elements) {
        if (undefined != this.toggleAnchor.attr('data-toggle-hide-animation') && this.toggleAnchor.attr('data-toggle-hide-animation') != "") {
            var options = JSON.parse(this.toggleAnchor.attr('data-toggle-hide-animation-options'));
            elements.hide(this.toggleAnchor.attr('data-toggle-hide-animation'),options,500);
        } else {
            elements.hide();
        }
    },

    showElements : function(elements) {
        if (undefined != this.toggleAnchor.attr('data-toggle-show-animation') &&  this.toggleAnchor.attr('data-toggle-show-animation') != "") {
            var options = JSON.parse(this.toggleAnchor.attr('data-toggle-show-animation-options'));
            elements.show(this.toggleAnchor.attr('data-toggle-show-animation'),options,500);
        } else {
            elements.show();
        }
    },

    toggleAction : function(element) {
        var elem = $(element);

        this.toggleAnchor = elem;

        var newToggleClass = (element.value || elem.attr('data-toggle-value')).split(',');

        if (elem.is('select') && elem.attr('data-toggle-value')) {
            newToggleClass = [elem.attr('data-toggle-value') + " ." + element.value];
        }

        $.each(newToggleClass, function(idx,cls) {
            if (cls.indexOf('.') == -1 && cls.indexOf('#') == -1) {
                newToggleClass[idx] = "." + cls;
            }
        });



        //get not hide classes from checkboxes if any
        var noHideSelector = "";
        $.each($('input.toggle'),function(idx,toggleElem){
            if (toggleElem.type.toUpperCase() == 'CHECKBOX' && toggleElem.checked) {
                noHideSelector += ":not(.toggleable." + toggleElem.value + ")";
            }
        });

        var defaultHideSelector = '.toggleable';
        var showSelector = '';
        var hideSelector = '';



        $.each(newToggleClass, function(idx,toggleClass){
            defaultHideSelector += ':not(' + toggleClass + '.toggleable)';
            showSelector += ((idx > 0) ? ',' : '') + toggleClass + '.toggleable:not(:visible)';
            hideSelector += ((idx > 0) ? ',' : '') + toggleClass + '.toggleable.:not(:hidden)';
        });
        defaultHideSelector += noHideSelector;

        var newDefaultHide = "";
        var includeRoot = false;
        $.each(newToggleClass, function(idx,toggleClass) {
            if (toggleClass.indexOf(' ') != -1 || toggleClass.indexOf('>') != -1) {
                if (toggleClass.indexOf(' ') != -1) {
                    newDefaultHide += ((idx > 0) ? ',' : '') + toggleClass.substr(0,toggleClass.indexOf(' ')+1) + defaultHideSelector;
                }
                if (toggleClass.indexOf('>') != -1) {
                    newDefaultHide += ((idx > 0) ? ',' : '') + toggleClass.substr(0,toggleClass.indexOf('>')+1) + defaultHideSelector;
                }
            } else {
                includeRoot = true;
            }
        });

        if (includeRoot == false && newDefaultHide != '') {
            defaultHideSelector = newDefaultHide;
        }

        this.hideElements($(defaultHideSelector));

        if (element.type != undefined && element.type.toUpperCase() =='CHECKBOX') {
            if (element.checked == false) {
                this.hideElements($(hideSelector));
            } else {
                this.showElements($(showSelector));
            }
        } else {
            this.showElements($(showSelector));
        }

        //execute window resize event, to help render responsive widgets
        $(window).resize();

    },

    init : function() {

        $(".toggle:not(#desc .toggle)").click(function(){
            toggleables.toggleAction(this);
        });
        $(".toggle:not(#desc .toggle)").change(function(){
            toggleables.toggleAction(this);
        });

        var notHideSelector = ""; //constructed from toggles
        $.each($('.toggle[data-toggle-default-visible="true"]'),function(idx,toggleCtrl) {

            var toggleClasses = $(toggleCtrl).attr('data-toggle-value').split(" ");
            $.each(toggleClasses, function(classIdx,className){
                if (className != "") {
                    notHideSelector += ":not(" + className + ")";
                }
            });

        });

        //hide toggleables
        $(".toggleable:not(.toggleable.toggleable-visible):not(#desc .toggleable)" + notHideSelector).hide();
    }

};

$(function() {
    toggleables.init();
});

