/* jk:
 - prerobene z "type" na pracu s nazvami css tried (validne HTML)
 - prerobenie "DOM vkladanie spanu" za pridelovanie css triedy (cross browser friendly)
 - fix pre !IE prehliadace (vkladanie paticky tabuliek na zaciatok tabulky) = TR musi mat class "paticka"
 - fixed - zakladne sortovanie slov s diakritikou [sk]
*/

var dom = (document.getElementsByTagName) ? true : false;
var ie5 = (document.getElementsByTagName && document.all) ? true : false;

if (typeof(firstColumnNumbers) == "undefined")
 var firstColumnNumbers = false;

firstColumnNumbers = new Boolean(firstColumnNumbers);

//added by jeeff
function highlight(obj,on)
{
   if (ie5 || dom)
   {
      if (on==1) obj.bgColor="#eeeeee";
      else obj.bgColor="white";
   }
}

function sortTable(tableNode, nCol, bDesc, sType)
{
   /*var tBody = null;
   for (i=0; i<tableNode.tBodies.length; i++)
   {
      tableNode.tBodies[1];
   	  window.alert(tableNode.tBodies[i].className);
   }
   var trs = tBody.rows;*/

   var trs = tableNode.rows;

   var a = new Array();
   var b = new Array(); // jk: !IE notSortable dummy fix - paticka buffer
   var c = new Array(); // jk: basic fix 4 "Spolu" table rows
   var counter = 0;
   var Bcounter = 0;
   var Ccounter = 0;
   for (var i=0; i<trs.length; i++)
   {
    // alert(trs[i].className);
   	if (trs[i].className.indexOf('notSortable')==-1)
   	{
   	   // window.alert("pridavam: " + trs[i].className);
      	a[counter++] = trs[i];
    }
    else if (trs[i].className.indexOf('paticka')!=-1)
    {  // jk: !IE notSortable dummy fix - paticka buffer fill
        b[Bcounter++] = trs[i];
    }
    else if (trs[i].className == "notSortable") // "Spolu" basic fix
    {
        c[Ccounter++] = trs[i];
    }
   }

   var tBodyContainer = null;
   for (i=0; i<tableNode.tBodies.length; i++)
   {
      if (tableNode.tBodies[i].className=="dataContainer")
      {
      	tBodyContainer = tableNode.tBodies[i];
   	  }
   }
   if (tBodyContainer == null) return;

   a.sort(compareByColumn(nCol,bDesc,sType));

   //window.alert("mam usortovane, l="+a.length);
   var className;

   for (var i=0; i<a.length; i++)
   {
      //window.alert("pridavam2: " + a[i].className);
      //modified by jeeff
      if (firstColumnNumbers)
      {
         j = i+1;
         setInnerText(a[i].cells[0], j+".");
      }
      className = a[i].className;
      if (i%2==0) className = className.replace("parna", "neparna"); // dal som opacne
      else if (i%2==1) className = className.replace("neparna", "parna"); // dal som opacne
      className = className.replace("neneparna", "neparna");
      a[i].className = className;
      tableNode.tBodies[1].appendChild(a[i]);
   }

    for (var i=0; i<c.length; i++)
    {
      tableNode.tBodies[1].appendChild(c[i]);
    }

   // jk: !IE notSortable dummy fix - paticka buffer print
   for (var i=0; i<b.length; i++)
   {
      tableNode.tBodies[1].appendChild(b[i]);
   }
   counter = 0;
   
   /*for (var i=0; i<trs.length; i++)
   {
   	if (trs[i].className.indexOf('notSortable')==-1)
   	{
   	   //window.alert("pridavam: " + trs[i].className);
      	//a[counter++] = trs[i];
      	//window.alert("pridavam3: " + a[i].className);
	      //modified by jeeff
	      if (firstColumnNumbers == true)
	      {
	         j = i+1;
	         setInnerText(a[counter].cells[0], j+".");
	      }
	      className = a[counter].className;
	      if (counter%2==0) className = className.replace("neparna", "parna");
	      else if (counter%2==1) className = className.replace("parna", "neparna");
	      className = className.replace("neneparna", "neparna");
	      a[counter].className = className;
	      //trs[i] = a[counter];
	      tableNode.rows.replaceChild(a[counter], trs[i]);

	      counter++;
      }
   }*/
}

var dia = {
"&#190;":"l",
"š":"s",
"&#232;":"c",
"&#157;":"t",
"ž":"z",
"ý":"y",
"á":"a",
"í":"i",
"é":"e",
"ä":"a",
"ú":"u",
"&#242;":"n",
"ô":"o",
"&#239;":"d",
"ó":"o",
"&#188;":"L",
"Š":"S",
"&#200;":"C",
"&#141;":"T",
"Ž":"Z",
"Ý":"Y",
"Á":"A",
"Í":"I",
"É":"E",
"Ä":"A",
"Ú":"U",
"&#210;":"N",
"Ô":"O",
"&#207;":"D",
"Ó":"O"
}

var diaPattern = new RegExp(/[&#190;š&#232;&#157;žýáíéäú&#242;ô&#239;ó&#188;Š&#200;&#141;ŽÝÁÍÉÄÚ&#210;Ô&#207;Ó]/);

function CaseInsensitiveString(s, bDescending)
{
  var inS = diaPattern.exec(s);

  while (inS != null)
  {
    s = s.replace(inS, dia[inS]);
    inS = diaPattern.exec(s);
  }
  return String(s).toUpperCase();
}

function parseDate(s, bDescending)
{
   //return Date.parse(s.replace(/\-/g, '/'));
   var day = s.replace(/(\d+)\.(\d+)\.(\d\d\d\d)/g, '$1');
   if (day == s) day = s.replace(/(\d+)\.\s(\d+)\./g, '$1');
   var month = s.replace(/(\d+)\.(\d+)\.(\d\d\d\d)/g, '$2');
   if (month == s) month = s.replace(/(\d+)\.\s(\d+)\./g, '$2');
   var year = s.replace(/(\d+)\.(\d+)\.(\d\d\d\d)/g, '$3');
   if (year == s) year = 2005;
   var date = new Date(Number(year), Number(month)-1, Number(day));
   return date;
}

/* alternative to number function
 * This one is slower but can handle non numerical characters in
 * the string allow strings like the follow (as well as a lot more)
 * to be used:
 *    "1,000,000"
 *    "1 000 000"
 *    "100cm"
 */

function toNumber(s, bDescending)
{
    s = s.replace(/[^0-9\.,-]/g, "");
    //s = s.replace(/,/g, "");
    s = s.replace(/,/g, ".");
    if (s=="" || s=="-")
    {
      if (bDescending == true)
  		{
  			return(999999999);
  		}
  		else
  		{
  			return(-999999999);
  		}
    }
    return Number(s);
}

function monthToNumber(s, bDescending)
{
  s = s.toLowerCase().replace(/\s/g, "");
  var ret = 0;
  if (s == "január") ret = 1;
	else if (s == "február") ret = 2;
	else if (s == "marec") ret = 3;
	else if (s == "apríl") ret = 4;
	else if (s == "máj") ret = 5;
	else if (s == "jún") ret = 6;
	else if (s == "júl") ret = 7;
	else if (s == "august") ret = 8;
	else if (s == "september") ret = 9;
	else if (s == "október") ret = 10;
	else if (s == "november") ret = 11;
	else if (s == "december") ret = 12;

	//window.status = s + " ret="+ret;
	return(ret);
}

function compareByColumn(nCol, bDescending, sType)
{
   var c = nCol;
   var d = bDescending;

   var fTypeCast = String;

   if (sType.indexOf("Number") != -1)
      fTypeCast = toNumber;
   else if (sType.indexOf("Date") != -1)
      fTypeCast = parseDate;
   else if (sType.indexOf("CaseInsensitiveString") != -1)
      fTypeCast = CaseInsensitiveString;
   else if (sType.indexOf("MonthName") != -1)
      fTypeCast = monthToNumber;

   return function (n1, n2)
   {
      if (fTypeCast(getInnerText(n1.cells[c]), bDescending) < fTypeCast(getInnerText(n2.cells[c]), bDescending))
         return d ? -1 : +1;
      if (fTypeCast(getInnerText(n1.cells[c]), bDescending) > fTypeCast(getInnerText(n2.cells[c]), bDescending))
         return d ? +1 : -1;
      return 0;
   };
}

if (typeof(elPrev) == "undefined")
  var elPrev = new Array;

var objectCounter = 0;

function sortColumn(e,prevRefNum)
{
   var tmp, el, tHeadParent;

   if (ie5)
      tmp = e.srcElement;
   else if (dom)
      tmp = e.target;

   //tHeadParent = getParent(tmp, "THEAD");
   tHeadParent = getParent(tmp, "TR");
   el = getParent(tmp, "TD");

   if (tHeadParent == null || tHeadParent.className.indexOf("notClickable")!=-1)
      return;

   if (el != null)
   {
      // if (el.getAttribute("type")=="None")
      if (el.className.indexOf("sortAfter") == -1 || el.className.indexOf(" None") != -1)
      {
      	return;
      }

      var p = el.parentNode;
      var i;

      //default bude descending
      if (el._descending == null)
      {
         el._descending = true;
      }

      if (el._descending)  // catch the null
         el._descending = false;
      else
         el._descending = true;

      // jk: prerobene na prehadzovanie className
      if (elPrev[prevRefNum] != el && typeof(elPrev[prevRefNum]) != "undefined") //reset sort order
      {
        var tmp = elPrev[prevRefNum].className;
        tmp = tmp.replace(" isAsc","");
        tmp = tmp.replace(" isDesc","");
        elPrev[prevRefNum].className = tmp;
        elPrev[prevRefNum]._descending = null;
      }
      elPrev[prevRefNum] = el;

      var tmp = el.className;
      if (el._descending) {
        tmp = tmp.replace(" isAsc","");
        tmp = tmp.replace(" isDesc","");
        el.className = tmp + " isAsc";
      }
      else {
        tmp = tmp.replace(" isAsc","");
        tmp = tmp.replace(" isDesc","");
        el.className = tmp + " isDesc";
      }

      // get the index of the td
      for (i=0; i<p.cells.length; i++)
      {
         if (p.cells[i] == el) break;
      }

      var table = getParent(el, "TABLE");
      // can't fail
      //window.alert("d="+el._descending+" t="+el.getAttribute("type"));
      sortTable(table,i,el._descending, el.className); // el.getAttribute("type"));
   }
}

function getInnerText(el)
{
   var str = "";
   try
   {
	   if (ie5) return el.innerText; //Not needed but it is faster

	   for (var i=0; i<el.childNodes.length; i++) {
	      switch (el.childNodes.item(i).nodeType) {
	         case 1: //ELEMENT_NODE
	            str += getInnerText(el.childNodes.item(i));
	            break;
	         case 3:  //TEXT_NODE
	            str += el.childNodes.item(i).nodeValue;
	            break;
	      }

	   }
   }
   catch (exception)
   {

   }
   return str;
}

function setInnerText(el, text)
{
   el.innerHTML = text; // added by jeeff
}

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);
}

function getLastParent(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);
}
