// created by Ilya Lebedev ilya@lebedev.net

/**
* Script is used to sort tables.
**/
function SortTable (t) {
  /**
  *  Used to define substring for default sorting column
  */
  var defSort = 'def_sort';
  /**
  *  Identifies sortable rows and columns.
  */
  var sAttrVal = 'sortable';
  /**
  *  Decimal charcode for arrow up
  */
  var arrowUp = 9660;
  /**
  *  Decimal charcode for arrow down
  */
  var arrowDown = 9650;
  /**
  *  class name for the arrow
  */
  var arrowClass = 'arrow';
  /**
  *   Sort in descending order
  */
  var sortDesc = true;
  /**
  *   Sort using case sensitive comparision
  */
  var caseSensitiveSort = false;

  var self = this;
  var sortA = new Array();
  var curCol;
  var columns = new Array();
  var idx = 2;

  __constructor (t);
  function __constructor (t) {
    var tn = document.createTextNode(String.fromCharCode(arrowUp));
    arrowUp = document.createElement("SPAN");
    arrowUp.appendChild(tn);
    arrowUp.className = arrowClass;

    var tn = document.createTextNode(String.fromCharCode(arrowDown));
    arrowDown = document.createElement("SPAN");
    arrowDown.appendChild(tn);
    arrowDown.className = arrowClass;

    if (t.tagName.toLowerCase() !== 'table') return null;
    var thead = t.getElementsByTagName('thead');
    if (thead.length <1) return null;
    var th = thead.item(0).getElementsByTagName('th');
    if (th.length <1) return null;
    var tbody = t.getElementsByTagName('tbody');
    var tr = tbody.item(0).getElementsByTagName('tr');
    var trL = tr.length;
    for (var i=0;i<trL;i++) {
      if (tr.item(i).className.indexOf(sAttrVal)>-1) {
        var td = tr.item(i).getElementsByTagName('td');
        var tdL = td.length;
        var fld = new Array();
        var id = idx;
        for (var k=0;k<tdL;k++) {
          if (td.item(k).className.indexOf(sAttrVal)>-1) {
            // got the sortable cell....
            var thClass = String(Object(th.item(id-idx)).className);
            if (thClass.indexOf('type:')>-1) {
              fld[id] = getCParsed(td.item(k),thClass.substr(thClass.indexOf('type:')+5));
            } else {
              fld[id] = getC (td.item(k));
            }
            id++;
          }
        }
        if (fld.length>0) {
          fld[0] = 'rown'+i;
          tr.item(i).setAttribute('id','rown'+i);
          var cnL = tr.item(i).childNodes.length;
          var childsHTML = new Array();
          for (var z=0;z<cnL;z++) childsHTML[childsHTML.length] = tr.item(i).childNodes.item(z).innerHTML;
          fld[1] = childsHTML;
          sortA[sortA.length] = fld;
        }
      }
    }
    if (sortA.length<2) return null;
    var m = Math.min(sortA[0].length,th.length);
    for (var k=0;k<m;k++) {
      if (String(th.item(k).getAttribute('id')).indexOf(defSort)>-1) th.item(k).appendChild(!sortDesc?arrowDown:arrowUp);
      th.item(k).attachEvent('onclick',sr);
      var thC = th.item(k).childNodes;
      var thCL = thC.length;
      for (var i=0;i<thCL;i++) {
        if (thC.item(i).nodeType==1)
          if (thC.item(i).tagName.toLowerCase() == 'a')
            thC.item(i).removeNode();
          else {
            thC.item(i).attachEvent('onclick',sr);
            thC.item(i).style.cursor = 'hand';
        }
      }
      th.item(k).colNum = k+idx;
      th.item(k).style.cursor = 'hand';
    }
  }
  function sr(e) {
    var dl = window.event ? window.event.srcElement : e.currentTarget;
    var d = Object(getParent(dl,'TH'));
    if (curCol == d.colNum) {
      d.sortDesc = !d.sortDesc;
    } else {
      d.sortDesc = sortDesc;
      curCol = d.colNum;
    }
    if (d.sortDesc) {
      d.appendChild(arrowDown);
      if (arrowUp.parentNode) arrowUp.removeNode(true);
    } else {
      d.appendChild(arrowUp);
      if (arrowDown.parentNode) arrowDown.removeNode(true);
    }
    if (columns[curCol]) {
      var sortB = columns[curCol].copy();
      if (!d.sortDesc) sortB.reverse();
    } else {
      var sortB = sortA.copy();
      sortB.sort(_sort);
      columns[curCol] = sortB;
    }
    var aL = sortA.length;
    for (var i=0;i<aL;i++) {
      var curR = document.getElementById(sortA[i][0]);
      var bL = curR.childNodes.length;
        for (var k=0;k<bL;k++) {
          curR.childNodes.item(k).innerHTML = sortB[i][1][k];
        }
    }
	tooltip.d(); // !!!! Заново инициализируем Тултипы. Если они не используются, строчку убрать !!!
    return false;
  }
  /**
  *  Functions below are cut off
  *  http://htmlcoder.visions.ru/JavaScript/?22
  */
  function _sort (an, bn) {
    var a = an[curCol];
    var b = bn[curCol];
    if (Number(a) && Number(b)) var r = _sortNum(a, b);
    else if (!caseSensitiveSort) var r = _sortCaseInsensitive(a, b);
    else var r = _sortCaseSensitive(a, b);
    if (sortDesc) return r;
    else return (0-r);
  }
  function _sortNum(a, b) {
    return a - b;
  }
  function _sortCaseInsensitive(a, b) {
    var anew = a.toLowerCase();
    var bnew = b.toLowerCase();
    if (anew < bnew) return -1;
    if (anew > bnew) return 1;
    return 0;
  }
  function _sortCaseSensitive(a, b) {
    if (a < b) return -1;
    if (a > b) return 1;
    return 0;
  }
  function getCParsed (o,t) {
    var t = t.substring(0,t.indexOf(" ")>-1?t.indexOf(" "):t.length);
    switch (t) {
      case "date":
        var c = getC(o).split(/\D/).reverse().join("/");
        return Date.parse(c);
        break;
      default :
        return getC(o);
    }
  }
  function getC (n) {
    var _r = "";
    if (n == null) return _r;
    var c = n.childNodes;
    var i = 0;
    while (i < c.length) {
      var child = c.item(i);
      switch (child.nodeType) {
       case 1: // ELEMENT_NODE
       case 5: // ENTITY_REFERENCE_NODE
         _r += getC(child);
         break;
       case 3: // TEXT_NODE
       case 2: // ATTRIBUTE_NODE
       case 4: // CDATA_SECTION_NODE
         _r += child.nodeValue;
         break;
       case 6: // ENTITY_NODE
       case 7: // PROCESSING_INSTRUCTION_NODE
       case 8: // COMMENT_NODE
       case 9: // DOCUMENT_NODE
       case 10: // DOCUMENT_TYPE_NODE
       case 11: // DOCUMENT_FRAGMENT_NODE
       case 12: // NOTATION_NODE
                // skip
         break;
      }
      i++;
    }
    return _r;
  }
  /**
  *  cut off http://webfx.eae.net/dhtml/tablesort/tablesort.html
  */
  function getParent(el, pTagName) {
    if (el == null)
      return null;
    else
      if (el.nodeType == 1 && el.tagName.toLowerCase() == pTagName.toLowerCase())        // Gecko bug, supposed to be uppercase
        return el;
      else
        return getParent(el.parentNode, pTagName);
  }
}

DoSortTable = {
  /**
  *  Defines class for sortable table
  */
  c: "sortable",
  init: function () {
    var t = document.getElementsByTagName('table');
    var tL = t.length;
    for (var i=0;i<tL;i++) {
      var table = t.item(i);
      if (table.className.indexOf(DoSortTable.c)>-1) {
        new SortTable(table);
      }
    }
  }
}
if (window.attachEvent) window.attachEvent("onload",DoSortTable.init);
else document.attachEvent("onload",DoSortTable.init)
