
var NewsStand =
{
	boundExpandInfo: "",

	init: function() 
	{	
		var feedElements = $$('div.newsStandElement');//get div elements for each feed
		var divIds = []; //declare array for element's divs
		var divURLs = [];//declare array for elements URLs
		var childNodes = []; //declare array to hold div child nodes
		for (var j = 0; j < feedElements.length; j++) //get array of div elements' ids and urls
		{
			divIds[j] = feedElements[j].id; //get each div elements id
			childNodes[j] = feedElements[j].childElements(); //get their children elements
			divURLs[j] = childNodes[j][0].remove(); //get the url from the first child element, the 'a's href and remove it the link element
		}
		
		for (var i = 0; i < divIds.length; i++) 
		{
			NewsStand.createFeed(divIds[i], divURLs[i]);//create feed object for each feed div element on page
		}
		
		//this initializes and sends the two needed elements to the expandInfo method
		var feedScrollerDivArray = $$('div.feedScrollers');//get array of all div.feedScrollers
		for (var k = 0; k < feedScrollerDivArray.length; k++)//run through all div.feedScrollers to find each ones a.theI to set event listener
		{
			var theILinkElement = feedScrollerDivArray[k].select('a.theI')[0]; //get the link element, a.theI, from array
			
			//set event handler to property of object to be stopped later, but never ended up using it
			NewsStand.boundExpandInfo = NewsStand.expandInfo.bindAsEventListener(theILinkElement, feedScrollerDivArray[k]);
			
			//set up event listeners on links, sending event=>linkElement, theILinkElement=>this, div.feedScrollerDivArray[k]=>divElement
			Event.observe(theILinkElement, 'click', NewsStand.boundExpandInfo, false);
			
		}
	},	
		
	createFeed: function(id, url)// run for every feed on the page
	{	
		
		var feed = new google.feeds.Feed(url); //create feed object
		feed.setNumEntries(40); //sets the number of results to show****************
	
		feed.load(function(result) //upon loading feed run function
		{
			if (!result.error) // if not an error
			{
				var container = $(id); //get div by given id
				
				var ulElement = container.select('ul')[0];//get ul element, from the array
				for (var i = 0; i < result.feed.entries.length; i++) //run through all entries making <li>s 
				{
					var entry = result.feed.entries[i];
					
					var lItem = document.createElement("li");
					lItem.appendChild(document.createTextNode(entry.title));
					ulElement.appendChild(lItem);
					
					Event.observe(lItem, 'click', NewsStand.showSnippet.bindAsEventListener(lItem, entry, id)); //set up the snippets for each headline
					
				}
				
				NewsStand.eventListeners(id, entry);//wire up event listenrs for all li mouseover/mouseouts
				NewsStand.scrollResults(id); //wire up listeners for scrolling up and down through results
			}
		});
	},
	
	eventListeners: function(id, entry)//manages the li.hovered class switching to change lis' styles
	{
		var listItemsArray = $(id).select("li");
		for (var i = 0; i <listItemsArray.length; i++)
		{
			Event.observe(listItemsArray[i], 'mouseover', function(e){this.addClassName('hovered');});
			Event.observe(listItemsArray[i], 'mouseout', function(e){this.removeClassName('hovered');});
		}
	},
	
	showSnippet: function(lItem, entry, id)
	{
		if (this.hasClassName('hovered')){this.removeClassName('hovered');}//fix color problems safari v2
		
		var theWidth = $(id).getWidth(); //get widht of div.newsStandElement
		var wrapper = $(id).select('div.Wrapper')[0]; // get div.Wrapper element
		var innerWrapperElement  = wrapper.select('div.innerWrapper')[0]; //get innerWrapper div element
		var feedListContainerElement = $(id).select('div.feedListContainer')[0]; //get div.feedListContainer element
		var scrollerDivElement = $(id).select('div.feedScrollers')[0]; //get scroller div element
		
		//create <h3><a href="url">TITLE</a></h3>
		var h3Tag = document.createElement("h3");
		var headlineLink = document.createElement("a");
		headlineLink.setAttribute('href', entry.link);
		headlineLink.appendChild(document.createTextNode(entry.title));
		h3Tag.appendChild(headlineLink);
		
		//create <p>CONTENT SNIPPET</p>
		var snippetGraph = document.createElement("p");
		snippetGraph.appendChild(document.createTextNode(entry.contentSnippet));
		
		//create <a class="readMore>read more</a>
		var readMoreLink = document.createElement("a");
		readMoreLink.setAttribute('href', entry.link);
		$(readMoreLink).addClassName('readMore'); //extend created element to work with prototype methods
		readMoreLink.appendChild(document.createTextNode("read more"));
		
		//create <a class="goBack">back</a>
		var goBackLink = document.createElement("a");
		goBackLink.setAttribute('href', "#");
		$(goBackLink).addClassName('goBack'); //extend created element to work with prototype methods
		goBackLink.appendChild(document.createTextNode("back"));
		
		//add all above created elements to div.innerWrapper
		innerWrapperElement.appendChild(h3Tag);
		innerWrapperElement.appendChild(snippetGraph);
		innerWrapperElement.appendChild(readMoreLink);
		innerWrapperElement.appendChild(goBackLink);
		
		new Effect.Move (feedListContainerElement,{ x:-theWidth, y:0, mode: 'relative'}); //move list of feed titles left out of screen
		new Effect.Move (scrollerDivElement,{ x:-theWidth, y:0, mode: 'relative'}); //move scroller links left out of screen
		new Effect.Move (wrapper,{ x:-theWidth, y:0, mode: 'relative'}); //move wrapper div into from 300 px from left
		
		var goBackArray = innerWrapperElement.select('a.goBack');
		var goBackElement = goBackArray[0];
		Event.observe(goBackElement, 'click', function(e){
			new Effect.Move (feedListContainerElement,{ x:theWidth, y:0, mode: 'relative'}); //move list of feed titles left out of screen
			new Effect.Move (scrollerDivElement,{ x:theWidth, y:0, mode: 'relative'}); //move scroller links left out of screen
			new Effect.Move (wrapper,{ x:theWidth, y:0, mode: 'relative'}); //move wrapper div into from 300 px from left
			Event.stop(e); //stop default action
			var inWrapChildren = innerWrapperElement.childElements();
			for ( var j = inWrapChildren.length-1; j >= 0; j--)
			{
				inWrapChildren[j].remove();
			}
		}, false);
	},
	

	scrollResults: function(id) //id is for feed divs, (div.newsStandElement), not overall div
	{
		if($(id).select('div.feedScrollers'))
		{
			var ulElement = $(id).select('ul')[0]; //get ul element
			var feedListContainerElement = $(id).select('div.feedListContainer')[0]; //get div.feedListContainer element
			var scrollerDivElement = $(id).select('div.feedScrollers')[0]; //get scroller div element
			var scrollUpElement = scrollerDivElement.select('a.feedUp')[0]; //get a.scrollUp element
			var scrollDownElement = scrollerDivElement.select('a.feedDown')[0]; //get a.scrollDown element
			
			if (feedListContainerElement.scrollHeight <= feedListContainerElement.offsetHeight)//hides up and down links if list isn't long enough to fill area
			{
				var scrollerChilderenArray = scrollerDivElement.childElements(); //gets children of div.feedScrollers
				for (var i = 0; i < scrollerChilderenArray.length; i++) //goes through children to only hide ".feedUp" and ".feedDown"
				{
					if (scrollerChilderenArray[i].hasClassName('feedUp') || scrollerChilderenArray[i].hasClassName('feedDown'))
					{
						scrollerChilderenArray[i]._marked = 1; //add property to link element as having ._marked = 1, checked later (line 250)
						scrollerChilderenArray[i].hide(); //hide .feedUp and .feedDown links
					}	
				}
			}
			else //wire in up and down scroll links with event listeners
			{
				Event.observe(scrollUpElement, 'click', function(e){
					var feedDivHeight = feedListContainerElement.getHeight();//get height of feed div container
					var feedHeight = feedListContainerElement.scrollHeight;//get full height of feed div container
					var ulTopStyle = parseInt(ulElement.getStyle('top')); //get style.top of ul
					//alert("the mark height: " + -(feedHeight-feedDivHeight) + "  :::  " + "ul top style: " + ulTopStyle);
					if (ulTopStyle >= -(feedHeight-feedDivHeight))
					{
						new Effect.Move (ulElement,{ x:0, y:-(feedDivHeight-15), mode: 'relative'}); //move list of feed titles left out of screen
					}
					Event.stop(e);
				}, false);
				
				Event.observe(scrollDownElement, 'click', function(e){
					var feedDivHeight = feedListContainerElement.getHeight();//get height of feed div container
					var feedHeight = feedListContainerElement.scrollHeight;//get full height of feed div container
					var ulTopStyle = parseInt(ulElement.getStyle('top')); //get style.top of ul
					if (ulTopStyle <= -feedDivHeight)
					{
						new Effect.Move (ulElement,{ x:0, y:(feedDivHeight-15), mode: 'relative'}); //move list of feed titles left out of screen
					}
					else if (ulTopStyle > -feedDivHeight && ulTopStyle <= 0)
					{
						new Effect.Move (ulElement,{ x:0, y:(-ulTopStyle), mode: 'relative'}); //move list of feed titles left out of screen
					}
					Event.stop(e);
				}, false);   
			}
		}
	},
	
	expandInfo: function(linkElement, divElement)// linkElement=event, this=link, divElement=div
	{
		//alert(linkElement + ", " + this.inspect() + ", " + divElement.inspect());
		
		new Effect.Morph(divElement,{ //animate the div to  move up over the list items
		  style:'height:212px; top:16px;',
		  duration:0.8
		});
		
		var theIText = divElement.select('div.theIText')[0];//get div.theIText and show it
		theIText.appear();
		
		var ITextSiblingsArray = theIText.siblings(); //get sibilings of theIText, hide them
		for (var i = 0; i < ITextSiblingsArray.length; i++) 
		{
			ITextSiblingsArray[i].fade();
		}
		
		Event.stop(linkElement); //stop the default action
		
		var backLink = theIText.select('div a')[0]; //get a.dropDown link
		Event.observe(backLink, 'click', function(e) //set up new event listener
		{ 
			new Effect.Morph(divElement,{ //animate the div to  move it back down
			  style:'height:35px; top:196px;',
			  duration:0.8
			});
			theIText.fade();
			for (var i = 0; i < ITextSiblingsArray.length; i++) //get sibilings of theIText, make them appear
			{
				if (ITextSiblingsArray[i]._marked != 1) //if the links weren't hidden earlier, ._marked = 1 (above lines 171 to 182), make them reappear
				{
					ITextSiblingsArray[i].appear();
				}
			}
			Event.stop(e);
		}, false);
	}
};

google.setOnLoadCallback(NewsStand.init);

    
    
    
    
    
    
    
    
    
    
    
    
    
    