/*

	ticker.js
	
	scrolls through paragraphs and outputs them in a 'typing' style
	
	Written for 19.co.uk
	
	Requires:
		mootools 1.2 core
		mootools Fx.Scroll add-on
		
		
	Exampe Usage:
	
		HTML:
			<div id="ticker"> 
        	<div id="ticker-inner" class="fashion">
                <p class="news"><span class="grey">30th April 2009</span>  <a href="news.html#news-claudia">Claudia Schiffer appears on the cover of V magazine</a><span class="clear"></span></p>
				<p> ... </p>
				<p ... </p>
            </div>
        </div>
		
		CSS:
			#ticker{
				width:740px;
				height:15px;
				padding:10px 10px 10px 80px;
			}

			#ticker p{
				margin:0;
				width:750px;
				cursor:pointer;
				height:20px;
				overflow:hidden;
			}

			#ticker span, #ticker a{
				display:block;
				height:100%;
				float:left;
			}

			#ticker a{
				width:300px;
			}

			#ticker span{
				margin-right:10px;
			}

			#ticker-inner{
				width:740px;
				height:15px;
				overflow:hidden;
			}
			
			Other styles as required
			
		JAVASCRIPT:	
			simply call ticker.init() - no arguments required
	
*/



var ticker = {
	
	element : 'ticker-inner', // container element
	data : [], // data holder
	letters: [], // used ticker anim tpo hold current letters, used by addLetter
	letterIndex : 0, // used by ticker anim to hold current letter used by addLetter
	per : '', // hold preiodical index used by addLetter
	pause : 2000, // amount of time in milliseconds that text should pause on screen
	currentItem : 0, // holds current <p> element - used by goTo and goToItem functions
	scroller : '', // holds Fx.Scroll instance
	debug : false, // if true - debugging info is output to console or other window
	height : 20, // holds height of <p> elements for accurate scrolling
	
/*
	init():void
		initialises ticker
*/

	init : function(){
		ticker.scroller= new Fx.Scroll(ticker.element);
		ticker.scroller.set(0,0);
		ticker.height = ticker.getFullHeight( $(ticker.element).getElement('p') );
		$(ticker.element).getElements('p').each( function(p){
			ticker.data.push( {'element' : p, 'date':p.getElement('span'), 'txt':p.getElement('a') });
			p.setOpacity(0);
			p.setStyle('visibility', 'visible');
			if( p.hasClass('twitter') ){
				p.addEvent('click', function(e){
				new Event(e).stop();							 
				 window.open(this.getElement('a').href);
				});
			}else if( p.hasClass('news') ){
				p.addEvent('click', function(){
				 location.href = this.getElement('a').href;
				});
			}
			
		});
		ticker.goTo(0);
	},
/*
	getFullHeight(el:Element):Number
		calculates full size of an element, including top and bottom margin
*/
	
	getFullHeight : function(el){
		return el.getSize().y + el.getStyle('margin-top').toInt() + el.getStyle('margin-bottom').toInt();
	},
/*
	addLetter():void
		called by periodical in goToItem, performs 'typing' effect
*/
	addLetter: function(){
		if( ticker.letterIndex > (ticker.letters.length - 1) ){
			$clear( ticker.per );
			ticker.letterIndex = 0;
			ticker.completed();
			return;
		}else{
			var txt = this.get('text');
			if(ticker.letters[ticker.letterIndex] == ' ') ticker.letters[ticker.letterIndex] = '&nbsp;';
			this.set('html', txt + ticker.letters[ticker.letterIndex]);
			ticker.letterIndex = ticker.letterIndex + 1;
		}
	},
/*
	trace(m:string):void
		used for debugging
*/
	trace: function(m){
		if(ticker.debug){
			console.log(m);
		}
	},
/*
	goToItem(i:Number):void
		called by goTo.  Scrolls to item with index i
*/
	
	goToItem: function(i){
		if( i < 0 ) i = ticker.data.length - 1;
		if( i > (ticker.data.length - 1) ) i = 0;
		if(Browser.Engine.trident){
			ticker.data[ticker.currentItem].element.setOpacity(0);
		}else{
			ticker.data[ticker.currentItem].element.tween('opacity', 0);
		}
		ticker.letters = [];
		var txt = '';
		
		ticker.trace('text is ' + ticker.data[i].txt.get('text') );
		ticker.trace( 'class is ' + ticker.data[i].element.className );
		txt = ticker.data[i].txt.get('text');
		for(var j=0; j<txt.length; j++){
			ticker.letters[j] = txt.charAt(j);
		}
		ticker.data[i].txt.set('html', '');
		ticker.scroller.start(0, i * ticker.height);
		if(Browser.Engine.trident){
			ticker.data[i].element.setOpacity(1);
		}else{
			ticker.data[i].element.tween('opacity', 1);
		}
		ticker.per = ticker.addLetter.periodical(100, ticker.data[i].txt);
		ticker.currentItem = i;
	},
/*
	goTo(pos:Number|String):void
		top level method - controls scrolling.
		Arguments:
			pos : can be 'next', 'previous' or an integer representing an element in the data arra
*/
	
	goTo: function(pos){
		ticker.trace('goTo called with argument ' + pos);
		switch(pos){
			case 'next' : ticker.goToItem( ticker.currentItem + 1 ); break;
			case 'previous' : ticker.goToItem( ticker.currentItem - 1 ); break;
			default : ticker.goToItem( pos ); break;
		}
	},
/*
	completed():void
		called by addLetter when all letter have been added
*/
	completed: function(){
		ticker.goTo.delay(ticker.pause, ticker, 'next');
	}
	
}

// additional code for adding a bebugging window, if required


try{
	console.log();
}catch(e){
	if( $chk(ticker.debug) ){
	var console = {};
		console.win = window.open('', 'Debugger', 'width=250,height=500,scrollbars=1,resizable=1');
		console.win.document.write('<h2>Debugging Console</h2>');
		console.log = function(m){
			try{console.win.document.write(m + '<br />');}catch(e){}
		}
	}
}
	
