/*
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 = "…";
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 */