jQuery.MindShop = function(container, options){
  var $container = jQuery(container);
  var state;
  var base_index = {};
  var rendered = false;

  function setup_events(){
    jQuery(document).bind('iselect', function(event, data){
      state = data.state;
      rendered ? refresh_select() : render();
    });
    jQuery('.iselect-select-checkbox').live('click',function(){
      var checkbox = this.id.split('-');
      mindsteps.iSelect.setBit(state.name, base_index[checkbox[0]] + parseInt(checkbox[1]), $(this).attr('checked'));
    });
    jQuery('.tab-toolbox-icon-area').click(function(){
      mindsteps.iSelect.clearSelection(state.name);
    });
    jQuery('#iselect-tab-results a').live('click', function(){
      display_results();
    });
    jQuery('#iselect-tab-details a').live('click', function(){
      display_details();
      jQuery('#iselect-tileview').trigger('details');
    });
    jQuery('#iselect-tab-compare a').live('click', function(){
      display_compare();
      jQuery('#iselect-tileview').trigger('compare');
    });
    jQuery(document).bind('iselect-details', function(){
      display_details();
    });
  }

  function render(){
    calc_base_index();
    render_lookup();
    render_select();
    $(document).trigger('rendered');
    rendered = true;
  }

  function calc_base_index(){
    for(var l=0;l<state.lookup.length;l++){
      var group = state.lookup[l][0];
      base_index[group] = mindsteps.iSelect.getBaseIndex(state.name, group);
    }
  }

  function render_lookup(){
    var i;
    var data = new Array();
    for(var r=0;r<(state.lookup.length/4);r++){
      data[r] = { checkbox:[] };
      for(var c=0;c<4;c++){
        i = r*4+c;
        if(state.lookup[i]!=undefined){
          data[r].checkbox.push({ label:state.lookup[i][0], value:i, id:i });
        }
      }
    }
    var node = jQuery('.templates .iselect-lookup').bindTo(data);
    jQuery('#iselect-lookup').html(node);
  }

  function render_select(){
    var i;
    var name;
    var selects;
    var data = new Array();
    var checked = '';
    var disabled = '';
    for(var a=0;a<state.lookup.length;a++){
      name = state.lookup[a][0];
      selects = state.lookup[a][1];
      data[a] = { group:name, id:a, row:[] };
      for(var r=0;r<(selects.length/4);r++){
        data[a].row[r] = { checkbox:[] };
        for(var s=0;s<4;s++){
          i = r*4+s;
          if(selects[i]!=undefined){
            is_set(state.selection, i + base_index[name]) ? checked = 'checked="true"' : checked = '';
            is_set(state.disabled, i + base_index[name]) ? disabled = 'disabled="true"' : disabled = '';
            data[a].row[r].checkbox.push({ label:selects[i], value:i, group:name, checked:checked, disabled:disabled });
          }
        }
      }
    }
    var node = jQuery('.templates .iselect-select').bindTo(data);
    jQuery('#iselect-select').html(node);
  }

  function is_set(array, index){
    return (array[Math.floor(index / 32)] & window.BitField.masks[index % 32]) != 0;
  }

  function refresh_select(){
    var $checkbox;
    for(var l=0;l<state.lookup.length;l++){
      name = state.lookup[l][0];
      selects = state.lookup[l][1];
      for(var s=0;s<(selects.length);s++){
        $checkbox = jQuery('[id='+name+'-'+s+']');
        if($checkbox.length>0){
          $checkbox.attr('checked', is_set(state.selection, s + base_index[name]) || is_set(state.preselection, s + base_index[name]));
          $checkbox.attr('disabled', is_set(state.disabled, s + base_index[name]) || is_set(state.preselection, s + base_index[name]));
        }
      }
    }
  }

  function display_results(){
    tab_show('results');
    tab_hide('details');
    tab_hide('compare');
  }

  function display_details(){
    tab_hide('results');
    tab_show('details');
    tab_hide('compare');
  }

  function display_compare(){
    tab_hide('results');
    tab_hide('details');
    tab_show('compare');
  }

  function tab_show(name){
    $tab = jQuery('#iselect-tab-'+name);
    $tab.attr('class','tab-on-left');
    jQuery('> div', $tab).attr('class','tab-on-right');
    jQuery('> div > div', $tab).attr('class','tab-header-text-on');
    $pane = jQuery('#iselect-pane-'+name);
    $pane.show();
  }

  function tab_hide(name){
    $tab = jQuery('#iselect-tab-'+name);
    $tab.attr('class','tab-off-left');
    jQuery('> div', $tab).attr('class','tab-off-right');
    jQuery('> div > div', $tab).attr('class','tab-header-text-off');
    $pane = jQuery('#iselect-pane-'+name);
    $pane.hide();
  }

  display_results();
  setup_events();
}

jQuery.fn.mindshop = function(options){
  this.each(function(){
    var container = this;
    options = jQuery.extend({}, jQuery.fn.mindshop.defaults, options);
    new jQuery.MindShop(container, options);
  });
  return this;
}

jQuery.fn.mindshop.defaults = {}
