/*
  SortTable popup menus
  Version 1
  September 2008
  Niklas Martinsson

Events:
  onGetPopup(cell)       - Get popup for header cell, default element with id='sortablePopupMenu'

Functions:
  hidePopup()            - Hides popup and returns header cell if popup was visible
  popupSortAscending()   - Popup: Sort ascending. Popup example: <tr class="sortable_col_sortable"><td><a onclick="sorttable.popupSortAscending()">Sort ascending</a>
  popupSortDescending()  - Popup: Sort descending
  popupSortNone()        - Popup: Remove sort
  popupSortGroup()       - Popup: Group by column
  popupSortRemGroup()    - Popup: Remove group by
  popupDelCol()          - Popup: Delete column

Classes:
  sortable_col_sortable  - Popup: Column is sortade
  sortable_col_deletable - Popup: Column is deletable
  sortable_col_groupable - Popup: Column is groupable
  sortable_col_remgroup  - Popup: Table is grouped
  sortable_col_insert    - Popup: There are deleted columns

Popup example:
 <script type="text/javascript" src="sorttable.js"></script>
 <script type="text/javascript" src="sorttablePopup.js"></script>
 <script type="text/javascript" src="sorttableCollapse.js"></script>
 <style><!--
  .popup a {cursor: default;}
  .popup tr:hover {background-color: #37c; color: white;}
  .popup td {padding-right: 8px; padding-left: 8px;}
  .popup th {padding-right: 2px; padding-left: 2px; background-color: white;}
  .popupdiv {height: 1px; width: 100%; border-top: 1px solid #bbb;}
 --></style>

 <div class="popup" id="sortablePopupMenu" style="display: none; position: absolute; background-color: #999; padding: 0px;">
  <div style="position: relative; top:-2px; left:-2px; background-color: white; padding: 0px; border: 1px solid #bbb;">
   <table>
    <tr class="sortable_col_sortable" ><td><a onclick="sorttable.popupSortAscending()" >Sort ascending</a>
    <tr class="sortable_col_sortable" ><td><a onclick="sorttable.popupSortDescending()">Sort descending</a>
    <tr class="sortable_col_sortable" ><td><a onclick="sorttable.popupSortNone()"      >Remove sort</a>
    <tr class="sortable_col_sortable" ><th><div class="popupdiv" />
    <tr class="sortable_col_groupable"><td><a onclick="sorttable.popupSortGroup()"     >Group by column</a>
    <tr class="sortable_col_remgroup" ><td><a onclick="sorttable.popupSortRemGroup()"  >Remove group by</a>
    <tr class="sortable_col_groupable"><th><div class="popupdiv" />
    <tr class="sortable_col_deletable"><td><a onclick="sorttable.popupDelCol()"        >Delete column</a>
   </table>
  </div>
 </div>
*/

function eventInElement(event, element)
{
  var t=event.target?event.target:event.srcElement; var e=element;
  if (t==e){return true;}else{while ((t=t.parentNode)!=null) {if (t==e) return true;}}
  return false;
};

dean_addEvent(document, 'mousedown',
  function(e) {
    if (sorttable.popup)
      if (!eventInElement(e, sorttable.popup))
        sorttable.hidePopup();
  }
);

sorttable.hidePopup = function() {
  var cell = sorttable.popupCell;
  if (sorttable.popup) {
    sorttable.popup.style.display = 'none';
    sorttable.popup = null;
    sorttable.popupCell = null;
  }
  return cell;
};

sorttable.columnHeaderContextMenu = function(e) {
  e.preventDefault();
  e.stopPropagation();
  sorttable.hidePopup();
  sorttable.popup = sorttable.getPopup(this);
  if (sorttable.popup)
  {
    var scrollTop = document.body.scrollTop ? document.body.scrollTop : document.documentElement.scrollTop;
    var scrollLeft = document.body.scrollLeft ? document.body.scrollLeft : document.documentElement.scrollLeft;
    sorttable.popup.style.top = e.clientY + scrollTop + 'px';
    sorttable.popup.style.left = e.clientX + scrollLeft + 'px';
    sorttable.popup.style.display = 'block';
    sorttable.popupCell = this;
  }
};

sorttable.onGetPopup = function(cell) {
  return document.getElementById('sortablePopupMenu');
}

sorttable.getPopup = function(cell) {
  var table = cell.sorttable_table;
  var index = cell.sorttable_columnindex;
  changeCSS('.sortable_col_sortable', sorttable.allowSort(cell)?'':'display:none');
  changeCSS('.sortable_col_deletable', sorttable.allowColumnDelete(cell)?'':'display:none');
  changeCSS('.sortable_col_insert', table.deletedColumns>0?'':'display:none');
  changeCSS('.sortable_col_groupable', sorttable.allowGroup(cell)?'':'display:none');
  changeCSS('.sortable_col_remgroup', table.sortable_grouped?'':'display:none');
  return sorttable.onGetPopup(cell);
};

sorttable.popupSortAscending = function() {
  sorttable.columnHeaderSort(sorttable.hidePopup(), "asc");
};

sorttable.popupSortDescending = function() {
  sorttable.columnHeaderSort(sorttable.hidePopup(), "desc");
};

sorttable.popupSortNone = function() {
  sorttable.columnHeaderSort(sorttable.hidePopup(), "none");
};

sorttable.popupDelCol = function() {
  var cell = sorttable.hidePopup();
  var table = cell.sorttable_table;
  sorttable.deleteColumn(table, cell.sorttable_columnindex);
};

sorttable.popupSortGroup = function() {
  sorttable.groupBy(sorttable.hidePopup());
};

sorttable.popupSortRemGroup = function() {
  sorttable.removeGroupBy(sorttable.hidePopup());
};

