<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs
title="iATND"
title_url="http://hkzo.org/2010/02/iatnd-igoogle-gadgets/"
directory_title="iATND - ATND Viewer"
author="&#x304B;&#x305A;"
author_email="takanaoch+gadgets@gmail.com"
author_affiliation="hkzo.org"
author_link="http://hkzo.org/"
author_location="Tokyo, JP"
author_aboutme="SE, IT Architect, Web Develpoer"
author_quote="http://twitter.com/hkzo/"
height="200"
description="&#x30A4;&#x30D9;&#x30F3;&#x30C8;&#x958B;&#x50AC;&#x652F;&#x63F4;&#x30C4;&#x30FC;&#x30EB;&#xFF1A;ATND&#xFF08;http://atnd.org/&#xFF09;&#x3067;&#x306E;&#x81EA;&#x5206;&#x306E;&#x30AD;&#x30E3;&#x30F3;&#x30BB;&#x30EB;&#x5F85;&#x3061;&#x72B6;&#x6CC1;&#x306A;&#x3069;&#x3092;&#x8868;&#x793A;&#x3059;&#x308B;&#x3053;&#x3068;&#x304C;&#x3067;&#x304D;&#x308B;&#x30AC;&#x30B8;&#x30A7;&#x30C3;&#x30C8;&#x3067;&#x3059;&#x3002;&#xFF08;&#x30E6;&#x30FC;&#x30B6;ID&#x306F;ATND&#x306B;&#x30ED;&#x30B0;&#x30A4;&#x30F3;&#x5F8C;&#x753B;&#x9762;&#x4E0A;&#x90E8;&#x306E;&#x540D;&#x524D;&#x306E;&#x30EA;&#x30F3;&#x30AF;&#x3067; http://atnd.org/users/99999 &#x306E;&#x6570;&#x5B57;&#x306E;&#x90E8;&#x5206;&#x306B;&#x306A;&#x308A;&#x307E;&#x3059;&#xFF09;[Link1] http://hkzo.org/ [Link2] http://twitter.com/hkzo"
thumbnail="http://www.google.com/ig/images/no_image/no_image_gadget_thm.png"
screenshot="http://hosting.gmodules.com/ig/gadgets/file/116868876864061975084/iATND_1.png"
singleton="false"
>
<Require feature="setprefs" />
<Require feature="dynamic-height" />
<Require feature="settitle"/>
<Require feature="com.google.gadgets.analytics"/> 
</ModulePrefs>
<UserPref name="TITLE" display_name="&#x30BF;&#x30A4;&#x30C8;&#x30EB;" datatype="string" default_value="iATND"></UserPref>
<UserPref name="USERID" display_name="USER ID" datatype="string" default_value=""></UserPref>
<UserPref name="COUNT" display_name="&#x8868;&#x793A;&#x4EF6;&#x6570;" datatype="enum" default_value="5">
  <EnumValue value="1" display_value="1"/>
  <EnumValue value="2" display_value="2"/>
  <EnumValue value="3" display_value="3"/>
  <EnumValue value="4" display_value="4"/>
  <EnumValue value="5" display_value="5"/>
  <EnumValue value="6" display_value="6"/>
  <EnumValue value="7" display_value="7"/>
  <EnumValue value="8" display_value="8"/>
  <EnumValue value="9" display_value="9"/>
  <EnumValue value="10" display_value="10"/>
</UserPref>
<UserPref name="DISPCANCEL" display_name="&#x30AD;&#x30E3;&#x30F3;&#x30BB;&#x30EB;&#x3082;&#x8868;&#x793A;" datatype="bool" default_value="true"></UserPref>
<UserPref name="CANCEL" display_name="&#x30AD;&#x30E3;&#x30F3;&#x30BB;&#x30EB;&#x5F85;&#x3061;&#x30AB;&#x30A6;&#x30F3;&#x30C8;" datatype="bool" default_value="true"></UserPref>
<Content type="html"><![CDATA[
<html>
<head>
<!-- Revision 1.3.7 -->
<style type="text/css">
<!--
body,td,th,p{margin:0px;font-family:Verdana,'MS UI Gothic',arial,sans-serif;font-size:12px;line-height:1.5;color:#333;}
table{border-collapse:collapse;width:100%;font-size:12px;font-weight:normal;}
td{border-bottom:1px solid #7aa5d6;text-align:left;color:#333;background:#fff;}
th{border-bottom:1px solid #7aa5d6;font-weight:bold;height:22px;color:#002ccc;background:#e5ecf9;}
td.event {}
td.status {text-align:center;}
td .red {color:#ff0000;}
p{color:#363636;line-height:2;}
.ended {color:#800000;}
.soon {color:#ff6060;}
-->
</style>
</head>
<body onload="getAtnd();">
<div id="contents"></div>
<p><input type="button" value="Update" onclick="getAtnd();" /></p>
</body>
</html>

<script type="text/javascript">
function getAtnd() {
  var prefs = new gadgets.Prefs();
  var title = prefs.getString("TITLE");
  var uid = prefs.getString("USERID");
  var cnt = prefs.getString("COUNT");

  if (title != '') {
    gadgets.window.setTitle(title);
  }
  if (uid != '') {
    document.getElementById('contents').innerHTML = 'Requesting....';
    var params = {};  
    params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.JSON;
    makeCachedRequest('http://api.atnd.org/events/users/?format=json&user_id=' + uid + '&count=' + cnt, update, params, 300);
  } else {
    document.getElementById('contents').innerHTML = '<p>[&#x8A2D;&#x5B9A;&#x3092;&#x7DE8;&#x96C6;]&#x304B;&#x3089;USER ID&#x3092;&#x8A2D;&#x5B9A;&#x3057;&#x3066;&#x304F;&#x3060;&#x3055;&#x3044;</p>';
  }
}

function update(json) {
  if (!json.data) {
      document.getElementById('contents').innerHTML = '<p>&#x60C5;&#x5831;&#x3092;&#x53D6;&#x5F97;&#x3067;&#x304D;&#x307E;&#x305B;&#x3093;&#x3067;&#x3057;&#x305F;&#x3002;&#x3057;&#x3070;&#x3089;&#x304F;&#x3057;&#x3066;&#x304B;&#x3089;Update&#x3057;&#x3066;&#x307F;&#x3066;&#x304F;&#x3060;&#x3055;&#x3044;&#x3002;</p>';
      return;
  }

  var data = json.data;
  if(data.results_returned < 1) {
      document.getElementById('contents').innerHTML = '<p>&#x8868;&#x793A;&#x3059;&#x3079;&#x304D;&#x30A4;&#x30D9;&#x30F3;&#x30C8;&#x304C;&#x3042;&#x308A;&#x307E;&#x305B;&#x3093;&#x3002;</p>';
      return;
  }
  
  var prefs = new gadgets.Prefs();
  var uid = prefs.getString("USERID");
  var cancel = prefs.getBool("CANCEL");
  var dispcancel = prefs.getBool("DISPCANCEL");

  var html = new Array();
  html.push(
  '<table>',
  '<tr>',
  '<th width="70%"><font size="2">Event</font></th>',
  '<th width="30%"><font size="2">Status</font></th>',
  '</tr>'
  );

  var events = new Array();
  if(data.results_returned > 0) {
    for(var i = 0; i < data.events.length; i++) {
      var cancel_ct = 0;
      var st = '';
      for (var u = 0; u < data.events[i].users.length; u++) {
        if (data.events[i].users[u].user_id == uid) {
          if (data.events[i].users[u].status == 1) {
            st = '&#x51FA;&#x5E2D;';
          } else {
            if (cancel) {
              st = '&#x30AD;&#x30E3;&#x30F3;&#x30BB;&#x30EB;<span class="red">' + (cancel_ct + 1) + '&#x4EBA;</span>&#x5F85;&#x3061;';
            } else {
              st = '&#x30AD;&#x30E3;&#x30F3;&#x30BB;&#x30EB;&#x5F85;&#x3061;';
            }
          }
          break;
        } else {
          if (cancel && data.events[i].users[u].status != 1) {
            cancel_ct++;
          }
        }
      }
      if (dispcancel == true && st == '') {
            st = '&#x30AD;&#x30E3;&#x30F3;&#x30BB;&#x30EB;';
      }
      if (st != '') {
          var eid = data.events[i].event_id;
          events.push(eid);
          html.push(
          '<tr>',
          '<td class="event">',
          '<span id="before_title_', eid, '"></span>',
          '<a id="a_', eid, '" href="', data.events[i].event_url, '" target="_blank">',
          gadgets.util.escapeString(data.events[i].title),
          '</a>',
          '<span id="after_title_', eid, '"></span>',
          '</td>',
          '<td class="status" id="status_', eid, '">',
          st,
          '</td>',
          '</tr>'
          );
       }
    }
  }

  html.push(
  '</table>'
  );
  var contents = document.getElementById('contents');
  contents.innerHTML=html.join('');

  if(data.results_returned > 0) {
    var params = {};  
    params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.JSON;
    var event_list = events.join(',');
    makeCachedRequest('http://api.atnd.org/events/?format=json&event_id=' + event_list, updateEvent, params, 300);
  }  

  gadgets.window.adjustHeight();
}

function updateEvent(json) {
  if (json.data) {
    var data = json.data;
    if(data.results_returned > 0) {
    
      for(var i = 0; i < data.events.length; i++) {
        var el;
        var nt = (new Date()).getTime();
        var day3 = 3*24*60*60*1000;
        var started_at = toDateTime(data.events[i].started_at);

        var dis = started_at - nt;
        if (dis > 0 && dis <= day3) {
          //el = document.getElementById('before_title_' + data.events[i].event_id);
          //el.innerHTML = '<img src="http://hosting.gmodules.com/ig/gadgets/file/116868876864061975084/iAtnd_i.png" style="widht: 16px; height: 16px; vertical-align:text-bottom" alt="" title="&#x3082;&#x3046;&#x3059;&#x3050;&#xFF01;"/>';
          el = document.getElementById('before_title_' + data.events[i].event_id);
          el.setAttribute("class", "soon");
          el.innerHTML = '&#x3010;&#x3082;&#x3046;&#x3059;&#x3050;&#x3011;';
        }
          
        el = document.getElementById('a_' + data.events[i].event_id);
        el.title = '&#x3010;&#x65E5;&#x6642;&#x3011;' + data.events[i].started_at.replace('T', ' ').replace('+09:00', '') + ' &#x3010;&#x5834;&#x6240;&#x3011;' + data.events[i].place;

        // &#x7D42;&#x4E86;&#x65E5;&#x304C;&#x767B;&#x9332;&#x3055;&#x308C;&#x3066;&#x3044;&#x306A;&#x3044;&#x5834;&#x5408;&#x306B;&#x306F;&#x958B;&#x59CB;&#x5F8C;&#xFF18;&#x6642;&#x9593;&#x3067;&#x7D42;&#x4E86;&#x3068;&#x307F;&#x306A;&#x3059;
        var ended_at;
        if (data.events[i].ended_at == null) {
          ended_at = toDateTime(data.events[i].started_at) + 28800000; /* 8*60*60*1000 */
        } else {
          ended_at = toDateTime(data.events[i].ended_at);
        }
        if (ended_at < nt) {
          //el = document.getElementById('after_title_' + data.events[i].event_id);
          //el.setAttribute("class", "ended");
          //el.innerHTML = '&nbsp;&#x3010;&#x7D42;&#x4E86;&#x3011;';
          el = document.getElementById('status_' + data.events[i].event_id);
          var orig=el.innerHTML;
          el.innerHTML = "&#x7D42;&#x4E86;(" + orig + ")";
        }
      }
      gadgets.window.adjustHeight();
    }
  }
}

// http://code.google.com/intl/ja/apis/gadgets/docs/remote-content.html#Cache
function makeCachedRequest(url, callback, params, refreshInterval) {
  var ts = new Date().getTime();
  var sep = "?";
  if (refreshInterval && refreshInterval > 0) {
    ts = Math.floor(ts / (refreshInterval * 1000));
  }
  if (url.indexOf("?") > -1) {
    sep = "&";
  }
  url = [ url, sep, "nocache=", ts ].join("");
  gadgets.io.makeRequest(url, callback, params);
}

// based on http://www.kawa.net/works/js/date/w3cdtf.html              
function toDateTime(dtf) {
    if (dtf == null) return;

    var sp = dtf.split( /[^0-9]/ );

    // invalid format
    if ( sp.length < 6 || sp.length > 8 ) return;

    // invalid time zone
    if ( sp.length == 7 ) {
        if ( dtf.charAt( dtf.length-1 ) != "Z" ) return;
    }

    // to numeric
    for( var i=0; i<sp.length; i++ ) sp[i] = sp[i]-0;

    // invalid range
    if ( sp[0] < 1970 ||                // year
         sp[1] < 1 || sp[1] > 12 ||     // month
         sp[2] < 1 || sp[2] > 31 ||     // day
         sp[3] < 0 || sp[3] > 23 ||     // hour
         sp[4] < 0 || sp[4] > 59 ||     // min
         sp[5] < 0 || sp[5] > 60 ) {    // sec
        return;                         // invalid date 
    }

    // get UTC milli-second
    var msec = Date.UTC( sp[0], sp[1]-1, sp[2], sp[3], sp[4], sp[5] );

    // time zene offset
    if ( sp.length == 8 ) {
        if ( dtf.indexOf("+") < 0 ) sp[6] *= -1;
        if ( sp[6] < -12 || sp[6] > 13 ) return;    // time zone offset hour
        if ( sp[7] < 0 || sp[7] > 59 ) return;      // time zone offset min
        msec -= (sp[6]*60+sp[7]) * 60000;
    }

    // set by milli-second;
    return msec;
};

var ga = new _IG_GA('UA-13144392-1');
ga.reportPageview('/iGoogle/iATND');

</script>
]]></Content>
</Module>


