$.fn.extend({
  equals:  function(obj) {
    return this.get(0) === $(obj).get(0);
  }
})

$.fn.extend({
  hasAttr: function(attribute) {
    return this.attr(attribute) != undefined;
  }
})

var alreadyRan = 0;
var apiKey = "2B1F258F953AF9B5DF77E7109C72E210";
var username = "GSLC_Fremont";
var baseUserUrl = "http://api.ustream.tv/json/user/{username}/{command}?key={apiKey}";
var baseChannelUrl = "http://api.ustream.tv/json/channel/{channelName}/{command}?key={apiKey}&params=autoplay:true;mute:false;height:368;width:608";

$(document).ready(function() {
  
  if (alreadyRan == 1) 
    return;
  
  alreadyRan = 1;

  $('.live-stream-link').hide();

  $('#header-wrapper').addClass(GetSeasonClass(Date.today()));

  $('.article-banner').each(function(index) {
    if ($(this).hasAttr('tag'))
    {
      var date = Date.parse($(this).attr('tag'));
      var colorClass = GetSeasonClass(date);

      if (colorClass != null)
        $(this).addClass(colorClass);
    }
  });

  $('#breadcrumbs li, #sidebar li').prepend('<span class="left ui-icon ui-icon-triangle-1-e"></span>');

  if (ShowBreadCrumbs()) {
    $('#breadcrumbs div').show('blind');
  }

  if($('#announcement').hasAttr('start') 
    && $('#announcement').hasAttr('end')) {
    var start = Date.parseExact($('#announcement').attr('start'), 'dd.MM.yyyy');
    var end = Date.parseExact($('#announcement').attr('end'), 'dd.MM.yyyy');

    if (start != null && end != null && Date.today().between(start, end.next().days().add(-1).seconds())) {
      $('#announcement')
        .animate({opacity: 1.0}, 3000)
        .show('blind');
    }
  }

  $('.hoverable').hover(
    function() { $(this).addClass('hover'); },
    function() { $(this).removeClass('hover'); }
  );  
  
  $('.accordion > h3.accordion-item').live('click', function() {
    $('.accordion > div').hide();
    $('.accordion > h3').removeClass('tab-content-current');
    $(this).addClass('tab-content-current');
    $(this).next('div').show('fade');
  });
  
  $('#tabs > li[tag]').live('click', function() {
    var clicked = $(this);
    var contentTag = $(clicked.attr('tag'));
    
    $('.tab-content:visible').each(function(index) {
      if(!contentTag.equals(this)) {
        $(this).slideToggle();
      }
    });
    
    $('#tabs > li[tag] .ui-icon-triangle-1-n').each(function(index) {
      if(!clicked.equals(this)) {
        $(this).find('span.ui-icon').toggleClass('ui-icon-triangle-1-s ui-icon-triangle-1-n');
      }
    });

    $(this).find('span.ui-icon').toggleClass('ui-icon-triangle-1-s ui-icon-triangle-1-n');
    contentTag.slideToggle();
  });

  $.ajax({
    url : baseUserUrl
            .replace("{username}", username)
            .replace("{command}", "listAllChannels")
            .replace("{apiKey}", apiKey),
    dataType: "jsonp",
    success: function(json) {
      $.each(json, function(index, channel) {
          if(channel.status == "live")
          {
            $('.live-stream-link').show();
            if (window.location.pathname == "/live-stream")
            {
              $.ajax({
                url : baseChannelUrl
                        .replace("{channelName}", channel.urlTitleName)
                        .replace("{command}", "getCustomEmbedTag")
                        .replace("{apiKey}", apiKey),
                dataType: "jsonp",
                success: function(embedcode) {
                  $('#live-stream-container').append(embedcode);
                },
                error: function(x,y,z) {
                  
                }
              });
            }
            return true;
          }
      });
    },
    error: function(x,y,z) {
      $('.live-stream-link').hide();
    }
  });


});

function ShowBreadCrumbs() {
  var url = window.location.pathname;

  var paths = new Array();
  paths[0] = '/blog/';
  paths[1] = '/organization';
  paths[2] = '/staff';

  paths = $.grep(paths, function(x) {
    return url.indexOf(x) != -1;
  }); 

  return paths.length > 0;
}

function GetSeasonClass(date) {
  var season = GetSeason(date);
  if (season != null) 
    return season.Color;
    
  return 'green';
}

function GetSeasonName(date) {
  var season = GetSeason(date);
  if (season != null) 
    return season.Name;
  
  return 'Unknown';
}

function GetSeason(date) {
  var seasons = GetChurchSeasons(date);
  
  for (index in seasons)
  {
    var season = seasons[index];
    if(date.between(season.Start, season.End))
      return season;
  }
  
  return null
}

function GetChurchSeasons(date) {    
  var seasons = new Array();

  var churchYearStart = date.clone().clearTime().christmas().previous().sunday().add(-3).weeks();
  
  if(date.clone().isBefore(churchYearStart))
    churchYearStart = date.clone().clearTime().christmas().previous().year().previous().sunday().add(-3).weeks();

  var advent1Begin = churchYearStart.clone();
  var advent1End = advent1Begin.clone().add(13).days();

  var advent2Begin = advent1End.clone().add(1).days();
  var advent2End = advent2Begin.clone().add(6).days();

  var advent3Begin = advent2End.clone().add(1).days();
  var advent3End = churchYearStart.christmas().clone().add(-2).days();

  var christmasEveBegin = churchYearStart.clone().christmas().add(-1).days();
  var christmasEveEnd = christmasEveBegin.clone();

  var christmasBegin = churchYearStart.clone().christmas();
  var christmasEnd = christmasBegin.clone().add(11).days();

  var epiphanyBegin = christmasEnd.clone().add(1).days();
  var epiphanyEnd = epiphanyBegin.clone();
  
  var easterBegin = epiphanyBegin.clone().easter();
  var easterEnd = easterBegin.clone();
  
  var goodFridayBegin = easterBegin.clone().previous().friday();
  var goodFridayEnd = easterEnd.clone().previous().day();
  
  var maundyThursdayBegin = easterBegin.clone().previous().thursday();
  var maundyThursdayEnd = maundyThursdayBegin.clone();
  
  var palmSundayBegin = easterBegin.clone().previous().sunday();
  var palmSundayEnd = palmSundayBegin.clone();
  
  var ashWednesdayBegin = easterBegin.clone().add(-7).weeks().next().wednesday();
  var ashWednesdayEnd = ashWednesdayBegin.clone();
  
  var lent1Begin = ashWednesdayEnd.clone().next().day();
  var lent1End = palmSundayEnd.clone().previous().day();
  
  var lent2Begin = palmSundayEnd.clone().next().day();
  var lent2End = maundyThursdayBegin.clone().previous().day();
  
  var ordinaryTime1Begin = epiphanyEnd.clone().next().day();
  var ordinaryTime1End = ashWednesdayBegin.clone().previous().day();
  
  var eastertideBegin = easterEnd.clone().next().day();
  var eastertideEnd = easterEnd.clone().add(7).weeks().previous().day();
  
  var pentecostBegin = eastertideEnd.clone().next().day();
  var pentecostEnd = pentecostBegin.clone();
  
  var reformationBegin = pentecostEnd.clone().nov().moveToFirstDayOfMonth().previous().sunday();
  var reformationEnd = reformationBegin.clone();
  
  var ordinaryTime2Begin = pentecostEnd.clone().next().day();
  var ordinaryTime2End = reformationBegin.clone().previous().day();
  
  var allSaintsDayBegin = reformationEnd.clone().next().sunday();
  var allSaintsDayEnd = allSaintsDayBegin.clone();
  
  var ordinaryTime3Begin = reformationEnd.clone().next().day();
  var ordinaryTime3End = allSaintsDayBegin.clone().previous().day();
  
  var ordinaryTime4Begin = allSaintsDayEnd.clone().next().day();
  var ordinaryTime4End = ordinaryTime4Begin.clone().christmas().previous().sunday().add(-3).weeks().previous().day();
  
  seasons[0] = new ChurchSeason("Advent1", advent1Begin, advent1End, "darkblue");
  seasons[1] = new ChurchSeason("Advent2", advent2Begin, advent2End, "pink");
  seasons[2] = new ChurchSeason("Advent3", advent3Begin, advent3End, "darkblue");
  seasons[3] = new ChurchSeason("ChristmasEve", christmasEveBegin, christmasEveEnd, "darkblue");
  seasons[4] = new ChurchSeason("Christmas", christmasBegin, christmasEnd, "gold");
  seasons[5] = new ChurchSeason("Epiphany", epiphanyBegin, epiphanyEnd, "gold");
  seasons[6] = new ChurchSeason("OrdinaryTime1", ordinaryTime1Begin, ordinaryTime1End, "green");
  seasons[7] = new ChurchSeason("AshWednesday", ashWednesdayBegin, ashWednesdayEnd, "purple");
  seasons[8] = new ChurchSeason("PalmSunday", palmSundayBegin, palmSundayEnd, "purple");
  seasons[9] = new ChurchSeason("Lent1", lent1Begin, lent1End, "purple");
  seasons[10] = new ChurchSeason("Lent2", lent2Begin, lent2End, "purple");
  seasons[11] = new ChurchSeason("MaundyThursday", maundyThursdayBegin, maundyThursdayEnd, "purple");
  seasons[12] = new ChurchSeason("GoodFriday", goodFridayBegin, goodFridayEnd, "black");
  seasons[13] = new ChurchSeason("Easter", easterBegin, easterEnd, "gold");
  seasons[14] = new ChurchSeason("Eastertide", eastertideBegin, eastertideEnd, "gold");
  seasons[15] = new ChurchSeason("Pentecost", pentecostBegin, pentecostEnd, "red");
  seasons[16] = new ChurchSeason("OrdinaryTime2", ordinaryTime2Begin, ordinaryTime2End, "green");
  seasons[17] = new ChurchSeason("Reformation", reformationBegin, reformationEnd, "red");
  seasons[18] = new ChurchSeason("OrdinaryTime3", ordinaryTime3Begin, ordinaryTime3End, "green");
  seasons[19] = new ChurchSeason("AllSaintsDay", allSaintsDayBegin, allSaintsDayEnd, "red");
  seasons[20] = new ChurchSeason("OrdinaryTime4", ordinaryTime4Begin, ordinaryTime4End, "green");

  return seasons;
}

function ChurchSeason(name, start, end, color) {
  this.Name = name;
  this.Start = start;
  this.End = end.add(1).days().add(-1).seconds(); 
  this.Color = color;
}
