// ******************************************************************
// *    Global Variables Definition
// ******************************************************************
@set @DEBUG = 0	// Program Debug Flag: ON(=1)/OFF(=0)

var CURRENT_DTIME_PTN = "MM/DD/YYYY hh:mm:ss";
var STANDARD_DATE_ID  = "MDATE";
var ThisVersion = "v2.19";
var CPATN   = null; // Current Patern Format String
var NPATN   = null; // New Pattern Format String
var iCurLen = 0;    // Current Pattern Format String Length
var iNewLen = 0;    // New Pattern Format String Length

if (typeof(F) == "undefined"){
    var F = document.all;
}

// ******************************************************************
// *    Data Format Constructor
// ******************************************************************

function fmPack( pos, chr, len ){
    this.Pos    = pos;  // Start Offset: based 0;-1:No data
    this.Chr    = chr;  // Format Qualifier; Default: ""
    this.Len    = len;  // Symbol Length; Default: 0 length
}
function makePatnArray( n ){
    // n: Pattern String Length (max)
    for (var i=0; i<n; i++){
        this[i] = new fmPack( -1, "", 0 );
    }
    this.length = n;
}

function getQualifyLen( cSYM ){
    for (i=0; i<iCurLen; i++){
        if (cSYM == CPATN[i].Chr) return(CPATN[i].Len);
        if (CPATN[i].Chr == "") break;
    }
    return(-1);
}

function getQualifyPos( cSYM ){
    for (i=0; i<iCurLen; i++){
        if (cSYM == CPATN[i].Chr) return(CPATN[i].Pos);
        if (CPATN[i].Chr == "") break;
    }
    return(-1);
}
function getQualifyChr( cSYM ){
    for (i=0; i<iCurLen; i++){
        if (cSYM == CPATN[i].Chr) return(i);
        if (CPATN[i].Chr == "") break;
    }
    return(-1);
}
if (typeof(makeDayOfWeek) == "undefined"){
    function wdPack(jday, eday){
        this.Jday = jday;   // JP
        this.Eday = eday;   // EN
    }
    function makeDayOfWeek(){
        var i = 0;
        this[i++] = new wdPack( "Sun", "Sun" ) ; // 0
        this[i++] = new wdPack( "Mon", "Mon" ) ; // 1
        this[i++] = new wdPack( "Tue", "Tue" ) ; // 2
        this[i++] = new wdPack( "Wed", "Wed" ) ; // 3
        this[i++] = new wdPack( "Thu", "Thu" ) ; // 4
        this[i++] = new wdPack( "Fri", "Fri" ) ; // 5
        this[i++] = new wdPack( "Sat", "Sat" ) ; // 6
        this.length = i;
    }
}
function updateTheYears(){
	var	x = F[ "clsYear" ];
	if (x != null){
		var d = new Date();
		with(d){
			var	TheYear  = getFullYear();
			var	TheMonth = getMonth();
		}
		if (TheMonth == 11) TheYear ++;
		x.title = x.title + " [" + TheYear + "]";
		x.children[0].innerText = TheYear;
	}
}
function fnFormatData( sNewPatn, sCurPatn, sData ){

    // sNewPatn: New output data format (string)    eg. "YYYY/MM/DD(ddd)-hh:mm:ss"
    // sCurPatn: Current input data format (string) eg. "MM/DD/YYYY hh:mm:ss"
    // sDate: Input raw data (string)               eg. 02/26/2003-10:08:30 ---> 2003/02/26(ddd)-10:08:30
    // sDate is expected as single byte data

    /* *---------------------------------------------------------------
    << Pre-Defined Symbols as place holder >>
        Y: Year  Symbol (eg. YYYY stands for 2003, YY is 03)
        M: Month Symbol (eg. MM stands for 10, 02,... so on)
        D: Day   Symbol (eg. DD stands for 06, 28,... so on)
        h: Hour  Symbol (eg. hh stands for 10, 05,... so on)
        m: Min.  Symbol (eg. mm stands for 01, 20,... so on)
        s: Sec.  Symbol (eg. ss stands for 10, 59,... so on)
    ----------------------------------------------------------------* */
    var i, j, k;    // General use purpose
    var aChr;       // Current character
    var pChr;       // Previous character
    var sYEAR;
    var s1 = "";
    var s2 = "";
    var s3 = "";
    var s  = "";

    iNewLen = sNewPatn.length;
    iCurLen = sCurPatn.length;
    CPATN   = new makePatnArray(iCurLen);
    NPATN   = new makePatnArray(iNewLen);

    for (pChr = null, i=0, j=0, k=0; i<iCurLen; i++){
        aChr = sCurPatn.substr(i,1);
        if (aChr == pChr){
            CPATN[k].Len ++;
            continue;
        }
        CPATN[j].Pos = i;
        CPATN[j].Chr = aChr;
        CPATN[j].Len ++;    // 1
        k = j++;
        pChr = aChr;
    }

    for (i=0; i<iCurLen; i++){
        if (CPATN[i].Pos == -1) break;
        s1 += CPATN[i].Chr + " ";
        s2 += CPATN[i].Pos + " ";
        s3 += CPATN[i].Len + " ";
    }

    for (pChr = null, i=0, j=0, k=0; i<iNewLen; i++){
        aChr = sNewPatn.substr(i,1);
        if (aChr == pChr){
            NPATN[k].Len ++;
            continue;
        }
        NPATN[j].Pos = i;
        NPATN[j].Chr = aChr;
        NPATN[j].Len ++;    // 1
        k = j++;
        pChr = aChr;
    }

    s1 = "";
    s2 = "";
    s3 = "";
    for (i=0; i<iNewLen; i++){
        if (NPATN[i].Pos == -1) break;
        s1 += NPATN[i].Chr + " ";
        s2 += NPATN[i].Pos + " ";
        s3 += NPATN[i].Len + " ";
    }

    for (i=0; i<iNewLen; i++){
        if ((nc = NPATN[i].Chr) == "") break;
        cp = getQualifyChr(nc);
        if ((cp != -1) && (CPATN[cp].Len == NPATN[i].Len)){ // nc is found in sData
            s += sData.substr(CPATN[cp].Pos, CPATN[cp].Len);
        } else if ((cp != -1) && ((CPATN[cp].Chr == 'Y') && (CPATN[cp].Len != NPATN[i].Len))){
            if (NPATN[i].Len == 4){
                sYEAR = sData.substr(CPATN[cp].Pos, CPATN[cp].Len);
                if (sYEAR > "50"){
                    sYEAR = "19" + sYEAR;   // 19XX
                } else {
                    sYEAR = "20" + sYEAR;   // 20XX
                }
            } else {
                sYEAR = sData.substr(CPATN[cp].Pos+(CPATN[cp].Len-NPATN[i].Len), NPATN[i].Len);
            }
            s += sYEAR;
        } else if (cp == -1){
            if (NPATN[i].Len == 1){ // should be a delimiter such as "/"
                s += ((nc == 'S') ? ' ' : nc);
            } else if ((nc == "d") && (NPATN[i].Len >= 3)){ // ddd ===> day of week
                var d = new Date();
                pY = getQualifyPos('Y'); lY = getQualifyLen('Y');
                pM = getQualifyPos('M'); lM = getQualifyLen('M');
                pD = getQualifyPos('D'); lD = getQualifyLen('D');
                sYEAR = (pY >= 0) ? sData.substr(pY, lY) : d.getFullYear();
                if (sYEAR.length == 2){
                    if (sYEAR > 50){
                        sYEAR = "19" + sYEAR;   // 19XX
                    } else {
                        sYEAR = "20" + sYEAR;   // 20XX
                    }
                }
                var iYEAR  = eval(sYEAR);
                var iMONTH = eval(sData.substr(pM, lM));
                var iDAY   = eval(sData.substr(pD, lD));
                d = new Date(iYEAR, iMONTH-1, iDAY);
                day = d.getDay();
                var DaysOfWeek = new makeDayOfWeek();
                s += DaysOfWeek[day].Eday;
                DaysOfWeek = null;
            } else {
                s += sNewPatn.substr(NPATN[i].Pos, NPATN[i].Pos);   // copy from NewPatn
            }
        }
    }
    return s;
}
function fnUpdateMdate( sID ){
    var oID = F[ sID ];
    if ((oID != null) && (oID.innerText.substr(0,2) == "YY")){  // (oID.innerText.substr(0,2) == "YY") is emergency to avoid twice call
        with(oID){
            style.display = "";
            //                       New Ptn    Current Pattern    Current Data(Date)
            innerText = fnFormatData(innerText, CURRENT_DTIME_PTN, document.lastModified);
        }
    }
}
function repLastModifiedDate(){
    fnUpdateMdate( STANDARD_DATE_ID );
}
function fnUpdateVersion( sID ){
    var oConectType = oBody.connectionType;
    var pType = (oConectType != "offline") ? "w" : "c";
    var coll = F.tags("SPAN");
    for (var i=0; i<coll.length; i++){
        if (coll[i].className == sID) coll[i].innerText = ThisVersion + pType;
    }
    @if (@DEBUG == 1) alert("Connection Type= " + oConectType); @end
}
function fnUpdateMdate2( sID ){
    var coll = F.tags("SPAN");
    for (var i=0; i<coll.length; i++){
        if (coll[i].className == sID && coll[i].innerText.substr(0,2) == "YY"){  // (oID.innerText.substr(0,2) == "YY") is emergency to avoid twice call
            with(coll[i]){
                style.display = "";
                //                       New Ptn    Current Pattern    Current Data(Date)
                innerText = fnFormatData(innerText, CURRENT_DTIME_PTN, document.lastModified);
            }
        }
    }
}
function fnUpdateProductInfo( sID1, sID2 ){
    // sID1: Version SPAN-Tag ClassName
    // sID2: Update Date SPAN-Tag ClassName
    fnUpdateVersion( sID1 );
    fnUpdateMdate2( sID2 );
}
function getNearestDay(dStr, day){
	if ((0 > day) || (day > 6)) return(dStr);
	var i, j, k;
	var cDay;
	var strYear;
	var strMonth;
	var strDate;
	var newDate;
	var numYear  = parseInt(dStr.substr(0,4), 10);
	var numMonth = parseInt(dStr.substr(5,2), 10) - 1;
	var numDate  = parseInt(dStr.substr(8,2), 10);
	var d = new Date();
	newDate = numDate + 1;
	do{
		d.setFullYear(numYear, numMonth, newDate);
		newDate ++;
	}while(day != d.getDay());
	with(d){
		strYear  = getFullYear();
		strMonth = getMonth() + 1;
		strDate  = getDate();
	}
	strMonth = (strMonth < 10) ? ("0" + strMonth) : strMonth;
	strDate  = (strDate  < 10) ? ("0" + strDate)  : strDate;
	var s = strYear + "/" + strMonth + "/" + strDate;
	return s;
}
function fnDateCountDown(){
	var	aYear, aDateStr, iYear, iMonth, iDay;
	var now = new Date();

	with(now){
		var tmpYear  = getFullYear();
		var tmpMonth = getMonth();
		var tmpDD	 = getDate();
	}
	tmpDD	 = (tmpDD < 10) ? ("0" + tmpDD) : tmpDD;
	aDateStr = tmpYear.toString() + "/" + "11/30";
	aYear    = getNearestDay(aDateStr, 0);
	iMonth 	 = 11;
	iDay	 = parseInt(aYear.substr(8,2), 10);
	if (tmpMonth < 11){
		iYear  = tmpYear;
	} else {	// 11 ==> 12
		if (iDay > parseInt(tmpDD, 10)){
			iYear  = tmpYear;
		} else {
			iYear    = tmpYear + 1;	// next year
			tmpYear  = iYear;
			aDateStr = tmpYear.toString() + "/" + "11/30";
			aYear    = getNearestDay(aDateStr, 0);
			iDay	 = parseInt(aYear.substr(8,2), 10);
		}
	}
	tmpDD = (iDay < 10) ? ("0" + iDay) : iDay;
	var point = new Date(iYear, iMonth, iDay);
	var countdown = Math.ceil( ( point.getTime() - now.getTime() ) / (1000*60*60*24) );
	with(F){
		oDays.value 			= countdown;
		oTestYear1.innerText	= tmpYear;	// Test Year, Not Calendar Year
		oTestYear2.innerText	= tmpYear;	// Test Year, Not Calendar Year
		oTestYear3.innerText	= tmpYear;	// Test Year, Not Calendar Year
		oTestDay.innerText		= tmpDD;
	}
}
function makeMonthNumber(){
	var i = 0;
	this[i++] = 31; // Jan
	this[i++] = 28; // Feb: to be modified by program
	this[i++] = 31; // Mar
	this[i++] = 30; // Apr
	this[i++] = 31; // May
	this[i++] = 30; // Jun
	this[i++] = 31; // Jul
	this[i++] = 31; // Aug
	this[i++] = 30; // Sep
	this[i++] = 31; // Oct
	this[i++] = 30; // Nov
	this[i++] = 31; // Dec
	this[i	] = null;
	this.length = i;
}
var NumMonth	= new makeMonthNumber();
var UPDATE_PIC  = "updated.gif";
var NEW_PIC     = "new2.gif";
var CONST_PIC   = "i13.gif";
var UPDATE_STR  = " updated";
var NEW_STR     = " released";
var CONST_STR   = " construction";
var MAX_EXPIRY  = "90";
function getDueDate(curDate, curDisp){
// parm1: curDate:String;  format yyyy/mm/dd
// parm2: curDisp:Integer; num of displacement

	var newDateStr = "";
	var strYYYY = curDate.substr( 0, 4 );	// YYYY
	var strMM	= curDate.substr( 5, 2 );	// MM
	var strDD	= curDate.substr( 8, 2 );	// DD
	var intYYYY = parseInt(strYYYY, 10);
	var intMM	= parseInt(strMM, 10);
	var intDD	= parseInt(strDD, 10);
	var mx		= intMM - 1;
	var newDate = intDD + parseInt(curDisp, 10);
	if (newDate > NumMonth[mx]){
		newDate = newDate - NumMonth[mx];
		intMM ++;
		if (intMM > 12){
			intMM = 1;
			intYYYY ++;
			strYYYY = intYYYY.toString();
		}
		strMM = (intMM < 10) ? ("0" + intMM.toString()) : intMM.toString();
	}
	strDD = (newDate < 10) ? ("0" + newDate.toString()) : newDate.toString();
	newDateStr = strYYYY + "/" + strMM + "/" + strDD;	// "yyyy/mm/dd"
	return newDateStr;
}
function imgDateCheck(){
	var d = new Date();
	with(d){
		var tmpYear  = getFullYear();
		var tmpMonth = getMonth() + 1;
		var tmpDD	 = getDate();
	}
	tmpMonth = (tmpMonth < 10) ? ("0" + tmpMonth) : tmpMonth;
	tmpDD	 = (tmpDD	 < 10) ? ("0" + tmpDD)	  : tmpDD;
	var toDay = tmpYear + "/" + tmpMonth + "/" + tmpDD;	// yyyy/mm/dd

	if ((((tmpYear % 4 == 0) && (tmpYear % 100 != 0)) || (tmpYear % 400 == 0))){
		 NumMonth[1] = 29;	// leap year
	}

	var limitDays, lTitle;
	var coll = F.tags("IMG");
	var clen = coll.length;
	var oModDate = F[ "MDATE" ];
	if (oModDate != null){
		var curModifiedDate = oModDate.innerText.substr(0, 10);	// yyyy/mm/dd
		var lstModifiedDate = oModDate.innerText;				// Initial Date
		var savModifiedDate = curModifiedDate;
	}
	for (var i=0; i<clen; i++){
		with(coll.item(i)){
			if ((className == "0") || (className == "") || isNaN(className)) continue;
			limitDays = (("0" > className) || (className > MAX_EXPIRY)) ? MAX_EXPIRY : className;
			startDate = title.substr(0,10);	// expected format:yyyy/mm/dd
			if (oModDate){
				if (curModifiedDate < startDate){
					curModifiedDate = startDate;
					lstModifiedDate = title.substr(0,24);
				}
			}
			limitDate = getDueDate(startDate, limitDays);
			if ((toDay < limitDate) || (title.indexOf(CONST_STR) != -1)){
				lTitle = title.toLowerCase();
				if (lTitle.indexOf(UPDATE_STR) != -1){
					 src = UPDATE_PIC;
				} else if ((src.indexOf(NEW_PIC) == -1) && (lTitle.indexOf(NEW_STR) != -1)){
					 src = NEW_PIC;
				} else if (src.indexOf(CONST_PIC) != -1){
					 src = CONST_PIC;
				}
				style.display = "";
			}
		}
	}
	if (oModDate && (curModifiedDate > savModifiedDate)){
		oModDate.innerText = lstModifiedDate;
		@if ( @DEBUG == 1 )
		window.status = "Replaced Last Modified Date As: " + lstModifiedDate;
		@end
	}
}
