// Place your application-specific JavaScript functions and classes here
// This file is automatically included by javascript_include_tag :defaults

var lightBoxInitiated     = false;

// Globals for dealing with time throughout the methods below.  These should
// be properly updated every time updateTimes is called, unless otherwise noted. 
var previous_current_time = "";  // Only used for the "live" clock page
var curtime               = "";
var cur_iso_time          = "";
var cur_twelve_hour_time  = "";
var cur_time              = "";
var cur_page_hour         = "";  // Only updated once, at page load time
var client_offset_minutes = "";  // Only updated once, at initialization time


// setTime code originated from: http://www.metalshell.com/view/source/85/
function initializeTimes () {
  setTimes();
  client_offset_minutes = curtime.getTimezoneOffset();

  $('current_time').innerHTML = cur_time;
  $('current_iso_time').value = cur_iso_time;
  updateTidbits();
}

function updateTimes() {
  if(cur_page_hour != cur_iso_time.sub(/:.+/, ''))  return;
  
	setTimes();
	
  $('current_time').innerHTML = cur_time;
  $('current_iso_time').value = cur_iso_time;

  if(!reactToHourChange()) {
    updateCurrentTimeClass();
    updateTidbitTimes();
    if(cur_twelve_hour_time != previous_current_time) previous_current_time = cur_twelve_hour_time;
  }
}

function setTimes() {
  curtime               = new Date();
  cur_iso_time          = curtime.toISOTimeString();
  cur_twelve_hour_time  = curtime.toTwelveHourTimeString();
  cur_time              = curtime.toTwelveHourTimeString(true);
}

function updateCurrentTimeClass () {
	// if previous_current_time is not set, assume first load
	if (previous_current_time == "") {
		if (!lightBoxInitiated) {
		 	initLightbox();
		}
    updateElapsedTimeClasses();
	}

  if(cur_twelve_hour_time != previous_current_time) {
    if($(previous_current_time)) {
      $(previous_current_time).removeClassName('current_time');
			$(previous_current_time).addClassName('elapsed_time');
    }
    if($(cur_twelve_hour_time)) {
      $(cur_twelve_hour_time).addClassName('current_time');
    }
  }
}

function updateElapsedTimeClasses () {
  time_array = cur_twelve_hour_time.split(':');
  curhour = time_array[0];
	curmin  = time_array[1];
	
	// Loop through to set elapsed time styles
	for (i=0;i<curmin;i++) {
		// convert single digit values to double digits
		min = "";
		if (i < 10) {
		  min = "0" + i;
		}	else {
		  min = i;
		}
		
		// add elapsed style to elapsed time
		$(curhour+":"+min).addClassName('elapsed_time');
	}
}

function updateTidbits () {
  // Call in to build the partials based on the new hour
  new Ajax.Request("/time/random_tidbits?time_of_day=" + cur_iso_time + "&minutes_offset=" + client_offset_minutes, { 
    method:     'get',
    onComplete: function(transport) {
      updateTidbitTimes();
    }
  });
}

function updateTidbitTimes () {
  if($$('#tidbit1 .tidbit_seconds_offset')) {
    var tidbit1_seconds_offset = $$('#tidbit1 .tidbit_seconds_offset')[0].value;
    var d = new Date(curtime.valueOfUTC() + parseInt(tidbit1_seconds_offset)*1000);
    $$('#tidbit1 .time')[0].innerHTML = d.toTwelveHourTimeString(true);
    $$('#tidbit1 .time')[0].href      = "/" + d.toTwelveHourTimeString().gsub(":", "");
  }
  if($$('#tidbit2 .tidbit_seconds_offset')) {
    var tidbit2_seconds_offset = $$('#tidbit2 .tidbit_seconds_offset')[0].value;
    var d = new Date(curtime.valueOfUTC() + parseInt(tidbit2_seconds_offset)*1000);
    $$('#tidbit2 .time')[0].innerHTML = d.toTwelveHourTimeString(true);
    $$('#tidbit2 .time')[0].href      = "/" + d.toTwelveHourTimeString().gsub(":", "");
  }
}

// Returns true if an hour change was found and reacted upon.  False otherwise.
function reactToHourChange () {
  current_hour  = cur_twelve_hour_time.split(':')[0];
  previous_hour = previous_current_time == "" ? current_hour : previous_current_time.split(':')[0];

  if(current_hour != previous_hour) {
    // Call in to build the partials based on the new hour
    window.location = cur_iso_time.sub(':', '').sub(/\d\d$/, '00');
    return true;
  } else {
    return false;
  }
}

// for IE only
function setOpacity(element, opacity) {
  if (navigator.userAgent.indexOf("MSIE") != -1) {
    var normalized = Math.round(opacity * 100);
    element.style.filter = "alpha(opacity=" + normalized + ")";
  } else {
    element.style.opacity = opacity;
  }
}


// DATE CLASS EXTENSIONS

// Returns the UTC time in milliseconds to/from midnight January 1, 1970.
Date.prototype.valueOfUTC = function valueOfUTCFunction () {
  return curtime.getTime() + curtime.getTimezoneOffset()*60*1000;
}

// Returns just the ISO time.  Examples: "1:04", "11:23", "21:56"
Date.prototype.toISOTimeString = function toISOTimeStringFunction () {
  var hour   = this.getHours();
  var minute = this.getMinutes();
  
  return hour + ":" + (minute < 10 ? "0" : "") + minute;
}

// Returns the 12-hour version of time.  Examples: "1:04", "11:23", "9:56"
// If set_meridian is passed in, includes meridian.  Examples: "1:04am", "11:23am", "9:56pm"   
Date.prototype.toTwelveHourTimeString = function toTwelveHourTimeStringFunction (set_meridian, return_seconds) {
  set_meridian = set_meridian || false
  var hour   = this.getHours();
  var minute = this.getMinutes();
  var second = this.getSeconds();
  
  if(0 == hour) hour = 12;
  var twelve_hour_string = (hour > 12 ? hour - 12 : hour) + ":" +
                           (minute < 10 ? "0" : "") + minute
  //if (return_seconds)
    // twelve_hour_string = twelve_hour_string + ":" + second;
  return set_meridian ? twelve_hour_string + (this.getHours() > 11 ? "pm" : "am") : twelve_hour_string;
}