/*
 * @author Bowman Design, Inc.
 */
 
var rangelowest = 0;
var rangehighest = 0;

var loadedlowest = 0;
var loadedhighest = 0;

var datesLoaded = new Array();
var datesDrawn = new Array();

var timerID,qc_themonth,qc_theyear;
var currentPOPUP;
var currentOVER;
var lastID;
var once = 0;
var ua = navigator.userAgent.toLowerCase();
var prefix = '';
var tmp = window.location.toString();
var qctoday = new Date();
var event_start_day = 0;
var event_end_day = 0;
var grabpast = 0;  //determines whether to grab more data
var grabfuture = 0; //determines whether to grab more data
var strhist = '';

var calsize = 540; //number of days in the total calendar
var daywidth = 24; //24 pixels size of each day
var miliToDays = 1000 * 60 * 60 * 24; //1000 miliseconds * 60 seconds * 60 min * 24 hours = 1 day
var viewport = 644; //size of the outerdiv (visible content)
var weekDays = ["S", "M", "T", "W", "T","F","S"];
var months = ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"];
var calBeginDay = new Date();

var calCurrentDay = 0;
var calDaysPer = 27;


qc_themonth = qctoday.getMonth();
qc_theyear = qctoday.getFullYear(); 

if (tmp.indexOf('index.jsp') > 0)
  prefix = '/bso';
if (tmp.charAt(tmp.length - 1) == '/')
  prefix = '/bso';


//load visible days
function qc_ajaxGrab()
{
  //if((grabfuture >=-1 && grabpast <= 1) && (strhist.indexOf('0') == -1))
  //{
    strhist+='0';
    /*from the 1st of the start month to the 1st of the end month - handles late start months */
    var startmonth = qc_themonth;
    var endmonth = qc_themonth+3;
    var endyear = qc_theyear;
    event_start_day = 240;
    event_end_day = 320;
    if (endmonth > 12)
    {
      endmonth = endmonth - 12;
      endyear++;
    }
  //}
  //grabEvents(startmonth,qc_theyear,endmonth,endyear,'qc');
}


//sets the content for the performance popup
function getPopUpContent (myPopup) {
  var head, p, pipe, vert, aSyos, aTicket, aDetails, node_content,pid,linebreak,horzrule,hrdiv;
  var divcounter = '';
  
  
  while(document.getElementById('title_' + myPopup.id + divcounter) != null)
  {
    aTicket = document.createElement("a");
    aDetails = document.createElement("a");
    aSyos = document.createElement("a");
    head = document.createElement("div");
    p = document.createElement("div");
    pipe = document.createElement("span");
    vert = document.createElement("span");
    buy = document.createElement("div");
    linebreak = document.createElement("br");
    

    head.className = "event_popupHead";
    p.className = "event_popupDesc";
    pipe.className = "event_popupDesc";
    vert.className = "event_popupDesc";
    aTicket.className = "event_popupLink";
    aDetails.className = "event_popupLink";
    aSyos.className = "event_popupLink";
    buy.className = "event_Link";
    
    head.innerHTML = document.getElementById('title_' + myPopup.id + divcounter).innerHTML;
    p.innerHTML = document.getElementById('date_' + myPopup.id + divcounter).innerHTML;
    pid = document.getElementById('pid_' + myPopup.id + divcounter).innerHTML;

    node_content = document.createTextNode("Performance Details");
    aTicket.appendChild(node_content);
    aTicket.setAttribute('href', '/bso/mods/perf_detail.jsp?pid=' + pid);
    buy.appendChild(aTicket);

    //node_content = document.createTextNode("|");
    //pipe.appendChild(node_content);
    //buy.appendChild(pipe);

    //node_content = document.createTextNode("Best Available Seats");
    //aDetails.appendChild(node_content);
    //aDetails.setAttribute('href', '/bso/mods/seatsel.jsp?prevPage=PerformanceDetails&pid=' + pid);

    //buy.appendChild(aDetails);

    //Added By Rich
    //node_content = document.createTextNode("|");
    //vert.appendChild(node_content);
    //buy.appendChild(vert)
    
    //node_content = document.createTextNode("Select Your Seats");
    //aSyos.appendChild(node_content);
    //aSyos.setAttribute('href', "javascript:openSYOS('" + sessionid + "','" + pid + "')");
    //buy.appendChild(aSyos);
    //End Rich
    
    if (divcounter != '') 
    {

      hrdiv = document.createElement("hr");
      hrdiv.setAttribute('height',1);
      //hrdiv.appendChild(hrdiv);

      myPopup.appendChild(hrdiv);
    }
    myPopup.appendChild(head);
    myPopup.appendChild(p);
    myPopup.appendChild(buy);
    
    if(divcounter == '') {divcounter = 1;linebreak='<br>';}
    divcounter++;
    
  }
  
  return myPopup;
}

//sets the content for the performance popup
function getOverContent (myPopup) {
  var head, p, aTicket, aDetails, node_content, strTemp;

  p = document.createElement("span");
  p.className = "event_popupOver";
  
  //node_content = document.createTextNode("<br><br>Click Here For Performance Details");
  //fp.appendChild(node_content);
  strTemp = myPopup.id;
  strTemp = 'date_event_popup' + strTemp.substr(10,strTemp.length-13);
  
  p.innerHTML = 'Click for performance details';
  myPopup.appendChild(p);

  return myPopup;
}


//Event Initator: user click
//this function creates an absolute positioned popup
//containing the a brief decription & links for performances  
function showEvtDetails(evt) {
  doHideEvent();

  if (!evt) evt = window.event; // Get event details for IE
  var obj = this;
  var startX = evt.clientX + Geometry.getHorizontalScroll();
  var startY = evt.clientY + Geometry.getVerticalScroll();
  var perf_details;
  
  if ((document.body.clientWidth - evt.clientX) < 300)
  {
   startX = (document.body.clientWidth-330);
  }
  
  myDiv = document.createElement("div");
  myDiv.id = "event_popup" + obj.id; //this will be dynamically generated when pulling live data
  myDiv.className = "event_popup";
  
  //offset the div a little
  myDiv.style.top = startY - 10 + "px";
  myDiv.style.left = startX - 5 + "px";
  myDiv.style.display = "none";
  
  //display event performance details
  perf_details = getPopUpContent(myDiv);
  document.body.appendChild(myDiv);
  myDiv.onmouseover = overEvtDetails;
  myDiv.onmouseout = nullEvtDetails;

  new Effect.Appear(myDiv, {duration: 0.5 });

  doHidePopup();
  currentPOPUP = myDiv;
}
//Event Initator: user click
//this function creates an absolute positioned popup
//containing the a brief decription & links for performances  
function showPopup(evt) {
  if (!evt) evt = window.event; // Get event details for IE
  var obj = this;
  var startX = evt.clientX + Geometry.getHorizontalScroll();
  var startY = evt.clientY + Geometry.getVerticalScroll();
  var perf_details;
  
  if ((document.body.clientWidth - evt.clientX) < 180)
  {
   startX = (document.body.clientWidth-200);
  }
  
  
  myDiv = document.createElement("div");
  myDiv.id = "event_over" + obj.id + "pop"; //this will be dynamically generated when pulling live data
  myDiv.className = "event_over";
  
  myDiv.style.top = startY + 20 + "px";
  myDiv.style.left = startX + 10 + "px";
  myDiv.style.display = "none";
  
  //display event performance details
  perf_details = getOverContent(myDiv);
  document.body.appendChild(myDiv);
  new Effect.Appear(myDiv, {duration: 0.5 });

  doHidePopup();
  currentOVER = myDiv;
}

function hidePopup(evt) {
  doHidePopup();
}

function doHidePopup()
{
  if (currentOVER != null)
  {
    document.body.removeChild(currentOVER);
    currentOVER = null;
  }
}

function nullEvtDetails(evt) {
  //switch popup off
  if (!evt) evt = window.event; // Get event details for IE
  currentPOPUP = this;
  timerID = setTimeout("hideEvtDetails('" + currentPOPUP.id + "');",50);
  lastID = currentPOPUP.id;
  return;
}

function overEvtDetails(evt) {
  //alert("back on");
  if (!evt) evt = window.event; // Get event details for IE
  
  if (currentPOPUP != null && lastID == currentPOPUP.id)
  {
    clearTimeout(timerID);
  }
    
  return;
}

//destroys the popup
function hideEvtDetails(param) {
//  alert(param);
//  alert(currentPOPUP.id);
  new Effect.Fade(param);
  
  if (param == currentPOPUP.id)
    currentPOPUP = null;    
}

function doHideEvent() {
  if (currentPOPUP != null)
  {
    new Effect.Fade(currentPOPUP.id);
    currentPOPUP = null;
  }
}

// quickCalendar class -> constructor
function QuickCalendar() {

  var curInterval = [];
  var hidePopupFlag = 0;
  var curDay = 0;
  var daysPer = 28;


  //function to display the correct year on the calendar
  function showYear() {
    //Add today + calsize, compare months
    var curYear;
    var myElement;
    
    curYear = calBeginDay.getFullYear();
    myElement = document.getElementById("qc_year");
    myElement.innerHTML = curYear;
  }
  
  function showMonth() {
  
    var nexDay = new Date();
    var curMonth;
    var nexMonth;
    var node_content;
    var myElement;

    curMonth = months[calBeginDay.getMonth()];
    
    nexDay.setTime(calBeginDay.getTime() + ((viewport / daywidth) * miliToDays));
    nexMonth = months[nexDay.getMonth()];
    
    if (curMonth == nexMonth) {
      node_content = "&nbsp&nbsp&nbsp " + curMonth + " &nbsp&nbsp&nbsp";
    } else {
      node_content = curMonth + " / " + nexMonth;
    } 
    
    myElement = document.getElementById("qc_month");
    myElement.innerHTML = node_content;
  }
  
  function hasBSOevent(thisDay) {
    var i,tmpdiv,tmpstr;
    var result = false;
    
    tmpdiv = document.getElementById('date_event_popup' + thisDay.getDate() + "/" + (thisDay.getMonth()+1) + "/" + thisDay.getFullYear());

    if (tmpdiv != null)
      return true;
    
    return result;
  }

/* The following two functions will handle the slide transition of the 
* QuickCalendar
* slideRight -> moves the calendar to the right - displaying days back in time
* slideLeft -> moves the calendar to the left - displaying days forward in time
*/
  this.slideRight = function() {
    calCurrentDay -= calDaysPer;
    this.draw(calCurrentDay, calCurrentDay+calDaysPer, -1);
    
    oldx = document.getElementById("qc_monthDays").style.left;
    //Step 1. animate "qc_monthDays" or the innerdiv
    var options = {
      duration: 1.0,
      transition: Effect.Transitions.sinoidal
    }
    new Effect.MoveBy('qc_monthDays', 0, viewport, options);
    calBeginDay.setTime(calBeginDay.getTime() - ((viewport / daywidth) * miliToDays));
    createCookie("qc_day", calCurrentDay, 1);
      
    showMonth();
    showYear();
  }
  this.slideLeft = function() {
    calCurrentDay += calDaysPer;
    this.draw(calCurrentDay, calCurrentDay + calDaysPer, 1);

    oldx = document.getElementById("qc_monthDays").style.left;
    //Step 1. animate the innderdiv
    var options = {
      duration: 1.0,
      transition: Effect.Transitions.sinoidal
    }
    new Effect.MoveBy('qc_monthDays', 0, -viewport, options);
    calBeginDay.setTime(calBeginDay.getTime() + ((viewport / daywidth) * miliToDays));
    createCookie("qc_day", calCurrentDay, 1);

    showMonth();
    showYear();
  }
  
  function createWeekDay(currentDay) {
    var myTD = document.createElement("td");
    var node_content;
    
    node_content = document.createTextNode(weekDays[currentDay.getDay()]);
    myTD.appendChild(node_content);
    myTD.className = "celldiv";
    
    if(currentDay.getDay() == 0) {
      myTD.className = "celldivSunWeekday";
    } 
    
    return myTD;
  }
  //This function takes in a date object
  //and looks to see if any events match up with the date
  //returns an TD element with the appropriate content & styling
  function createMonthDay(currentDay) {
    var myTD = document.createElement("td");
    var a = document.createElement("a");
    var node_content = document.createTextNode(currentDay.getDate());
    
    myTD.id = currentDay.getDate() + "/" + (currentDay.getMonth()+1) + "/" + currentDay.getFullYear();
    a.setAttribute("href","javascript:void();");
    a.setAttribute("title", "Click for details.");
    myTD.appendChild(node_content);
    myTD.className = "celldiv";
    //if an event falls on the date - apply style, insert pop_up span
    
    /*
      Done in Redraw
    if (hasBSOevent(currentDay)) {
      myTD.onmouseover = showPopup;
      myTD.onmouseout = hidePopup;
      myTD.onclick = showEvtDetails;
      //attach mouseclick Event Listener
      myTD.className += " event";
    }*/
    
    if (currentDay.getDay() == 6) {
      myTD.className += " sat";
    }
    
    if (currentDay.getDay() == 0) {
      myTD.className += " sun";
    }
    
    return myTD;
  }
  
  function createBlank() {
    var myTD = document.createElement("td");
    var img = document.createElement("img");
    
    img.setAttribute('src',"/images/transpix.gif");
    //add 8 1px spacers.
    for (var i=0;i<8;i++) {myTD.appendChild(img);}

    myTD.className = "cellspace";
    
    return myTD;
  }
  
  
  
  this.draw = function(rangestart, rangeend, dir) {
    var newDate = 0;
    if (rangestart == null)
    {
      // Initial load from page
          
      if (readCookie("qc_day") != null)
      {
        calCurrentDay = parseInt(readCookie("qc_day"));
        newDay = new Date();
        
        calBeginDay.setTime(newDay.getTime() + calCurrentDay * miliToDays);
        showMonth();
        showYear();
        this.draw(calCurrentDay - 1* calDaysPer, calCurrentDay + 4 * calDaysPer, 0);
      } else {
        this.draw(calCurrentDay - 1* calDaysPer, calCurrentDay + 4 * calDaysPer, 0);
      }
    } else {
      // we have dates!
      var weekRow = document.getElementById("qc_wkdays");
      var dayRow = document.getElementById("qc_daysOfMonth")
      var curDay;
      var node_content;
      
      showYear();
      showMonth();
      
      if (rangestart <= rangelowest) rangelowest = rangestart;
      if (rangeend >= rangehighest) rangehighest = rangeend;
      
      var myTable = document.getElementById("qc_monthDays");
      if (myTable.style.left == "")
      {
        myTable.style.left = "0px";
      }
      
      startWeek = weekRow.firstChild;
      startDay = dayRow.firstChild;
      
      for (var i=rangestart;i < rangeend; i++){
        if (datesDrawn[i] != 1)
        {
          
        
          curDay = new Date();
          curDay.setTime(curDay.getTime() + i * miliToDays);
  
          var tdWkDay = createWeekDay(curDay);
          var tdDay = createMonthDay(curDay);   
          var tdBlank = createBlank();
          var tdBlank2 = createBlank();
              //append the new TD elements to the corresponding rows

          if (dir > 0)
          {
            weekRow.appendChild(tdWkDay);   
            weekRow.appendChild(tdBlank);
            dayRow.appendChild(tdDay);
            dayRow.appendChild(tdBlank2);
            datesDrawn[i]= 1;
          } else {
            weekRow.insertBefore(tdWkDay, startWeek);
            weekRow.insertBefore(tdBlank, startWeek);
            dayRow.insertBefore(tdDay, startDay);
            dayRow.insertBefore(tdBlank2, startDay);
            datesDrawn[i]= 1;
          }
          
          newDate = 1;
        }
      }
      
      if (dir < 0 && newDate)
      {
        //alert(parseInt(myTable.style.left));
        //alert(parseInt(myTable.style.left) - viewport / 2 + "px");
        myTable.style.left = (parseInt(myTable.style.left) - viewport) + "px";
      } else if (dir == 0 && rangestart < calCurrentDay)
      {
        //alert(rangestart + " " + calCurrentDay);
        myTable.style.left = ((rangestart - calCurrentDay) * daywidth + 4) + "px";
        new Effect.MoveBy('qc_monthDays', 0, 1);
      }
      
      if (newDate)
        this.loadvals(rangestart, rangeend);
    }
  
  }
  
  this.loadvals = function (rangestart, rangeend) {
    //alert(rangestart + " -> " + rangeend);
      startDate = new Date();
      startDate.setTime(startDate.getTime() + rangestart * miliToDays);
      endDate = new Date();
      endDate.setTime(endDate.getTime() + (rangeend + 31)* miliToDays);
      grabEvents(parseInt(startDate.getMonth()) + 1,startDate.getFullYear(),parseInt(endDate.getMonth()) + 1,endDate.getFullYear(),'qc');   
  }
  
  this.loadCookieVals = function () {
    
  }
  
  
  this.redraw = function () {
    for (var i=rangelowest;i < rangehighest; i++){
      if (datesLoaded[i] != 1 && datesDrawn[i] == 1)
      {
        
        startDate = new Date();
        startDate.setTime(startDate.getTime() + i * miliToDays);

        myTD = document.getElementById(startDate.getDate() + "/" + (startDate.getMonth()+1) + "/" + startDate.getFullYear());
        
        if (hasBSOevent(startDate)) {
          datesLoaded[i] = 1;       
          myTD.onmouseover = showPopup;
          myTD.onmouseout = hidePopup;
          myTD.onclick = showEvtDetails;
          myTD.className += " event";
        }
        
      } else {
        // cached the date
      }
    }   
  } 
}

function createCookie(name,value,days) {
  if (days) {
    var date = new Date();
    date.setTime(date.getTime()+(days*4*60*60*1000));
    var expires = "; expires="+date.toGMTString();
  }
  
  else var expires = "";
  document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
  var nameEQ = name + "=";
  var ca = document.cookie.split(';');
  for(var i=0;i < ca.length;i++) {
    var c = ca[i];
    while (c.charAt(0)==' ') c = c.substring(1,c.length);
    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
  }
  return null;
}

function eraseCookie(name) {
  createCookie(name,"",-1);
}