var ScrollWindow = Class.create();

ScrollWindow.prototype = {
	
	/*dom objects */
	linkList:null,
	contentList:null,
	initialItem:null,
	viewingWindow:null,
	scrollLeftArrow:null,
	scrollRightArrow:null,
	titleLabel:null,
	selectionBackground:null,
	
	selectedItem:null,
	
	/* coordinates */
	listLength:null,
	farLeft:null,
	farRight:null,
	viewportLength:null,
	
	/* scroll variables */
	scrollLength:null,
	scrollDuration:null,
	scrollFastDuration:null,
	scrollType:Effect.Transitions.linear,
	pixelsPerSecond:165,
	fastPixelsPerSecond:null,
	
	scrollEffect:null,
	activeContent:null,
	
	contentEffectIn:Effect.SlideDown,
	contentEffectOut:Effect.Fade,
	contentEffectInOptions:null,
	contentEffectOutOptions:null,
	contentEffectDuration:0.3,
	contentEffectQueue:'content',
	
	linkIdPrefix:'link',
	contentIdprefix:'content',
	
	scrollDirection:'ltr', // options are 'ltr' or 'rtl' for left-to-right and right-to-left respectively
	
	shouldHighlightArrows:true,
	addArrowHoverEffect:true,
	
    thumbWidth:96,
    thumbHeight:74,
    featureWidth:300,
    featureHeight:230,
    featureLocationX:10,
    featureLocationY:10,

	
    featureLeft:function() { return this.featureLocationX-this.featureWidth/2; },
    featureTop:function() { return this.featureLocationY-this.featureHeight/2; },
	
	////////////////////////////////////////////////
	initialize:function (list,larrow,rarrow,content,visibleWindow,titleObj,firstItem, selectionBkgd)
	{
		
		this.linkList=list;
		this.scrollLeftArrow=larrow;
		this.scrollRightArrow=rarrow;
		this.contentList=content;
		this.viewingWindow=visibleWindow;
		this.titleLabel=titleObj;
		this.initialItem=firstItem;
		this.selectionBackground=selectionBkgd;
		
		this.linkList._scrollWindowObject=this;
	},
		
	/////////////////////// initialize methods /////////////////////////
	initializeObjects: function ()
	{
		
		this.initScrollEffect();
		this.initScrollArrows();
		this.initLinks();
		this.initContent();
		this.initFeature();
		this.initImages();
		if(this.shouldHighlightArrows)this.HighlightArrows();

		if(this.initialItem)this.timelineItem_click(this.initialItem); 
	},
    initImages:function()
    {
		var images = this.linkList.getElementsByTagName('a');
		for(var i=0;i<images.length;i++)
		{
			images[i].style.position='absolute';
			images[i].style.left=i*this.thumbWidth + 'px'
			images[i].originalLeft=i*this.thumbWidth;
		}
    },
	initScrollArrows:function()
	{
		this.scrollLeftArrow._scrollWindowObject=this;
		this.scrollRightArrow._scrollWindowObject=this;
		
		if(this.scrollRightArrow!=null)
		{
			this.scrollRightArrow.onclick=function() 
			{ 
				if (this._scrollWindowObject != null)
					this._scrollWindowObject.rightArrow_click(); 
			}
			this.scrollRightArrow.onmouseover=function() 
			{ 
				if (this._scrollWindowObject != null)
					this._scrollWindowObject.rightArrow_mouseover(); 
			}
			this.scrollRightArrow.onmouseout=function() 
			{ 
				if (this._scrollWindowObject != null)
					this._scrollWindowObject.rightArrow_mouseout(); 
			}
		}

		if(this.scrollLeftArrow!=null)
		{
			this.scrollLeftArrow.onclick=function() 
			{ 
				if (this._scrollWindowObject != null)
					this._scrollWindowObject.leftArrow_click(); 
			}
			this.scrollLeftArrow.onmouseover=function() 
			{ 
				if (this._scrollWindowObject != null)
					this._scrollWindowObject.leftArrow_mouseover(); 
			}
			this.scrollLeftArrow.onmouseout=function() 
			{ 
				if (this._scrollWindowObject != null)
					this._scrollWindowObject.leftArrow_mouseout(); 
			}
		}
	},
	initScrollEffect:function()
	{
		this.viewportLength = this.viewingWindow.offsetWidth; 
		this.listLength = this.linkList.offsetWidth; 
		
		if(this.scrollDirection=='rtl')
		{
			this.farLeft=0;
			this.farRight=this.listLength - this.viewportLength;
		}
		else
		{
			this.farLeft=-this.listLength + this.viewportLength;
			this.farRight=0;
		}
		
		this.scrollLength=this.farRight-this.farLeft;
		
		if(this.fastPixelsPerSecond==null)this.fastPixelsPerSecond=this.pixelsPerSecond*7;
		
		this.scrollDuration=this.calculateDuration(this.pixelsPerSecond);
		this.scrollFastDuration=this.calculateDuration(this.fastPixelsPerSecond);

	},
	calculateDuration:function(pixelsPerSecond) { return this.scrollLength/pixelsPerSecond; },
	initLinks:function() { 
	    if(!this.AddLinkAttributes || !this.isLinkItem || !this.linkList ) return;
		var items = this.linkList.descendants();
		for(i=0;i<items.length;i++)
			if(this.isLinkItem(items[i]))
				this.AddLinkAttributes(items[i]);
	},
	initContent:function() {
		if(!this.AddContentAttributes || !this.isContentItem || !this.contentList) return;
		var items = this.contentList.descendants();
		for(i=0;i<items.length;i++)
			if(this.isContentItem(items[i]))
				this.AddContentAttributes(items[i]);
	},
	
    initFeature:function() 
    {
        this.featureLocationX = (this.featureLocationX!=null) ? this.featureLocationX : 0;
        this.featureLocationY = (this.featureLocationY!=null) ? this.featureLocationY : 0;
        
        this.featureLocationX+=this.viewportLength/4;
        this.featureLocationY+=this.thumbHeight + this.featureHeight/2 + 50;
    },
	
	
	
	////////////////////// events ////////////////////////////
	////hover events ///
	callFunction:function(target) { if(target)target();	},
		
	leftArrow_mouseover:function() { 
		this.scrollLeft(this.linkList); 
		if(this.addArrowHoverEffect==true)this.enlargeArrow(this.scrollLeftArrow);
	},
	leftArrow_mouseout:function() { 
		this.cancelEffect(this.linkList); 
		this.cancelEffect(this.selectionBackground); 
		if(this.addArrowHoverEffect==true)this.shrinkArrow(this.scrollLeftArrow);
	},
	rightArrow_mouseover:function() { 
		this.scrollRight(this.linkList);  
		if(this.addArrowHoverEffect==true)this.enlargeArrow(this.scrollRightArrow);
	},
	rightArrow_mouseout:function() { 
		this.cancelEffect(this.linkList); this.cancelEffect(this.selectionBackground); 
		if(this.addArrowHoverEffect==true)this.shrinkArrow(this.scrollRightArrow);
	},
	
	////click events ////
	leftArrow_click:function(sender) { this.scrollLeft(this.linkList,this.fastPixelsPerSecond) },
	rightArrow_click:function(sender) { this.scrollRight(this.linkList,this.fastPixelsPerSecond) },
	timelineItem_click:function(sender)
	{
	    if(!sender)return;
		if(this.on_timelineItem_click)this.on_timelineItem_click(sender);
		var value1 = sender;
		var value2 = this.selectedItem ? this.selectedItem : '';
        if(value1==value2) 
        { 
			pageTracker._trackPageview('/outgoing/' + sender.alt);
			window.location=sender; 
			return; 
		}
        
        if(this.selectedItem!=null) this.MakeThumb(this.selectedItem);
        this.MakeFeature(sender);  
        this.loadText(sender);          

		this.selectedItem=sender;

        return false;
	},
	loadText:function(target)
	{
		if(!target) return this.clearText();
		
		var images = target.getElementsByTagName('img');

		var name = images[0].alt;
		var description = images[0].title;;
		var award='';
		if (images[1])award=images[1].alt;
		
		this.setDescription(name,description,award);
	},
	clearText:function() { this.setDescription('','',''); },
	setDescription:function(name,description,award)
	{
		$('nameLabel').innerHTML = name;
		$('descriptionLabel').innerHTML = description;
		
		var awardLabel = $('awardLabel')
		awardLabel.innerHTML = award;
		awardLabel.className = award!='' ? 'textAwardIcon' : '';
		
	},

	imageIndex:function(target)
	{
		return $A(this.linkList.getElementsByTagName('a')).indexOf(target);
	},
	//////////////////////////////////////////////////////////////////
    MakeFeature:function (target)
    {
        this.selectedFeatureX=target.offsetLeft;
        this.selectedFeatureY=target.offsetTop;
        var xOffset = this.viewOffset() + this.featureLeft()-2*this.imageIndex(target);
        var yOffset = this.featureTop();
            
        new Effect.Move(target, {x: xOffset, y: yOffset, mode:'absolute'} );
        this.ScaleObject(target.childNodes[0]);
    },
    MakeThumb:function(target)
    {
        if (target==null) return;
        if(target==this.selectedItem) this.selectedItem=null;
        new Effect.Move(target, {x: target.originalLeft, y: 0, mode:'absolute'} );
        this.ResetScale(target.childNodes[0]);
    },
    ScaleObject:function(object)
    {
        var targetSize=300;
        var percentChange=(100*targetSize)/object.width
        new Effect.Scale(object, percentChange);
    },
    ResetScale:function(object)
    {
        var targetSize=96;
        var percentChange=(100*targetSize)/object.width
        new Effect.Scale(object, percentChange);
    },
	/////////////////////////// effects //////////////////////////////
	
	enlargeArrow:function(target)
	{
		var efxDuration = 0.1;
		var efx = new Effect.Scale (target,125,{ scaleY: false, duration:efxDuration, scaleMode: {originalWidth:35} }); 
	},
	shrinkArrow:function(target)
	{
		var efxDuration = 0.1;
		var efx = new Effect.Scale (target,100,{ scaleY: false, duration:efxDuration, scaleMode: {originalWidth:35}  }); 
	},
	
	
	MoveSelectionBackground:function(target, finalLocation)
	{
		if(!target) return;
		if(!this.selectionBackground) return;
		
		var effectDuration = 0.5;
		var effectTransition = Effect.sinoidal;
		var efx = new Effect.Move (this.selectionBackground,{ x: finalLocation,  mode: 'absolute', duration: effectDuration, transition:effectTransition}); 

		if(target!=null) {
			this.selectionBackground.style.height = this.getHeight(target) + 'px';
			this.selectionBackground.style.width = target.offsetWidth + 'px';
			target._currenteffect=efx;
		}
	},
	getHeight:function(target)
	{
		if(!target) return 0;
		var height = target.offsetHeight;

		var lineHeight = 13;	/* mindless work around for IE 6 */
		if (target.getStyle)
			lineHeight = parseFloat(target.getStyle('lineHeight'));
		return height + lineHeight; 
	},
	
	
	scrollLeft:function(target,speed) 
	{ 
		var pixelsPerSecond = speed || this.pixelsPerSecond;

		var remainingDistance=Math.abs(this.viewOffset());
		var newDuration = remainingDistance/pixelsPerSecond;

		this.clearText();
        if(this.selectedItem)this.MakeThumb(this.selectedItem);
		this.cancelEffect(target);
		target._currentEffect=new Effect.Move (target,{ x: this.farRight,  mode: 'absolute', duration: newDuration, transition: this.scrollType}); 
		
	},
	scrollRight:function(target,speed) 
	{ 
		var pixelsPerSecond = speed || this.pixelsPerSecond;
		
		var remainingDistance;
		
		if(this.scrollDirection=='rtl')
			remainingDistance=Math.abs(this.farRight-this.viewOffset());
		else
			remainingDistance=Math.abs(this.farLeft+this.viewOffset());
		
		var newDuration = remainingDistance/pixelsPerSecond;
        
        this.clearText();
        if(this.selectedItem)this.MakeThumb(this.selectedItem);
		this.cancelEffect(target);
		target._currentEffect=new Effect.Move (target,{ x: this.farLeft,  mode: 'absolute', duration: newDuration, transition: this.scrollType}); 
	},
	
	ShowItem:function(target) { target.style.display='';  },
	HideItem:function(target) { target.style.display='none';  },
	
	FadeItem:function(target) { 
		if((target==null)||(target=='')) return;
		var defaultOptions = {duration:this.contentEffectDuration,queue:{position:'front',scope:this.contentEffectQueue}};
		this.cancelEffect(target);
		target._currentEffect=new this.contentEffectOut(target, Object.extend(defaultOptions,this.contentEffectOutOptions || {})); 
	},
	
	AppearItem:function(target) { 
		if((target==null)||(target=='')) return;
		
		var defaultOptions = {duration:this.contentEffectDuration,queue:{position:'end',scope:this.contentEffectQueue}};
		this.cancelEffect(target);
		target._currentEffect=new this.contentEffectIn(target, Object.extend(defaultOptions,this.contentEffectInOptions || {})); 
	},
	
	cancelEffect:function(target) { if(target && target._currentEffect!=null)target._currentEffect.cancel(); },
	
	
	
	
	//////////////////////////// misc ///////////////////////////////////
	
	/* overload the following five functions to customize the items and behaviors that recieve the ScrollWindow effects and events:
		getContentIdByLinkId, isLinkItem, isContentItem, AddLinkAttributes, AddContentAttributes
	*/
	getContentIdByLinkId:function(linkId) { return this.contentIdprefix + linkId.replace(this.linkIdPrefix,''); },
	isLinkItem:function(target) { return (target.tagName=='A'); },
	isContentItem:function(target) { return (target.tagName=='LI'); },

	AddLinkAttributes:function(target) { 
		target._scrollWindowObject=this;
		target.onclick=function(e){ this._scrollWindowObject.timelineItem_click(target); return false; } 
		//Event.observe(target,'click',function(e){ this._scrollWindowObject.timelineItem_click(target); e.preventBubble(); return false; } );
	},
	AddContentAttributes:function(target) { 
		target._scrollWindowObject=this;
		this.HideItem(target); 
	},
	
	HighlightArrows:function()
	{
		var effectDuration = 6;
		var minOpacity = 0.3;
		var numPulses = 10;
		var transitionType = Effect.Transitions.linear
		
		new Effect.Pulsate(this.scrollLeftArrow,{duration:effectDuration, from:minOpacity, pulses:numPulses, transition: transitionType});
		new Effect.Pulsate(this.scrollRightArrow,{duration:effectDuration, from:minOpacity, pulses:numPulses, transition: transitionType});
	},
	
	viewOffset:function() { return -1 * this.linkList.offsetLeft; },
	
	set_TitleText:function(value) { if(this.titleLabel)this.titleLabel.innerHTML=value; }

}

////////////////////////////////Friend functions/////////////////////////////////////









/*

        function left_out() { scrollEffect.cancel(); }
        function right_out() { scrollEffect.cancel(); }
        function left_over() 
        { 
            if(selectedElement!=null)MakeThumb(selectedElement); 
            scrollLeft($('ThumbList')); 
            selectedElement=null; 
        }
        function right_over() 
        { 
            if(selectedElement!=null)MakeThumb(selectedElement); 
            scrollRight($('ThumbList')); 
            selectedElement=null; 
        }
        function scrollLeft(target) { scrollEffect=new Effect.Move (target,{ x: farRight,  mode: 'absolute', duration: scrollDuration}); }
        function scrollRight(target) { scrollEffect=new Effect.Move (target,{ x: farLeft,  mode: 'absolute', duration: scrollDuration}); }
        
        function thumbnail_clicked(sender)
        {
            if((sender==null)) return;
            if(selectedElement==sender) { window.location=sender.parentNode; return; }
            
            if(selectedElement!=null) MakeThumb(selectedElement);
            MakeFeature(sender);            
            
            selectedElement=sender;
            
        }
        function MakeFeature(target)
        {
            selectedFeatureX=target.offsetLeft;
            selectedFeatureY=target.offsetTop;
            var xOffset = viewOffset() + featureLeft()-target.offsetLeft;
            var yOffset = featureTop();
            
            new Effect.Move(target, {x: xOffset, y: yOffset, mode:'absolute'} );
            ScaleObject(target);
        }
        function MakeThumb(target)
        {
            if (target==null) return;
            new Effect.Move(target, {x: 0, y: 0, mode:'absolute'} );
            ResetScale(target);
        }
        function findPos(obj) {
	        var curleft = curtop = 0;
	        if (obj.offsetParent) {
		        curleft = obj.offsetLeft
		        curtop = obj.offsetTop
		        while (obj = obj.offsetParent) {
			        curleft += obj.offsetLeft
			        curtop += obj.offsetTop
		        }
	        }
	        return [curleft,curtop];
        }
        function ScaleObject(object)
        {
            var targetSize=300;
            var percentChange=(100*targetSize)/object.width
            new Effect.Scale(object, percentChange);
        }
        function ResetScale(object)
        {
            var targetSize=96;
            var percentChange=(100*targetSize)/object.width
            new Effect.Scale(object, percentChange);
        }
        
        function AddCssClass(object, style) { object.className += ' ' + style + ' '; }
        function RemoveCssClass(object, style) { object.className = trim(object.className.replace(style, '')); }
        
        function trim(strText) { 
            while (strText.substring(0,1) == ' ') 
                strText = strText.substring(1, strText.length);
            while (strText.substring(strText.length-1,strText.length) == ' ')
                strText = strText.substring(0, strText.length-1);
           return strText;
        } 
        
        function SwapString(string, option) {
            var reg =  new RegExp("-[^\\.-]*?\\.");
            return string.replace(reg, "-" + option + ".");
        }
        function LargeImage(image) 
        {
            if(image==null) return;
            MM_swapImage(image,'',SwapString(image.src, largeSuffix),1);
        }
        function SmallImage(image) 
        {
            if(image==null) return;
            MM_swapImage(image,'',SwapString(image.src, smallSuffix),1);
        }

*/