<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>http://wiki-dofus.eu/w?action=history&amp;feed=atom&amp;title=MediaWiki%3ASortables.js</id>
	<title>MediaWiki:Sortables.js - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="http://wiki-dofus.eu/w?action=history&amp;feed=atom&amp;title=MediaWiki%3ASortables.js"/>
	<link rel="alternate" type="text/html" href="http://wiki-dofus.eu/w?title=MediaWiki:Sortables.js&amp;action=history"/>
	<updated>2026-04-07T22:49:48Z</updated>
	<subtitle>Historique des révisions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>http://wiki-dofus.eu/w?title=MediaWiki:Sortables.js&amp;diff=12631&amp;oldid=prev</id>
		<title>GyD le 2 septembre 2007 à 18:06</title>
		<link rel="alternate" type="text/html" href="http://wiki-dofus.eu/w?title=MediaWiki:Sortables.js&amp;diff=12631&amp;oldid=prev"/>
		<updated>2007-09-02T18:06:52Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/* &amp;lt;pre&amp;gt;&lt;br /&gt;
  SortTable&lt;br /&gt;
  version 2&lt;br /&gt;
  7th April 2007&lt;br /&gt;
  Stuart Langridge, http://www.kryogenix.org/code/browser/sorttable/&lt;br /&gt;
  &lt;br /&gt;
  Instructions:&lt;br /&gt;
  Download this file&lt;br /&gt;
  Add &amp;lt;script src=&amp;quot;sorttable.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt; to your HTML&lt;br /&gt;
  Add class=&amp;quot;sortable&amp;quot; to any table you'd like to make sortable&lt;br /&gt;
  Click on the headers to sort&lt;br /&gt;
  &lt;br /&gt;
  Thanks to many, many people for contributions and suggestions.&lt;br /&gt;
  Licenced as X11: http://www.kryogenix.org/code/browser/licence.html&lt;br /&gt;
  This basically means: do what you want with it.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
var stIsIE = /*@cc_on!@*/false;&lt;br /&gt;
&lt;br /&gt;
sorttable = {&lt;br /&gt;
  init: function() {&lt;br /&gt;
    // quit if this function has already been called&lt;br /&gt;
    if (arguments.callee.done) return;&lt;br /&gt;
    // flag this function so we don't do the same thing twice&lt;br /&gt;
    arguments.callee.done = true;&lt;br /&gt;
    // kill the timer&lt;br /&gt;
    if (_timer) clearInterval(_timer);&lt;br /&gt;
    &lt;br /&gt;
    if (!document.createElement || !document.getElementsByTagName) return;&lt;br /&gt;
    &lt;br /&gt;
    sorttable.DATE_RE = /^(\d\d?)[\/\.-](\d\d?)[\/\.-]((\d\d)?\d\d)$/;&lt;br /&gt;
    &lt;br /&gt;
    forEach(document.getElementsByTagName('table'), function(table) {&lt;br /&gt;
      if (table.className.search(/\bmy_sortable\b/) != -1) {&lt;br /&gt;
        sorttable.makeSortable(table);&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
    &lt;br /&gt;
  },&lt;br /&gt;
  &lt;br /&gt;
  makeSortable: function(table) {&lt;br /&gt;
    if (table.getElementsByTagName('thead').length == 0) {&lt;br /&gt;
      // table doesn't have a tHead. Since it should have, create one and&lt;br /&gt;
      // put the first table row in it.&lt;br /&gt;
      the = document.createElement('thead');&lt;br /&gt;
      the.appendChild(table.rows[0]);&lt;br /&gt;
      table.insertBefore(the,table.firstChild);&lt;br /&gt;
    }&lt;br /&gt;
    // Safari doesn't support table.tHead, sigh&lt;br /&gt;
    if (table.tHead == null) table.tHead = table.getElementsByTagName('thead')[0];&lt;br /&gt;
    &lt;br /&gt;
    if (table.tHead.rows.length != 1) return; // can't cope with two header rows&lt;br /&gt;
    &lt;br /&gt;
    // Sorttable v1 put rows with a class of &amp;quot;sortbottom&amp;quot; at the bottom (as&lt;br /&gt;
    // &amp;quot;total&amp;quot; rows, for example). This is B&amp;amp;R, since what you're supposed&lt;br /&gt;
    // to do is put them in a tfoot. So, if there are sortbottom rows,&lt;br /&gt;
    // for backwards compatibility, move them to tfoot (creating it if needed).&lt;br /&gt;
    sortbottomrows = [];&lt;br /&gt;
    for (var i=0; i&amp;lt;table.rows.length; i++) {&lt;br /&gt;
      if (table.rows[i].className.search(/\bsortbottom\b/) != -1) {&lt;br /&gt;
        sortbottomrows[sortbottomrows.length] = table.rows[i];&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    if (sortbottomrows) {&lt;br /&gt;
      if (table.tFoot == null) {&lt;br /&gt;
        // table doesn't have a tfoot. Create one.&lt;br /&gt;
        tfo = document.createElement('tfoot');&lt;br /&gt;
        table.appendChild(tfo);&lt;br /&gt;
      }&lt;br /&gt;
      for (var i=0; i&amp;lt;sortbottomrows.length; i++) {&lt;br /&gt;
        tfo.appendChild(sortbottomrows[i]);&lt;br /&gt;
      }&lt;br /&gt;
      delete sortbottomrows;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // work through each column and calculate its type&lt;br /&gt;
    headrow = table.tHead.rows[0].cells;&lt;br /&gt;
    for (var i=0; i&amp;lt;headrow.length; i++) {&lt;br /&gt;
      // manually override the type with a sorttable_type attribute&lt;br /&gt;
      if (!headrow[i].className.match(/\bsorttable_nosort\b/)) { // skip this col&lt;br /&gt;
        mtch = headrow[i].className.match(/\bsorttable_([a-z0-9]+)\b/);&lt;br /&gt;
        if (mtch) { override = mtch[1]; }&lt;br /&gt;
	      if (mtch &amp;amp;&amp;amp; typeof sorttable[&amp;quot;sort_&amp;quot;+override] == 'function') {&lt;br /&gt;
	        headrow[i].sorttable_sortfunction = sorttable[&amp;quot;sort_&amp;quot;+override];&lt;br /&gt;
	      } else {&lt;br /&gt;
	        headrow[i].sorttable_sortfunction = sorttable.guessType(table,i);&lt;br /&gt;
	      }&lt;br /&gt;
	      // make it clickable to sort&lt;br /&gt;
	      headrow[i].sorttable_columnindex = i;&lt;br /&gt;
	      headrow[i].sorttable_tbody = table.tBodies[0];&lt;br /&gt;
	      dean_addEvent(headrow[i],&amp;quot;click&amp;quot;, function(e) {&lt;br /&gt;
&lt;br /&gt;
          if (this.className.search(/\bsorttable_sorted\b/) != -1) {&lt;br /&gt;
            // if we're already sorted by this column, just &lt;br /&gt;
            // reverse the table, which is quicker&lt;br /&gt;
            sorttable.reverse(this.sorttable_tbody);&lt;br /&gt;
            this.className = this.className.replace('sorttable_sorted',&lt;br /&gt;
                                                    'sorttable_sorted_reverse');&lt;br /&gt;
            this.removeChild(document.getElementById('sorttable_sortfwdind'));&lt;br /&gt;
            sortrevind = document.createElement('span');&lt;br /&gt;
            sortrevind.id = &amp;quot;sorttable_sortrevind&amp;quot;;&lt;br /&gt;
            sortrevind.innerHTML = stIsIE ? '&amp;amp;nbsp&amp;lt;font face=&amp;quot;webdings&amp;quot;&amp;gt;5&amp;lt;/font&amp;gt;' : '&amp;amp;nbsp;&amp;amp;#x25B4;';&lt;br /&gt;
            this.appendChild(sortrevind);&lt;br /&gt;
            return;&lt;br /&gt;
          }&lt;br /&gt;
          if (this.className.search(/\bsorttable_sorted_reverse\b/) != -1) {&lt;br /&gt;
            // if we're already sorted by this column in reverse, just &lt;br /&gt;
            // re-reverse the table, which is quicker&lt;br /&gt;
            sorttable.reverse(this.sorttable_tbody);&lt;br /&gt;
            this.className = this.className.replace('sorttable_sorted_reverse',&lt;br /&gt;
                                                    'sorttable_sorted');&lt;br /&gt;
            this.removeChild(document.getElementById('sorttable_sortrevind'));&lt;br /&gt;
            sortfwdind = document.createElement('span');&lt;br /&gt;
            sortfwdind.id = &amp;quot;sorttable_sortfwdind&amp;quot;;&lt;br /&gt;
            sortfwdind.innerHTML = stIsIE ? '&amp;amp;nbsp&amp;lt;font face=&amp;quot;webdings&amp;quot;&amp;gt;6&amp;lt;/font&amp;gt;' : '&amp;amp;nbsp;&amp;amp;#x25BE;';&lt;br /&gt;
            this.appendChild(sortfwdind);&lt;br /&gt;
            return;&lt;br /&gt;
          }&lt;br /&gt;
          &lt;br /&gt;
          // remove sorttable_sorted classes&lt;br /&gt;
          theadrow = this.parentNode;&lt;br /&gt;
          forEach(theadrow.childNodes, function(cell) {&lt;br /&gt;
            if (cell.nodeType == 1) { // an element&lt;br /&gt;
              cell.className = cell.className.replace('sorttable_sorted_reverse','');&lt;br /&gt;
              cell.className = cell.className.replace('sorttable_sorted','');&lt;br /&gt;
            }&lt;br /&gt;
          });&lt;br /&gt;
          sortfwdind = document.getElementById('sorttable_sortfwdind');&lt;br /&gt;
          if (sortfwdind) { sortfwdind.parentNode.removeChild(sortfwdind); }&lt;br /&gt;
          sortrevind = document.getElementById('sorttable_sortrevind');&lt;br /&gt;
          if (sortrevind) { sortrevind.parentNode.removeChild(sortrevind); }&lt;br /&gt;
          &lt;br /&gt;
          this.className += ' sorttable_sorted';&lt;br /&gt;
          sortfwdind = document.createElement('span');&lt;br /&gt;
          sortfwdind.id = &amp;quot;sorttable_sortfwdind&amp;quot;;&lt;br /&gt;
          sortfwdind.innerHTML = stIsIE ? '&amp;amp;nbsp&amp;lt;font face=&amp;quot;webdings&amp;quot;&amp;gt;6&amp;lt;/font&amp;gt;' : '&amp;amp;nbsp;&amp;amp;#x25BE;';&lt;br /&gt;
          this.appendChild(sortfwdind);&lt;br /&gt;
&lt;br /&gt;
	        // build an array to sort. This is a Schwartzian transform thing,&lt;br /&gt;
	        // i.e., we &amp;quot;decorate&amp;quot; each row with the actual sort key,&lt;br /&gt;
	        // sort based on the sort keys, and then put the rows back in order&lt;br /&gt;
	        // which is a lot faster because you only do getInnerText once per row&lt;br /&gt;
	        row_array = [];&lt;br /&gt;
	        col = this.sorttable_columnindex;&lt;br /&gt;
	        rows = this.sorttable_tbody.rows;&lt;br /&gt;
	        for (var j=0; j&amp;lt;rows.length; j++) {&lt;br /&gt;
	          row_array[row_array.length] = [sorttable.getInnerText(rows[j].cells[col]), rows[j]];&lt;br /&gt;
	        }&lt;br /&gt;
	        /* If you want a stable sort, uncomment the following line */&lt;br /&gt;
	        //sorttable.shaker_sort(row_array, this.sorttable_sortfunction);&lt;br /&gt;
	        /* and comment out this one */&lt;br /&gt;
	        row_array.sort(this.sorttable_sortfunction);&lt;br /&gt;
	        &lt;br /&gt;
	        tb = this.sorttable_tbody;&lt;br /&gt;
	        for (var j=0; j&amp;lt;row_array.length; j++) {&lt;br /&gt;
	          tb.appendChild(row_array[j][1]);&lt;br /&gt;
	        }&lt;br /&gt;
	        &lt;br /&gt;
	        delete row_array;&lt;br /&gt;
	      });&lt;br /&gt;
	    }&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  &lt;br /&gt;
  guessType: function(table, column) {&lt;br /&gt;
    // guess the type of a column based on its first non-blank row&lt;br /&gt;
    sortfn = sorttable.sort_alpha;&lt;br /&gt;
    for (var i=0; i&amp;lt;table.tBodies[0].rows.length; i++) {&lt;br /&gt;
      text = sorttable.getInnerText(table.tBodies[0].rows[i].cells[column]);&lt;br /&gt;
      if (text != '') {&lt;br /&gt;
        if (text.match(/^-?[£$¤]?[\d,.]+%?$/)) {&lt;br /&gt;
          return sorttable.sort_numeric;&lt;br /&gt;
        }&lt;br /&gt;
        // check for a date: dd/mm/yyyy or dd/mm/yy &lt;br /&gt;
        // can have / or . or - as separator&lt;br /&gt;
        // can be mm/dd as well&lt;br /&gt;
        possdate = text.match(sorttable.DATE_RE)&lt;br /&gt;
        if (possdate) {&lt;br /&gt;
          // looks like a date&lt;br /&gt;
          first = parseInt(possdate[1]);&lt;br /&gt;
          second = parseInt(possdate[2]);&lt;br /&gt;
          if (first &amp;gt; 12) {&lt;br /&gt;
            // definitely dd/mm&lt;br /&gt;
            return sorttable.sort_ddmm;&lt;br /&gt;
          } else if (second &amp;gt; 12) {&lt;br /&gt;
            return sorttable.sort_mmdd;&lt;br /&gt;
          } else {&lt;br /&gt;
            // looks like a date, but we can't tell which, so assume&lt;br /&gt;
            // that it's dd/mm (English imperialism!) and keep looking&lt;br /&gt;
            sortfn = sorttable.sort_ddmm;&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return sortfn;&lt;br /&gt;
  },&lt;br /&gt;
  &lt;br /&gt;
  getInnerText: function(node) {&lt;br /&gt;
    // gets the text we want to use for sorting for a cell.&lt;br /&gt;
    // strips leading and trailing whitespace.&lt;br /&gt;
    // this is *not* a generic getInnerText function; it's special to sorttable.&lt;br /&gt;
    // for example, you can override the cell text with a customkey attribute.&lt;br /&gt;
    // it also gets .value for &amp;lt;input&amp;gt; fields.&lt;br /&gt;
    &lt;br /&gt;
    hasInputs = (typeof node.getElementsByTagName == 'function') &amp;amp;&amp;amp;&lt;br /&gt;
                 node.getElementsByTagName('input').length;&lt;br /&gt;
    &lt;br /&gt;
    if (node.getAttribute(&amp;quot;sorttable_customkey&amp;quot;) != null) {&lt;br /&gt;
      return node.getAttribute(&amp;quot;sorttable_customkey&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else if (typeof node.textContent != 'undefined' &amp;amp;&amp;amp; !hasInputs) {&lt;br /&gt;
      return node.textContent.replace(/^\s+|\s+$/g, '');&lt;br /&gt;
    }&lt;br /&gt;
    else if (typeof node.innerText != 'undefined' &amp;amp;&amp;amp; !hasInputs) {&lt;br /&gt;
      return node.innerText.replace(/^\s+|\s+$/g, '');&lt;br /&gt;
    }&lt;br /&gt;
    else if (typeof node.text != 'undefined' &amp;amp;&amp;amp; !hasInputs) {&lt;br /&gt;
      return node.text.replace(/^\s+|\s+$/g, '');&lt;br /&gt;
    }&lt;br /&gt;
    else {&lt;br /&gt;
      switch (node.nodeType) {&lt;br /&gt;
        case 3:&lt;br /&gt;
          if (node.nodeName.toLowerCase() == 'input') {&lt;br /&gt;
            return node.value.replace(/^\s+|\s+$/g, '');&lt;br /&gt;
          }&lt;br /&gt;
        case 4:&lt;br /&gt;
          return node.nodeValue.replace(/^\s+|\s+$/g, '');&lt;br /&gt;
          break;&lt;br /&gt;
        case 1:&lt;br /&gt;
        case 11:&lt;br /&gt;
          var innerText = '';&lt;br /&gt;
          for (var i = 0; i &amp;lt; node.childNodes.length; i++) {&lt;br /&gt;
            innerText += sorttable.getInnerText(node.childNodes[i]);&lt;br /&gt;
          }&lt;br /&gt;
          return innerText.replace(/^\s+|\s+$/g, '');&lt;br /&gt;
          break;&lt;br /&gt;
        default:&lt;br /&gt;
          return '';&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
  &lt;br /&gt;
  reverse: function(tbody) {&lt;br /&gt;
    // reverse the rows in a tbody&lt;br /&gt;
    newrows = [];&lt;br /&gt;
    for (var i=0; i&amp;lt;tbody.rows.length; i++) {&lt;br /&gt;
      newrows[newrows.length] = tbody.rows[i];&lt;br /&gt;
    }&lt;br /&gt;
    for (var i=newrows.length-1; i&amp;gt;=0; i--) {&lt;br /&gt;
       tbody.appendChild(newrows[i]);&lt;br /&gt;
    }&lt;br /&gt;
    delete newrows;&lt;br /&gt;
  },&lt;br /&gt;
  &lt;br /&gt;
  /* sort functions&lt;br /&gt;
     each sort function takes two parameters, a and b&lt;br /&gt;
     you are comparing a[0] and b[0] */&lt;br /&gt;
  sort_numeric: function(a,b) {&lt;br /&gt;
    aa = parseFloat(a[0].replace(/[^0-9.-]/g,''));&lt;br /&gt;
    if (isNaN(aa)) aa = 0;&lt;br /&gt;
    bb = parseFloat(b[0].replace(/[^0-9.-]/g,'')); &lt;br /&gt;
    if (isNaN(bb)) bb = 0;&lt;br /&gt;
    return aa-bb;&lt;br /&gt;
  },&lt;br /&gt;
  sort_alpha: function(a,b) {&lt;br /&gt;
    if (a[0]==b[0]) return 0;&lt;br /&gt;
    if (a[0]&amp;lt;b[0]) return -1;&lt;br /&gt;
    return 1;&lt;br /&gt;
  },&lt;br /&gt;
  sort_ddmm: function(a,b) {&lt;br /&gt;
    mtch = a[0].match(sorttable.DATE_RE);&lt;br /&gt;
    y = mtch[3]; m = mtch[2]; d = mtch[1];&lt;br /&gt;
    if (m.length == 1) m = '0'+m;&lt;br /&gt;
    if (d.length == 1) d = '0'+d;&lt;br /&gt;
    dt1 = y+m+d;&lt;br /&gt;
    mtch = b[0].match(sorttable.DATE_RE);&lt;br /&gt;
    y = mtch[3]; m = mtch[2]; d = mtch[1];&lt;br /&gt;
    if (m.length == 1) m = '0'+m;&lt;br /&gt;
    if (d.length == 1) d = '0'+d;&lt;br /&gt;
    dt2 = y+m+d;&lt;br /&gt;
    if (dt1==dt2) return 0;&lt;br /&gt;
    if (dt1&amp;lt;dt2) return -1;&lt;br /&gt;
    return 1;&lt;br /&gt;
  },&lt;br /&gt;
  sort_mmdd: function(a,b) {&lt;br /&gt;
    mtch = a[0].match(sorttable.DATE_RE);&lt;br /&gt;
    y = mtch[3]; d = mtch[2]; m = mtch[1];&lt;br /&gt;
    if (m.length == 1) m = '0'+m;&lt;br /&gt;
    if (d.length == 1) d = '0'+d;&lt;br /&gt;
    dt1 = y+m+d;&lt;br /&gt;
    mtch = b[0].match(sorttable.DATE_RE);&lt;br /&gt;
    y = mtch[3]; d = mtch[2]; m = mtch[1];&lt;br /&gt;
    if (m.length == 1) m = '0'+m;&lt;br /&gt;
    if (d.length == 1) d = '0'+d;&lt;br /&gt;
    dt2 = y+m+d;&lt;br /&gt;
    if (dt1==dt2) return 0;&lt;br /&gt;
    if (dt1&amp;lt;dt2) return -1;&lt;br /&gt;
    return 1;&lt;br /&gt;
  },&lt;br /&gt;
  &lt;br /&gt;
  shaker_sort: function(list, comp_func) {&lt;br /&gt;
    // A stable sort function to allow multi-level sorting of data&lt;br /&gt;
    // see: http://en.wikipedia.org/wiki/Cocktail_sort&lt;br /&gt;
    // thanks to Joseph Nahmias&lt;br /&gt;
    var b = 0;&lt;br /&gt;
    var t = list.length - 1;&lt;br /&gt;
    var swap = true;&lt;br /&gt;
&lt;br /&gt;
    while(swap) {&lt;br /&gt;
        swap = false;&lt;br /&gt;
        for(var i = b; i &amp;lt; t; ++i) {&lt;br /&gt;
            if ( comp_func(list[i], list[i+1]) &amp;gt; 0 ) {&lt;br /&gt;
                var q = list[i]; list[i] = list[i+1]; list[i+1] = q;&lt;br /&gt;
                swap = true;&lt;br /&gt;
            }&lt;br /&gt;
        } // for&lt;br /&gt;
        t--;&lt;br /&gt;
&lt;br /&gt;
        if (!swap) break;&lt;br /&gt;
&lt;br /&gt;
        for(var i = t; i &amp;gt; b; --i) {&lt;br /&gt;
            if ( comp_func(list[i], list[i-1]) &amp;lt; 0 ) {&lt;br /&gt;
                var q = list[i]; list[i] = list[i-1]; list[i-1] = q;&lt;br /&gt;
                swap = true;&lt;br /&gt;
            }&lt;br /&gt;
        } // for&lt;br /&gt;
        b++;&lt;br /&gt;
&lt;br /&gt;
    } // while(swap)&lt;br /&gt;
  }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ******************************************************************&lt;br /&gt;
   Supporting functions: bundled here to avoid depending on a library&lt;br /&gt;
   ****************************************************************** */&lt;br /&gt;
&lt;br /&gt;
// Dean Edwards/Matthias Miller/John Resig&lt;br /&gt;
&lt;br /&gt;
/* for Mozilla/Opera9 */&lt;br /&gt;
if (document.addEventListener) {&lt;br /&gt;
    document.addEventListener(&amp;quot;DOMContentLoaded&amp;quot;, sorttable.init, false);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* for Internet Explorer */&lt;br /&gt;
/*@cc_on @*/&lt;br /&gt;
/*@if (@_win32)&lt;br /&gt;
    document.write(&amp;quot;&amp;lt;script id=__ie_onload defer src=javascript:void(0)&amp;gt;&amp;lt;\/script&amp;gt;&amp;quot;);&lt;br /&gt;
    var script = document.getElementById(&amp;quot;__ie_onload&amp;quot;);&lt;br /&gt;
    script.onreadystatechange = function() {&lt;br /&gt;
        if (this.readyState == &amp;quot;complete&amp;quot;) {&lt;br /&gt;
            sorttable.init(); // call the onload handler&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
/*@end @*/&lt;br /&gt;
&lt;br /&gt;
/* for Safari */&lt;br /&gt;
if (/WebKit/i.test(navigator.userAgent)) { // sniff&lt;br /&gt;
    var _timer = setInterval(function() {&lt;br /&gt;
        if (/loaded|complete/.test(document.readyState)) {&lt;br /&gt;
            sorttable.init(); // call the onload handler&lt;br /&gt;
        }&lt;br /&gt;
    }, 10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* for other browsers */&lt;br /&gt;
window.onload = sorttable.init;&lt;br /&gt;
&lt;br /&gt;
// written by Dean Edwards, 2005&lt;br /&gt;
// with input from Tino Zijdel, Matthias Miller, Diego Perini&lt;br /&gt;
&lt;br /&gt;
// http://dean.edwards.name/weblog/2005/10/add-event/&lt;br /&gt;
&lt;br /&gt;
function dean_addEvent(element, type, handler) {&lt;br /&gt;
	if (element.addEventListener) {&lt;br /&gt;
		element.addEventListener(type, handler, false);&lt;br /&gt;
	} else {&lt;br /&gt;
		// assign each event handler a unique ID&lt;br /&gt;
		if (!handler.$$guid) handler.$$guid = dean_addEvent.guid++;&lt;br /&gt;
		// create a hash table of event types for the element&lt;br /&gt;
		if (!element.events) element.events = {};&lt;br /&gt;
		// create a hash table of event handlers for each element/event pair&lt;br /&gt;
		var handlers = element.events[type];&lt;br /&gt;
		if (!handlers) {&lt;br /&gt;
			handlers = element.events[type] = {};&lt;br /&gt;
			// store the existing event handler (if there is one)&lt;br /&gt;
			if (element[&amp;quot;on&amp;quot; + type]) {&lt;br /&gt;
				handlers[0] = element[&amp;quot;on&amp;quot; + type];&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		// store the event handler in the hash table&lt;br /&gt;
		handlers[handler.$$guid] = handler;&lt;br /&gt;
		// assign a global event handler to do all the work&lt;br /&gt;
		element[&amp;quot;on&amp;quot; + type] = handleEvent;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
// a counter used to create unique IDs&lt;br /&gt;
dean_addEvent.guid = 1;&lt;br /&gt;
&lt;br /&gt;
function removeEvent(element, type, handler) {&lt;br /&gt;
	if (element.removeEventListener) {&lt;br /&gt;
		element.removeEventListener(type, handler, false);&lt;br /&gt;
	} else {&lt;br /&gt;
		// delete the event handler from the hash table&lt;br /&gt;
		if (element.events &amp;amp;&amp;amp; element.events[type]) {&lt;br /&gt;
			delete element.events[type][handler.$$guid];&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function handleEvent(event) {&lt;br /&gt;
	var returnValue = true;&lt;br /&gt;
	// grab the event object (IE uses a global event object)&lt;br /&gt;
	event = event || fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);&lt;br /&gt;
	// get a reference to the hash table of event handlers&lt;br /&gt;
	var handlers = this.events[event.type];&lt;br /&gt;
	// execute each event handler&lt;br /&gt;
	for (var i in handlers) {&lt;br /&gt;
		this.$$handleEvent = handlers[i];&lt;br /&gt;
		if (this.$$handleEvent(event) === false) {&lt;br /&gt;
			returnValue = false;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return returnValue;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function fixEvent(event) {&lt;br /&gt;
	// add W3C standard event methods&lt;br /&gt;
	event.preventDefault = fixEvent.preventDefault;&lt;br /&gt;
	event.stopPropagation = fixEvent.stopPropagation;&lt;br /&gt;
	return event;&lt;br /&gt;
};&lt;br /&gt;
fixEvent.preventDefault = function() {&lt;br /&gt;
	this.returnValue = false;&lt;br /&gt;
};&lt;br /&gt;
fixEvent.stopPropagation = function() {&lt;br /&gt;
  this.cancelBubble = true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Dean's forEach: http://dean.edwards.name/base/forEach.js&lt;br /&gt;
/*&lt;br /&gt;
	forEach, version 1.0&lt;br /&gt;
	Copyright 2006, Dean Edwards&lt;br /&gt;
	License: http://www.opensource.org/licenses/mit-license.php&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// array-like enumeration&lt;br /&gt;
if (!Array.forEach) { // mozilla already supports this&lt;br /&gt;
	Array.forEach = function(array, block, context) {&lt;br /&gt;
		for (var i = 0; i &amp;lt; array.length; i++) {&lt;br /&gt;
			block.call(context, array[i], i, array);&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// generic enumeration&lt;br /&gt;
Function.prototype.forEach = function(object, block, context) {&lt;br /&gt;
	for (var key in object) {&lt;br /&gt;
		if (typeof this.prototype[key] == &amp;quot;undefined&amp;quot;) {&lt;br /&gt;
			block.call(context, object[key], key, object);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// character enumeration&lt;br /&gt;
String.forEach = function(string, block, context) {&lt;br /&gt;
	Array.forEach(string.split(&amp;quot;&amp;quot;), function(chr, index) {&lt;br /&gt;
		block.call(context, chr, index, string);&lt;br /&gt;
	});&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// globally resolve forEach enumeration&lt;br /&gt;
var forEach = function(object, block, context) {&lt;br /&gt;
	if (object) {&lt;br /&gt;
		var resolve = Object; // default&lt;br /&gt;
		if (object instanceof Function) {&lt;br /&gt;
			// functions have a &amp;quot;length&amp;quot; property&lt;br /&gt;
			resolve = Function;&lt;br /&gt;
		} else if (object.forEach instanceof Function) {&lt;br /&gt;
			// the object implements a custom forEach method so use that&lt;br /&gt;
			object.forEach(block, context);&lt;br /&gt;
			return;&lt;br /&gt;
		} else if (typeof object == &amp;quot;string&amp;quot;) {&lt;br /&gt;
			// the object is a string&lt;br /&gt;
			resolve = String;&lt;br /&gt;
		} else if (typeof object.length == &amp;quot;number&amp;quot;) {&lt;br /&gt;
			// the object is array-like&lt;br /&gt;
			resolve = Array;&lt;br /&gt;
		}&lt;br /&gt;
		resolve.forEach(object, block, context);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* &amp;lt;/pre&amp;gt; */&lt;/div&gt;</summary>
		<author><name>GyD</name></author>
	</entry>
</feed>