// Copyright &copy; 2005 Mikrobit Sp. z o.o.. All Rights Reserved.
// liczniki
var i,j,k,l = 0;
// BODY tabelki, która jest sortowana
var oTBody = null;
// tablica z wartościami do posortowania
var aTable = new Array();
// rodzaj sortowania:
// n - numeryczne
// s - znakowe
// l - numeryczne (liczba porządkowa)
var sSortType = 's';
// kolumna, na której wykonujemy sortowanie
var iSortIdx = 0;
// type sortowania: false: rosnący, true: malejący
var bSortOrder = false;
// domyślny porządek sortowania dla numeryków
var bDfltNumSortOrder = true;
// domyślny porządek sortowania dla stringów
var bDfltStrSortOrder = false;
// domyślny porządek sortowania dla liczby porządkowej
var bDfltLpSortOrder  = false;
// tablica z danymi o sortowaniu w poszczególnych tabelach, kolumnach i porządku sortowania
var aSortOrder = new Array();
// ostatnio sortowana tabelka i kolumna/y
// indeks 0 : tabelks
// indeks 1 : kolumna/y
var aLastSort = new Array();
// bazowa klasa CSS
var sBaseClass = '';
// klasa bazowa jako pierwsza
var bBaseClass = true;
// czy bazowa klasa CSS została pobrana
var bTakedBaseClass = false;
// ilość wierszy, które nie mają standardowej klasy CSS
var iNotStdRows = 0;
// bieżący wiersz tabel
var iCurrRow = 0;
// po ile wierszy podstawiać w jednym obiegu pętli
var iMaxNumRows = 460;
// bieżący licznik pętli
var iCurrNumRows = 0;
// licznik pętli
var iLoopCounter = 0;
// bieżący wiersz w tablicy posortowanej
var iRowCounter = 0;
// okienko z informacją o sortowaniu
var hWaitWindow = null;

// Tabela, na której wykonujemy operacje.
var oTable = null;
// tabela z posortowanymi wartościami i nazwami klas CSS
var aValues = Array();

// timeout dla funkcji podstawiającej
var iTimeout = 0;
// timeout dla okienka wait
var iWaitTimeout = null;
// timeout funkcji zbierającej dane
var iGetTimeout = null;
// timeout dla funkcji sortującej
var iSortTimeout = null;

// semafor dla funkcji podstawiającej
var bInProgress = false;
// semafor dla funkcji doSort
var bDoSortInProgress = false;
// semafory dla funkcji sprawdzającej przeglądarkę
var isIE4 = ((navigator.appName.indexOf('Microsoft') == 0 && parseInt(navigator.appVersion) >= 4));
var isW3c = (document.documentElement) ? true : false;
var bIE = false;
// semafor dla funkcji pobierającej dane
var bGetInProgress = false;
// semafor dla funkcji sortującej
var bWasSorted = false;
// semafor oznaczający działanie funkcji sortującej tablicę z pobranymi danymi z tabeli
var bSortingInProgress = false;

function detectBrowser() {
if (isIE4 && isW3c) {
bIE = true;
return true;
}
if (!isIE4 && isW3c) {
bIE = false;
return true;
}
return false;
}

function doCompare(row1, row2) {
if (typeof iSortIdx == "object") {
for(i=0;i<iSortIdx.length;i++) {
val1 = row1[iSortIdx[i]][0];
val2 = row2[iSortIdx[i]][0];
if (sSortType == 'n' || sSortType == 'l') {
val1 = new Number(val1);
val2 = new Number(val2);
if (!bSortOrder) {
// rosnący
if (val1 < val2) {return -1;}
if (val1 > val2) {return  1;}
} else {
// malejący
if (val1 < val2) {return  1;}
if (val1 > val2) {return -1;}
}
} else {
if (!bSortOrder) {
// rosnący
//			      return val1.localeCompare(val2);
if (val1 < val2) {return -1;}
if (val1 > val2) {return  1;}
} else {
// malejący
//			      return val2.localeCompare(val1);
if (val1 < val2) {return  1;}
if (val1 > val2) {return -1;}
}
}
}
return 0;
} else {
val1 = row1[iSortIdx][0];
val2 = row2[iSortIdx][0];
if (sSortType == 'n' || sSortType == 'l') {
if (!bSortOrder) {
return val1 - val2;
}
return val2 - val1;
} else {
if (!bSortOrder) {
// rosnący
if (val1 < val2) {return -1;}
if (val1 > val2) {return  1;}
} else {
// malejący
if (val1 < val2) {return  1;}
if (val1 > val2) {return -1;}
}
return 0;
}
}
}

function r(sHash) {
detectBrowser();
var sURL = document.location.href;
if (sURL.indexOf('#') != -1) {
sURL = sURL.substring(0,sURL.indexOf('#'));
}
if (sHash != '') {
sURL += '#' + sHash;
}
document.location.href = sURL;
if (!bIE) {
document.location.reload();
} else {
history.go(0);
}
}

function showWaitWindow() {
if (bDoSortInProgress) {
document.body.style.cursor = 'wait';
} else {
document.body.style.cursor = 'auto';
}
}

function getData() {
if (bGetInProgress) {
return;
}
bGetInProgress = true;
if (iLoopCounter * iMaxNumRows + iMaxNumRows > oTBody.rows.length) {
iCurrNumRows = oTBody.rows.length % iMaxNumRows;
} else {
iCurrNumRows = iMaxNumRows;
}
for(j=0;j<iCurrNumRows;j++) {
iRowCounter = j + (iMaxNumRows * iLoopCounter);
aValues[iRowCounter] = new Array();
if (oTBody.rows[iRowCounter].cells[0].className != sBaseClass && bBaseClass) {
iNotStdRows++;
} else {
if (oTBody.rows[iRowCounter].cells[0].className == sBaseClass && !bBaseClass) {
iNotStdRows++;
}
}
for (k=0;k<oTBody.rows[iRowCounter].cells.length;k++) {
aValues[iRowCounter][k] = new Array();
if (oTBody.rows[iRowCounter].cells[k].innerText == null) {
if (oTBody.rows[iRowCounter].cells[k].innerHTML == null) {
aValues[iRowCounter][k][0] = null;
} else if (oTBody.rows[iRowCounter].cells[k].childNodes[0].nodeType == 1) {
aValues[iRowCounter][k][0] = oTBody.rows[iRowCounter].cells[k].innerHTML.match(/\>([^\<]+)\</);
if (aValues[iRowCounter][k][0] != null) {
aValues[iRowCounter][k][0] = aValues[iRowCounter][k][0][1];
}
} else {
aValues[iRowCounter][k][0] = oTBody.rows[iRowCounter].cells[k].innerHTML;
}
} else {
aValues[iRowCounter][k][0] = oTBody.rows[iRowCounter].cells[k].innerText;
}
if ((sSortType == 'n' || sSortType == 'l') && aValues[iRowCounter][k][0] != null) {
aValues[iRowCounter][k][0] = aValues[iRowCounter][k][0].match(/[0-9\.,]+/);
if (aValues[iRowCounter][k][0] != null) {
aValues[iRowCounter][k][0] = aValues[iRowCounter][k][0].join('');
} else {
//aValues[iRowCounter][k][0] = Number.POSITIVE_INFINITY;
aValues[iRowCounter][k][0] = Number.MAX_VALUE;
}
} else if ((sSortType != 'n' && sSortType != 'l') && aValues[iRowCounter][k][0] != null) {
//ęóąśłżźćń
//ĘÓĄŚŁŻŹĆŃ
//alert(aValues[iRowCounter][k][0]);
aValues[iRowCounter][k][0] = aValues[iRowCounter][k][0].replace(/ę/i,'e{');
aValues[iRowCounter][k][0] = aValues[iRowCounter][k][0].replace(/ó/i,'o{');
aValues[iRowCounter][k][0] = aValues[iRowCounter][k][0].replace(/ą/i,'a{');
aValues[iRowCounter][k][0] = aValues[iRowCounter][k][0].replace(/ś/i,'s{');
aValues[iRowCounter][k][0] = aValues[iRowCounter][k][0].replace(/ł/i,'l{');
aValues[iRowCounter][k][0] = aValues[iRowCounter][k][0].replace(/ż/i,'z}');
aValues[iRowCounter][k][0] = aValues[iRowCounter][k][0].replace(/ź/i,'z{');
aValues[iRowCounter][k][0] = aValues[iRowCounter][k][0].replace(/ć/i,'c{');
aValues[iRowCounter][k][0] = aValues[iRowCounter][k][0].replace(/ń/i,'n{');
aValues[iRowCounter][k][0] = aValues[iRowCounter][k][0].toLowerCase();
//alert(aValues[iRowCounter][k][0]);
}
aValues[iRowCounter][k][1] = oTBody.rows[iRowCounter].cells[k].className;
aValues[iRowCounter][k][2] = oTBody.rows[iRowCounter].cells[k].innerHTML;
aValues[iRowCounter][k][3] = oTBody.rows[iRowCounter].cells[k].title;
}
}
bGetInProgress = false;
iLoopCounter++
}

function doGetData() {
if (iRowCounter < (oTBody.rows.length-1)) {
getData();
} else {
clearInterval(iGetTimeout);
iGetTimeout = null;
iCurrNumRows = 0;
l = j = k = 0;
iCurrRow = 0;
iRowCounter = 0;
iLoopCounter = 0;
iSortTimeout = setInterval(sort,5);
}
}

function sort() {
if (aValues.length == oTBody.rows.length && !bWasSorted && !bSortingInProgress) {
bSortingInProgress = true;
aValues = aValues.sort(doCompare);
bWasSorted = true;
clearInterval(iSortTimeout);
bSortingInProgress = false;
iTimeout = setInterval(doInsertIntoTable,5);
}
}

function insertIntoTable() {
if (bInProgress) {
return;
}
bInProgress = true;
if (iLoopCounter * iMaxNumRows + iMaxNumRows > aValues.length) {
iCurrNumRows = aValues.length % iMaxNumRows;
} else {
iCurrNumRows = iMaxNumRows;
}
for(j=0;j<iCurrNumRows;j++) {
iRowCounter = j + (iMaxNumRows * iLoopCounter);
if (aValues[iRowCounter][0][1] == sBaseClass && bBaseClass) {
iCurrRow = l;
l++;
} else {
if (aValues[iRowCounter][0][1] != sBaseClass && !bBaseClass) {
iCurrRow = l;
l++;
} else {
iCurrRow = aValues.length - iNotStdRows;
iNotStdRows--;
}
}
for (k=0;k<aValues[iRowCounter].length;k++) {
oTBody.rows[iCurrRow].cells[k].title = aValues[iRowCounter][k][3];
oTBody.rows[iCurrRow].cells[k].innerHTML = aValues[iRowCounter][k][2];
if (oTBody.rows[iCurrRow].cells[k].className != aValues[iRowCounter][k][1]) {
oTBody.rows[iCurrRow].cells[k].className = aValues[iRowCounter][k][1];
}
}
}
bInProgress = false;
iLoopCounter++
}

function doInsertIntoTable() {
if (!bWasSorted) {
return;
}
if (iRowCounter < (aValues.length-1)) {
insertIntoTable();
} else {
clearInterval(iTimeout);
iTimeout = null;
iCurrNumRows = 0;
l = j = k = 0;
iCurrRow = 0;
iRowCounter = 0;
iLoopCounter = 0;
bDoSortInProgress = false;
aValues = Array();
bWasSorted = false;

oEndDate = new Date();
iFinalTime = oEndDate.getTime() - oStartDate.getTime();
oFinalDate = new Date(iFinalTime);
}
}

function s(sSortID, iColIdx, sMethod) {
if (!detectBrowser()) {
alert('Twoja przeglądarka nie obsługuje sortowania. Your browser is to old to handle sorting script.');
return false;
}
if (bDoSortInProgress) {
return false;
}
bDoSortInProgress = true;
iSortIdx  = iColIdx;
sSortType = sMethod;
oStartDate = new Date();
if (document.getElementById(sSortID) != null) {
oTable = document.getElementById(sSortID);
oTBody = oTable.tBodies[1];
if (oTBody == null || oTBody.rows.length < 2) {
// brak tbody w tabeli
return false;
}
if (typeof aSortOrder[sSortID] == "undefined") {
aSortOrder[sSortID] = new Array();
}
if (typeof aSortOrder[sSortID][iSortIdx.toString()] == "undefined") {
if (sSortType == 'n') {
aSortOrder[sSortID][iSortIdx.toString()] = bDfltNumSortOrder;
} else if (sSortType == 'l') {
aSortOrder[sSortID][iSortIdx.toString()] = bDfltLpSortOrder;
} else {
aSortOrder[sSortID][iSortIdx.toString()] = bDfltStrSortOrder;
}
} else {
if (aLastSort[0] == sSortID && aLastSort[1] == iSortIdx.toString()) {
aSortOrder[sSortID][iSortIdx.toString()] = !aSortOrder[sSortID][iSortIdx.toString()];
}
}
aLastSort[0] = sSortID;
aLastSort[1] = iSortIdx.toString();
bSortOrder = aSortOrder[sSortID][iSortIdx.toString()];
iWaitTimeout = setInterval(showWaitWindow,5);
if (!bTakedBaseClass) {
sBaseClass = oTBody.rows[0].cells[0].className;
bTakedBaseClass = true;
}
iGetTimeout = setInterval(doGetData,5);
}
return false;
}