// jQuery initalisation
var default_min_panel_width = 1080;
var default_min_panel_height = 460;
var default_max_panel_width = 1310;
var default_max_panel_height = 807;
var restrained_max_panel_width = 960;
var restrained_max_panel_height = 628;
var homepage_max_panel_width = 964;
var signup_max_panel_width = 388;
var signup_max_panel_height = 420;
var signup_min_panel_width = 388;
var signup_min_panel_height = 420;
var max_horizontal_padding = 60;
var not_homepage = true;

$(document).ready(function() {
  $(window).resize(autoresize);
  not_homepage = ( $('body#Homepage').length == 0 );
  if (!(not_homepage)) {
    resize_panel_internals();
  }
  autoresize();
  if (!(not_homepage)) {
    resize_panel_internals();
    autoresize();
  }
});

function ajax_internal_resize() {
  $('.loading_animation').removeClass('loading_animation');
  $('.loading_info_box').removeClass('loading_info_box');
  resize_panel_internals();
}

function autoresize() {
  var jq_MainWrapper = $('#MainWrapper');
  var jq_Panel = $('#Panel');
  var panel_width = jq_Panel.width();
  var panel_height = jq_Panel.height();
  var window_width = $(window).width();
  var window_height = $(window).height();
  var new_panel_width = panel_width;
  var new_panel_height = panel_height;
  var panel_has_been_resized = false;

  // Set up sizing rules based on classnames
  var min_panel_width = default_min_panel_width;
  var min_panel_height = default_min_panel_height;
  var max_panel_width = default_max_panel_width;
  var max_panel_height = default_max_panel_height;

  if (jq_MainWrapper.is('.restrained, .restrained_onecol')) {
    max_panel_width = restrained_max_panel_width;
    max_panel_height = restrained_max_panel_height;
  }

  if (jq_MainWrapper.is('.signup')) {
    max_panel_width = signup_max_panel_width;
    max_panel_height = signup_max_panel_height;
    min_panel_width = signup_min_panel_width;
    min_panel_height = signup_min_panel_height;
    var viewer_height = $('div#viewer').height() + 40;
  }

  if (!(not_homepage)) {
    max_panel_width = homepage_max_panel_width;
    max_panel_height = panel_height;
    min_panel_height = panel_height;
    min_panel_width = homepage_max_panel_width;
  }

  var horizontal_padding = window_width - max_panel_width;
  if (horizontal_padding < 20) {
    horizontal_padding = 20;
    new_panel_width = window_width - 20;
    if (new_panel_width < min_panel_width) {
      new_panel_width = min_panel_width;
    }
  } else if (panel_width < max_panel_width) {
    new_panel_width = max_panel_width;
  }
  if (horizontal_padding > max_horizontal_padding) {
    horizontal_padding = max_horizontal_padding;
  }


  var vertical_padding = window_height - max_panel_height;
  var top_vertical_padding;
  var bottom_vertical_padding;

  if (not_homepage) {
    if (vertical_padding < 70) {
      vertical_padding = 70;
      new_panel_height = window_height - 70;
      if (new_panel_height < min_panel_height) {
        new_panel_height = min_panel_height;
      }
    } else if (panel_height < max_panel_height) {
      new_panel_height = max_panel_height;
    }
    top_vertical_padding = Math.floor(vertical_padding / 2) - 25;
    bottom_vertical_padding = vertical_padding - top_vertical_padding;
  } else {
    if (vertical_padding < 80) {
      vertical_padding = 80;
      new_panel_height = window_height - 80;
      if (new_panel_height < min_panel_height) {
        new_panel_height = min_panel_height;
      }
    } else if (panel_height < max_panel_height) {
      new_panel_height = max_panel_height;
    }
    top_vertical_padding = Math.floor(vertical_padding / 2);
    bottom_vertical_padding = vertical_padding - top_vertical_padding;
  }

  $('table#MainWrapper tbody tr td.tl').css("width", ( horizontal_padding / 2 ));
  $('table#MainWrapper tbody tr td.tr').css("width", ( horizontal_padding - ( horizontal_padding / 2 ) ));
  $('table#MainWrapper tbody tr td.tl').css("height", top_vertical_padding);
  $('table#MainWrapper tbody tr td.bl').css("height", bottom_vertical_padding);
  $('table#MainWrapper tbody tr td.bcl').css("height", bottom_vertical_padding);
  $('table#MainWrapper tbody tr td.bcr').css("height", bottom_vertical_padding);

  /* if (( new_panel_width != panel_width ) || ( new_panel_height != panel_height )) {
   $('div#notifications_pane>div').css("width", new_panel_width);
   } */

  if (( new_panel_width != panel_width ) || ( new_panel_height != panel_height )) {
    jq_Panel.css("width", new_panel_width);
    if (not_homepage) {
      jq_Panel.css("height", new_panel_height);
    }
    panel_has_been_resized = true;
  }

  // Rule out scrollbar changes - the size of the viewport may change based on the resizing
  window_width = $(window).width();
  window_height = $(window).height();

  panel_width = new_panel_width;      // Shorthand
  panel_height = new_panel_height;    // Shorthand


  var horizontal_diff = window_width - ( panel_width + horizontal_padding );
  if (horizontal_diff > 0) {
    if (panel_width == max_panel_width) {
      horizontal_padding += horizontal_diff;
      if (horizontal_padding > max_horizontal_padding) {
        horizontal_padding = max_horizontal_padding;
      }
      $('table#MainWrapper tbody tr td.tl').css("width", ( horizontal_padding / 2 ));
      $('table#MainWrapper tbody tr td.tr').css("width", ( horizontal_padding - ( horizontal_padding / 2 ) ));
    } else {
      if (panel_width > max_panel_width) {
        panel_width = max_panel_width;
      }
      panel_width += horizontal_diff;
      jq_Panel.css("width", panel_width);
      panel_has_been_resized = true;
    }
  } else if (horizontal_diff < 0) {
    if (( panel_width > min_panel_width ) && ( ( horizontal_padding + horizontal_diff ) > 19 )) {
      horizontal_padding += horizontal_diff;
      if (horizontal_padding > max_horizontal_padding) {
        horizontal_padding = max_horizontal_padding;
      }
      $('table#MainWrapper tbody tr td.tl').css("width", ( horizontal_padding / 2 ));
      $('table#MainWrapper tbody tr td.tr').css("width", ( horizontal_padding - ( horizontal_padding / 2 ) ));
    } else {
      panel_width += horizontal_diff;
      if (panel_width < min_panel_width) {
        panel_width = min_panel_width;
      }
      jq_Panel.css("width", panel_width);
      panel_has_been_resized = true;
    }
  }

  if (not_homepage) {
    var vertical_diff = window_height - ( panel_height + vertical_padding );
    if (vertical_diff > 0) {
      if (panel_height == max_panel_height) {
        vertical_padding += vertical_diff;
        $('table#MainWrapper tbody tr td.tl').css("height", ( ( vertical_padding / 2 ) - 25 ));
        $('table#MainWrapper tbody tr td.bl').css("height", ( vertical_padding - ( vertical_padding / 2 ) + 25 ));
        $('table#MainWrapper tbody tr td.bcl').css("height", ( vertical_padding - ( vertical_padding / 2 ) + 25 ));
        $('table#MainWrapper tbody tr td.bcr').css("height", ( vertical_padding - ( vertical_padding / 2 ) + 25 ));
      } else {
        panel_height += vertical_diff;
        if (panel_height > max_panel_height) {
          panel_height = max_panel_height;
        }
        jq_Panel.css("height", panel_height);
        panel_has_been_resized = true;
      }
    } else if (vertical_diff < 0) {
      if (( panel_height > min_panel_height ) && ( ( vertical_padding + vertical_diff ) > 69 )) {
        vertical_padding += vertical_diff;
        $('table#MainWrapper tbody tr td.tl').css("height", ( ( vertical_padding / 2 ) - 25 ));
        $('table#MainWrapper tbody tr td.bl').css("height", ( vertical_padding - ( vertical_padding / 2 ) + 25 ));
        $('table#MainWrapper tbody tr td.bcl').css("height", ( vertical_padding - ( vertical_padding / 2 ) + 25 ));
        $('table#MainWrapper tbody tr td.bcr').css("height", ( vertical_padding - ( vertical_padding / 2 ) + 25 ));
      } else {
        panel_height += vertical_diff;
        if (panel_height < min_panel_height) {
          panel_height = min_panel_height;
        }
        jq_Panel.css("height", panel_height);
        panel_has_been_resized = true;
      }
    }
  }

  // Set table width, just in case
  $('table#MainWrapper').css("width", horizontal_padding + panel_width);
  $('table#MainWrapper').css("height", vertical_padding + panel_height);

  if (panel_has_been_resized) {
    resize_panel_internals();
  }
}

function resize_panel_internals() {
  internalResize.fix_header_and_footer_width();
  internalResize.clear_panes();
  internalResize.resize_grab_space();
  internalResize.resize_stretchers();
  internalResize.reposition_elements();
  internalResize.resize_panes();
  internalResize.resize_info_boxes();
  internalResize.firefox_bug_workaround();
}

var internalResize = {
  fix_header_and_footer_width : function() {
    if (not_homepage) {
      $('div#Panel div.panel').each(function() {
        var width = $(this).width();
        $(this).find('div.header, div.footer').css("width", width);
      });
    }
  },
  clear_panes : function() {
    $('.pane').css({'width': '', 'height': ''});
  },
  resize_grab_space : function() {
    // Resize "space grabbers"
    $('div#Panel .grab_space_container .grab_space').hide();
    $('div#Panel .grab_space_container .grab_space').css({'width': ''});
    $('div#Panel .grab_space_container .search_button').css({'width': ''});

    // Sort by nesting depth, ascending
    var full_width_objs = [];
    $('div#Panel .grab_space_container').each(function() {
      if ($(this).parents('.hidden').length == 0) {
        full_width_objs.push($(this));
      }
    });
    full_width_objs = full_width_objs.sort(internalResize.jq_sort_nesting_depth);

    for (var i = 0; i < full_width_objs.length; i++) {
      // Add up widths of all elements
      var jq_obj = full_width_objs[i];
      var grab_obj = jq_obj.children('.grab_space');
      var remaining_width = jq_obj.width();
      jq_obj.children().each(function() {
        // No need to exclude .grab_spaces from here... they are always going
        // to have an offsetWidth of 0 when hidden
        remaining_width -= $(this)[0].offsetWidth;
      });
      grab_obj.show();
      if (grab_obj.is('input') && !(grab_obj.parents("form#SearchForm") )) {
        remaining_width -= 1;
      }
      grab_obj.css("width", remaining_width - ( grab_obj[0].offsetWidth - grab_obj.width() ));
    }

    // Firefox fix
    if ($.browser.mozilla) {
      $('form#SearchForm div.search_box').each(function(i) {
        var jq_obj = $(this);
        jq_obj.width(jq_obj.width() - 1);
        var search_button = jq_obj.find('a.search_button');
        search_button.width(search_button.width() - 1);
      });
    }

  },
  resize_stretchers : function(filter) {
    filter = filter || '';
    $('div#Panel ' +filter+' .vertical_stretch_on').removeClass('vertical_stretch_on');
    $('div#Panel ' +filter+' .horizontal_stretch_on').removeClass('horizontal_stretch_on');
    $('div#Panel ' +filter+' .expand_vertically').each(function() {
      var jq_obj = $(this);
      var offset_element = jq_obj.offset().top;
      var offset_panel = jq_obj.parents('div.header').offset().top;
      var jq_obj_top = offset_element - offset_panel;
      jq_obj.css("top", jq_obj_top);

      if (jq_obj.is('.not_alone')) {
        var last_obj = jq_obj.next('.after_expander').eq(0);
        jq_obj.css("bottom", last_obj[0].offsetHeight);
        jq_obj.next().eq(0).addClass('reposition_to_bottom');
      }
    });
    $('div#Panel ' +filter+' .expand_horizontally').each(function() {
      var jq_obj = $(this);
      var offset_element = jq_obj.offset().left;
      var offset_panel = jq_obj.parents('div.header').offset().left;
      jq_obj.css("left", offset_element - offset_panel);
    });

    $('div#Panel ' +filter+' .expand_vertically').addClass('vertical_stretch_on');
    $('div#Panel ' +filter+' .expand_horizontally').addClass('horizontal_stretch_on');
  },
  reposition_elements : function() {
    $('.reposition_to_bottom').each(function() {
      var jq_obj = $(this);
      var stretcher = jq_obj.prev(".expand_vertically").eq(0);
      jq_obj.css('marginTop', stretcher[0].offsetHeight);
    });
  },
  resize_panes : function() {
    var panes_objs = [];
    $('div#Panel .panes').each(function() {
      panes_objs.push($(this));
    });
    panes_objs = panes_objs.sort(internalResize.jq_sort_nesting_depth);

    for (var i = 0; i < panes_objs.length; i++) {
      var jq_obj = panes_objs[i];
      var units = 0;
      var remaining_width = jq_obj.width();
      var unit_width = 0;
      var max_height = 0;

      jq_obj.children('.pane').each(function() {
        units += 1;
        if ($(this).hasClass("double_pane"))
          units += 1;
      });

      unit_width = Math.floor(remaining_width / units);
      jq_obj.children('.pane').each(function() {
        var internal_width = unit_width;
        if ($(this).hasClass("double_pane"))
          internal_width = unit_width * 2;
        internal_width -= $(this)[0].offsetWidth - $(this).width();

        $(this).css("width", internal_width);
//         Record element height if heighest
        try {
          $(this).css("height", "inherit");
        } catch (e){
          $(this).css("height", "100%");
        }

        var el_height = $(this).height();
        if (el_height > max_height)
          max_height = el_height;
      });
      jq_obj.children('.pane').css("height", max_height);
    }
  },
  resize_info_boxes :function() {
    $('div#Panel .info_box table').each(function() {
      var jq_obj = $(this);
      jq_obj.css("width", "100%");
      jq_obj.css("width", jq_obj.width() + 20);
    });
  },
  firefox_bug_workaround : function() {
    // Hack for FF 1px bug
    var hack_width = $('form#SearchForm .search_box a').width();
    $('form#SearchForm .search_box a').width((hack_width + 1));
    $('form#SearchForm .search_box a').width(hack_width);
  },
  jq_sort_nesting_depth : function(a, b) {
    return a.parents().length - b.parents().length;
  }
};