<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs title="__UP_title__"
             author="__MSG_google__"
             author_email="sophia.feedback+countdown@gmail.com"
             screenshot="__MSG_countdown_screenshot__"
             thumbnail="http://www.google.com/ig/modules/gadgetmaker_content/thumbs/countdown.png"
             description="__MSG_countdown_description__">
  <Require feature="dynamic-height"/>
  <Require feature="views"/>
  <Require feature="setprefs"/>
  <Require feature="gadgetmaker"/>
  <Locale messages="/ig/modules/gadgetmaker_content/en_ALL.xml"/>
  <Locale lang="ar" messages="/ig/modules/gadgetmaker_content/ar_ALL.xml"
          language_direction="rtl"/>
  <Locale lang="bg" messages="/ig/modules/gadgetmaker_content/bg_ALL.xml"/>
  <Locale lang="ca" messages="/ig/modules/gadgetmaker_content/ca_ALL.xml"/>
  <Locale lang="cs" messages="/ig/modules/gadgetmaker_content/cs_ALL.xml"/>
  <Locale lang="da" messages="/ig/modules/gadgetmaker_content/da_ALL.xml"/>
  <Locale lang="de" messages="/ig/modules/gadgetmaker_content/de_ALL.xml"/>
  <Locale lang="el" messages="/ig/modules/gadgetmaker_content/el_ALL.xml"/>
  <Locale lang="en-GB"
          messages="/ig/modules/gadgetmaker_content/en-GB_ALL.xml"/>
  <Locale lang="es" messages="/ig/modules/gadgetmaker_content/es_ALL.xml"/>
  <Locale lang="es-419"
          messages="http://www.google.com/ig/modules/gadgetmaker/gadgetmaker_content/messages/es-419_ALL.xml"/>
  <Locale lang="et" messages="/ig/modules/gadgetmaker_content/et_ALL.xml"/>
  <Locale lang="fi" messages="/ig/modules/gadgetmaker_content/fi_ALL.xml"/>
  <Locale lang="fr" messages="/ig/modules/gadgetmaker_content/fr_ALL.xml"/>
  <Locale lang="he" messages="/ig/modules/gadgetmaker_content/iw_ALL.xml"
          language_direction="rtl"/>
  <Locale lang="hi" messages="/ig/modules/gadgetmaker_content/hi_ALL.xml"/>
  <Locale lang="hr" messages="/ig/modules/gadgetmaker_content/hr_ALL.xml"/>
  <Locale lang="hu" messages="/ig/modules/gadgetmaker_content/hu_ALL.xml"/>
  <Locale lang="hy" messages="/ig/modules/gadgetmaker_content/hy_ALL.xml"/>
  <Locale lang="id" messages="/ig/modules/gadgetmaker_content/id_ALL.xml"/>
  <Locale lang="in" messages="/ig/modules/gadgetmaker_content/in_ALL.xml"/>
  <Locale lang="is" messages="/ig/modules/gadgetmaker_content/is_ALL.xml"/>
  <Locale lang="it" messages="/ig/modules/gadgetmaker_content/it_ALL.xml"/>
  <Locale lang="iw" messages="/ig/modules/gadgetmaker_content/iw_ALL.xml"
          language_direction="rtl"/>
  <Locale lang="ja" messages="/ig/modules/gadgetmaker_content/ja_ALL.xml"/>
  <Locale lang="ko" messages="/ig/modules/gadgetmaker_content/ko_ALL.xml"/>
  <Locale lang="lt" messages="/ig/modules/gadgetmaker_content/lt_ALL.xml"/>
  <Locale lang="lv" messages="/ig/modules/gadgetmaker_content/lv_ALL.xml"/>
  <Locale lang="ms" messages="/ig/modules/gadgetmaker_content/ms_ALL.xml"/>
  <Locale lang="nl" messages="/ig/modules/gadgetmaker_content/nl_ALL.xml"/>
  <Locale lang="no" messages="/ig/modules/gadgetmaker_content/no_ALL.xml"/>
  <Locale lang="pl" messages="/ig/modules/gadgetmaker_content/pl_ALL.xml"/>
  <Locale lang="pt-BR"
          messages="/ig/modules/gadgetmaker_content/pt-BR_ALL.xml"/>
  <Locale lang="pt-PT"
          messages="/ig/modules/gadgetmaker_content/pt-PT_ALL.xml"/>
  <Locale lang="ro" messages="/ig/modules/gadgetmaker_content/ro_ALL.xml"/>
  <Locale lang="ru" messages="/ig/modules/gadgetmaker_content/ru_ALL.xml"/>
  <Locale lang="sk" messages="/ig/modules/gadgetmaker_content/sk_ALL.xml"/>
  <Locale lang="sl" messages="/ig/modules/gadgetmaker_content/sl_ALL.xml"/>
  <Locale lang="sr" messages="/ig/modules/gadgetmaker_content/sr_ALL.xml"/>
  <Locale lang="sv" messages="/ig/modules/gadgetmaker_content/sv_ALL.xml"/>
  <Locale lang="th" messages="/ig/modules/gadgetmaker_content/th_ALL.xml"/>
  <Locale lang="tl" messages="/ig/modules/gadgetmaker_content/tl_ALL.xml"/>
  <Locale lang="tr" messages="/ig/modules/gadgetmaker_content/tr_ALL.xml"/>
  <Locale lang="uk" messages="/ig/modules/gadgetmaker_content/uk_ALL.xml"/>
  <Locale lang="vi" messages="/ig/modules/gadgetmaker_content/vi_ALL.xml"/>
  <Locale lang="zh-CN"
          messages="/ig/modules/gadgetmaker_content/zh-CN_ALL.xml"/>
  <Locale lang="zh-HK"
          messages="http://www.google.com/ig/modules/gadgetmaker/gadgetmaker_content/messages/zh-HK_ALL.xml"/>
  <Locale lang="zh-TW"
          messages="/ig/modules/gadgetmaker_content/zh-TW_ALL.xml"/>
</ModulePrefs>
<UserPref name="preview" default_value="false" datatype="hidden"/>
<UserPref name="created" default_value="" datatype="hidden"/>
<UserPref name="last_modified" default_value="" datatype="hidden"/>
<UserPref name="title" default_value="__MSG_event_default__" datatype="hidden"/>
<UserPref name="author" default_value="" datatype="hidden"/>
<UserPref name="location" default_value="" datatype="hidden"/>
<UserPref name="email" default_value="" datatype="hidden"/>
<UserPref name="description" default_value="__MSG_countdown_description__"
          datatype="hidden"/>
<UserPref name="image" default_value="p" datatype="hidden"/>
<!--
Possible values (commented out, as it's valid only for "enum" datatype):
  <EnumValue value="b" display_value="Birthday"/>
  <EnumValue value="g" display_value="Game Day"/>
  <EnumValue value="p" display_value="Party"/>
  <EnumValue value="n" display_value="Night on the Town"/>
  <EnumValue value="v" display_value="Vacation"/>
  <EnumValue value="a" display_value="Anniversary"/>
  <EnumValue value="w" display_value="Wedding"/>
  <EnumValue value="none" display_value="None"/>
-->
<UserPref name="custom_image" default_value="" datatype="hidden"/>
<UserPref name="message" default_value="" datatype="hidden"/>
<UserPref name="month" default_value="" datatype="hidden"/>
<UserPref name="day" default_value="" datatype="hidden"/>
<UserPref name="year" default_value="" datatype="hidden"/>
<UserPref name="color" default_value="b" datatype="hidden"/>
<!--
Possible values (commented out, as it's valid only for "enum" datatype):
  <EnumValue value="b" display_value="Blue"/>
  <EnumValue value="g" display_value="Green"/>
  <EnumValue value="o" display_value="Orange"/>
  <EnumValue value="p" display_value="Purple"/>
  <EnumValue value="pi" display_value="Pink"/>
  <EnumValue value="y" display_value="Yellow"/>
  <EnumValue value="w" display_value="White"/>
-->
<Content type="html" view="home">
<![CDATA[
<script src="http://www.google.com/ig/modules/gadgetmaker/gm_common.js">
</script>
<script>
var prefs = new _IG_Prefs(__MODULE_ID__);
var preloadedImage = new Image();

_IG_RegisterOnloadHandler(
    function() {
      _gm = new _GadgetMaker(prefs);
      _gel('pic').style.border = '1px solid ' + _gm._borderColor;
      _gel('box').style.backgroundColor = _gm._bgColor;
      _gel('time_left').style.color = _gm._fontColor;
      _gel('time_remaining').innerHTML = getTimeRemainingHtml();
      _gm._addFrameIfPreview();
      var picUrl = getPicUrl();
      if (picUrl != 'none') {
        preloadedImage.src = picUrl;
        _gel('pic').src = picUrl;
      } else {
        _gel('pic').style.display = 'none';
      }
      _IG_AdjustIFrameHeight();
    }
);

var images = {'a' : 'anniversary2.jpg',
              'b' : 'birthday2.jpg',
              'p' : 'party.jpg',
              'n' : 'night_on_the_town.jpg',
              'v' : 'vacation.jpg',
              'w' : 'wedding.jpg',
              'g' : 'game_day2.jpg'};

function getTimeRemainingHtml() {
  var currentDate = new Date();
  var currentYearStr = currentDate.getFullYear().toString();
  var targetYearStr = prefs.getString('year');
  // Since the year could be absent or entered with a weird number of digits,
  // just prepend digits from the current year onto the front of the user's
  // string until we have the correct number of digits.
  var charDifference = currentYearStr.length - targetYearStr.length;
  if (charDifference > 0) {
    targetYearStr = currentYearStr.substr(0, charDifference) + targetYearStr;
  }
  var targetDate = new Date(parseInt(targetYearStr), 
                            parseInt(prefs.getInt('month')),
                            parseInt(prefs.getInt('day')));
  if (currentDate.getTime() >= targetDate.getTime()) {
    // The target day has already passed. Time to party!
    _gel('time_left').style.display = 'none';
    return _hesc(prefs.getString('message'));
  }
  var numYearsRemaining = targetDate.getFullYear() - currentDate.getFullYear();
  var numMonthsRemaining = targetDate.getMonth() - currentDate.getMonth();
  var numDaysRemaining = targetDate.getDate() - currentDate.getDate();
  
  var SHORTEST_MONTH_LEN = 28;
  var NUM_OF_TRIES = 5;
  if (numDaysRemaining < 0) {
    // The calculate the number of days necessary, we need to see how many days
    // are in the previous month.
    for (var i = 1; i < NUM_OF_TRIES; ++i) {
      var tempDate = new Date(targetDate.getFullYear(),
                              targetDate.getMonth() - 1,
                              SHORTEST_MONTH_LEN + i);
      if (tempDate.getMonth() == targetDate.getMonth()) {
        // So now we know that the month before the target month has
        // (SHORTEST_MONTH_LEN + i - 1) days.
        if (currentDate.getDate() > (SHORTEST_MONTH_LEN + i - 1)) {
          // Handle the case where the current day of the month is larger than
          // the number of days in the month before the target month (example:
          // current date is January 30, target date is March 2 should return
          // "1 month, 2 days").
          numDaysRemaining = targetDate.getDate();
        } else {
          numDaysRemaining = (SHORTEST_MONTH_LEN - currentDate.getDate()) +
                             (i - 1) + targetDate.getDate();
        }
        break;
      }
    }
    --numMonthsRemaining; // Carry the one.
  }
  var MONTHS_PER_YEAR = 12;
  if (numMonthsRemaining < 0) {
    numMonthsRemaining += MONTHS_PER_YEAR;
    --numYearsRemaining; // Carry the one.
  }

  var retStr = '';
  var baseLength = retStr.length;
  if (numYearsRemaining == 1) {
    retStr += '__MSG_one_year__';
  } else if (numYearsRemaining > 0) {
    retStr += '__MSG_multiple_years__'.replace('%VAL1%',
                                               numYearsRemaining.toString());
  }
  if (numMonthsRemaining > 0) {
    if (retStr.length > baseLength) retStr += ', ';
    if (numMonthsRemaining == 1) {
      retStr += '__MSG_one_month__';
    } else {
      retStr += '__MSG_multiple_months__'.replace(
          '%VAL1%', numMonthsRemaining.toString());
    }
  }
  if (numDaysRemaining > 0) {
    if (retStr.length > baseLength) retStr += ', ';
    if (numDaysRemaining == 1) {
      retStr += '__MSG_one_day__';
    } else {
      retStr += '__MSG_multiple_days__'.replace(
          '%VAL1%', numDaysRemaining.toString());
    }
  }
  return retStr;
}

function getPicUrl() {
  var imageChoice = prefs.getString('image');
  var retStr = prefs.getString('custom_image');
  if (retStr.length == 0) {
    retStr = 'http://www.google.com/ig/modules/gadgetmaker_content/countdown_images/' +
             images[imageChoice];
  }
  return retStr;
}
</script>
<style>
#box {
  font-size:smaller;
}
#pic {
  margin:6px;
}
#time_left {
  font-style:italic;
  padding-__BIDI_END_EDGE__:6px;
}
</style>
<div id="box">
  <table cellspacing="0" cellpadding="0">
    <tr>
      <td valign="top">
        <img id="pic" width="50"/>
      </td>
      <td style="font-size:smaller">
        <span id="time_left">__MSG_time_remaining__:</span>
        <span id="time_remaining"></span>
      </td>
    </tr>
  </table>
</div>
]]>
</Content>
<Content type="html" view="canvas">
<![CDATA[
<script>
var prefs = new _IG_Prefs(__MODULE_ID__);
var preloadedImage = new Image();

_IG_RegisterOnloadHandler(
    function() {
      _gm = new _GadgetMaker(prefs, __MODULE_ID__);
      _gel('pic').style.border = '1px solid ' + _gm._borderColor;
      _gel('box').style.backgroundColor = _gm._bgColor;
      _gel('time_left').style.color = _gm._fontColor;
      _gel('time_remaining').innerHTML = getTimeRemainingHtml();
      _gm._addFrameIfPreview();
      var picUrl = getPicUrl();
      if (picUrl != 'none') {
        preloadedImage.src = picUrl;
        _gel('pic').src = picUrl;
      } else {
        _gel('pic').style.display = 'none';
      }
      _gm._showInfo('http://www.google.com/ig/modules/gadgetmaker_content/thumbs/countdown.png');
      _IG_AdjustIFrameHeight();
    }
);

var images = {'a' : 'anniversary2.jpg',
              'b' : 'birthday2.jpg',
              'p' : 'party.jpg',
              'n' : 'night_on_the_town.jpg',
              'v' : 'vacation.jpg',
              'w' : 'wedding.jpg',
              'g' : 'game_day2.jpg'};

function getTimeRemainingHtml() {
  var currentDate = new Date();
  var currentYearStr = currentDate.getFullYear().toString();
  var targetYearStr = prefs.getString('year');
  // Since the year could be absent or entered with a weird number of digits,
  // just prepend digits from the current year onto the front of the user's
  // string until we have the correct number of digits.
  var charDifference = currentYearStr.length - targetYearStr.length;
  if (charDifference > 0) {
    targetYearStr = currentYearStr.substr(0, charDifference) + targetYearStr;
  }
  var targetDate = new Date(parseInt(targetYearStr), 
                            parseInt(prefs.getInt('month')),
                            parseInt(prefs.getInt('day')));
  if (currentDate.getTime() >= targetDate.getTime()) {
    // The target day has already passed. Time to party!
    _gel('time_left').style.display = 'none';
    return _hesc(prefs.getString('message'));
  }
  var numYearsRemaining = targetDate.getFullYear() - currentDate.getFullYear();
  var numMonthsRemaining = targetDate.getMonth() - currentDate.getMonth();
  var numDaysRemaining = targetDate.getDate() - currentDate.getDate();
  
  var SHORTEST_MONTH_LEN = 28;
  var NUM_OF_TRIES = 5;
  if (numDaysRemaining < 0) {
    // The calculate the number of days necessary, we need to see how many days
    // are in the previous month.
    for (var i = 1; i < NUM_OF_TRIES; ++i) {
      var tempDate = new Date(targetDate.getFullYear(),
                              targetDate.getMonth() - 1,
                              SHORTEST_MONTH_LEN + i);
      if (tempDate.getMonth() == targetDate.getMonth()) {
        // So now we know that the month before the target month has
        // (SHORTEST_MONTH_LEN + i - 1) days.
        if (currentDate.getDate() > (SHORTEST_MONTH_LEN + i - 1)) {
          // Handle the case where the current day of the month is larger than
          // the number of days in the month before the target month (example:
          // current date is January 30, target date is March 2 should return
          // "1 month, 2 days").
          numDaysRemaining = targetDate.getDate();
        } else {
          numDaysRemaining = (SHORTEST_MONTH_LEN - currentDate.getDate()) +
                             (i - 1) + targetDate.getDate();
        }
        break;
      }
    }
    --numMonthsRemaining; // Carry the one.
  }
  var MONTHS_PER_YEAR = 12;
  if (numMonthsRemaining < 0) {
    numMonthsRemaining += MONTHS_PER_YEAR;
    --numYearsRemaining; // Carry the one.
  }

  var retStr = '';
  var baseLength = retStr.length;
  if (numYearsRemaining == 1) {
    retStr += '__MSG_one_year__';
  } else if (numYearsRemaining > 0) {
    retStr += '__MSG_multiple_years__'.replace('%VAL1%',
                                               numYearsRemaining.toString());
  }
  if (numMonthsRemaining > 0) {
    if (retStr.length > baseLength) retStr += ', ';
    if (numMonthsRemaining == 1) {
      retStr += '__MSG_one_month__';
    } else {
      retStr += '__MSG_multiple_months__'.replace(
          '%VAL1%', numMonthsRemaining.toString());
    }
  }
  if (numDaysRemaining > 0) {
    if (retStr.length > baseLength) retStr += ', ';
    if (numDaysRemaining == 1) {
      retStr += '__MSG_one_day__';
    } else {
      retStr += '__MSG_multiple_days__'.replace(
          '%VAL1%', numDaysRemaining.toString());
    }
  }
  return retStr;
}

function getPicUrl() {
  var imageChoice = prefs.getString('image');
  var retStr = prefs.getString('custom_image');
  if (retStr.length == 0) {
    retStr = 'modules/gadgetmaker_content/countdown_images/' +
             images[imageChoice];
  }
  return retStr;
}
</script>
<style>
#box {
  font-size:smaller;
}
#pic {
  margin:6px;
}
#time_left {
  font-style:italic;
  padding-__BIDI_END_EDGE__:6px;
}
</style>
<table width="100%">
  <tr>
    <td width="70%" valign="top">
      <div id="box">
        <table cellspacing="0" cellpadding="0">
          <tr>
            <td valign="top">
              <img id="pic" width="50"/>
            </td>
            <td style="font-size:smaller">
              <span id="time_left">__MSG_time_remaining__:</span>
              <span id="time_remaining"></span>
            </td>
          </tr>
        </table>
      </div>
    </td>
    <td width="30%" valign="top">
      <div id="info-box"/>
    </td>
  </tr>
</table>
]]>
</Content>
</Module>
