﻿/*--------------------------------------------------------------------------

 * 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;

}



