/* Group: Highlight Gallery */

  var activeNum = 0;

  var highlightGallery = {
    elements:'',numElements:'',
    advanceGallery: function(){
      (activeNum == numElements-1)?activeNum = 0:activeNum++;
      highlightGallery.showElement();
    },

    reverseGallery: function(){
      (activeNum == 0)?activeNum = numElements-1:activeNum--;
      highlightGallery.showElement();
    },

    showElement: function(){
      elements.each(function(i){
        if(i == activeNum){
          $(this).fadeIn('slow')
        } else {
          $(this).hide()
        }
      })
    },

    init: function(val){
      elements = val;
      numElements = val.length;
      highlightGallery.showElement();
    }
  };

/* End  */

/* Group: Schedule Setup */

  var showTitles = [];
  var showTimes = [];
  var scheduleXML;

/* End  */

/* Group: Current Schedule */

  var getCurrentSchedule = {

    init:function(feed){
            
      for(i = 0, ii = feed.length; i < ii; i++){
        showTitles.push(feed[i].title);
        showTimes.push(feed[i].pubDate);
      }

      getCurrentSchedule.getStartTime();

    },

    getStartTime:function(){

      //CURRENT
      var currentTime       = new Date();
      var currentMinutes    = currentTime.getMinutes();
      var currentHours      = currentTime.getHours();
      var currentDayOfWeek  = utils.getCurrentDay(currentTime.getDay())
      var currentDayOfMonth = currentTime.getDate();
      var currentMonth      = utils.getCurrentMonth(currentTime.getMonth());
      var currentYear       = currentTime.getFullYear();

      if(currentHours < 10)      { currentHours      = '0' + currentHours; }
      if(currentDayOfMonth < 10) { currentDayOfMonth = '0' + currentDayOfMonth; }

      var currentDateStr = currentDayOfWeek + ', ' + currentDayOfMonth + ' ' + currentMonth + ' ' + currentYear + ' ' + currentHours;

      //SCHEDULE
      var scheduleDayOfWeek  = showTimes[0].substring(0, showTimes[0].indexOf(','));
      var scheduleDayOfMonth = showTimes[0].substring(showTimes[0].indexOf(',')+2, showTimes[0].indexOf(',')+4);
      var startNode;

      for(i = 0, ii = showTimes.length; i < ii; i++){

        var scheduleDateStr = showTimes[i].substring(0, showTimes[0].indexOf(':'));
        var curDayDigits    = currentDateStr.substring(currentDateStr.length-2, currentDateStr.length);
        var schedDayDigits  = scheduleDateStr.substring(scheduleDateStr.length-2, scheduleDateStr.length)

        if( curDayDigits <= schedDayDigits ){
          startNode = i;
          break;
        } else {
          startNode = showTimes.length + 1;
        }
        
      }

      $('.schedule-summary').each(function(i){

        var titleToShow = showTitles[ startNode + i - 1 ];
        
        if(titleToShow !== undefined) {
          if ( titleToShow.length > 38 ) {
            titleToShow = titleToShow.substring( 0, 35 ) + '...';
          } else {
            titleToShow = titleToShow;
          }
        
          $(this).text( titleToShow );
        } else {
          $(this).parent().remove();
        }
        
      })
      
      $('#schedule-snippet .time').each(function(i){

        sStr   = ( showTimes[ startNode + i - 1 ] != '') ? showTimes[startNode+i-1] : '';

        sHour  = Math.floor( sStr.substring( sStr.indexOf(':'), sStr.indexOf(':') - 2 ) );
        sTime  = sStr.substring(sStr.lastIndexOf(':')-2,sStr.lastIndexOf(':')+3)
        sYear  = currentYear;
        sMonth = utils.getCurrentMonthStr(sStr.substring(sStr.lastIndexOf(sYear) - 4 ,sStr.lastIndexOf(sYear) - 1 ) );
        sDay   = sStr.substring(5, 7);

        mfStr  = sYear+'-'+sMonth+'-'+sDay+'T'+sTime;
        sMin   = sStr.substring(sStr.lastIndexOf(':'),sStr.lastIndexOf(':')-2);
        

        if(sHour == 00) {sHour=12}
        if(sHour >  12) {sHour -= 12; meridium = 'PM' } else { meridium = 'AM' }
        if(sHour <  10) {sHour = '  &nbsp; '+sHour;}

        $(this).html('<abbr class="dtstart" title="'+mfStr+'">'+sHour+':'+sMin+' '+meridium+'</abbr>');

      })

    }

  };

/* End  */

/* Group: Weekly Schedule */

  var getWeeklySchedule = {

    curDay:'',
    dayXML:'',
    activeDays: {},

    init:function(feed){

      this.feed = feed;

      var currentDate = new Date();
      if(utils.urlVars() == ''){
        //determine day
        curDay = utils.getCurrentDay(currentDate.getDay()).toLowerCase();
      } else{
        curDay = utils.urlVars();
      }

      //show this week
      var myDate      = new Date();
                        myDate.setDate(myDate.getDate()+6)
      var cDay        = currentDate.getDate()
      var cMonth      = utils.getCurrentMonthFullStr( utils.getCurrentMonth( currentDate.getMonth() ).toLowerCase() ).toUpperCase();
      var schedTitle  = cMonth.toUpperCase() + ' ' + cDay + ' - ';
          schedTitle += myDate.getUTCDate() + ' ' + currentDate.getFullYear();

      //$('#schedule-week span').text(schedTitle);

      //rearrange days of the week
      var dCnt = currentDate.getDay();
      $('#schedule-week-nav a').each(function(i){

        var d = utils.getCurrentDay(dCnt++);
        var urlAttr = $(this).attr('href');
        var newAttr = urlAttr.substring(urlAttr, urlAttr.length-3);
        
        getWeeklySchedule.activeDays[d.toLowerCase()] = false;

        $(this)
          .text(d.toUpperCase())
          .attr('href', newAttr + d.toLowerCase() )
          .parent()
          .addClass(d.toLowerCase())        
          .filter('.' + curDay)
          .children('a')
          .addClass('active');

        if(dCnt==7){dCnt=0}

      });

      getWeeklySchedule.getCurDayXMlNodes();

      //Clean up nav to only show active days
      for(var activeDay in getWeeklySchedule.activeDays) {
        if(getWeeklySchedule.activeDays[activeDay] !== true) {
          $('#schedule-week-nav li.'+activeDay).hide();
        }
      }

    },

    getCurDayXMlNodes:function(){

      today          = new Date();
      todayDayInt    = today.getDay();
      todayDay       = utils.getCurrentDay( todayDayInt );
      todayDate      = today.getDate();
      curDayInt      = utils.getCurrentDayInt( curDay.toString() );    
      curTodayDiff   = ( ( curDayInt + 7 ) - todayDayInt) % 7;

      curDays        = new Date();
                       curDays.setDate(today.getDate() + curTodayDiff);
      curDateString  = curDays.toDateString();
      curMonth       = utils.getCurrentMonthFullStr( curDateString.substring(4,7) )
      curDate        = curDateString.substring(8,10);
      if (curDate < 10) { curDate = curDate.substring(1,3); };

      schedDate   = utils.getCurrentDayFullStr( curDay.toString() );

      $('#schedule-main #schedule-date').text(schedDate.toUpperCase() + ', ' + curMonth.toUpperCase() + ' ' + curDate);

      getWeeklySchedule.populateSchedule('morning',   0,  12);
      getWeeklySchedule.populateSchedule('afternoon', 12, 17);
      getWeeklySchedule.populateSchedule('evening',   17, 23);
    },

    populateSchedule: function(timeframe,begin,end){

      for(var i=0, ii=this.feed.length; i<ii; i++){

        var titleStr  = this.feed[i].title,
            pubDate = this.feed[i].pubDate;
        
        var schedDay  = pubDate.substring(pubDate.indexOf(',')-3,pubDate.indexOf(',')).toLowerCase();
        var beginTime = pubDate.substring( pubDate.lastIndexOf(':') - 5, pubDate.lastIndexOf(':') - 3 );
        
        getWeeklySchedule.activeDays[schedDay] = true;
        
        if( ( curDay == schedDay ) && ( beginTime >= begin ) && ( beginTime < end )){

          sYear       = pubDate.substring( pubDate.lastIndexOf(':') - 8, pubDate.lastIndexOf(':') - 5 );
          sMonth      = utils.getCurrentMonthStr(pubDate.substring(pubDate.indexOf(',')+5, pubDate.indexOf(',')+8))+1;
          sDay        = pubDate.substring(pubDate.indexOf(',')+2, pubDate.indexOf(',')+4);         
          sHour       = Math.floor(pubDate.substring(pubDate.lastIndexOf(':') - 5, pubDate.lastIndexOf(':') - 3 ));
          sMin        = pubDate.substring(pubDate.lastIndexOf(':') - 2, pubDate.lastIndexOf(':'));
          
          if ( sMonth < 10) { sMonth = '0' + sMonth }
          if ( sHour  > 12) { sHour -= 12 }

          meridium    = (timeframe == 'morning') ? 'AM' : 'PM';
          dateStr     = sYear + '-' + sMonth + '-' + sDay + 'T' + sHour + ':' + sMin + ':00';

          row =  '<tr class="vevent"><td class="time schedule-time"><abbr class="dtstart" title="'+dateStr+'">';
          row += sHour+':'+sMin+' '+meridium;
          row += '</abbr></td>';
          row += '<td class="summary schedule-title">';
          row += titleStr;
          row += '</td></tr>';

          $('#schedule-' + timeframe + ' tbody').append(row);

        }

      }
      
    }  
  };

/* End  */

/* Group: Utility */

  var utils = {

    urlVars:function(){
      var vars = [], hash;
      var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
        for(var i = 0, ii = hashes.length; i < ii; i++)  {
          hash = hashes[i].split('=');
          vars.push(hash[1]);
          vars[hash[0]] = hash[1];
        }
        return vars;
    },

    match:function(val,obj,type){
      var i = 0;
      for ( key in obj ){
        if ( obj[key].substring(0,3).toLowerCase() == val.toLowerCase() ) {
          if ( type == 'int' )
            return i;
          else 
            return obj[i];
        }
        i++;
      }
    },

    getDate:function(val,obj,type){

      if (obj == 'month'){
        obj = this.months;
      } else {
        obj = this.days;
      }

      if( parseInt(val) == val ){
        data = obj[val];
      } else if ( val.length == 3 ) {
        data = this.match(val,obj,type);
      } else {
        data = this.match(val,obj,type);
        data = ( data < 10 ) ? '0' + data : data;
      }

      switch (type) {
        case 'int':
          return parseInt(data);
          break;
        case 'abbr':
          return data.substring(0,3);
          break;
        default:
          return data;
      }

    },

    getCurrentDay:function(val){
      return this.getDate(val,'day','abbr');
    },

    getCurrentDayInt:function(val){
      return this.getDate(val,'day','int');
    },

    getCurrentDayFullStr:function(val){
      return this.getDate(val,'day');
    },

    getCurrentMonth:function(val){
      return this.getDate(val,'month','abbr');
    },

    getCurrentMonthFullStr:function(val){
      return this.getDate(val,'month');
    },

    getCurrentMonthStr:function(val){
      data = this.getDate(val,'month','int') + 1;
      data = ( data < 10 ) ? '0' + data : data;
      return data;
    },

    days : {
      0 : 'Sunday',
      1 : 'Monday',
      2 : 'Tuesday',
      3 : 'Wednesday',
      4 : 'Thursday',
      5 : 'Friday',
      6 : 'Saturday'
    },

    months : {
      0  : 'January',
      1  : 'February',
      2  : 'March',
      3  : 'April',
      4  : 'May',
      5  : 'June',
      6  : 'July',
      7  : 'August',
      8  : 'September',
      9  : 'October',
      10 : 'November',
      11 : 'December'
    }

  }

/* End  */

/* Group: Document Ready */

  $().ready(function(){

    if ( seg ) {

      $.yql(
         'SELECT * FROM xml WHERE url="http://intranet.fcctv.net:3000/xml/program_schedule_feed?channel_id=1"',
         function ( data ){
           parsed_data = $( data.query.results.rss.channel.item );

            if (seg == 'schedule'){
              getWeeklySchedule.init( parsed_data );
           } else {
              getCurrentSchedule.init( parsed_data );
           }

         }
       );

    }

  });
  
/* End  */
