var emginfo_timer = null;
var emginfo_update_interval_second = 30;
function parseXml(xml) {
  var emginfo = {earthquake_list: [], tsunami_list: []};
  $(xml).find("Result").each(function() {
    var result_type = $(this).attr("type");
    if (result_type == "EARTHQUAKE") {
      var maxSeismicIntensity = $(this).find('MaxSeismicIntensity').text();
      if ($.inArray(maxSeismicIntensity, ['1', '2', '3', '4']) < 0) {
        emginfo.earthquake_list.push($(this));
      }
    } else if (result_type == "TSUNAMI") {
      emginfo.tsunami_list.push($(this));
    }
  });
  return emginfo;
}
function parseISO8601(isodatetime) {
  var newdate = isodatetime.replace(/^(\d{4})-(\d{2})-(\d{2})T([0-9:]*)([.0-9]*)(.)(.*)$/, '$1/$2/$3 $4 GMT');
  newdate = Date.parse(newdate) + 1000 * RegExp.$5;
  var k = +1;
  newdate -= k * Date.parse('1970/01/01 ' + RegExp.$7 + ' GMT') * (RegExp.$6 + '1');
  return new Date(newdate);
}
function strftime(d, format) {
  var day = d.getDate();
  var hour = d.getHours();
  var minute = d.getMinutes();
  return day + "日" + hour + "時" + minute + "分";
}
function buildEarthquakeElem(earthquake) {
  var emgbox = $('<div></div>').attr("class", "emgbox");
  var emgtitle = $('<div></div>').attr('class', 'emgtitle');
  var refTime = parseISO8601(earthquake.find("refTime").text());
  var observationTime = parseISO8601(earthquake.find("observationTime").text());
  var epicenterAreaName = earthquake.find("epicenterAreaName").text();
  var MaxSeismicIntensity = earthquake.find("MaxSeismicIntensity").text();
  var note = earthquake.find("note").text();
  var link = earthquake.find("Link[name=pc]").text();
  emgtitle.text('地震情報　' + strftime(refTime) + '発表');
  emgbox.append(emgtitle);
  var buf = [];
  buf.push(strftime(observationTime) + "ごろ地震がありました。<br />");
  buf.push('[震央]' + epicenterAreaName + '　[震度]' + MaxSeismicIntensity);
  buf.push('　<a href="' + link + '" target="_blank">Yahoo!天気情報</a>');
  var emgbody = $('<div></div>').attr('class', 'emgbody').html(buf.join(''));
  emgbox.append(emgbody);
  return emgbox;
}
function buildEarthquakeListElem(emginfo) {
  var container = $('<div></div>').attr("class", "emginfo_type_container");
  if (emginfo.tsunami_list.length == 0) {
    container.css('width', '900px');
    if (emginfo.earthquake_list.length == 1) {
      container.css('text-align', 'center');
    }
  }
  $.each(emginfo.earthquake_list, function() {
    container.append(buildEarthquakeElem($(this)));
  });
  return container;
}
function buildTsunamiElem(tsunami) {
  var emgbox = $('<div></div>').attr("class", "emgbox");
  var emgtitle = $('<div></div>').attr('class', 'emgtitle');
  var refTime = parseISO8601(tsunami.find("refTime").text());
  var link = tsunami.find("Link[name=pc]").text();
  emgtitle.text('津波情報　' + strftime(refTime) + '発表');
  emgbox.append(emgtitle);
  var buf = [];
  buf.push("津波に関する情報が発表されています。<br />今後の情報に注意してください。");
  buf.push('　<a href="' + link + '" target="_blank">Yahoo!天気情報</a>');
  var emgbody = $('<div></div>').attr('class', 'emgbody').html(buf.join(''));
  emgbox.append(emgbody);
  return emgbox;
}
function buildTsunamiListElem(emginfo) {
  var container = $('<div></div>').attr("class", "emginfo_type_container");
  if (emginfo.earthquake_list.length == 0) {
    container.css('width', '900px');
    if (emginfo.tsunami_list.length == 1) {
      container.css('text-align', 'center');
    }
  }
  $.each(emginfo.tsunami_list, function() {
    container.append(buildTsunamiElem($(this)));
  });
  return container;
}
function buildEmginfoElem(emginfo) {
  var container = $('<div></div>').attr("id", "emginfo_container");
  if (emginfo.earthquake_list.length > 0) {
    var earthquake_list_container = buildEarthquakeListElem(emginfo);
    container.append(earthquake_list_container);
  }
  if (emginfo.tsunami_list.length > 0) {
    var tsunami_list_container = buildTsunamiListElem(emginfo);
    container.append(tsunami_list_container);
  }
  return container;
}
function showResultSet(emginfo) {
  var emginfoElem = $("#emginfo");
  if (emginfo.earthquake_list.length == 0 && emginfo.tsunami_list.length == 0) {
    emginfoElem.hide();
    return;
  }
  emginfoElem.empty();
  emginfoElem.append(buildEmginfoElem(emginfo));
  emginfoElem.show();
}
function updateEmgInfo() {
  var url = "/webapi/emg.xml";
  var datatype = "xml";
  $.get(url, function(xml) {
    showResultSet(parseXml(xml));
  }, datatype);
}
function initEmgInfo() {
  $.ajaxSetup({
    cache: false
  });
  $("#emginfo").ajaxStart(function(evt) {
  }).ajaxSend(function(evt, xhr, options) {
  }).ajaxSuccess(function(evt, xhr, options) {
  }).ajaxError(function(evt, xhr, options, err) {
    $("#emginfo").hide();
    if (emginfo_timer) {
      clearInterval(emginfo_timer);
    }
  }).ajaxComplete(function(evt, xhr, options) {
  });
}
function startUpdateEmgInfo() {
  emginfo_timer = setInterval('updateEmgInfo()', emginfo_update_interval_second * 1000);
}
$(document).ready(function() {
  initEmgInfo();
  updateEmgInfo();
  startUpdateEmgInfo();
})


