var tab_per_page = 20;
var tab_content;
var tab_load_base;
$(document).ready(function(){

  // some shortcuts
  tab_content = $('div.tab_content');
  var tab_ajax    = tab_content.find('a.more').length;
  var tab_boxes   = tab_content.find('div.tab_body');

  // apply click events to main tabs
  tab_content.find('div.tab_nav li a').click(function() {

    // select this tab and de-select others 
    $(this).parents("ul").find("li").removeClass("selected");
    $(this).parent().addClass("selected");

    // hide all quiz listings
    tab_boxes.addClass("hidden");

    // get tab body for this tab
    var tab_body = tab_content.find(
      "a[name=" + $(this).attr("href").replace(/^#/, "") + "]"
    ).parents("div.tab_body");

    var quiz_listing = tab_body.find('table.quiz_listing');

    if (tab_ajax) {

      if (quiz_listing.find('tbody tr').length) {

        // make sure first page of quizzes is showing
        quiz_listing.find('tbody tr:gt(' + (tab_per_page -1) + ')').addClass("hidden");
        quiz_listing.find('tbody tr:lt(' + tab_per_page + ')').removeClass("hidden");
        // make sure more link is visible
        tab_body.find('span a.more').removeClass('hidden');

      } else {

        // load first page of quizzes
        tabbox_load_more(quiz_listing);

      }

    } else {

      // make sure first of three more links is selected
      tab_body.find('span a:not(:first)').addClass('hidden');
      tab_body.find('span a:first').removeClass('hidden');

      // make sure first page of quizzes are showing
      quiz_listing.find('tr:gt(' + tab_per_page + ')').addClass("hidden");
      quiz_listing.find('tr:lt(' + (tab_per_page + 1) + ')').removeClass("hidden");

    }

    // unhide relevant quiz listing and load all images in this tab now
    tab_body.removeClass('hidden').find('img.avatar').each(function(){
      if ($(this).data('src-original')) {
        $(this).attr('src', $(this).data('src-original'));
      }
    });

    if (quiz_listing.find('tbody tr:visible').length < tab_per_page) {
      tab_body.find('div.footer').find('a.more').addClass('hidden');
    } else {
      tab_body.find('div.footer').find('a.more').removeClass('hidden');
    }

    return false;
  });

  // apply click events to more links
  if (tab_ajax) {

    // apply ajax load event
    tab_boxes.find('a.more').click(function(){
      var table_elem = $(this).parents("div.box").find("table.quiz_listing");
      tabbox_load_more(table_elem);
      return false;
    });

    tab_content.find('div.search form').submit(function(){
      search_event();
      return false;
    });
    tab_content.find('div.search form :checkbox').click(search_event);

  } else {

    // apply js to show more quizzes to more links
    tab_boxes.each(function(){
      $(this).find("div.footer span a:not(:last)").click(function() {

        var table_elem = $(this).parents("div.box").find("table.quiz_listing");

        if (tabbox_more(table_elem)) {
          $(this).addClass("hidden").next().removeClass("hidden");
          return false;
        } else {
          return true;
        }

      });
    });

  }

  // make the first tab active by clicking on it
  if (tab_content.find('div.tab_nav li.active a').length) {
    tab_content.find('div.tab_nav li.active a:first').click();
  } else if (document.location.hash &&
             tab_content.find("div.tab_nav li a[href='" +
                              document.location.hash + "']").length) {
    tab_content.find("div.tab_nav li a[href='" +
                     document.location.hash + "']").click();
  } else {
    tab_content.find('div.tab_nav li a:first').click();
  }

  // don't load images in hidden tabs yet
  tab_boxes.filter(':hidden').find('img.avatar').each(function(){
    $(this).data(
      'src-original', $(this).attr("src")
    ).attr(
      'src', 'static/images/spacer.gif'
    );
  });

  // does nothing at the moment
  // tab_content('div.box p.title").addClass("hidden");

});

function search_event() {
  var table = tab_content.find('div.search').siblings('table.quiz_listing');
  table.find('tbody').remove();
  tabbox_load_more(table);
}

function tabbox_load_more(table_elem) {

  var rows = table_elem.find('tbody tr');
  var last_visible = 0;
  for (var i = 0; i < rows.length; i++) {
    if (!$(rows[i]).hasClass('hidden')) {
      last_visible = i;
    }
  }

  var load_page;

  if (last_visible) {

    if (rows.length > last_visible + 1) {

      // the rows we want to show are already on the page, show them
      rows.filter(':visible').addClass('hidden');
      var start = last_visible + 1;
      rows.slice(start, start + tab_per_page).removeClass('hidden');
      return;

    } else {

      // we need to get the next page from the server
      load_page = Math.ceil((last_visible + 1) / tab_per_page) + 1;

    }

  } else {

    // we need to load the first page
    load_page = 1;

  }

  var type = table_elem.siblings('a:first').attr('name');

  var params = {
    page:     load_page,
    per_page: tab_per_page
  };

  if (type == 'search') {
    tab_content.find('div.search :input').each(function(){
      if ($(this).attr('type') == 'text' ||
          ($(this).attr('type') == 'checkbox' && $(this).attr('checked'))) {
        if (params[$(this).attr('name')]) {
          if (typeof(params[$(this).attr('name')]) == 'object') {
            params[$(this).attr('name')].push($(this).val());
          } else {
            params[$(this).attr('name')] =
              [params[$(this).attr('name')], $(this).val()];
          }
        } else {
          params[$(this).attr('name')] = $(this).val();
        }
      }
    });
    if (!params['q']) {
      table_elem.find('tbody').remove();
      return;
    }
  } else {
    params['type'] = type;
  }

  // set request url to grab data from
  if (!tab_load_base) {
    tab_load_base = $('base').attr('href');
  }

  var more_link = table_elem.siblings('div.footer').find('a.more');

  var more_spinner;
  if (type == 'search' && load_page == 1) {
    more_spinner = $('div.search form img');
    if (!more_spinner.length) {
      more_spinner = $('<img src="static/images/ajax-loader.gif">').css({
        'margin-left' : '5px'
      });
      $('div.search form input[type=submit]').after(more_spinner);
    }
  } else {
    more_spinner = more_link.siblings('img');
  }
  more_spinner.removeClass('hidden');

  var new_tbody = $('<tbody>');
  new_tbody.load(
    tab_load_base,
    params,
    function(){

      // hide old rows and add new rows
      rows.addClass('hidden');
      table_elem.append(new_tbody);

      // hide more link if we are out of items
      if (new_tbody.find('tr').length < tab_per_page) {
        more_link.addClass('hidden');
      } else {
        more_link.removeClass('hidden');
      }
      more_spinner.addClass('hidden');

      // run optional custom function
      try {
        finish_tab_load();
      } catch(e) {
      };

    }
  );

}

// show more links in a list
function tabbox_more(table_elem) {
  var rows = table_elem.find("tr");
  var last_visible = 0;
  for (var i = 1; i < rows.length; i++) {
    if (!$(rows[i]).hasClass('hidden')) {
      last_visible = i;
    }
  }
  var min = last_visible + 1;
  if (!table_elem.find('tr:eq(' + min + ')').length) {
    return false;
  }
  var max = min + tab_per_page;
  table_elem.find("tr").removeClass("hidden");  
  table_elem.find("tr:lt(" + min + ")").addClass("hidden");
  table_elem.find("tr:gt(" + (max - 1) + ")").addClass("hidden");
  table_elem.find("tr:first").removeClass("hidden");
  return true;
}
