rotatorObj = new Object();

// Conditional actions that need to be added as soon as possible, i.e. as soon as their dependent objects appear in the DOM
actASAP("rotator", function() {
 var rttr = getEl("rotator");
 rttr.onmouseover = function() {
  if (rotatorObj.timeoutRotate)  rotatorObj.pause = 1;
  getEl("rttrPause").innerHTML = "Play";
  getEl("rttrNavStatus").innerHTML = "Rotator paused";
 };
 rttr.onmouseout = function() {
  if (rotatorObj.timeoutRotate)  rotatorObj.pause = 0;
  getEl("rttrPause").innerHTML = "Pause";
  getEl("rttrNavStatus").innerHTML = "";
 };
});
actASAP("rotatorNav", function() {
 rotatorObj.shownNum = 1;
 rotatorObj.totalNum = getElementsByTagAndClassNames("rotator", "div", "rotateItem").length;
 createRotatorNav();
});

// Prepare the various variables that the rotatorObj needs to run; this is called on window.onload
function preprotatorObj() {
 rotatorObj.inProgress = 0;
 rotatorObj.pause = 0;
 rotatorObj.clockTick = 20; // milliseconds
 rotatorObj.timeBetweenAds = 4500; // milliseconds
 rotatorObj.width = getEl("rotatorBox").clientWidth; // 530px
 rotatorObj.totalSteps = 20;
 rotatorObj.step = 0;
 if (window.XMLHttpRequest) { // IE 7, mozilla, safari, opera 9 ... the good stuff
  rotatorObj.scroll = 1;
 } else { // IE6, older browsers
  rotatorObj.scroll = 0;
 }
}

function getElementsByTagAndClassNames(elID, searchTagName, searchClassName) {
 var allTagsAry = getEl(elID).getElementsByTagName(searchTagName);
 var returnAry = new Array();
 for (var i = 0;  i < allTagsAry.length;  i++) {
  if (allTagsAry[i].className == searchClassName)  returnAry.push(allTagsAry[i]);
 }
 return returnAry;
}

// the self-calling timed loop that does the actual scrolling left of the rotator
function scrollLeft() {
 var rttr = getEl("rotator");
 var rotatorDivs = getElementsByTagAndClassNames("rotator", "div", "rotateItem");
 var divToSquish = rotatorDivs[0];
 if (rotatorObj.scroll) {
  if (rotatorObj.step == 0) {
   var moveToBack = rotatorDivs[0].cloneNode(true);
   rttr.appendChild(moveToBack);
   rotatorObj.inProgress = 1;
  }
  if (rotatorObj.step < rotatorObj.totalSteps) {
   var dx = discreteQuad(rotatorObj.width, rotatorObj.totalSteps, .75, rotatorObj.step);
   divToSquish.style.width = rotatorObj.width-dx + "px";
   rotatorObj.step++;
   rotatorObj.timeoutScroll = window.setTimeout("scrollLeft()", rotatorObj.clockTick);
  } else {
   rotatorObj.step = 0;
   rotatorObj.inProgress = 0;
   if (parseInt(divToSquish.style.width) > 0)  divToSquish.style.width = 0; // make sure it rotates all the way off
   rttr.removeChild(rotatorDivs[0]); // once it's squished to 0 width, remove it
  }
 } else { // not scrolling for IE6-, just clone, append, and remove
  var moveToBack = rotatorDivs[0].cloneNode(true);
  rttr.appendChild(moveToBack);
  rttr.removeChild(rotatorDivs[0]);
 }
}

// create the inner HTML that allows one to randomly navigate the rotator
function createRotatorNav() {
 var prevItem = (rotatorObj.shownNum == 1) ? rotatorObj.totalNum : rotatorObj.shownNum-1;
 var nextItem = (rotatorObj.shownNum == rotatorObj.totalNum) ? 1 : rotatorObj.shownNum+1;
 var navHtml = (rotatorObj.pause) ? "<span id='rttrPause' title='Play' onclick='pausePlay()'>Play</span>" : "<span id='rttrPause' title='Pause' onclick='pausePlay()'>Pause</span>";
 navHtml += "<span id='rttrNavNums'>";
 navHtml += "<a class='rttrNav' id='rttrNavPrev' title='View previous item' onclick='gotoItem("+ prevItem +")'></a>";
 for (i = 1;  i <= rotatorObj.totalNum;  i++) {
  navHtml += (i == rotatorObj.shownNum) ? "<span id='rttrNavCur' class='rttrNav'>"+ i +"</span>" :
   "<span class='rttrNav' title='View #"+ i +"' onclick='gotoItem("+ i +")'>"+ i + "</span>";
 }
 navHtml += "<a class='rttrNav' id='rttrNavNext' title='View next item' onclick='gotoItem("+ nextItem +")'></a>";
 navHtml += "<span id='rttrNavNumEnd'></span>";
 navHtml += "</span>";
 navHtml += "<span id='rttrNavStatus'></span>";
 getEl("rotatorNav").innerHTML = navHtml;
}

// wrapper function that appends the front element to the back and begins the rotating
function nextItem() {
 if (!rotatorObj.pause) {
  scrollLeft();
  rotatorObj.shownNum = (rotatorObj.shownNum == rotatorObj.totalNum) ? 1 : rotatorObj.shownNum+1;
  createRotatorNav();
 }
 rotatorObj.timeoutRotate = window.setTimeout("nextItem()", rotatorObj.timeBetweenAds);
}

function gotoItem(num) {
 if (rotatorObj.inProgress == 1) { // wait until the scrolling is done before doing this
  window.setTimeout("gotoItem("+num+")", Math.round(rotatorObj.timeBetweenAds/2));
 } else {
  window.clearTimeout(rotatorObj.timeoutRotate);
  rotatorObj.timeoutRotate = 0;
  var rttr = getEl("rotator");
  var swapNumber = num - rotatorObj.shownNum;
  if (swapNumber < 0)  swapNumber += rotatorObj.totalNum;
  for (var i = 0;  i < swapNumber;  i++) {
   var rotatorDivs = getElementsByTagAndClassNames("rotator", "div", "rotateItem");
   rttr.appendChild(rotatorDivs[0]);
  }
  rotatorObj.shownNum = num;
  createRotatorNav();
  if (!rotatorObj.pause)  rotatorObj.timeoutRotate = window.setTimeout("nextItem()", rotatorObj.timeBetweenAds);
 }
}

function pausePlay() {
 rotatorObj.pause = !rotatorObj.pause;
 getEl("rttrPause").innerHTML = (rotatorObj.pause) ? "Play" : "Pause";
 getEl("rttrNavStatus").innerHTML = (rotatorObj.pause) ? "Rotator paused" : "";
 if (rotatorObj.pause) {
  window.clearTimeout(rotatorObj.timeoutRotate);
  rotatorObj.timeoutRotate = 0;
 } else {
  rotatorObj.timeoutRotate = window.setTimeout("nextItem()", rotatorObj.timeBetweenAds);
 }
}

window.onload = function() {
 preprotatorObj();
 rotatorObj.timeoutRotate = window.setTimeout("nextItem()", rotatorObj.timeBetweenAds);
}