// ******************************************************************
// *    QUICK SORT partition
// ******************************************************************
var	PIVOT;
var giSortOrder = 0;
function partition(rows, l, r){
    var i, j;

    i = l - 1;
    j = r;

	PIVOT = rows[r].innerText;

    if (giSortOrder == 0){
        do{
            while(rows[++i].innerText < PIVOT);
            while((i < --j) && (PIVOT < rows[j].innerText));
            if (i >= j) break;
            rows[i].swapNode(rows[j]);
        }while(1);
    } else {
        do{
            while(rows[++i].innerText > PIVOT);
            while((i < --j) && (PIVOT > rows[j].innerText));
            if (i >= j) break;
            rows[i].swapNode(rows[j]);
        }while(1);
    }

    rows[i].swapNode(rows[r]);

    return(i);
}

// ******************************************************************
// *    QUICK SORT Engine for Table List
// ******************************************************************

function TblQuickSort(rows, start, end){
    // rows : Table BODY ROWS Collection Object
    // start: Table row start number to be sorted (0,1,2,...)
    // start: Table row end   number to be sorted (0,1,2,...)

    var left;
    var right;
    var v;
    var sp;
    var low  = new Array();
    var high = new Array();

    low[0]  = start;
    high[0] = end-1;
    sp = 1;

    while(sp > 0){
        sp --;
        left    = low[sp];
        right   = high[sp];
        if (left >= right){
        } else {
            v = partition(rows, left, right);
            if ((v - left) < (right - v)){
                low[sp]     = v + 1;
                high[sp++]  = right;
                low[sp]     = left;
                high[sp++]  = v - 1;
            } else {
                low[sp]     = left;
                high[sp++]  = v - 1;
                low[sp]     = v + 1;
                high[sp++]  = right;
            }
        }
    }
}
