// 各都市の時差を格納
var tz_ldn = 0 * 60;    // GMT +-0
var tz_tyo = 9 * 60;    // GMT  +9
var tz_jor = 2 * 60;    // GMT  +2
var tz_nyc = -5 * 60;   // GMT  -5

var today;
var year;
var tz_offset;
var pos_startUS;
var pos_endUS;
var pos_startUK;
var pos_endUK;


function initWorldClock()
{
    // まず今が何年か調べる
    today = new Date();
    year = today.getYear();
    if (year < 1900) { year += 1900; }

    // ローカル時間とグリニッジ標準時の差を分で表示
    tz_offset = today.getTimezoneOffset();

    // 米英のサマータイムの期間を格納
    pos_startUS  = GetDstStartUS(year);
    pos_endUS    = GetDstEndUS(year);
    pos_startUK  = GetDstStartUK(year);
    pos_endUK    = GetDstEndUK(year);

    // ◆各都市の表示欄の色づけ
    var cities = new Array(4);
    cities[0] = "LDN";
    cities[1] = "TYO";
    cities[2] = "JOR";
    cities[3] = "NYC";

    // いまの時刻を取得（たぶん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] == "JOR")    { var str = printtime(n_t,tz_jor); }
        else if (cities[i] == "NYC")    { var str = printtime(n_t,tz_nyc); }

        var tmpArr = str.split('&nbsp;&nbsp;&nbsp;', 2);
        str = String(tmpArr[1]);

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

        /*
         * ○時刻ごとの背景色設定
         * 白 ....... 6-16
         * 薄い青 ... 16-18, 5-6
         * 青 ....... 18-20, 4-5
         * 濃い青 ... 20-4
         */
        if ( 6 <= hour && hour < 16 ) {
            $('clock' + cities[i]).style.backgroundColor = '#FFF'; // '#eee';
        } else if ( (16 <= hour && hour < 18) || (5 <= hour && hour < 6) ) {
            $('clock' + cities[i]).style.backgroundColor = '#FFF'; // '#ccf';
        } else if ( (18 <= hour && hour < 20) || (4 <= hour && hour < 5) ) {
            $('clock' + cities[i]).style.backgroundColor = '#FFF'; // '#77c';
            // $('clock' + cities[i]).style.color = '#CCC';
        } else {
            $('clock' + cities[i]).style.backgroundColor = '#FFF'; // '#448';
            // $('clock' + cities[i]).style.color = '#888';
        }
    }

    updateWorldClock();
}


// ◆メインルーチン
function updateWorldClock() {
    // いまの時刻を取得（たぶん1000ミリ秒単位）
    var now  = new Date();
    var n_t  = now.getTime();

    $('clockLDN').innerHTML = printtime(n_t,tz_ldn);
    $('clockTYO').innerHTML = printtime(n_t,tz_tyo);
    $('clockJOR').innerHTML = printtime(n_t,tz_jor);
    $('clockNYC').innerHTML = printtime(n_t,tz_nyc);

    setTimeout('updateWorldClock()', 999);
}

// ◆米国版 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_jor || 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);
    month = t.getMonth() + 1;
    day   = t.getDate();
    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 '<span style="font-size:12px !important; position:relative; top:-2px;">' + month + '/' + day + '</span>&nbsp;&nbsp;&nbsp;' + hour + ":" + min + ":" + sec;
}
