// #################################################################################
// #    File Name   : srctblc2.js
// #    Project     : Japanese Grammar Note
// #    System      : On-Line Japanese Reading Material
// #    Purpose     : Generate Dynamic Table of Contents
// #    Function    : DIARY Control
// #    Model       : This programe is based on the Document Object Model (DOM)
// #    Language    : JavaScript (Client Side Scripting. ver: 5.x)
// #    Include     : jpread.js
// #    Date Issued : 2006/09/18(Mon)-20:35:12
// #    Base URL    : http://www.all.co.nz/
// #    Location    : js/
// #    Usage       :
// #    Browsers    : IE5.x and above
// #    Requirement : <BODY ID='oBody'>
// #    Restriction : None
// #    Author      : H. Sekine (Able LL Systems Dpt. CHC, NZL)
// #    Copyright   : (C) 2006 Southern Cross Virtual Co., Ltd. All Rights Reserved.
// #    Contact     : info@all.co.nz
// #    Tab Stop    : 4 (Suitable TAB stop size to view this Source Code)
// # ===============================================================================
// #    ** Revision **
// # Date   Description                                             Sign      Mark
// # ------+-------------------------------------------------------+---------+------
// #
// #################################################################################
@set @DEBUG = 1 // Program Debug Flag: ON(>=1)/OFF(==0)/(==9) Test Release Mode
// ###########################################################################
// #                            << NOTICE >>                                 #
// # THIS PROGRAM CODE BELONGS TO SOUTHERN CROSS VIRTUAL CO., LTD. IT IS     #
// # CONSIDERED A TRADE SECRET AND IS NOT TO BE DIVULUGED OR USED BY PARTIES #
// # WHO HAVE NOT RECEIVED WRITTEN AUTHORIZATION FROM THE OWNER.             #
// # ----------------------------------------------------------------------- #
// #                            << 通  知 >>                                 #
// # 本プログラムはSOUTHERN CROSS VIRTUAL CO., LTD.の財産です。本プログラム  #
// # はトレード・シークレットとみなされ、当該権利者の書面による許可なくして、#
// # 漏洩または使用を禁じます。                                              #
// ###########################################################################

// ******************************************************************
// *    External Constant Definition for HTML file
// *    If you change HTML file, these value should be updated
// *    append04hr.htm or tableAct3.htc
// ******************************************************************

var SEARCH_BODY = "oSearchBody" ;   // Use in tableAct3.htm
var SEARCH_TABL = "oSearchTable";   // Defined in append04hr.htm
var IMAGE_ID    = "srtImg" ;        // Defined in tableAct3.htc

// ******************************************************************
// *    Search Table Header Caption Array Order (append14hr.htm)
// ******************************************************************

var HCAPS0      = "品　詞";
var HCAPS1      = "読　み";
var HCAPS2      = "単　語";
var HCAPS3      = "意　味";
var HCAPS4      = "レベル";
var HCAPS5      = "備　考";
var HCAPS6      = "FLAG1";
var HCAPS7      = "FLAG2";

// ******************************************************************
// *    Search Table Control Object Array Order (append14hr.htm)
// ******************************************************************

var CTLID0      = "cmbInit"     ;   // 頭文字       選択
var CTLID1      = "cmbPart"     ;   // 品　詞       選択
var CTLID2      = "cmbClass"    ;   // レベル       選択
var CTLID3      = "txtSearch"   ;   // 検索文字     入力
var CTLID4      = "cmbSort"     ;   // ソート項目   選択
var CTLID5      = "txtMatched"  ;   // 条件一致数   表示
var CTLID6      = "btnCmbReset" ;   // 選択解除     ボタン

// *===========<< External Constant Definition: END >>===============

var CINFO       = null;
var TBROWS      = null; // TBODY row collection
var TBNUM       = null; // Number of TBODY row collection
var PIVOT       = null; // Pivot position for qsort function

var HIDX0       = 0;    // 品　詞
var HIDX1       = 1;    // 読　み
var HIDX2       = 2;    // 単　語
var HIDX3       = 3;    // 意　味
var HIDX4       = 4;    // レベル
var HIDX5       = 5;    // 備　考
var HIDX6       = 6;    // FLAG1
var HIDX7       = 7;    // FLAG2

var SRC_TOP_CHR = "*" ; // eg. *ABC --> [ABC]....
var SRC_FUL_CHR = "#" ; // eg. #ABC --> ABC
var SRC_BTM_CHR = "&" ; // eg. &ABC --> ....[ABC]
var SRC_EXL_CHR = "!" ; // eg. !ABC --> .![ABC]..

var giSortOrder = 0;    // Initial: Ascendant
var SortByPart  = HIDX0;// 品　詞
var SortByYomi  = HIDX1;// 読　み
var SortByWord  = HIDX2;// 単　語
var SortByMean  = HIDX3;// 意　味
var SortByOpp   = HIDX4;// レベル
var SortByRem   = HIDX5;// 備　考
var SortByRlg1  = HIDX6;// FLAG1
var SortByRlg2  = HIDX7;// FLAG2

var goThead     = null; // Keep OBJECT <THEAD> in oSearchTable
var goTheadRow  = null; // Keep The first <TR> tag OBJECT, which contains Table header
var giColCount  = 0;    // Store number of <TD> tags
var giLastClick = -1;

var IMG_BLANK   = "dude07232001blank.gif";
var IMG_DOWN    = "dude07232001down.gif";
var IMG_UP      = "dude07232001up.gif";

var SPACE       = "";
var SHOW_ON     = "";       // Dsiplay for "style.display"
var SHOW_OFF    = "none";   // Hide for "style.display"
var L_BRAKET    = "[";      // [....
var R_BRAKET    = "]";      // ....]

var STR_MSG0    = "Table Data is being Loaded ....";
var STR_MSG1    = ".... Ready to Use!!";

var GA_ROW = new Array("が","ぎ","ぐ","げ","ご");
var ZA_ROW = new Array("ざ","じ","ず","ぜ","ぞ");
var DA_ROW = new Array("だ","ぢ","づ","で","ど");
var BA_ROW = new Array("ば","び","ぶ","べ","ぼ");
var KN_ROW = new Array("ア","ン");

function makeControlTableInfo(){
    var HEADNAME = new makeTableHeaderName();
    var CMBID    = new makeComboControlID();
    for (var i=0; i<CMBID.length; i++){
        this[i]  = new ciPack(HEADNAME[i], CMBID[i]);
    }
    this.length = i;
}

function filterSelected(){
    var x, iRet = true, loop;
    var CMBID   = new makeComboControlID();
    var loop    = CMBID.length;

    for (var i=0; i<loop; i++){
        x = F[CMBID[i]];

        switch(CMBID[i]){

            default:
                if ((x != null) && (x.selectedIndex != 0)) iRet = false;
                break;

            case CTLID3:
                if ((x != null) && (x.value != SPACE)) iRet = false;
                break;

            case CTLID4:

                if ((giLastClick != HCAPS1) && (giSortOrder == 0) ||
                    (giLastClick == HCAPS1) && (giSortOrder != 0)) iRet = false;
                break;
        }
    }
    return iRet;
}

function initTable(){
    var i, l, clickCell;

    goThead    = oSearchTable.tHead;            // OK in append04hr.htm
    goTheadRow = goThead.children[0];           // The first <TR> tag
    giColCount = goTheadRow.children.length;    // Get number of <TD> tags

    var imgcol = goTheadRow.all( IMAGE_ID );

    CP = F[ CTLID6 ];
    if (CP != null) CP.setExpression("disabled", "filterSelected()", "JavaScript");
    window.status = STR_MSG0;
    makeSearchTable2( SEARCH_TABL );
	with(F.cmbSort){
    	selectedIndex = 2;	// offset 2 of "cmbSort" Object in HTML
    	fireEvent( "onchange" );
    	selectedIndex = 2;	// offset 2 of "cmbSort" Object in HTML
    }
    fnTblRemarksBindDriver();
    with(imgcol[SortByYomi]){
        src = ((giSortOrder) ? IMG_DOWN : IMG_UP);
        style.display = SHOW_ON;
    }
    window.status = STR_MSG1;
    giLastClick = HCAPS1;   // 1 == "object.selectIndex"
}
function InitItemIndex(){	// Added: 2006/09/19(Tsu)-13:46:23
	var	sHeadNames = makeTableHeaderName();
	for (var i=0; i<goTheadRow.children.lengh; i++){
		goTheadRow.children[i].innerText = sHeadNames[i];
	}
}
function DetermineItemIndex(n){
    for (var i=0; i<CINFO.length; i++){
        if (CINFO[n].Header == goTheadRow.children[i].innerText) return( i );
    }
    return ( -1 );
}

function isPartsOK(targetPart, curPart){
    return(targetPart == curPart);
}

function isClassOK(targetClass, curClass){
    return(targetClass == curClass);
}

function isKeywdOK(targetKey, s1, s2, s3, s4, s5){
    var fp = -1;
    var fc = "";
    targetKey = targetKey.toLowerCase();    // 検索文字
if (s4 == "[ 3 ]") alert("targetKey= " + targetKey + " s4= " + s4);
    fp = targetKey.indexOf( SRC_TOP_CHR );
    if (fp == 0){           // if '*' is first position (ie. 0)
        fc = targetKey.slice( 0,1 );
        targetKey = targetKey.slice( 1 );
    } else {
        fp = targetKey.indexOf( SRC_FUL_CHR );
        if (fp == 0){       // if '#' is first position (ie. 0)
            fc = targetKey.slice( 0,1 );
            targetKey = targetKey.slice( 1 );
        } else {
            fp = targetKey.indexOf( SRC_BTM_CHR );
            if (fp == 0){   // if '&' is first position (ie. 0)
                fc = targetKey.slice( 0,1 );
                targetKey = targetKey.slice( 1 );
                var Tlen = targetKey.length;
            } else {
                fp = targetKey.indexOf( SRC_EXL_CHR );
                if (fp == 0){   // if '!' is first position (ie. 0)
                    fc = targetKey.slice( 0,1 );
                    targetKey = targetKey.slice( 1 );
                    var Tlen = targetKey.length;
                }
            }
        }
    }
    switch(fc){
        default:
            if ((s1.indexOf(targetKey) != -1) ||    // 読み
                (s2.indexOf(targetKey) != -1) ||    // 単語
                (s3.indexOf(targetKey) != -1) ||    // 意味
                (s4.indexOf(targetKey) != -1) ||    // レベル
                (s5.indexOf(targetKey) != -1)){     // 備考
                return(true);
            }
            break;

        case SRC_EXL_CHR:   // Non-including from top (eg. ABC...)
            if ((s1.indexOf(targetKey) == -1) &&    // 読み
                (s2.indexOf(targetKey) == -1) &&    // 単語
                (s3.indexOf(targetKey) == -1) &&    // 意味
                (s4.indexOf(targetKey) == -1) &&    // レベル
                (s5.indexOf(targetKey) == -1)){     // 備考
                return(true);
            }
            break;

        case SRC_TOP_CHR:   // including from top (eg. ABC...)
            if ((s1.indexOf(targetKey) == 0) ||     // 読み
                (s2.indexOf(targetKey) == 0) ||     // 単語
                (s3.indexOf(targetKey) == 0) ||     // 意味
                (s4.indexOf(targetKey) == 0) ||     // レベル
                (s5.indexOf(targetKey) == 0)){      // 備考
                return(true);
            }
            break;

        case SRC_BTM_CHR:   // including from bottom (eg. ....ABC)
            var p = s1.length - Tlen;
            if (s1.lastIndexOf(targetKey) == p){    // 読み
//          if ((s1.lastIndexOf(targetKey) != -1) ||// 読み
//              (s2.lastIndexOf(targetKey) != -1) ||// 単語
//              (s3.lastIndexOf(targetKey) != -1) ||// 意味
//              (s4.lastIndexOf(targetKey) != -1) ||// レベル
//              (s5.lastIndexOf(targetKey) != -1)){ // 備考
                return(true);
            }
            break;

        case SRC_FUL_CHR:   // including exactly from top (eg. ABC only)
            if ((s1 == targetKey) ||                // 読み
                (s2 == targetKey) ||                // 単語
                (s3 == targetKey) ||                // 意味
                (s4 == targetKey) ||                // レベル
                (s5 == targetKey)){                 // 備考
                return(true);
            }
            break;
    }
    return(false);
}
function isInitCOK(targetInit, curInit){
    var TopChr, i;
    switch(targetInit){

        default:
            return(curInit.indexOf(targetInit) == 0);
            break;

		case "KN":	// カタカナ単語
			topChr = curInit.substr(0,1);
			if (KN_ROW[0] <= topChr && topChr <= KN_ROW[1]) return(true);
			return(false);
			break;

        case GA_ROW[0]:
            TopChr = curInit.substr(0,1);
            for (i=0; i<5; i++){
                if (TopChr == GA_ROW[i]) return(true);
            }
            return(false);
            break;

        case ZA_ROW[0]:
            TopChr = curInit.substr(0,1);
            for (i=0; i<5; i++){
                if (TopChr == ZA_ROW[i]) return(true);
            }
            return(false);
            break;

        case DA_ROW[0]:
            TopChr = curInit.substr(0,1);
            for (i=0; i<5; i++){
                if (TopChr == DA_ROW[i]) return(true);
            }
            return(false);
            break;

        case BA_ROW[0]:
            TopChr = curInit.substr(0,1);
            for (i=0; i<5; i++){
                if (TopChr == BA_ROW[i]) return(true);
            }
            return(false);
            break;
    }
}

function TableFilter(){
    var goTbody = oSearchTable.all( SEARCH_BODY );
    if (goTbody == null) return;
    var i, iRow, curRow, curClass, s1, s2, s3, s4, s5;

    var childLen  = goTheadRow.children.length;
    var rowLen    = goTbody.rows.length;
    var itemIndex = new Array();
    var Hits = 0;   // Matched Entry Counter

    CINFO = new makeControlTableInfo();

    for (i=0; i<CINFO.length; i++){
        itemIndex[i] = DetermineItemIndex(i);
    }
    var w = F[ CTLID0 ]; if (w == null) return; // 頭文字   選択
    var x = F[ CTLID1 ]; if (x == null) return; // 品　詞   選択
    var y = F[ CTLID2 ]; if (y == null) return; // レベル   選択
    var z = F[ CTLID3 ]; if (z == null) return; // 検索文字 入力

    var curValue = new Array();

    curValue[0] = (w.selectedIndex > 0) ? w.options[w.selectedIndex].value : null;
    curValue[1] = (x.selectedIndex > 0) ? x.options[x.selectedIndex].value : null;
    curValue[2] = (y.selectedIndex > 0) ? y.options[y.selectedIndex].value : null;
    curValue[3] = z.value;

    for (iRow=0; iRow<rowLen; iRow++){
        curRow = goTbody.children[iRow];
        with(curRow){
            curInit  = children[itemIndex[HIDX1]].innerText;    // 頭文字(Control) <-- 読み
            curPart  = children[itemIndex[HIDX0]].innerText;    // 品詞  (Control)
			curClass = children[itemIndex[HIDX4]].innerText;	// レベル(Control)
            s1       = children[itemIndex[HIDX1]].innerText;    // 読み  (Data)
            s2       = children[itemIndex[HIDX2]].innerText;    // 単語  (Data)
            s3       = children[itemIndex[HIDX3]].innerText;    // 意味  (Data)
            s4       = children[itemIndex[HIDX5]].innerText;    // 備考  (Data)
            s5		 = curClass;
        }
        if (((curValue[0] == null)  || isInitCOK(curValue[0], curInit))  &&     // Init
            ((curValue[1] == null)  || isPartsOK(curValue[1], curPart))  &&     // Part
            ((curValue[2] == null)  || isClassOK(curValue[2], curClass)) &&     // Class
            ((curValue[3] == SPACE) || isKeywdOK(curValue[3], s1,s2,s3,s4,s5))){	// Search String
            curRow.style.display = SHOW_ON;
            Hits ++;
        } else {
            curRow.style.display = SHOW_OFF;
        }
    }
    CINFO = null;
    var x = F[ CTLID5 ];
    if (x != null) x.innerText = Hits;
}

function cmbButtonReset(){
    var x;
    var CMBID = new makeComboControlID();
    var loop  = CMBID.length;

    for (var i=0; i<loop; i++){
        x = F[CMBID[i]];
        switch(CMBID[i]){
            default:
                if (x != null) x.selectedIndex = 0;
                break;

            case CTLID3:
                if (x != null) x.value = SPACE;
                break;
        }
    }

    TableFilter();
/*
    var imgcol = goTheadRow.all( IMAGE_ID );
    var imgLen = imgcol.length;
    for (var x = 0; x<imgLen; x++){
        with(imgcol[x]){
            src = IMG_BLANK;
            style.display = SHOW_OFF;
        }
    }
    TableSort( SEARCH_BODY, SortByYomi );
    with(imgcol[SortByYomi]){
        src = ((giSortOrder) ? IMG_DOWN : IMG_UP);
        style.display = SHOW_ON;
    }
    giLastClick = HCAPS1;
    window.status = STR_MSG1;
*/
    x = F[CTLID3];
    if (x != null) x.focus();
}

function fnGetTargetSortFieldByCaps( cap ){
    var i, oCell;
    for (i=0; i<giColCount; i++){
        oCell = goTheadRow.children[i];
        if (oCell.innerText == cap){
            giSortOrder = ((giLastClick == cap) ? !giSortOrder : 0);
            giLastClick = cap;
            return i;   // return current field position
        }
    }
    return -1;
}

function CallTableSort( oSort ){    // This function is called from append04hr.htm:cmbSort
    // oSort: Control OBJECT for Sort; ie. 'cmbSort'
    var iSortField = fnGetTargetSortFieldByCaps( oSort.value );
    if (iSortField == -1) return;               // "SELECT" is selected
    var imgcol = goTheadRow.all( IMAGE_ID );    // Determined in ActTable3.htc
    var imgLen = imgcol.length;
    for (var x = 0; x<imgLen; x++){
        with(imgcol[x]){
            src = IMG_BLANK;
            style.display = SHOW_OFF;
        }
    }

    TableSort( SEARCH_BODY, iSortField );
    if (iSortField > 0){    // skip 品詞
        with(imgcol[iSortField]){
            src = ((giSortOrder) ? IMG_DOWN : IMG_UP);
            style.display = SHOW_ON;
        }
    }
//    oSort.selectedIndex = 0;
    window.status = STR_MSG1;
}

function TableSort( oTable, iSortField ){
    var oTBL = F[ oTable ];
    if (oTBL == null) return;
    TBROWS = oTBL.rows;
    TBNUM  = TBROWS.length;

    window.status = "... Sorting[" + ((giSortOrder == 0) ? "昇順" : "降順") + "] oSearchTable for " + TBNUM + " at Fileld: " + cmbSort.value + " ・・・ しばらくお待ちください。";
    TblQuickSort( TBROWS, 0, TBNUM, iSortField );
    window.status = "... Completed!!";

    TBROWS = null;
    TBNUM  = null;

}

// ******************************************************************
// *    QUICK SORT partition
// ******************************************************************

function partition(rows, l, r, pos){
    var i, j;

    i = l - 1;
    j = r;

    PIVOT = rows[r].cells[pos].innerText;

    if (giSortOrder == 0){
        do{
            while(rows[++i].cells[pos].innerText < PIVOT);
            while((i < --j) && (PIVOT < rows[j].cells[pos].innerText));
            if (i >= j) break;
            rows[i].swapNode(rows[j]);
        }while(1);
    } else {
        do{
            while(rows[++i].cells[pos].innerText > PIVOT);
            while((i < --j) && (PIVOT > rows[j].cells[pos].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, pos){
    // 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,...)
    // pos  : Table column position to be used as Sort-Key field (0,1,2,...)

//    if ((0 > pos) || (pos > 6)) return;	2006/09/19(Tsu)-14:18:22
    if ((0 > pos) || (pos > 5)) return;	// 2006/09/19(Tsu)-14:18:43
    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, pos);
            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;
            }
        }
    }
}

// #################################################################################
// #    << End of srctblc.js >> (C) 2002 Southern Cross Virtual Co., Ltd. (v1.2)
// #################################################################################
