/*
* jQuery UI Multilevel Accordion v.1
* 
* Copyright (c) 2011 Pieter Pareit
*
* http://www.scriptbreaker.com
*
*/

//plugin definition
(function ($) {
  $.fn.extend({

    //pass the options variable to the function
    accordion: function (options) {

      var defaults = {
        accordion: 'true',
        speed: 300,
        closedSign: '[+]',
        openedSign: '[-]'
      };

      // Extend our default options with those provided.
      var opts = $.extend(defaults, options);
      //Assign current element to variable, in this case is UL element
      var $this = $(this);

      //add a mark [+] to a multilevel menu
      $this.find("li").each(function () {
        if ($(this).find("ul").size() != 0) {
          //add the multilevel sign next to the link
          $(this).find("a:first").append("<span>" + opts.closedSign + "</span>");

          //avoid jumping to the top of the page when the href is an #
          if ($(this).find("a:first").attr('href') == "#") {
            $(this).find("a:first").click(function () { return false; });
          }
        }
      });

      //open active level
      $this.find("li.active").each(function () {
        $(this).parents("ul").slideDown(opts.speed);
        $(this).parents("ul").parent("li").find("span:first").html(opts.openedSign);
      });

      $this.find("li a").click(function () {
        if ($(this).parent().find("ul").size() != 0) {
          if (opts.accordion) {
            //Do nothing when the list is open
            if (!$(this).parent().find("ul").is(':visible')) {
              parents = $(this).parent().parents("ul");
              visible = $this.find("ul:visible");
              visible.each(function (visibleIndex) {
                var close = true;
                parents.each(function (parentIndex) {
                  if (parents[parentIndex] == visible[visibleIndex]) {
                    close = false;
                    return false;
                  }
                });
                if (close) {
                  if ($(this).parent().find("ul") != visible[visibleIndex]) {
                    $(visible[visibleIndex]).slideUp(opts.speed, function () {
                      $(this).parent("li").find("span:first").html(opts.closedSign);
                    });

                  }
                }
              });
            }
          }
          if ($(this).parent().find("ul:first").is(":visible")) {
            $(this).parent().find("ul:first").slideUp(opts.speed, function () {
              $(this).parent("li").find("span:first").delay(opts.speed).html(opts.closedSign);
            });


          } else {
            $(this).parent().find("ul:first").slideDown(opts.speed, function () {
              $(this).parent("li").find("span:first").delay(opts.speed).html(opts.openedSign);
            });
          }
        }
      });
    }
  });
})(jQuery);
