/*

 *

 * ◆ worldclock.js

 *

 *    CREATED:  2001-10-23

 *    MODIFIED: 2002-07-20

 *    BY Yuki SHIMAZU

 *

 */





// まず今が何年か調べる

var today = new Date();

var year = today.getYear();

if (year < 1900) { year += 1900; }



// ローカル時間とグリニッジ標準時の差を分で表示

var tz_offset = today.getTimezoneOffset();



// 米英のサマータイムの期間を格納

var pos_startUS  = GetDstStartUS(year);

var pos_endUS    = GetDstEndUS(year);

var pos_startUK  = GetDstStartUK(year);

var pos_endUK    = GetDstEndUK(year);



// 各都市の時差を格納

var tz_ldn = 0 * 60;    // GMT +-0

var tz_tyo = 9 * 60;    // GMT  +9

var tz_lax = -8 * 60;   // GMT  -8

var tz_nyc = -5 * 60;   // GMT  -5

var tz_lax1 = -10 * 60;   // GMT  -10

var tz_nyc1 = -12 * 60;   // GMT  -12





//

// ◆各都市の表示欄の色づけ

//

cities = Array(4);

cities[0] = "ldn";

cities[1] = "tyo";

cities[2] = "lax";

cities[3] = "nyc";

cities[4] = "lax1";

cities[5] = "nyc1";



document.writeln("<style type=text/css>");



// いまの時刻を取得（たぶん1000ミリ秒単位）

var now  = new Date();

var n_t  = now.getTime();



for ( i=0; i<4; i++ ) {



    if (cities[i] == "ldn")         { var str = printtime(n_t,tz_ldn); }

    else if (cities[i] == "tyo")    { var str = printtime(n_t,tz_tyo); }

    else if (cities[i] == "lax")    { var str = printtime(n_t,tz_lax); }

    else if (cities[i] == "nyc")    { var str = printtime(n_t,tz_nyc); }

    else if (cities[i] == "lax1")    { var str = printtime(n_t,tz_lax1); }

    else if (cities[i] == "nyc1")    { var str = printtime(n_t,tz_nyc1); }



    var hour = str.substring(0,2);



    /*

     * ○時刻ごとの背景色設定

     * 白 ....... 6-16

     * 薄い青 ... 16-18, 5-6

     * 青 ....... 18-20, 4-5

     * 濃い青 ... 20-4

     */



    if ( 6 <= hour && hour < 16 ) {

        document.writeln("input." + cities[i] + " { background:#eee }");

    } else if ( (16 <= hour && hour < 18) || (5 <= hour && hour < 6) ) {

        document.writeln("input." + cities[i] + " { background:#ccf }");

    } else if ( (18 <= hour && hour < 20) || (4 <= hour && hour < 5) ) {

        document.writeln("input." + cities[i] + " { background:#77c;color:#ddd }");

    } else {

        document.writeln("input." + cities[i] + " { background:#448;color:#ddd }");

    }

}



document.writeln("</style>");







// ◆メインルーチン

function update_watch() {

    // いまの時刻を取得（たぶん1000ミリ秒単位）

    var now  = new Date();

    var n_t  = now.getTime();



    document.worldclock.ldn.value = printtime(n_t,tz_ldn);

    document.worldclock.tyo.value = printtime(n_t,tz_tyo);

    document.worldclock.lax.value = printtime(n_t,tz_lax);

    document.worldclock.nyc.value = printtime(n_t,tz_nyc);

    document.worldclock.lax1.value = printtime(n_t,tz_lax1);

    document.worldclock.nyc1.value = printtime(n_t,tz_nyc1);



    document.worldclock.internettime.value = internettime();



    setTimeout('update_watch()', 999);        // 1000msec = 1sec（秒）

}





// ◆米国版 DST 開始設定（４月第１日曜日2:00AM から 10月最終日曜日1:00AM まで）

// 引数arg_yearで指定された年のサマータイム開始時刻を return で返す

function GetDstStartUS(arg_year) {

    // 第2引数の3→4月　第3引数の1→1日　第4引数の2→2:00AM

    var dst_start = new Date(arg_year, 3, 1, 2, 0, 0);

    for (var i = 1; i <= 7; i++) {

        dst_start.setDate(i);

        if (0 == dst_start.getDay()) {    // 0は日曜日を意味する

            break;

        }

    }

    return dst_start.getTime();

}



// ◆米国版 DST 終了設定（４月第１日曜日2:00AM から 10月最終日曜日1:00AM まで）

// 引数arg_yearで指定された年のサマータイム終了時刻を return で返す

function GetDstEndUS(arg_year) {

    // 第2引数の9→10月　第3引数の31→31日　第4引数の1→1:00AM

    var dst_end = new Date(arg_year, 9, 31, 1, 0, 0);

    for (var i = 31; i > 24; i--) {

        dst_end.setDate(i);

        if (0 == dst_end.getDay()) {    // 0は日曜日を意味する

            break;

        }

    }

    return dst_end.getTime();

}





// ◆英国版 DST 開始設定（３月最終土曜日2:00AM から 10月最終土曜日2:00AM まで）

// 引数arg_yearで指定された年のサマータイム開始時刻を return で返す

function GetDstStartUK(arg_yearUK) {

    // 第2引数の2→3月　第3引数の31→31日　第4引数の2→2:00AM

    var dst_startUK = new Date(arg_yearUK, 2, 31, 2, 0, 0);

    for (var i = 31; i > 24; i--) {

        dst_startUK.setDate(i);

        if (6 == dst_startUK.getDay()) {    // 6は土曜日を意味する

            break;

        }

    }

    return dst_startUK.getTime();

}



// ◆英国版 DST 終了設定（３月最終土曜日2:00AM から 10月最終土曜日2:00AM まで）

// 引数arg_yearで指定された年のサマータイム終了時刻を return で返す

function GetDstEndUK(arg_yearUK) {

    // 第2引数の9→10月　第3引数の31→31日　第4引数の2→2:00AM

    var dst_endUK = new Date(arg_yearUK, 9, 31, 2, 0, 0);

    for (var i = 31; i > 24; i--) {

        dst_endUK.setDate(i);

        if (6 == dst_endUK.getDay()) {    // 6は土曜日を意味する

            break;

        }

    }

    return dst_endUK.getTime();

}





// ◆表示・サマータイム処理

function printtime(now_time, timezone) {

    var hour, min, sec;



    var pos_t = now_time + (tz_offset + timezone) * 60 * 1000;



    // サマータイム処理

    if (timezone == tz_ldn) {

        // ロンドン編

        if ((pos_startUK <= pos_t) && (pos_endUK > pos_t)) {

            pos_t += 60 * 60 * 1000;

        }

    } else if ( timezone == tz_lax || timezone == tz_nyc ) {

        // LA & NY 編

        if ((pos_startUS <= pos_t) && (pos_endUS > pos_t)) {

            pos_t += 60 * 60 * 1000;

        }

    }



    var t = new Date();

    t.setTime(pos_t);

    hour = t.getHours();

    min  = t.getMinutes();

    sec  = t.getSeconds();



    // 「XX時00分00秒」で、かつ、XX が「4,5,6,16,18,20」のうち

    // いずれかであるときにページをリロード

    // この処理により時間ごとの背景色が自動的に変わる

    if ( (hour==4||hour==5||hour==6||hour==16||hour==18||hour==20) && min==0 && sec==0 ) {

        window.location.reload();

    }



    if (hour < 10) {

        hour = "0" + hour;

    }

    if (min < 10) {

        min = "0" + min;

    }

    if (sec < 10) {

        sec = "0" + sec;

    }



    return hour + ":" + min + ":" + sec;

//    return hour + ":" + min;

}







// ◆インターネットタイムの処理

function internettime() {

    var c = new Date();

    var gmt = c.toGMTString();

    var d = gmt.indexOf(":")



    var h = eval( gmt.slice(d-2,d) );

    var m = eval( gmt.slice(d+1,d+3) );

    var s = eval( gmt.slice(d+4,d+6) );



    // LONDON と BIEL（SWATCH本社所在地／PARISとtime zoneが同じ）の 時差は１時間（3600秒）

    var beat = (h * 3600 + m * 60 + s + 3600) / 86.4;



    if (beat >= 1000) beat = beat - 1000;

    beat = Math.floor(beat);



    var zero = "";

    if (beat < 100) zero = "0";

    if (beat < 10) zero = "00";



    return "@" + zero + beat;

}