/*******************************************************************************
 * Copyright (c) 2008 Wotif.com Holdings Ltd. All Rights Reserved.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
 * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 ******************************************************************************/

// global variables used by startSortTable function
  var col = 0;
  var parent = null;
  var items = new Array();
  var N = 0;

  <!-- added new variables for recreatng headers-->
  var deletedRows = 0;
  var numOfDays = 14;

  <!-- functions used by startSortTable -->
  function get(i)
  {
    var node = items[i].getElementsByTagName("TD")[col];
    if(node.childNodes.length == 0) return "";
    var retval = node.firstChild.nodeValue;
    if(parseInt(retval) == retval) return parseInt(retval);
    return retval;
  }

  function compare(val1, val2, desc)
  {
    return (desc) ? val1 > val2 : val1 < val2;
  }

  function exchange(i, j)
  {
    if(i == j+1) {
      parent.insertBefore(items[i], items[j]);
    } else if(j == i+1) {
      parent.insertBefore(items[j], items[i]);
    } else {
      var tmpNode = parent.replaceChild(items[i], items[j]);
      if(typeof(items[i]) == "undefined") {
        parent.appendChild(tmpNode);
      } else {
        parent.insertBefore(tmpNode, items[i]);
      }
    }
  }

  function quicksort(m, n, desc)
  {
    if(n <= m+1) return;

    if((n - m) == 2) {
      if(compare(get(n-1), get(m), desc)) exchange(n-1, m);
      return;
    }

    i = m + 1;
    j = n - 1;

    if(compare(get(m), get(i), desc)) exchange(i, m);
    if(compare(get(j), get(m), desc)) exchange(m, j);
    if(compare(get(m), get(i), desc)) exchange(i, m);

    pivot = get(m);

    while(true) {
      j--;
      while(compare(pivot, get(j), desc)) j--;
      i++;
      while(compare(get(i), pivot, desc)) i++;
      if(j <= i) break;
      exchange(i, j);
    }

    exchange(m, j);

    if((j-m) < (n-j)) {
      quicksort(m, j, desc);
      quicksort(j+1, n, desc);
    } else {
      quicksort(j+1, n, desc);
      quicksort(m, j, desc);
    }
  }

   <!-- startSortTable uses quickSort to sort table rows using values from a specifed column on the rows -->
  function startSortTable(tableid, n, desc)
  {
    parent = document.getElementById(tableid);
    col = n;

    if(parent.nodeName != "TBODY")
      parent = parent.getElementsByTagName("TBODY")[0];
    if(parent.nodeName != "TBODY")
      return false;

    items = parent.getElementsByTagName("TR");
    N = items.length;

    // quick sort
    quicksort(0, N, desc);
  }

<!-- this is the main function called for sorting table -->
<!-- the arguments are : -->
<!-- table element name on html -->
<!-- index of the column to sort -->
<!-- sorting order ( descending or ascending ) -->
function sortTable(tableid, n, desc)
{
        deleteHeaders(tableid);
        startSortTable(tableid,n,desc);
        repairAlternatingColor(parent);
        showAvailHotels();
        restoreHeaders(tableid, deletedRows);

}

<!-- this function delete headers that broke sorting  -->
function deleteHeaders(tableid)
{
    var dataTable = document.getElementById(tableid);
    var tbody = dataTable.getElementsByTagName("TBODY")[0];
    var tableRows = new Array();
    var currentRow;
    tableRows = tbody.getElementsByTagName("TR");
    for(var i = 0; i < tableRows.length; i++)
    {
        currentRow = tableRows[i];
        if(currentRow.getAttribute("name") == "heading")
        {
            tbody.deleteRow(i);
            deletedRows++;
            i--;
        }

        if((currentRow.getAttribute("name") == "heading2"))
        {
            tbody.deleteRow(i);
            i--;
        }
    }

}

 <!-- this function restores the headers on the hotel search result page after the page is sorted -->
function restoreHeaders(tableid, deletedRows)
{
   var offset = 0;
   var dataTable = document.getElementById(tableid);
   var tbody = dataTable.getElementsByTagName("TBODY")[0];
   var thead = dataTable.getElementsByTagName("THEAD")[0];
   var headings = new Array();
   headings = thead.getElementsByTagName("TR");

   var columns = headings[0].getElementsByTagName("TH");
   var prevDaysUrl = headings[1].getElementsByTagName("A")[0];
   var nextDaysUrl = headings[1].getElementsByTagName("A")[1];
   if(nextDaysUrl == null)
   {
       nextDaysUrl = prevDaysUrl;
       prevDaysUrl = null;
   }

   for(var j = 1; j <= deletedRows; j++)
   {
          var heading1row = tbody.insertRow(j*10 + offset);
          <!-- prepared headers -->
          heading1row.className = "heading1";
          heading1row.setAttribute("name","heading");
          var newTd1 = document.createElement("th");
          newTd1.setAttribute("style","width: 250px;");
          heading1row.appendChild(newTd1);
          for(var k = 1; k < (columns.length - 3); k++)
          {
            newTd1 = document.createElement("th");
            newTd1.className = columns[k].className;
            newTd1.innerHTML = columns[k].innerHTML;
            heading1row.appendChild(newTd1);
          }
          newTd1 = document.createElement("th");
          newTd1.className = "nodisplay";
          newTd1.appendChild(document.createTextNode("Avg"));
          heading1row.appendChild(newTd1);
          newTd1.appendChild(document.createTextNode("Stars"));
          heading1row.appendChild(newTd1);
          newTd1.appendChild(document.createTextNode("Mixed"));
          heading1row.appendChild(newTd1);
       
          <!-- insert heading2 -->
          var heading2row = tbody.insertRow(j*10+1 + offset);
          heading2row.className = "heading2";
          heading2row.setAttribute("name","heading2");

          var newTd2 = document.createElement("td");
          heading2row.appendChild(newTd2);

          newTd2 = document.createElement("td");
          newTd2.className = "th";
          newTd2.setAttribute("colSpan",3);
          newTd2.style.textAlign = "left";
          newTd2.style.paddingRight = "0px";

           <!-- If prevDays url exsit, then add it --> 
          if(prevDaysUrl != null)
          {
              var newA2 = document.createElement("a");
              newA2.className = "link link-prev prev-a";
              newA2.appendChild(document.createTextNode("Prev 7 Days"));
              newA2.setAttribute("href",prevDaysUrl.href);
              newTd2.appendChild(newA2);
          }
       
          heading2row.appendChild(newTd2);


          newTd2 = document.createElement("td");
          newTd2.setAttribute("colSpan",numOfDays - 6);
          newTd2.setAttribute("style","background-color:white;");
          heading2row.appendChild(newTd2);

          newTd2 = document.createElement("td");
          newTd2.className = "th";
          newTd2.setAttribute("colSpan",3);
          newTd2.style.textAlign = "right";
          newTd2.style.paddingRight = "0px";
          newA2 = document.createElement("a");
          newA2.className = "link-right next-a";
          newA2.setAttribute("href",nextDaysUrl.href);
          newA2.appendChild(document.createTextNode("Next 7 Days"));
          newTd2.appendChild(newA2);
          heading2row.appendChild(newTd2);

          newTd2 = document.createElement("td");
          newTd2.className = "nodisplay";
          heading2row.appendChild(newTd2);
          newTd2 = document.createElement("td");
          newTd2.className = "nodisplay";
          heading2row.appendChild(newTd2);
          newTd2 = document.createElement("td");
          newTd2.className = "nodisplay";
          heading2row.appendChild(newTd2);

          offset = offset + 2;
   }
}

 <!-- this function repairs the alternating color on the hotel search result page -->
function repairAlternatingColor(parent)
{
    tableRows = parent.getElementsByTagName("TR");
    for(var i = 0; i < tableRows.length; i++){
        var currentRow = tableRows[i];
        if(i%2 == 0)
        {
            currentRow.className = "hotelrow";
        }

        else
        {
            currentRow.className = "hotelrow alt";
        }
    }
}

 <!-- used by the showAvailHotel check box on result page -->
function showAvailHotels()
   {
       var currentTd;
       var currentTr;
       var currentTdParent;
       var Tds;
       var Trs;
       var PrevRow = 0;
       var checkBox = document.getElementById("showavailhotels-cbox");
       var regExp1 = /selected\s*soldout/g;
       
       <!-- hide the rows with sold out on selected dates -->
       if(checkBox.checked)
       {
           Tds = window.document.getElementsByTagName("TD");
           for(var i = 0; i < Tds.length; i++)
           {

                currentTd = Tds[i];

                if(currentTd.className.match(regExp1) != null)
                {

                    currentTdParent = currentTd.parentNode;
                    if(currentTdParent.className == "hotelrow")
                    {

                        currentTdParent.className = "hotelrow nodisplay";

                    }

                    else if(currentTdParent.className == "hotelrow alt")
                    {

                        currentTdParent.className = "hotelrow alt nodisplay";
                    }
                }
           }
       }

       <!-- show all the rows -->
       else
       {
           Trs = window.document.getElementsByTagName("TR");
           for(var i = 0; i < Trs.length; i ++)
           {
               currentTr = Trs[i];
               if(currentTr.className == "hotelrow nodisplay")
               {
                   currentTr.className = "hotelrow";
               }

               else if(currentTr.className == "hotelrow alt nodisplay")
               {
                   currentTr.className = "hotelrow alt";
               }
           }
       }
   }

