(function($){

  $.fn.groupMultipleSelector = function(options) {

    var settings = jQuery.extend({
      preventControls: false
    }, options);

    var isIe67 = ($.browser.msie && $.browser.version.substr(0,1)<=7);
    var isInit = true;

    return this.each(function() {

      var obj = $(this);
      $('.grouped-items-list', obj).hide();

      var groups = new Object;
      var groupKeys = [];

      var groupMaxSel = $('.group-selection-max', obj).val();

      // Get groups
      var $groupContainer = $('.grouped-items-list-content .groups', obj);
      var $itemContainer = $('.grouped-items-list-content .items', obj);
      var $groupCheckboxes = $('input', $groupContainer);
      var $selectedItemTextBox = $('.grouped-items-textbox input', obj);

      $selectedItemTextBox.data('default-text', $selectedItemTextBox.attr('title'));

      var tgt = $('.grouped-items-list', obj);
      // tgt.data('prevent-controls', settings.preventControls);

      $('.grouped-items-textbox, .grouped-items-textbox input', obj).bind('click', function() {

        var currentPopup = $('body').data('search-popup');

        if (currentPopup && tgt.get(0) == currentPopup.get(0)) {
          return false;
        }

        if (currentPopup) {
          currentPopup.trigger('onclose');
          currentPopup.fadeOut('fast');
        }

        tgt.fadeIn('fast');

        if (isIe67 && settings.preventControls) {
          $(settings.preventControls).css('visibility', 'hidden');
        }

        $('body').data('search-popup', tgt);
        return false;
      });

      tgt.bind('onclose', function() {
        if (isIe67 && settings.preventControls) {
          $(settings.preventControls).css('visibility', 'visible');
        }
      });

      $('.close-button', obj).bind('click', function(){
        var tgt = $('.grouped-items-list', obj);

        tgt.trigger('onclose');
        tgt.fadeOut('fast');

        /*
        if (settings.preventControls) {
          $(settings.preventControls).css('visibility', 'visible');
        }
        */

        var currentPopup = $('body').data('search-popup');
        if (currentPopup && currentPopup.get(0) == tgt.get(0)) {
          $('body').data('search-popup', '');
        }

        return false;
      });

      obj.data('selected-text-box', $selectedItemTextBox);
      obj.data('group-container', $groupContainer);

      $groupCheckboxes.each(function() {
        var v = $(this).val();
        var maxSel = $('.group-childitems-'+v+'-selection-max', obj).val();
        var itemContainer = $('.group-childitems-'+v, obj);

        groupKeys.push(v);

        groups[v] = new Object;
        groups[v].groupKey = v;
        groups[v].e = $(this);
        groups[v].label = $('label[for='+this.id+']', obj).html(); // label sibling of checkbox
        if (!groups[v].label) { // checkbox wrapped in label
          groups[v].label = $('span', $(this).parent()).html();
        }
        groups[v].maxSelection = $('.group-childitems-'+v+'-selection-max', obj).val();
        groups[v].itemContainer = itemContainer;
        groups[v].hasItems = itemContainer.length > 0;

        // itemContainer.hide();

        $(this).bind('change', function() {

          clearTextBoxValue(obj);

          //
          var countCheck = 0;
          var $checkedGroups = $('input:checked', $groupContainer);

          if ($checkedGroups.length >= groupMaxSel) {
            $groupCheckboxes.each(function() {
              if ($(this).is(':checked') && countCheck < groupMaxSel) {
                countCheck++;
              }
              else
              {
                $(this).removeAttr('checked').attr('disabled', 'disabled');
                $(this).siblings('span').css('color', 'gray');
                
              }
            });
          }
          else {
            $groupCheckboxes.removeAttr('disabled');
          }

          refreshChildItemVisibility($groupContainer, $itemContainer, obj);

          if (!isInit && $(this).is(':checked'))
          {
            var $childItemContainer = $('.group-childitems-'+v, $itemContainer);
            if ($childItemContainer.length)
            {
              $itemContainer.scrollTo($childItemContainer, 150);
            }
          }
          //
          updateTextBoxValue(obj);

        }).bind('click', function() {
          $(this).trigger('change');
        });

        $('.group-childitems-'+v, $itemContainer).data('max-selection', maxSel);

        var subitemList = $('.group-childitems-'+v+' dd', $itemContainer);

        $('input[type=checkbox]', subitemList).bind('change', function() {

          refreshChildItemSelection(subitemList, maxSel);

          updateTextBoxValue(obj);
        }).bind('click', function() {
          $(this).trigger('change');
        });

        refreshChildItemSelection(subitemList, maxSel);
      });

      obj.data('groups', groups);
      obj.data('groupKeys', groupKeys);
      obj.data('groupContainer', $groupContainer);
      obj.data('groupMaxSel', groupMaxSel);

      $($groupCheckboxes.get(0)).trigger('change');

      isInit = false;
    });
  };


  function clearTextBoxValue($obj)
  {
    $obj.data('selected-text-box').val('');
  }

  function updateTextBoxValue($obj)
  {
    var $selectedItemTextBox = $obj.data('selected-text-box');
    var groupKeys = $obj.data('groupKeys');
    var groupData = $obj.data('groups');

    var districts = [];

    for (var i = 0; i < groupKeys.length; i++) {
      var group = groupData[groupKeys[i]];

      if (group.e.is(':checked')) {
        if (group.hasItems) {
          $('input:checked', group.itemContainer).each(function() {
            districts.push($('span', $(this).parent()).html());
          });
        }
        else
        {
          districts.push(group.label);
        }
      }
    }

    if (districts && districts.length > 0) {
      $selectedItemTextBox.val(districts.join(', ')).removeClass('blur');
    }
    else {
      $selectedItemTextBox.val($selectedItemTextBox.data('default-text')).addClass('blur');
    }
  }

  function refreshChildItemVisibility($groupContainer, $itemContainer, $obj)
  {
    $('input', $groupContainer).each(function() {
      var v = $(this).val();

      var maxSel = $('.group-childitems-'+v, $itemContainer).data('max-selection');

      if ($(this).is(':checked')) {

        var subitemList = $('.group-childitems-'+v+' dd', $itemContainer);
        refreshChildItemSelection(subitemList, maxSel);

        $('.group-childitems-'+v, $itemContainer).fadeIn('fast');
        $('.group-childitems-'+v+' input', $itemContainer).siblings('span').css('color', 'black');
      }
      else {
        $('.group-childitems-'+v+' input', $itemContainer).removeAttr('checked').attr('disabled', 'disabled');
        $('.group-childitems-'+v+' input', $itemContainer).siblings('span').css('color', 'gray');
        $('.group-childitems-'+v, $itemContainer).removeAttr('checked')/*.fadeOut('fast')*/;
      }
    });
  }

  function refreshChildItemSelection($itemList, maxSel)
  {
    var $checkedItems = $('input:checked', $itemList);

    if ($checkedItems.length >= maxSel) {
      $('input:not(:checked)', $itemList).attr('disabled', 'disabled');
      $('input:not(:checked)', $itemList).siblings('span').css('color', 'gray');
    }
    else {
      $('input', $itemList).removeAttr('disabled');
      $('input:not(:checked)', $itemList).siblings('span').css('color', 'black');
    }
  }

})(jQuery);

