//2006/12/20 pmackie@transunion.com
//js used by promotion component

//lexical vars:
var iMaxTxt, iSelImage, iSelText=1, iFlipInterval;
var iIntervalId=null, bStopped=false, bStarted=false;
var aImages = new Array, aFloatTxt = new Array, aFloatImg = new Array;
var aHeight = new Array, aTop = new Array; //upsell dynamic CSS values
(window.attachEvent) ? window.attachEvent('onload', initPromotion) : window.addEventListener('load', initPromotion, false);

//initialize promotion object:
function initPromotion() {
	fixJSForms();
  preload(); //preload images and floats
  displayFloats();
  initEvHandlers(); //initialize event handlers
  if(Number(iFlipInterval)) startRotate();
} //initPromotion()

//replace "jsform" string with "form" in aFloatTxt array:
function fixJSForms(){
	for(var i=1;i<aFloatTxt.length;i++)aFloatTxst[i]=aFloatTxt[i].replace(/jsform/g,"form");
} //fixJSForms()

//populate oImage object with aImages array values:
function setImg(oImage, iIndex) {
  oImage.src=aImages[iIndex].src; oImage.alt=aImages[iIndex].alt; oImage.title=aImages[iIndex].title;
  oImage.txt=aImages[iIndex].txt;
} //setImg()

//populate oText object with txt value from aImages array:
function setTxt(oText, iIndex) {
  oText.innerHTML=aImages[iIndex].txt;
  oText.setAttribute("index", iIndex); //link to image array
} //setTxt()

//populate oText object with iIndex/array length value:
function setTxtDisp(oText, iIndex) {
  oText.innerHTML=iIndex+'/'+aImages.length;
} //setTxtdisp()

//display floats for current image if exist:
function displayFloats() {
  if(isNotSpace(aFloatTxt[iSelImage])) {
	var oFloatTxt=document.getElementById("prFloatTxt");
//alert('debug, iSelImage = '+iSelImage);
    oFloatTxt.style.top=aTop[iSelImage]+'px';
	oFloatTxt.style.height=aHeight[iSelImage]+'px';
	setFloatTxt(oFloatTxt, iSelImage);
  } //if aFloatTxt
/*
  if(aFloatImg[iSelImage]) {
	var oFloatImg=document.getElementById("prFloatImg");
	setFloatImg(oFloatImg, iSelImage);
  } //if aFloatImg
*/
} //displayFloats()

//hide floating text and image:
function hideFloats() {
  var oFloatTxt=document.getElementById("prFloatTxt");
  oFloatTxt.style.display="none";
/*
  var oFloatImg=document.getElementById("prFloatImg");
  oFloatImg.style.display="none";
*/
} //hideFloats()

//create and display promotion float:
function setFloatTxt(oFloatTxt, iIndex) {
  oFloatTxt.innerHTML=aFloatTxt[iIndex];
  oFloatTxt.style.display="block";
} //setFloatTxt()

//create and display star float:
function setFloatImg(oFloatImg, iIndex) {
  oFloatImg.src=aFloatImg[iIndex].src; oFloatImg.alt=aFloatImg[iIndex].alt; oFloatImg.title=aFloatImg[iIndex].title;
  oFloatImg.style.display="block";
} //setFloatImg()

//return aImages index value offset from current:
function getArrIndex(iCurrent,iOffset) {
  var iTempIndex=Number(iCurrent)+Number(iOffset);
  while(iTempIndex<0 || iTempIndex>aImages.length-1) {
	if(iTempIndex>aImages.length-1)iTempIndex-=aImages.length;
	else if(iTempIndex<0)iTempIndex+=aImages.length;
  } //while
  return iTempIndex;
} //getArrIndex()

//return Tab index value offset from current:
function getTabIndex(iSelText,iOffset) {
  var iTempIndex=Number(iSelText)+Number(iOffset);
  while(iTempIndex<1 || iTempIndex>iMaxTxt) {
	if(iTempIndex>iMaxTxt)iTempIndex-=iMaxTxt;
	else if(iTempIndex<1)iTempIndex+=iMaxTxt;
  } //while
  return iTempIndex;
} //getTabIndex()

//initialize event handlers:
function initEvHandlers() {
  var oPr=document.getElementById('pr');
  (oPr.attachEvent)?oPr.attachEvent('onclick', stopRotate):oPr.addEventListener('click', stopRotate, false);
  for(var i=1; i<=iMaxTxt; i++){
	var sTxt="prTxt"+i; var oTxt=document.getElementById(sTxt);
	var fnSetThis=function(oEvent) { setThis(oEvent.srcElement); }; //pass ev triggering object to IE
	(oTxt.attachEvent)?oTxt.attachEvent('onclick', fnSetThis):oTxt.addEventListener('click', setThis, false);
	(oTxt.attachEvent)?oTxt.attachEvent('onclick', stopRotate):oTxt.addEventListener('click', stopRotate, false);
	var oPr=document.getElementById("pr");
	(oPr.attachEvent)?oPr.attachEvent('onmouseover', suspendRotate):oPr.addEventListener('mouseover', suspendRotate, false);
	(oPr.attachEvent)?oPr.attachEvent('onmouseout', resumeRotate):oPr.addEventListener('mouseout', resumeRotate, false);
  } //for
} //initEvHandlers()

//onclick event handler for text controls:
function setThis(oThis) {
  hideFloats(); //hide previous floats
  //in IE oThis is the clicked object. FF reports a mousevent, so need to get clicked object from "this":
  if(!oThis.id)oThis=this; //FF
  iSelText=oThis.id.substring(oThis.id.length-1);
  iSelImage=oThis.getAttribute("index");
  var oImage=document.getElementById("prImg"); setImg(oImage, iSelImage);
  var oTxtDisp=document.getElementById("prCtrlBottom"); setTxtDisp(oTxtDisp, Number(iSelImage)+1);
  displayFloats();
  selectThis(); //mark clicked text box as selected
} //setThis()

//mark iSelText box as selected, unselect all the others:
function selectThis() {
  for(var i=1; i<=iMaxTxt; i++) {
	var sText="prTxt"+i; var oText=document.getElementById(sText);
	var sTextNav="prNavGrad"+i; var oTextNav=document.getElementById(sTextNav);
	if(i==iSelText) { oText.className="prTxtSelected"; oTextNav.className="promoNavGradSelected"; }
	else { oText.className="prTxt"; oTextNav.className="promoNavGrad"; }
  } //for
} //selectThis()

//arrows clicked, either rotate or shift based on current selection:
function dirLeft() {
  //iSelText==1?rotate(-1):prShift(-1);
  prShift(-1);
} //dirLeft()
function dirRight() {
  //iSelText==iMaxTxt?rotate(1):prShift(1);
  prShift(1);
} //dirRight()

//set hover state for sObj onmouseover event:
function setHover(sObj) {
  oObj=document.getElementById(sObj);
  if(oObj.className.match("Selected")==null)oObj.className="promoNavGradHover";
} //setHover()

//remove hover state for sObj for onmouseout event:
function unHover(sObj) {
  oObj=document.getElementById(sObj);
  if(oObj.className.match("Selected")==null)oObj.className="promoNavGrad";
} //unHover()

//rotate image and textboxes by given offset:
function rotate(iOffset) {
  hideFloats(); //hide previous floats
  iSelImage=getArrIndex(iSelImage,iOffset);
  var oImage=document.getElementById("prImg"); setImg(oImage, iSelImage);
  var oTxtDisp=document.getElementById("prCtrlBottom"); setTxtDisp(oTxtDisp, Number(iSelImage)+1);
  displayFloats();
  for(var i=1; i<=iMaxTxt; i++) {
	var sTxt="prTxt"+i;
	var oTxt=document.getElementById(sTxt);
	var iTempIndex=Number(oTxt.getAttribute("index"));
	iTempIndex=getArrIndex(iTempIndex,iOffset);
	setTxt(oTxt, iTempIndex);
  } //for
} //rotate()

//shift current tab selection by given offset
//this imitates user click on that tab, so we can use setThis() with offsetted object:
function prShift(iOffset) {
  iSelText=getTabIndex(Number(iSelText),iOffset);
  var oObj=document.getElementById('prTxt'+iSelText);
  setThis(oObj);
} //prShift()

//auto rotate helpers:
function startRotate() {
  if(!bStarted && Number(iFlipInterval)){
	iIntervalId=setInterval("dirRight() ", iFlipInterval*1000); bStarted=true;
  } //if !bStarted
} //startRotate()
function stopRotate() {
  if(iIntervalId)clearInterval(iIntervalId); bStopped=true;
} //stopRotate()
function suspendRotate() {
  if(iIntervalId)clearInterval(iIntervalId); bStarted=false;
} //suspendRotate()
function resumeRotate() {
  if(!bStopped)startRotate();
} //resumeRotate()

//based on checkbox(es) selection, set href for passed link object. Options are:
//none: set href to "Go" button href (also stored in "noneChecks" hidden element)
//1 checkbox: goto that checkbox URL (stored in checkbox value attribute)
//2 (or both, since max 2 are allowed): goto "both" url stored in "bothChecks" hidden element
function setPrHref(oLink, sSelImage) {
  var oForm=document.forms["prOrderForm"+sSelImage]; //get current form
  var sURL="", bChecked=false;
  for(var i=0; i<oForm.prCheck.length; i++) { //loop through checkboxes
	if(oForm.prCheck[i].checked) {
	  sURL = bChecked ? oForm.bothChecks.value : oForm.prCheck[i].value;
	  bChecked=true;
	} //if checked
  } //for prCheck
  if(sURL)oLink.href=sURL;
  else oLink.href=oForm.noneChecks.value;
} //setPrHref()

//check if sValue is defined and has values other than whitespace:
function isNotSpace(sValue) {
  var regExTrim=/^\s*(.*?)\s*$/;  //trim whitespace
  return sValue.replace(regExTrim, "$1");
} //isNotSpace()
