/* Begin Main story module */
var currPic = 0;
var timer1, timer2;
var paused = true;
var opacity = 100;
var msDivs = new Array(5);  //  change to the number of rotating stories
var msButtons = new Array(5);  //  change to the number of rotating stories
var msWrap;
var button;
var position;
var currPosition;

function initPageComponents() {
    /*  Used to load all components on the page */
    msDivs[0] = document.getElementById('mainStory1');
    msDivs[1] = document.getElementById('mainStory2');
    msDivs[2] = document.getElementById('mainStory3');
    msDivs[3] = document.getElementById('mainStory4');   // hide if not used
    msDivs[4] = document.getElementById('mainStory5');   // hide if not used
    msButtons[0] = document.getElementById('a1');
    msButtons[1] = document.getElementById('a2');
    msButtons[2] = document.getElementById('a3');
    msButtons[3] = document.getElementById('a4');   // hide if not used
    msButtons[4] = document.getElementById('a5');   // hide if not used
    msWrap = document.getElementById('mainStoryWrap');
    initPausePlayEvents();
    var breakingNews = document.getElementById('breakingNewsImg');
    if (breakingNews == null) {
        paused = false;
        timer1 = setTimeout('timedStory()', 7000);
    }
    doImageSwap();
}

function initPausePlayEvents() {
    /* add Event Handlers for the Photo Module */
    if (!document.getElementById || !document.getElementsByTagName) {
        return true;
    }
    /* checks for Javascript operability  */

    /*  get all the links in the photo module  */
    var topStories = document.getElementById('topStories');
    var links = topStories.getElementsByTagName('a');

    for (i = 0; i < links.length; i++) {
        if (links.item(i).id.substring(0, 1) == 'a') {
            //filter the links for those that have a class name beginnig with 'a'
            //add the doNumber event handler for the number links
            links.item(i).href = 'javascript:{}';
            tii_addEventHandler(links[i], 'click', function(event) {
                doNumber(event);
            }, false);
        }
    }

    var playLink = document.getElementById('playLink');

    //add the doButton event handler for the play pause button 
    tii_addEventHandler(playLink, 'click', function(event) {
        doButton(event);
    }, false);
}

/* helper function to deal specifically with images and the cross-browser differences in opacity handling */
function fader(opac) {
    if (msWrap.style.MozOpacity != null) {
        /* Mozilla's pre-CSS3 proprietary rule */
        msWrap.style.MozOpacity = (opac / 100) - .001;
    } else if (msWrap.style.opac != null) {
        /* CSS3 compatible */
        msWrap.style.opacity = (opac / 100) - .001;
    } else if (msWrap.style.filter != null) {
        /* IE's proprietary filter */
        if (opac == 100) {
            msWrap.style.filter = "none;";
        } else {
            msWrap.style.filter = "alpha(opacity=" + opac + ");";
        }
    }
}

function change(num, step) {
    /*fadeOut*/
    if (step == 1) {
        opacity -= 10;
        if (opacity > 0) {
            fader(opacity);
            timer2 = setTimeout('change(' + num + ', 1)', 50);
        }
        else {
            change(num, 2);
        }
    }
    /*change picture*/
    else if (step == 2) {
        currPic = num;
        msDivs[0].style.display = (num == 0 ? "block" : "none");
        msDivs[1].style.display = (num == 1 ? "block" : "none");
        msDivs[2].style.display = (num == 2 ? "block" : "none");
        msDivs[3].style.display = (num == 3 ? "block" : "none"); // hide if not used
        msDivs[4].style.display = (num == 4 ? "block" : "none"); // hide if not used
        msButtons[0].className = (num == 0 ? "on" : "off");
        msButtons[1].className = (num == 1 ? "on" : "off");
        msButtons[2].className = (num == 2 ? "on" : "off");
        msButtons[3].className = (num == 3 ? "on" : "off"); // hide if not used
        msButtons[4].className = (num == 4 ? "on" : "off"); // hide if not used
        change(num, 3);
    }
    /*fadeIn*/
    else if (step == 3) {
        opacity += 10;
        if (opacity <= 100) {
            fader(opacity);
            timer2 = setTimeout('change(' + num + ', 3)', 50);
        }
    }
}

/* change picture, wait 5 seconds, repeat */
function timedStory() {
    if (currPic < 4) {  // change to 1 less than total stories
        currPic++;
        change(currPic, 1);
        timer1 = setTimeout('timedStory()', 7000);
    } else {
        currPic = 0;
        clearTimeout(timer1);
        change(currPic, 1);
        paused = false;
        timer1 = setTimeout('timedStory()', 7000);
    }
}

/* executed when the play pause button is selected */
function doButton(event) {
    paused = !paused;
    doImageSwap();
    if (paused) {
        /* stop the image loop */
        clearTimeout(timer1);
    }
    else {
        /* restart the image loop */
        timedStory();
    }
}


/*executed when a number link is selected */
function doNumber(event) {
    var eventSource = typeof event.target != 'undefined' ? event.target : window.event.srcElement;
    /*  get the number portion of the class name of the event source */
    currPic = eventSource.id.substring(1, 2) - 1;
    paused = true;
    doImageSwap();
    clearTimeout(timer1);
    clearTimeout(timer2);
    change(currPic, 1);

}

/* swap the play pause button image */
function doImageSwap() {
    var button = document.getElementById('playLink');
    if (!tii_isie) {
        var imageFile = paused ? "btn_play.gif" : "btn_pause.gif";
        button.style.background = "url(" + imageFile + ") 0px 0px no-repeat";
    } else {
        /*  Use an image sprite to deplete the image flickering in IE */
        button.style.backgroundImage = "url(btn_playpause.gif)";
        position = paused ? "-16 px" : "0 px";  /* change the image source */
        try {
            document.execCommand('BackgroundImageCache', false, true);
        } catch (e) { }

        /* if paused and play is not displayed */
        if (paused == true && currPosition != "-16 px") {
            button.style.backgroundPositionY = position;
        }
        /* if playing and paused is not displayed */
        if (paused != true && currPosition != "0 px") {
            button.style.backgroundPositionY = position;
        }
        currPosition = position;
    }
}
/* End Main story module */


/***** TII Global Browser Sniffing Variables *****/

var tii_isopera = typeof window.opera != 'undefined';

var tii_isie = typeof document.all != 'undefined'

   	&& !tii_isopera && navigator.vendor != 'KDE';

var tii_issafari = navigator.vendor == 'Apple Computer, Inc.';

/***** TII Global Functions *****/
/* Gets the total offset position of the element, assuming none of its ancestors have a float of left or right.
   Direction is 'x' for horizontal, and 'y' for vertical */
function tii_getTotalOffsetPosition (element, direction)
{
  var pos = direction == 'x' ? element.offsetLeft : element.offsetTop;
  var tmp = element.offsetParent;
  while (tmp != null)
  {
    pos += direction == 'x' ? tmp.offsetLeft : tmp.offsetTop;
    tmp = tmp.offsetParent;
  }
  return pos;
}

/* Stops the default action for the event, such as jumping to an anchor when clicking on a hyperlink */
function tii_stopDefaultAction (event)
{
	event.returnValue = false;
	if (typeof event.preventDefault != 'undefined')
	{
		event.preventDefault ();
	}
}

/* Create a new element node with attributes */
function tii_dom_createElement (nodeName, attributes)
{
	var isopera = typeof window.opera != 'undefined';
	var isie = typeof document.all != 'undefined'
   		&& !isopera && navigator.vendor != 'KDE';
		
	var newElement;
	try
	{
		newElement = document.createElement (nodeName);
	}
	catch (error)
	{
		return null;
	}
	
	var attributesLength = attributes.length;
	for (var i = 0; i < attributesLength; i++)
	{
		var attribute = attributes [i] [0];
		var value = attributes [i] [1];
		newElement.setAttribute (attribute, value);
		switch (attribute)
		{
			case 'id':
				newElement.id = value;
				break;
			case 'class':
				if (isie)
				{
					newElement.setAttribute ('className', value);
				}
				newElement.className = value;
				break;
			case 'style':
				newElement.style.cssText = newElement.style.cssText + ' ' + value;
				break;
			case 'for':
				if (isie)
				{
					newElement.setAttribute ('htmlFor', value);
				}
				newElement.htmlFor = value;
		}
	}
	
	return newElement;
}

/* Removes all the unwanted whitespace text nodes from inside the tree
   (including tabs, spaces, and line breaks between list items) */
function tii_dom_removeWhitespaceTextNodes (node)
{
  for (var x = 0; x < node.childNodes.length; x++)
  {
    var child = node.childNodes [x];
    if (child.nodeType == 3 && !/\S/.test (child.nodeValue))
    {
      node.removeChild (node.childNodes [x]);
      x--;
    }
    if (child.nodeType == 1)
    {
      tii_dom_removeWhitespaceTextNodes (child);
    }
  }
}

/***** ^^^ TII Global Functions Placed in >TII>Shared>JavaScript>TII LIB - JavaScript Event Listeners ^^^ *****/
/* Adds a function for the window load event */
function tii_callFunctionOnWindowLoad (functionToCall)
{
  if (typeof window.addEventListener != 'undefined')
  {
    window.addEventListener ('load', functionToCall, false);
  }
  else if (typeof document.addEventListener != 'undefined')
  {
    document.addEventListener ('load', functionToCall, false);
  }
  else if (typeof window.attachEvent != 'undefined')
  {
    window.attachEvent ('onload', functionToCall);
  }
  else
  {
    var oldFunctionToCall = window.onload;
    if (typeof window.onload != 'function')
    {
      window.onload = functionToCall;
    }
    else
    {
      window.onload = function ()
      {
        oldFunctionToCall ();
        functionToCall ();
      };
    }
  }
}

/* Calls functionToCall as soon as the targetElement is loaded, even if the document hasn't completely loaded yet. 
   Place the parameter list for functionToCall in order after tii_callFunctionOnElementLoad (targetId, functionToCall),
   e.g., tii_callFunctionOnElementLoad (targetId, functionToCall, parameter1, parameter 2, parameter 3, ...) */  
function tii_callFunctionOnElementLoad (targetId, functionToCall)
{
	var myArguments = arguments;
	tii_callFunctionOnWindowLoad (function ()
		{
			window.loaded = true;
		});
	var targetElement = document.getElementById (targetId);
	if (targetElement == null && !window.loaded)
	{
		var pollingInterval = setInterval (function ()
			{
				if (window.loaded)
				{
					clearInterval (pollingInterval);
				}
				targetElement = document.getElementById (targetId);
				if (targetElement != null)
				{
					clearInterval (pollingInterval);
					var argumentsTemp = new Array ();
					var argumentsTempLength = myArguments.length - 2;
					for (var i = 0; i < argumentsTempLength; i++)
					{
						argumentsTemp [i] = myArguments [i + 2];
					}		
					functionToCall.apply (this, argumentsTemp);
				}
			}, 10);
	}
}

/* Attaches an event handling function to the targetElement as soon as the targetElement is loaded
   (even if the document hasn't completely loaded yet). */  
function tii_addEventHandlerOnElementLoad (targetId, eventType, functionToCall, bubbleEventUpDOMTree)
{
	tii_callFunctionOnWindowLoad (function ()
		{
			window.loaded = true;
		});
	var targetElement = document.getElementById (targetId);
	if (targetElement == null && !window.loaded)
	{
		var pollingInterval = setInterval (function ()
			{
				if (window.loaded)
				{
					clearInterval (pollingInterval);
				}
				targetElement = document.getElementById (targetId);
				if (targetElement != null)
				{
					clearInterval (pollingInterval);
					tii_addEventHandler (targetElement, eventType, functionToCall, bubbleEventUpDOMTree);
				}
			}, 10);
	}
}

/* Attaches an event handling function to the targetElement. 
   Examples of eventType values are 'mouseover' and 'keyup', as opposed to 'onmouseover' and 'onkeyup'. 
   bubbleEventUpDOMTree is a boolean variable specifying whether the event should activate the event listeners
   of all the ancestors of the element (up to the window object) */
function tii_addEventHandler (targetElement, eventType, functionToCall, bubbleEventUpDOMTree)
{
  if (!targetElement)
  {
	  window.status = 'Warning: Tried to attach event to null object';
	  return false;
  }
  if (typeof targetElement.addEventListener != 'undefined')
  {
    targetElement.addEventListener (eventType, functionToCall, bubbleEventUpDOMTree);
  }
  else if (typeof targetElement.attachEvent != 'undefined')
  {
    targetElement.attachEvent ('on' + eventType, functionToCall);
  }
  else
  {
    eventType = 'on' + eventType;
    if (typeof targetElement [eventType] == 'function')
    {
      var oldListener = targetElement [eventType];
      targetElement [eventType] = function ()
      {
        oldListener ();
        return functionToCall ();
      }
    }
    else
    {
      targetElement [eventType] = functionToCall;
    }
  }

  return true;
}

/* Removes an event handling function from the targetElement. 
   Examples of eventType values are 'mouseover' and 'keyup', as opposed to 'onmouseover' and 'onkeyup'. 
   bubbleEventUpDOMTree is a boolean variable specifying whether the event should activate the event listeners
   of all the ancestors of the element (up to the window object)
   ***NOTE: This function does not support removing anonymous functions; a reference to the added function is needed */
function tii_removeEventHandler (targetElement, eventType, functionToRemove, bubbleEventUpDOMTree)
{
  if (typeof targetElement.removeEventListener != "undefined")
  {
    targetElement.removeEventListener (eventType, functionToRemove, bubbleEventUpDOMTree);
  }
  else if (typeof targetElement.detachEvent != "undefined")
  {
    targetElement.detachEvent ("on" + eventType, functionToRemove);
  }
  else
  {
    targetElement ["on" + eventType] = null;
  }
  
  return true;
}

/* Initialization and Unobtrusive Javascript Calls */
tii_callFunctionOnElementLoad('playLink', initPageComponents);
