


  var is_ie6 = (
   window.external &&
   typeof window.XMLHttpRequest == "undefined"
  );

  var twCalendarInst = null;
  Event.observe(window, 'load', function() {
    twCalendarInst =  new twCalendar();
  });

  if(typeof settings == 'undefined') {
    var settings = {frontendURL: ''}
  }

  function twCalendar() {

    var calendar = $('twCalendar');
    var eventItem = null;

    /* Add event handlers */
    $$('.eventItem').each(function(elm) {
      Event.observe(elm, 'click', showDetails);
    });

    /* Remove event handlers method */
    this.removeShowDetailsHandlers = function() {

      $$('.eventItem').each(function(elm) {
        Event.stopObserving (elm, 'click', showDetails);
      });
    }

    Event.observe(document.body, 'click', hideDetails);

    /* Communicates with server to retrieve event data as JSON */
    function getEventData(eventId, eventItem) {

      var eventData = {};

      var milliTime = new Date().getTime();
      var url = settings.frontendURL + 'includes/components/calendar/scripts/jsonEventData.php?e=' + encodeURIComponent(eventId) + '&t=' + encodeURIComponent(milliTime);

      new Ajax.Request(url, {
        method: 'get',
        onSuccess: function(transport) {
          updateDetails(transport.responseText.evalJSON(), eventItem);
        },
        onFailure: function(transport) {
          alert('Unable to load event data. Please try again.');
        }
      });

      return eventData;
    }

    /* Shows event details popup */
    function showDetails() {

      eventItem = this;

      var re = /e(\d+).(-*\d+)/;
      var ids = re.exec(this.id);

      if(ids != null) {
        var eventId = ids[1];

        /* Clear content */
        $('twCalendarContent').innerHTML = '';

        /* If loading is taking a while, show loading message */
        var counter = 0;
        var iId = window.setInterval(function() {

          if($('twCalendarContent').innerHTML != '') {
            window.clearInterval(iId);
          }

          if(counter == 450) {
            $('twCalendarContent').innerHTML = 'Loading, please wait...';
            window.clearInterval(iId);
          }

          counter += 50;
        }, 50);

        /* Get event data */
        getEventData(eventId);

        updateDimensions();

        if(is_ie6) {
          calendar.show();
        }
        else {
          Effect.Appear(calendar, {duration: 0.3});
        }
      }
      else {
        alert('Unable to load event details.');
      }
    }
    this.showDetails = showDetails;

    /* Update the popup window details */
    function updateDetails(eventData, eventItem) {

      /* Add text*/
      var content  = '<h1>' + eventData.EventName + '</h1>'
      content += '<h2>' + eventData.EventDate;

      if(eventData.AllDayEvent != -1) {

        content += ' ' + eventData.EventTime;

        if(eventData.EventDate != eventData.EventEndDate) {
          content += ' - ' + eventData.EventEndDate;
        }
        else if(eventData.EventEndTime != eventData.EventTime) {
          content += ' -';
        }

        if(eventData.EventEndTime != eventData.EventTime) {
          content += ' ' + eventData.EventEndTime;
        }
      }
      else {
        content += ' (All Day Event)';
      }

      content += '</h2>';

      if(eventData.EventDescription != '') {
        content += '<p><div class="popupLabel">Description</div>' + eventData.EventDescription + '</p>';
      }

      if(eventData.EventLocation != '') {
        content += '<p><div class="popupLabel">Location</div>' + eventData.EventLocation + '</p>';
      }

      content += '<div id="iCalendar"><a href="' + settings.frontendURL + 'includes/components/calendar/scripts/export.php?id=' + encodeURIComponent(eventData.EventID) + '"><img src="' + settings.frontendURL + 'includes/components/calendar/images/calendar.png" alt="Download Event" title="Download Event" border="0" /></a></div>';
      $('twCalendarContent').innerHTML = content;

      updateDimensions();
    }

    function updateDimensions() {

      /* Get dimensions and positions of calendar and eventItem div */
      var posItm = eventItem.cumulativeOffset();
      var dimItm = eventItem.getDimensions();
      var dimCal = calendar.getDimensions();

      /* Position popup */
      var left = posItm.left + 30 + dimItm.width;
      var top = posItm.top - dimCal.height / 2 + 10;

      var prntPos = calendar.getOffsetParent().cumulativeOffset();
      top -= prntPos.top;
      left -= prntPos.left;

      /* Position side DIVs */
      $$('.popupL')[0].style.height = (dimCal.height - 10) + 'px';
      $$('.popupR')[0].style.height = (dimCal.height - 10) + 'px';

      /* Position arrow */
      var arrow = $('twCalendarArrow');
      arrow.style.top = (dimCal.height / 2 - 17) + 'px';

      calendar.setStyle({left: left + 'px', top: top + 'px'});
    }

    /* Hides event details popup */
    function hideDetails(e) {

     var target = e.target || e.srcElement;

     $(target);

     if(calendar.style.display == '' && target.className != 'eventItem' && !target.up('.popup')) {

        if(is_ie6) {
          calendar.hide();
        }
        else {
          Effect.Fade(calendar, {duration: 0.3});
        }
        return false;
      }
    }
    this.hideDetails = hideDetails;
  }