
YAHOO.namespace("ksu.widget.StatusCameo");

(function() {

// Shortcut YUI definitions
var Dom         = YAHOO.util.Dom;
var $           = Dom.get;
var setStyle    = Dom.setStyle;
var LOG;


/**
 * Constructor for the KSU.widget.StatusCameo object.
 */
KSU.widget.StatusCameo = function(el, attr) {
   attr = attr || {};

   this.el = $(el);
   if (!this.el) {
      LOG.log("Element '" + el + "'could not be found.", "error");
   }
   this.urlFeed = "/its/status/status.xml";
   this.urlStatusPage = "/its/status/";

   LOG = new YAHOO.widget.LogWriter("StatusCameo");
   LOG.log("Created new StatusCameo");
};

/* These next three functions are copied from the status page application.
 * They should be moved to a shared library.
 */


var hasTag = function(taglist, tag) {

   var regex = new RegExp("\\b" + tag + "\\b");

   return regex.test(taglist);

};

var getValue = function(el, tagname) {

   var result = "";

   try {
      result = el.getElementsByTagName(tagname)[0].firstChild.nodeValue;
   } catch (e) {
      /* nothing */
   }

   return result;
};


var getValues = function(el, tagname) {

   var result = "";
   var els, i;

   try {
      els = el.getElementsByTagName(tagname);
      for (i = 0; i < els.length; i++) {
         result = result + " " + els[i].firstChild.nodeValue;
      }
   } catch (e) {
      /* nothing */
   }

   return result;
};


var isStale = function(d) {
   var now = new Date();
   var oneday = 24*3600000;
   var expiretime =d.getTime() + oneday;
   var dow;

   while (true) {
      dow = new Date(expiretime).getDay();
      if (dow>=1  && dow <=6) {
         break;
      }
      expiretime = expiretime + oneday;
   }

   return now.getTime() >= expiretime;

};


var isExpired = function(item, category, jsdate) {

      // If the entry is tagged with "expire-now", override everything and expire the item.
      if (hasTag(category, 'expire-now')) {
         return true;
      }

      // If the entry is tagged with "expire-never", don't ever expire it.
      if (hasTag(category, 'expire-never')) {
         return false;
      }

      // If the entry isn't tagged as either resolved or completed, it can't be expired based on the time.
      if (!hasTag(category, 'resolved')  &&  !hasTag(category, 'completed')) {
         return false;
      }

      return isStale(jsdate);

};


var removeExpired = function(items) {
   var i, item, category, date, jsdate, currentitems;

   if (!items) {
      return null;
   }

   currentitems = [];
   for (i = 0; i < items.length; i++) {
      item = items[i];
      category = getValues(item, 'category');
      date = getValue(item, 'atom:updated');
      date = null;
      if (!date) {
         date = getValue(item, 'pubDate');
      }
      jsdate = new Date(date);

      if (isExpired(item, category, jsdate)) {
         continue;
      }

      currentitems.unshift(item);
   }

   return currentitems;
};




////////////////////////////////////////////////
// Private static properties
////////////////////////////////////////////////

var pub = KSU.widget.StatusCameo.prototype;


/**
 * Display retrieved information.
 */
pub.displayResult = function(response, ctx) {

   var i, item, items, startdate, title, time, location, locationurl;

   items = response.responseXML.getElementsByTagName('item');
   items = removeExpired(items);
   html = "";

   if (items) {
      if (items.length === 1) {
         html = "There is <a href='" + this.urlStatusPage + "'>1 current service notice</a>.";
      } else if (items.length > 1) {
         html = "There are <a href='" + this.urlStatusPage + "'>" + items.length + " current service notices</a>.";
      }
   }

   if (!html) {
      html = "There are <a href='" + this.urlStatusPage + "'>no current service notices</a>.";
   }

   if (this.el) {
      this.el.innerHTML = html;
   }

};


/**
 * Add a note about data not available.
 */
pub.warnNotAvailable = function(response, ctx) {
};

pub.render = function() {

   LOG.log("Rendering");
   this.transID = YAHOO.util.Connect.asyncRequest('GET',
                                         this.urlFeed,
                                         {
                                             success: pub.displayResult,
                                             failure: pub.warnNotAvailable,
                                             scope: this
                                         } );
};

})();

