/*
  Copyright (c) 2009 Technetra Corp
  Released under The MIT License
*/
var Countdown;
/* BEGIN SpinningWheel Application Interface */
var SpinningWheel_AI = {
  openEventDate: function() {
    var obj = document.getElementById('select_event');
    var event_title = obj.options[obj.selectedIndex].text;
    if (event_title == "Birthday" || event_title == "Other") {
  	var now = new Date();
  	var days = { };
  	var years = { };
  	var months = { 1: 'Jan', 2: 'Feb', 3: 'Mar', 4: 'Apr', 5: 'May', 6: 'Jun', 7: 'Jul', 8: 'Aug', 9: 'Sep', 10: 'Oct', 11: 'Nov', 12: 'Dec' };
  	
  	for( var i = 1; i < 32; i += 1 ) {
  		days[i] = i;
  	}
   
  	for( i = now.getFullYear(); i < now.getFullYear()+4; i += 1 ) {
  		years[i] = i;
  	}
   
        SpinningWheel.addSlot(years, 'right', Countdown.get_selected_year());
        SpinningWheel.addSlot(months, '', Countdown.get_selected_month());
        SpinningWheel.addSlot(days, 'right', Countdown.get_selected_day()); 
  	SpinningWheel.setCancelAction(SpinningWheel_AI.cancel);
  	SpinningWheel.setDoneAction(Countdown.updateSWDate);
  	
  	SpinningWheel.open();
    } else {
      alert("Please select 'Birthday' or 'Other' Event Type To Customize Date");
    }
  }, 
  cancel: function() {
    //document.getElementById('sw_date_picked').innerHTML = 'cancelled!';
  }
}
/* END SpinningWheel Application Interface */

/* Countdown Closure */
Countdown = function() {
  var $ = function(id) { return document.getElementById(id); }
  var $getInnerText = function(id) { var id = $(id); return (id.innerText? id.innerText : id.innerHTML) }
  var $setInnerText = function(id, val) { // hack for Firefox 3.5
    id = $(id);
    if (id.innerText)
      id.innerText = val;
    else
      id.innerHTML = val;
  }
  var MSSEC = 1000;
  var MSMIN = 60 * MSSEC;
  var MSHR = 60 * MSMIN;
  var MSDAY = 24 * MSHR;
  var gMy_interval_timer;
  var gSelected_day, gSelected_month, gSelected_year;
  var gTitle_input_field = "Midnight";
  var gEvent_type_text = "Midnight";
  var gEvent_type_value = "midnight";
  var gTarget_time;
  var gDone = false;
  var gTotal_yeardays = 365;
  var gStart_month, gStart_day, gStart_year;
  var gMark_month = -1, gMark_day = -1, gMark_year = -1;
  var gDate_format = "mm/dd/yyyy";
  var gPad = " ";
  var gUpdate_date_mark = false;
  var gUpdate_interval = 2000;
  var gUpdate_interval_text = "2 seconds"; 
  var gLocalStore = {};
  var gIs_iPhone = (navigator.userAgent.toLowerCase().indexOf('iphone')!=-1);
   
  window.onorientationchange = function() {
      switch(window.orientation) {
        case 0:
          document.body.setAttribute('orient', 'portrait');
          break;
        case 90:
        case -90:
          document.body.setAttribute('orient', 'landscape');
          break;
      }
      setTimeout('Countdown.countDown()', 0); 
      setTimeout(scrollTo, 100, 0, 1);
  }
  
  window.addEventListener("load", function() {
      initApp();
      window.onorientationchange();
      Countdown.countDown(); // set up initial timer values, fields and overlays
      gMy_interval_timer = window.setInterval('Countdown.countDown()', gUpdate_interval);
  }, false);

  var storeItem = function(item, val) {
    if (window.localStorage) {
      window.localStorage[item] = val;
    } else {
      gLocalStore[item] = val;
    }
  };

  var retrieveItem = function(item) {
    var val;
    if (window.localStorage) {
      val = window.localStorage[item];
    } else {
      val = gLocalStore[item];
    }
    return val;
  };

  var clearItems = function() {
    if (window.localStorage) {
      window.localStorage.clear();
    } else {
      gLocalStore = {};
    }
  };

  var actionButton = function(btn, action, dsply) {
    if (typeof btn == 'string') {
      if (btn != '') $(btn).style.display = dsply;
    } else {
      btn.style.display = dsply;
    }
    if (action != '') Countdown[action]();
  };
  
  var store_date = function(y, m, d) {
    storeItem('selected_year', y);
    storeItem('selected_month', m);
    storeItem('selected_day', d);
  };
    
  var store_update_interval = function(i, t) {
    storeItem('update_interval', i);
    storeItem('update_interval_text', t);
  };
    
  var format_date = function(date_fields) {
    var fmt = "";
    switch (gDate_format) {
      case "mm/dd/yyyy":
          fmt = [ date_fields.m, date_fields.d, date_fields.y ].join('/');
          break;
      case "yyyy/mm/dd":
          fmt = [ date_fields.y, date_fields.m, date_fields.d ].join('/');
          break;
      case "dd/mm/yyyy":
          fmt = [ date_fields.d, date_fields.m, date_fields.y ].join('/');
          break;
      case "mm-dd-yyyy":
          fmt = [ date_fields.m, date_fields.d, date_fields.y ].join('-');
          break;
      case "yyyy-mm-dd":
          fmt = [ date_fields.y, date_fields.m, date_fields.d ].join('-');
          break;
      case "dd-mm-yyyy":
          fmt = [ date_fields.d, date_fields.m, date_fields.y ].join('-');
          break;
    }
    return fmt;
  };
    
  var setOverlay = function(obj, tp, offset) {
    var mfactor, wfactor;
    offset = (offset < 0) ? 0 : offset;
    offset = (offset > 59) ? 59 : offset;
    if (window.orientation==0) {
      mfactor = 138/60;
      wfactor = 136;
      tp += 52;
      height = "58px";
    } else {
      mfactor = 260/60;
      wfactor = 256;
      height = "36px";
    }
    obj.style.top = tp+"px";
    obj.style.height = height;
    obj.style.width = (wfactor-(offset*mfactor))+"px";
    /* obj.innerHTML = obj.style.width; */
    /* obj.innerHTML = tp+"px"; */
  };
    
  var formatNum = function(num, len) {
      var d, padding;
      var fmt = "&hellip;";
      if (num < 0) return fmt;
      fmt = "" + num;
      d = len - fmt.length + 1; 
      padding = new Array(d).join(gPad);
      return padding + fmt;
  }; 
    
  var setFields = function(days, hrs, mins, secs) {
      if (gUpdate_interval_text.match(/minute/)) {
        secs = -1;
      } else if (gUpdate_interval_text.match(/hour/)) {
        secs = mins = -1;
      } else if (gUpdate_interval_text.match(/day/)) {
        secs = mins = hrs = -1;
      }
      setOverlay($("days_overlay"), $("days").offsetTop, Math.floor((days*60)/gTotal_yeardays));
      setOverlay($("hours_overlay"), $("hours").offsetTop, Math.floor((hrs*60)/24));
      setOverlay($("minutes_overlay"), $("minutes").offsetTop, mins);
      setOverlay($("seconds_overlay"), $("seconds").offsetTop, secs);
      $setInnerText("days", formatNum(days, 3));
      $setInnerText("hours", formatNum(hrs, 3));
      $setInnerText("minutes", formatNum(mins, 3));
      $setInnerText("seconds", formatNum(secs, 3));
      //alert("setFields, days="+days+", hrs="+hrs+", mins="+mins+", secs="+secs);
  };
  
  var setupSelectElementByValue = function(el, val) {
    var i, o;
    o = el.options;
    for (i=0; i < o.length; i++) {
      if (o[i].value == val) {
        el.selectedIndex = i;
      }  
    }
  };

  var setupSelectElementByText = function(el, val) {
    var i, o;
    o = el.options;
    for (i=0; i < o.length; i++) {
      if (o[i].text == val) {
        el.selectedIndex = i;
      }  
    }
  };

  var setupDate = function(etype) {
    var targ_date, start_date;
    var now = new Date();
    start_date = new Date(now);
    gStart_day = now.getDate();
    gStart_month = now.getMonth();
    gStart_year = now.getFullYear();
    var selected_hour = 1, selected_minute = 1, selected_second = 1;
    switch (etype) {
      case "midnight":
        now.setDate(now.getDate() + 1);
        gSelected_day = now.getDate();
        gSelected_month = now.getMonth() + 1;
        gSelected_year = now.getFullYear();
        store_date(gSelected_year, gSelected_month, gSelected_day);
        break;
      case "newyears":
        now.setFullYear(now.getFullYear() + 1);
        gSelected_day = 1;
        gSelected_month = 1;
        gSelected_year = now.getFullYear();
        store_date(gSelected_year, gSelected_month, gSelected_day);
        break;
    }
    targ_date = new Date(gSelected_year, gSelected_month-1, gSelected_day, selected_hour-1, selected_minute-1, selected_second-1);
    gTotal_yeardays = Math.floor((targ_date.getTime() - start_date.getTime())/(1000*60*60*24));
    $setInnerText('start_date', format_date({m:gStart_month+1, d:gStart_day, y:gStart_year}));
    $setInnerText('target_date', format_date({m:gSelected_month, d:gSelected_day, y:gSelected_year}));
    if (!gIs_iPhone) {
      setupSelectElementByText($('select_day'), gSelected_day);
      setupSelectElementByText($('select_month'), gSelected_month);
      setupSelectElementByText($('select_year'), gSelected_year);
    }
    return targ_date;
  };
    
  var initApp = function() {
    if (retrieveItem('pad')) gPad = retrieveItem('pad');
    if (retrieveItem('event_type_text')) gEvent_type_text = retrieveItem('event_type_text');
    if (retrieveItem('event_type_value')) gEvent_type_value = retrieveItem('event_type_value');
    if (retrieveItem('title_input_field')) gTitle_input_field = retrieveItem('title_input_field');
    if (retrieveItem('date_format')) gDate_format = retrieveItem('date_format');
    if (retrieveItem('selected_day')) gSelected_day = parseInt(retrieveItem('selected_day'));
    if (retrieveItem('selected_month')) gSelected_month = parseInt(retrieveItem('selected_month'));
    if (retrieveItem('selected_year')) gSelected_year = parseInt(retrieveItem('selected_year'));
    if (retrieveItem('update_interval')) gUpdate_interval = parseInt(retrieveItem('update_interval'));
    if (retrieveItem('update_interval_text')) gUpdate_interval_text = retrieveItem('update_interval_text');
    document.getElementsByTagName('body')[0].setAttribute('device', gIs_iPhone?'iphone':'unknown');
    $setInnerText('update_interval_text', gUpdate_interval_text);
    $setInnerText('pageTitle', gTitle_input_field);
    $('title_input_field').value = gTitle_input_field;
    gTarget_time = setupDate(gEvent_type_value).getTime();
  };
  
  var setEventTypeResources = function(ett, etv) {
    storeItem('event_type_text', ett);
    storeItem('event_type_value', etv);
    gEvent_type_text = ett;
    gEvent_type_value = etv;
  };

  return {
    get_selected_year: function() {
      return gSelected_year;
    },

    get_selected_month: function() {
      return gSelected_month;
    },

    get_selected_day: function() {
      return gSelected_day;
    },

    doSetup: function() {
        var i, e;
        if (gMy_interval_timer != null) {
          window.clearInterval(gMy_interval_timer);
          gMy_interval_timer = null;
        }
        if (gSelected_day != -1 && gSelected_month != -1 && gSelected_year != -1) {
          if (gIs_iPhone) $setInnerText('sw_date_picked', format_date({m:gSelected_month, d:gSelected_day, y:gSelected_year}));
        }
        setupSelectElementByValue($('select_event'), gEvent_type_value);
        setupSelectElementByValue($('select_interval'), gUpdate_interval);
        setupSelectElementByValue($('select_date_format'), gDate_format);
        setupSelectElementByValue($('select_padding'), gPad);
        if (!gIs_iPhone) {
          setupSelectElementByText($('select_day'), gSelected_day);
          setupSelectElementByText($('select_month'), gSelected_month);
          setupSelectElementByText($('select_year'), gSelected_year);
        }
        if ($('title_input_field').value == "") Countdown.setTitleFieldResources(gEvent_type_text);
        if (gEvent_type_value == "other" || gEvent_type_value == "birthday") {
          $('title_input_field').disabled = false;
        } else if (gEvent_type_value == "midnight") {
          $('title_input_field').disabled = true;
        } else {
          $('title_input_field').disabled = true;
        }
    },
    
    doMain: function() {
        $setInnerText('pageTitle', $('title_input_field').value);
        var etv = $('select_event').options[$('select_event').selectedIndex].value;
        gTarget_time = setupDate(etv).getTime();
        gUpdate_date_mark = true;
        window.scrollTo(0, 1);
        if (gMy_interval_timer != null) {
          window.clearInterval(gMy_interval_timer);
        }
        gMy_interval_timer = window.setInterval('Countdown.countDown()', gUpdate_interval);
        window.setTimeout('Countdown.countDown()', 0); 
    },
    
    countDown: function() {
      var now, ms, diff, daysLeft, hrsLeft, minsLeft, secsLeft, today;
      now = new Date();
      now_day = now.getDate();
      now_month = now.getMonth();
      now_year = now.getFullYear();
      ms = now.getTime();
      diff = gTarget_time - ms;
      if (diff <= MSSEC && !gDone) { 
        daysLeft = hrsLeft = minsLeft = secsLeft = 0;
        if (gMy_interval_timer != null) {
          window.clearInterval(gMy_interval_timer);
          gMy_interval_timer = null;
        }
        $('counter_done').style.display = "block";
        $('settingsButton').style.display = "none";
        gDone = true;
      } else {
        daysLeft = Math.floor(diff / MSDAY);
        diff -= (daysLeft * MSDAY);
        hrsLeft = Math.floor(diff / MSHR);
        diff -= (hrsLeft * MSHR);
        minsLeft = Math.floor(diff / MSMIN);
        diff -= (minsLeft * MSMIN);
        secsLeft = Math.floor(diff / MSSEC);
        gDone = false;
      }
      setFields(daysLeft, hrsLeft, minsLeft, secsLeft);
      if (now_month != gMark_month || now_day != gMark_day || now_year != gMark_year || gUpdate_date_mark) {
        today = format_date({m:now_month+1, d:now_day, y:now_year});
        if ($getInnerText('today') != today) $setInnerText('today', today);
        gMark_month = now_month; gMark_day = now_day; gMark_year = now_year;
      }
    }, 
    
    setTitleFieldResources: function(et) {
      storeItem('title_input_field', et);
      gTitle_input_field = et;
      $('title_input_field').value = et;
    },
  
    updateEventType: function(obj) {
      var ett = obj.options[obj.selectedIndex].text;
      var etv = obj.options[obj.selectedIndex].value;
      setEventTypeResources(ett, etv); // sets gEvent_type and related fields
      if (etv == "other" || etv == "birthday") {
        Countdown.setTitleFieldResources(ett); // sets title_input_field and related fields
        $('title_input_field').disabled = false;
      } else if (ett == "Midnight" || ett == "New Years") {
        Countdown.setTitleFieldResources(ett);
        $('title_input_field').disabled = true;
      } else if (etv == "reset") {
        ett = "Midnight";
        etv = "midnight";
        alert("Clearing local storage & setting up default event 'Midnight'. Please reload Countdown app to see changes.");
        clearItems();
        Countdown.setTitleFieldResources(ett);
        setupSelectElementByValue($('select_event'), etv);
        setupSelectElementByValue($('select_interval'), "2000");
        setupSelectElementByValue($('select_date_format'), "mm/dd/yyyy");
        setupSelectElementByValue($('select_padding'), " ");
        Countdown.updateInterval($('select_interval'));
        Countdown.updateDateFormat($('select_date_format'));
        Countdown.updatePadding($('select_padding'));
        $('title_input_field').disabled = true;
     }
     gTarget_time = setupDate(etv).getTime();
     if (gIs_iPhone) $setInnerText('sw_date_picked', format_date({m:gSelected_month, d:gSelected_day, y:gSelected_year}));
     window.scrollTo(0, 1);
    }, 
    
    updateInterval: function(obj) {
      gUpdate_interval = parseInt(obj.options[obj.selectedIndex].value);
      $setInnerText('update_interval_text', obj.options[obj.selectedIndex].text);
      gUpdate_interval_text = obj.options[obj.selectedIndex].text;
      store_update_interval(gUpdate_interval, gUpdate_interval_text);
      window.clearInterval(gMy_interval_timer);
      gMy_interval_timer = window.setInterval('Countdown.countDown()', gUpdate_interval);
      window.scrollTo(0, 1);
    }, 
    
    updateSWDate: function() {
      var results = SpinningWheel.getSelectedValues(); 
      gSelected_year = results.keys[0];
      gSelected_month = results.keys[1];
      gSelected_day = results.keys[2];
      store_date(gSelected_year, gSelected_month, gSelected_day);
      $setInnerText('sw_date_picked', format_date({m:gSelected_month, d:gSelected_day, y:gSelected_year}));
      window.scrollTo(0, 1);
    },
    
    updateDateFormat: function(obj) {
      gDate_format = obj.options[obj.selectedIndex].value;
      storeItem('date_format', gDate_format);
      if (gIs_iPhone) $setInnerText('sw_date_picked', format_date({m:gSelected_month, d:gSelected_day, y:gSelected_year}));
      window.scrollTo(0, 1);
    },
    
    updateDay: function(obj) {
      gSelected_day = obj.options[obj.selectedIndex].text;
      storeItem('selected_day', gSelected_day);
    },

    updateMonth: function(obj) {
      gSelected_month = obj.options[obj.selectedIndex].text;
      storeItem('selected_month', gSelected_month);
    },

    updateYear: function(obj) {
      gSelected_year = obj.options[obj.selectedIndex].text;
      storeItem('selected_year', gSelected_year);
    },

    updatePadding: function(obj) {
      gPad = obj.options[obj.selectedIndex].value;
      storeItem('pad', gPad);
      window.scrollTo(0, 1);
    },

    turnActionButtonOn: function(btn, action) {
      actionButton(btn, action, "inline");
    },

    turnActionButtonOff: function(btn, action) {
      actionButton(btn, action, "none");
    },

    acknowledgeDone: function(obj) {
      obj.style.display='none';
      $('settingsButton').style.display='inline';
    }
  }
}();
/* END Countdown */
