﻿/*--------------------------------------------------------------------------
 * Copyright (c) 2006, drk<drk7jp@gmail.com>(http://www.drk7.jp/)
 *
 * License :
 *   Articstic License 2.0
 *
 * Drk7jpWeather.js :
 *   This library is a utility for Japan Weather Forecast XML (JWFX) (http://www.drk7.jp/weather/)
 *
 *--------------------------------------------------------------------------*/
var JWFX_NODEID       = 'jwfx';
var JWFX_MENU_NODEID  = 'jwfx_menu';
var JWFX_JWFX_DEFAULT_ID    = '46';
var JWFX_DEFAULT_XML   = '13';
var JWFX_DEFAULT_AREA  = '東京地方';
var JWFX_LOCATION_XML  = '13';
var JWFX_LOCATION_AREA = '東京地方';
var JWFX_COOKIE_NAME   = 'jwfx_locationid';
var JWFX_LOCATION_IDS = 
[
    {'id':1  ,'pref':'北海道' ,   'xml':'01',  'area':'宗谷地方'},
    {'id':2  ,'pref':'北海道' ,   'xml':'01',  'area':'上川地方'},
    {'id':3  ,'pref':'北海道' ,   'xml':'01',  'area':'留萌地方'},
    {'id':4  ,'pref':'北海道' ,   'xml':'01',  'area':'網走地方'},
    {'id':5  ,'pref':'北海道' ,   'xml':'01',  'area':'北見地方'},
    {'id':6  ,'pref':'北海道' ,   'xml':'01',  'area':'紋別地方'},
    {'id':7  ,'pref':'北海道' ,   'xml':'01',  'area':'釧路地方'},
    {'id':8  ,'pref':'北海道' ,   'xml':'01',  'area':'根室地方'},
    {'id':9  ,'pref':'北海道' ,   'xml':'01',  'area':'十勝地方'},
    {'id':10 ,'pref':'北海道' ,   'xml':'01',  'area':'胆振地方'},
    {'id':11 ,'pref':'北海道' ,   'xml':'01',  'area':'日高地方'},
    {'id':12 ,'pref':'北海道' ,   'xml':'01',  'area':'石狩地方'},
    {'id':13 ,'pref':'北海道' ,   'xml':'01',  'area':'空知地方'},
    {'id':14 ,'pref':'北海道' ,   'xml':'01',  'area':'後志地方'},
    {'id':15 ,'pref':'北海道' ,   'xml':'01',  'area':'渡島地方'},
    {'id':16 ,'pref':'北海道' ,   'xml':'01',  'area':'檜山地方'},

    {'id':17 ,'pref':'青森県' ,   'xml':'02',  'area':'津軽'},
    {'id':18 ,'pref':'青森県' ,   'xml':'02',  'area':'下北'},
    {'id':19 ,'pref':'青森県' ,   'xml':'02',  'area':'三八上北'},

    {'id':20 ,'pref':'岩手県' ,   'xml':'03',  'area':'内陸'},
    {'id':21 ,'pref':'岩手県' ,   'xml':'03',  'area':'沿岸北部'},
    {'id':22 ,'pref':'岩手県' ,   'xml':'03',  'area':'沿岸南部'},

    {'id':23 ,'pref':'宮城県' ,   'xml':'04',  'area':'東部'},
    {'id':24 ,'pref':'宮城県' ,   'xml':'04',  'area':'西部'},

    {'id':25 ,'pref':'秋田県' ,   'xml':'05',  'area':'沿岸'},
    {'id':26 ,'pref':'秋田県' ,   'xml':'05',  'area':'内陸'},

    {'id':27 ,'pref':'山形県' ,   'xml':'06',  'area':'村山'},
    {'id':28 ,'pref':'山形県' ,   'xml':'06',  'area':'置賜'},
    {'id':29 ,'pref':'山形県' ,   'xml':'06',  'area':'庄内'},
    {'id':30 ,'pref':'山形県' ,   'xml':'06',  'area':'最上'},

    {'id':31 ,'pref':'福島県' ,   'xml':'07',  'area':'中通り'},
    {'id':32 ,'pref':'福島県' ,   'xml':'07',  'area':'浜通り'},
    {'id':33 ,'pref':'福島県' ,   'xml':'07',  'area':'会津'},

    {'id':34 ,'pref':'茨城県' ,   'xml':'08',  'area':'南部'},
    {'id':35 ,'pref':'茨城県' ,   'xml':'08',  'area':'北部'},

    {'id':36 ,'pref':'栃木県' ,   'xml':'09',  'area':'南部'},
    {'id':37 ,'pref':'栃木県' ,   'xml':'09',  'area':'北部'},

    {'id':38 ,'pref':'群馬県' ,   'xml':'10',  'area':'南部'},
    {'id':39 ,'pref':'群馬県' ,   'xml':'10',  'area':'北部'},

    {'id':40 ,'pref':'埼玉県' ,   'xml':'11',  'area':'南部'},
    {'id':41 ,'pref':'埼玉県' ,   'xml':'11',  'area':'北部'},
    {'id':42 ,'pref':'埼玉県' ,   'xml':'11',  'area':'秩父地方'},

    {'id':43 ,'pref':'千葉県' ,   'xml':'12',  'area':'北西部'},
    {'id':44 ,'pref':'千葉県' ,   'xml':'12',  'area':'北東部'},
    {'id':45 ,'pref':'千葉県' ,   'xml':'12',  'area':'南部'},

    {'id':46 ,'pref':'東京都' ,   'xml':'13',  'area':'東京地方'},
    {'id':47 ,'pref':'東京都' ,   'xml':'13',  'area':'伊豆諸島北部'},
    {'id':48 ,'pref':'東京都' ,   'xml':'13',  'area':'伊豆諸島南部'},
    {'id':49 ,'pref':'東京都' ,   'xml':'13',  'area':'小笠原諸島'},

    {'id':50 ,'pref':'神奈川県' , 'xml':'14',  'area':'東部'},
    {'id':51 ,'pref':'神奈川県' , 'xml':'14',  'area':'西部'},

    {'id':52 ,'pref':'新潟県' ,   'xml':'15',  'area':'下越'},
    {'id':53 ,'pref':'新潟県' ,   'xml':'15',  'area':'中越'},
    {'id':54 ,'pref':'新潟県' ,   'xml':'15',  'area':'上越'},
    {'id':55 ,'pref':'新潟県' ,   'xml':'15',  'area':'佐渡'},

    {'id':56 ,'pref':'富山県' ,   'xml':'16',  'area':'東部'},
    {'id':57 ,'pref':'富山県' ,   'xml':'16',  'area':'西部'},

    {'id':58 ,'pref':'石川県' ,   'xml':'17',  'area':'加賀'},
    {'id':59 ,'pref':'石川県' ,   'xml':'17',  'area':'能登'},

    {'id':60 ,'pref':'福井県' ,   'xml':'18',  'area':'嶺北'},
    {'id':61 ,'pref':'福井県' ,   'xml':'18',  'area':'嶺南'},

    {'id':62 ,'pref':'山梨県' ,   'xml':'19',  'area':'中・西部'},
    {'id':63 ,'pref':'山梨県' ,   'xml':'19',  'area':'東部・富士五湖'},

    {'id':64 ,'pref':'長野県' ,   'xml':'20',  'area':'北部'},
    {'id':65 ,'pref':'長野県' ,   'xml':'20',  'area':'中部'},
    {'id':66 ,'pref':'長野県' ,   'xml':'20',  'area':'南部'},

    {'id':67 ,'pref':'岐阜県' ,   'xml':'21',  'area':'美濃地方'},
    {'id':68 ,'pref':'岐阜県' ,   'xml':'21',  'area':'飛騨地方'},

    {'id':69 ,'pref':'静岡県' ,   'xml':'22',  'area':'中部'},
    {'id':70 ,'pref':'静岡県' ,   'xml':'22',  'area':'伊豆'},
    {'id':71 ,'pref':'静岡県' ,   'xml':'22',  'area':'東部'},
    {'id':72 ,'pref':'静岡県' ,   'xml':'22',  'area':'西部'},

    {'id':73 ,'pref':'愛知県' ,   'xml':'23',  'area':'西部'},
    {'id':74 ,'pref':'愛知県' ,   'xml':'23',  'area':'東部'},

    {'id':75 ,'pref':'三重県' ,   'xml':'24',  'area':'北中部'},
    {'id':76 ,'pref':'三重県' ,   'xml':'24',  'area':'南部'},

    {'id':77 ,'pref':'滋賀県' ,   'xml':'25',  'area':'南部'},
    {'id':78 ,'pref':'滋賀県' ,   'xml':'25',  'area':'北部'},

    {'id':79 ,'pref':'京都府' ,   'xml':'26',  'area':'南部'},
    {'id':80 ,'pref':'京都府' ,   'xml':'26',  'area':'北部'},

    {'id':81 ,'pref':'奈良県' ,   'xml':'29',  'area':'北部'},
    {'id':82 ,'pref':'奈良県' ,   'xml':'29',  'area':'南部'},

    {'id':83 ,'pref':'大阪府' ,   'xml':'27',  'area':'大阪府'},

    {'id':84 ,'pref':'兵庫県' ,   'xml':'28',  'area':'南部'},
    {'id':85 ,'pref':'兵庫県' ,   'xml':'28',  'area':'北部'},

    {'id':86 ,'pref':'和歌山県' , 'xml':'30',  'area':'南部'},
    {'id':87 ,'pref':'和歌山県' , 'xml':'30',  'area':'北部'},

    {'id':88 ,'pref':'鳥取県' ,   'xml':'31',  'area':'東部'},
    {'id':89 ,'pref':'鳥取県' ,   'xml':'31',  'area':'中・西部'},

    {'id':90 ,'pref':'島根県' ,   'xml':'32',  'area':'東部'},
    {'id':91 ,'pref':'島根県' ,   'xml':'32',  'area':'西部'},
    {'id':92 ,'pref':'島根県' ,   'xml':'32',  'area':'隠岐'},

    {'id':93 ,'pref':'岡山県' ,   'xml':'33',  'area':'南部'},
    {'id':94 ,'pref':'岡山県' ,   'xml':'33',  'area':'北部'},

    {'id':95 ,'pref':'広島県' ,   'xml':'34',  'area':'北部'},
    {'id':96 ,'pref':'広島県' ,   'xml':'34',  'area':'南部'},

    {'id':97 ,'pref':'山口県' ,   'xml':'35',  'area':'中部'},
    {'id':98 ,'pref':'山口県' ,   'xml':'35',  'area':'東部'},
    {'id':99 ,'pref':'山口県' ,   'xml':'35',  'area':'西部'},
    {'id':100,'pref':'山口県' ,   'xml':'35',  'area':'北部'},

    {'id':101,'pref':'徳島県' ,   'xml':'36',  'area':'北部'},
    {'id':102,'pref':'徳島県' ,   'xml':'36',  'area':'南部'},

    {'id':103,'pref':'香川県' ,   'xml':'37',  'area':'香川県'},

    {'id':104,'pref':'愛媛県' ,   'xml':'38',  'area':'中予'},
    {'id':105,'pref':'愛媛県' ,   'xml':'38',  'area':'東予'},
    {'id':106,'pref':'愛媛県' ,   'xml':'38',  'area':'南予'},

    {'id':107,'pref':'高知県' ,   'xml':'39',  'area':'中部'},
    {'id':108,'pref':'高知県' ,   'xml':'39',  'area':'東部'},
    {'id':109,'pref':'高知県' ,   'xml':'39',  'area':'西部'},

    {'id':110,'pref':'福岡県' ,   'xml':'40',  'area':'福岡地方'},
    {'id':111,'pref':'福岡県' ,   'xml':'40',  'area':'北九州地方'},
    {'id':112,'pref':'福岡県' ,   'xml':'40',  'area':'筑豊地方'},
    {'id':113,'pref':'福岡県' ,   'xml':'40',  'area':'筑後地方'},

    {'id':114,'pref':'佐賀県' ,   'xml':'41',  'area':'南部'},
    {'id':115,'pref':'佐賀県' ,   'xml':'41',  'area':'北部'},

    {'id':116,'pref':'長崎県' ,   'xml':'42',  'area':'南部'},
    {'id':117,'pref':'長崎県' ,   'xml':'42',  'area':'北部'},
    {'id':118,'pref':'長崎県' ,   'xml':'42',  'area':'壱岐・対馬'},
    {'id':119,'pref':'長崎県' ,   'xml':'42',  'area':'五島'},

    {'id':120,'pref':'熊本県' ,   'xml':'43',  'area':'熊本地方'},
    {'id':121,'pref':'熊本県' ,   'xml':'43',  'area':'阿蘇地方'},
    {'id':122,'pref':'熊本県' ,   'xml':'43',  'area':'天草・芦北地方'},
    {'id':123,'pref':'熊本県' ,   'xml':'43',  'area':'球磨地方'},

    {'id':124,'pref':'大分県' ,   'xml':'44',  'area':'中部'},
    {'id':125,'pref':'大分県' ,   'xml':'44',  'area':'北部'},
    {'id':126,'pref':'大分県' ,   'xml':'44',  'area':'西部'},
    {'id':127,'pref':'大分県' ,   'xml':'44',  'area':'南部'},

    {'id':128,'pref':'宮崎県' ,   'xml':'45',  'area':'南部平野部'},
    {'id':129,'pref':'宮崎県' ,   'xml':'45',  'area':'北部平野部'},
    {'id':130,'pref':'宮崎県' ,   'xml':'45',  'area':'南部山沿い'},
    {'id':131,'pref':'宮崎県' ,   'xml':'45',  'area':'北部山沿い'},

    {'id':132,'pref':'鹿児島県' , 'xml':'46',  'area':'薩摩地方'},
    {'id':133,'pref':'鹿児島県' , 'xml':'46',  'area':'大隅地方'},
    {'id':134,'pref':'鹿児島県' , 'xml':'46',  'area':'奄美地方'},

    {'id':135,'pref':'沖縄県' ,   'xml':'47',  'area':'本島中南部'},
    {'id':136,'pref':'沖縄県' ,   'xml':'47',  'area':'本島北部'},
    {'id':137,'pref':'沖縄県' ,   'xml':'47',  'area':'久米島'},
    {'id':138,'pref':'沖縄県' ,   'xml':'47',  'area':'大東島地方'},
    {'id':139,'pref':'沖縄県' ,   'xml':'47',  'area':'宮古島地方'},
    {'id':140,'pref':'沖縄県' ,   'xml':'47',  'area':'石垣島地方'},
    {'id':141,'pref':'沖縄県' ,   'xml':'47',  'area':'与那国島地方'}
];


/*--------------------------------------------------------------------------
 * JWFX_Selecter
 *--------------------------------------------------------------------------*/
var JWFX_Selecter = Class.create();
JWFX_Selecter.prototype={

    initialize: function(){
        this.container=$(JWFX_MENU_NODEID);
        this.t_select = document.createElement('select');

        var selected_value = getCookie(JWFX_COOKIE_NAME);
        if(!selected_value) {
            selected_value     = JWFX_JWFX_DEFAULT_ID;
            JWFX_LOCATION_XML  = JWFX_DEFAULT_XML;
            JWFX_LOCATION_AREA = JWFX_DEFAULT_AREA;
        } else {
            JWFX_LOCATION_XML  = JWFX_LOCATION_IDS[selected_value-1].xml;
            JWFX_LOCATION_AREA = JWFX_LOCATION_IDS[selected_value-1].area;
        }

        new XML2JSON('http://www.drk7.jp/weather/xml/' + JWFX_LOCATION_XML + '.xml' , {container:JWFX_NODEID, template:this.template, id:0});

        for(var i=0;i<JWFX_LOCATION_IDS.length;i++){
            this.t_select.options[i]
                = new Option(JWFX_LOCATION_IDS[i].pref + '(' + JWFX_LOCATION_IDS[i].area + ')'
                            ,JWFX_LOCATION_IDS[i].id
                            ,false,false);
        }

        this.t_select.options[selected_value-1].selected=true;
        this.container.appendChild(this.t_select);
        Event.observe(this.t_select,'change', this.t_onchange.bindAsEventListener(this), false);
        Event.observe(this.t_select,'keydown',this.t_onchange.bindAsEventListener(this), false);
        Event.observe(this.t_select,'keyup',  this.t_onchange.bindAsEventListener(this), false);
    },
    template: function(context) {
        var html = '<table summary="" border="0" cellspacing="2" cellpadding="0">'
        + '<tbody>'
        + '<tr>'
        + '<td width="30" align="right">　</td>'
        + '<td width="50" align="center">天気</td>'
        + '<td width="65" align="center">気温</td>'
        + '<td width="60" align="center">降水</td>'
        + '<tr><td colspan="4" bgcolor="#808080"></td></tr>';

        var min = new Array(7);
        var max = new Array(7);
        var day = new Array(7);
        var p_max = new Array(7);
        var p_min = new Array(7);
        var elem = context.pref.area[JWFX_LOCATION_AREA];
        if(!elem) elem = context.pref.area;
        for(var i=0, length=elem.info.length; i<length; i++) {
            day[i]=elem.info[i].date.substr(8,10) + '日';
            min[i]='?'; if(elem.info[i].temperature.range[1].content!='[object Object]') {min[i]=elem.info[i].temperature.range[1].content;}
            max[i]='?'; if(elem.info[i].temperature.range[0].content!='[object Object]') {max[i]=elem.info[i].temperature.range[0].content;}

            if(String(min[i])=='undefined') {min[i]='?';}
            if(String(max[i])=='undefined') {max[i]='?';}

            p_max[i]='?';
            p_min[i]='?';
            if(i<2) {
                for(var j=0; j<4; j++) {
                    if(elem.info[i].rainfallchance.period[j].content!='[object Object]' && elem.info[i].rainfallchance.period[j].content!='--') {
                        if(p_max[i]=='?' || p_max[i]<elem.info[i].rainfallchance.period[j].content) {
                            p_max[i] = elem.info[i].rainfallchance.period[j].content;
                        }
                        if(p_min[i]=='?' || p_min[i]>elem.info[i].rainfallchance.period[j].content) {
                            p_min[i] = elem.info[i].rainfallchance.period[j].content;
                        }
                    }
                }
                if(String(p_max[i])=='undefined') {p_max[i]='?';}
                if(String(p_min[i])=='undefined') {p_min[i]='?';}
            }
        }

        html += '<tr><td width="30">' + day[0] + '</td>'
        + '<td width="50" align="center"><img src="' + elem.info[0].img + '" width="50" title="' + elem.info[0].weather_detail + '" /></td>'
        + '<td width="65" align="center"><font color="#0050F0">' + min[0] + '</font>～<font color="#FF0055">' + max[0] + '</font>℃</td>'
        + '<td width="60" align="center"><font color="#0050F0">' + p_min[0] + '～' + p_max[0] + '%</font></td></tr>'
        + '<tr><td width="30">' + day[1] + '</td>'
        + '<td width="50" align="center"><img src="' + elem.info[1].img + '" width="50" title="' + elem.info[1].weather_detail + '" /></td>'
        + '<td width="65" align="center"><font color="#0050F0">' + min[1] + '</font>～<font color="#FF0055">' + max[1] + '</font>℃</td>'
        + '<td width="60" align="center"><font color="#0050F0">' + p_min[1] + '～' + p_max[1] + '%</font></td></tr>'
        + '</table>';

        return html;
    },
    t_onchange :function() {
        var selected_value = $F(this.t_select);

        if(JWFX_LOCATION_XML == selected_value) { return; }
        JWFX_LOCATION_XML  = JWFX_LOCATION_IDS[selected_value-1].xml;
        JWFX_LOCATION_AREA = JWFX_LOCATION_IDS[selected_value-1].area;

        var expire = new Date('2010','01', '01');
        setCookie(JWFX_COOKIE_NAME, selected_value, expire);
        new XML2JSON('http://www.drk7.jp/weather/xml/' + JWFX_LOCATION_XML+ '.xml' , {container:JWFX_NODEID, template:this.template, id:0});
    }
};


/*--------------------------------------------------------------------------
 * Event
 *--------------------------------------------------------------------------*/
Event.observe(window, "load", function(){
    var d = $(JWFX_NODEID);
    $(JWFX_NODEID).innerHTML = 'now loading...';

    new JWFX_Selecter();
});




/*--------------------------------------------------------------------------
 * Cookie
 *--------------------------------------------------------------------------*/
function setCookie(name,value,expire){
    document.cookie = name + '=' + escape(value) + ((expire==null)?'':('; expires='+expire.toGMTString()));
}

function getCookie(name){
    var search = name + '=';
    if(document.cookie.length>0) {
        offset = document.cookie.indexOf(search);
        if(offset != -1) {
            offset += search.length;
            end     = document.cookie.indexOf(';',offset);
            if(end == -1) {
                end = document.cookie.length;
            }
            return unescape(document.cookie.substring(offset,end));
        }
    }
    return null;
}

