/*---------------------------------------------------------------- 
  Copyright:
  (C) 2008 - 2011 IceTheme
  
  License:
  GNU/GPL http://www.gnu.org/copyleft/gpl.html
  
  Author:
  IceTheme - http://wwww.icetheme.com
---------------------------------------------------------------- */

if( typeof IceBreakingNews != Object ) {
	var IceBreakingNews = new Class( {
		initialize:function( eMain, options ){
			this.setting = $extend({
				mainItemClass		: '.ice-breakingnew-item',
				wapperClass			: '.ice-breakingnews-wrapper',
				moduleTitleClass	: '.ice-module-nav',
				interval	  	 	: 3000,
				layoutStyle		    : 'hrleft',
				fxObject			: null,
				isAjax				: false,
				auto			    : true,
				maxItemSelector	:0
			}, options || null  );
			//this.setOptions( options );
		//	this.setting = this.options;
			this.options=null;
			this.currentNo  = 0;
			this.nextNo     = null;
			this.previousNo = null;
			this.totalItems = 0;
			this.fxNavigatorImages=[];
			this.fxItems = [];
			this.minSize = 0;
			this.slideLength = 0;
			// 
			if( $defined(eMain) ){
				mTitleWidth = 0;
				if( eMain.getElements(this.setting.moduleTitleClass) ){
					mTitleWidth =  parseInt(eMain.getElements(this.setting.moduleTitleClass).getStyle('width'));
				}			
				this.slides = eMain.getElements( this.setting.mainItemClass );
				this.iceMain = eMain;
				if(this.setting.maxItemSelector > 0 && this.setting.isAjax){
					this.slides.length = this.setting.maxItemSelector;
				}
				this.slideLength = this.slides.length;
				this.totalItems = this.slides.length;
				if( this.totalItems <= 1 ){
					return ;
				}
				var offset = 20;
				this.maxWidth  = this.slides[0].offsetWidth.toInt()-mTitleWidth-offset;
				this.maxHeight =  this.slides[0].offsetHeight.toInt();
				eMain.getElement( this.setting.wapperClass ).setStyle( 'width', Math.abs(this.maxWidth) );
				
				var fx =  $extend({waiting:false, onComplete:this.onComplete.bind(this)}, this.setting.fxObject );
				var styleMode = this.__getStyleMode();
				this.styleMode = styleMode;
			
				this.slides.each( function(item, index) { 
			   		this.fxItems[index] = new Fx.Tween( item, fx  );
					item.setStyles( eval('({'+styleMode[0]+': index * this.maxSize,"'+styleMode[1]+'":Math.abs(this.maxSize),"display" : "block"})') );			   
					// this.fxItems[index] = new Fx.Morph( item, fx );
					if( this.setting.auto ){
						item.addEvent( "mouseenter", this.stop.bind(this) );
						item.addEvent( "mouseleave", function(){
							this.play( this.setting.interval,'next', true )
							}.bind(this));
					}
				}.bind(this) );
				if( styleMode[0] == 'opacity' ){
					this.slides[0].setStyle(styleMode[0],'1');
				}
			}
		},
		__getStyleMode:function(){
			switch( this.setting.layoutStyle ){
				case 'opacity': this.maxSize=0; this.minSize=1; return ['opacity','opacity'];
				case 'vrup': this.maxSize=this.maxHeight; return ['top','height'];
				case 'vrdown':this.maxSize=-this.maxHeight;  return ['top','height'];
				case 'hrright': this.maxSize=-this.maxWidth; return ['left','width'];
				case 'hrleft':
				default: this.maxSize=this.maxWidth; return ['left','width'];
			}
		},
		registerButtonsControl:function( eventHandler, objects ){
			if( $defined(objects) && this.totalItems > 1 ){
				for( var action in objects ){
					if( $defined(this[action.toString()])  && $defined(objects[action]) ){
							objects[action].addEvent( eventHandler, this[action.toString()].bind(this, [true]) );
					}
				}
			}
			return this;	
		},
		start:function( isStart ){
			this.setting.auto = isStart;
			if( isStart ){this.play( this.setting.interval,'next', true );}
		},
		onComplete:function(){},	
		onProcessing:function( item, manual, start, end ){
		
			this.previousNo = this.currentNo + (this.currentNo>0 ? -1 : this.totalItems-1);
			this.nextNo 	= this.currentNo + (this.currentNo < this.totalItems-1 ? 1 : 1- this.totalItems);	
			if( manual ) { this.stop(); }
			return this;
		},
		finishFx:function( manual ){
			if( manual ) this.stop();
			if( manual && this.setting.auto )
				this.play( this.setting.interval,'next', true );
		},
		fxStart:function( index, start, end ){
		//	this.fxItems[index].start( eval("({'"+this.styleMode[0]+"':[start,end]})") );
			if(this.fxItems[index]){
				this.fxItems[index].cancel().start(this.styleMode[0], start, end);
			}
			return this;
		},
		next:function( manual ){
			this.currentNo += (this.currentNo < this.totalItems-1) ? 1 : (1 - this.totalItems);
			if(	this.setting.isAjax && !this.fxItems[ this.currentNo ]){
				this.loadAjax( this.currentNo, manual, 'next' );
			}
			else{			
				this.onProcessing( null, manual, 0, this.maxSize )
					.fxStart( this.currentNo, this.maxSize , this.minSize )
					.fxStart( this.previousNo, this.minSize,  -this.maxSize )
					.finishFx( manual );
			}
		},
		previous:function( manual ){
			this.currentNo += this.currentNo > 0 ? -1 : this.totalItems - 1;
			if(	this.setting.isAjax && !this.fxItems[ this.currentNo ]){
				this.loadAjax( this.currentNo, manual, 'prev' );
			}
			else{
				this.onProcessing( null, manual, -this.maxWidth, this.minSize )
					.fxStart( this.nextNo, this.minSize, this.maxSize )
					.fxStart( this.currentNo, -this.maxSize, this.minSize )
					.finishFx( manual	);
			}
		},
		loadAjax: function( nextpage, manual, dir ){
			var self = this;
			this.loadingBlock = this.iceMain.getElement('.ice-loading');
			this.loadingBlock.setStyle("display", "block");
			var page = ( parseInt( nextpage ) + 1 );
			var req =new Request({
							  method: 'get',
							  url: this.setting.url,
							  evalScripts: false,
							  data: { 'p' : page },
							  onComplete: function(response) {
									if(response !=""){
										this.loadingBlock.setStyle("display", "none");
										var eMainHtml = this.iceMain.getElement(this.setting.wapperClass).get("html");
										this.iceMain.getElement(this.setting.wapperClass).set("html", eMainHtml + response );
										var fx =  $extend({waiting:false, onComplete:this.onComplete.bind(this)}, this.setting.fxObject );
										var itemTmp = this.iceMain.getElement(".page-"+page);
										this.slides	   = this.iceMain.getElements( this.setting.mainItemClass );
										this.slides.length = this.slideLength;
										this.slides.each( function(item, index) {
											this.fxItems[index] = new Fx.Tween( item, fx  );
											if( this.setting.auto ){
											item.addEvent( "mouseenter", this.stop.bind(this) );
												item.addEvent( "mouseleave", function(){
													this.play( this.setting.interval,'next', true )
													}.bind(this));
											}
										}.bind(this) );
										itemTmp.setStyles( eval('({'+this.styleMode[0]+': nextpage * this.maxSize,"'+this.styleMode[1]+'":Math.abs(this.maxSize),"display" : "block"})') );
										if( dir =='prev'){
											this.onProcessing( null, manual, -this.maxWidth, this.minSize )
												.fxStart( this.nextNo, this.minSize, this.maxSize )
												.fxStart( this.currentNo, -this.maxSize, this.minSize )
												.finishFx( manual );
										}
										else if( dir == 'next') {
											this.onProcessing( null, manual, 0, this.maxSize )
												.fxStart( this.currentNo, this.maxSize , this.minSize )
												.fxStart( this.previousNo, this.minSize,  -this.maxSize )
												.finishFx( manual );
										}
										$$('.hasTip').each(function(el) {
											var title = el.get('rel');
											if (title) {
												var parts = title.split('::', 2);
												el.store('tip:title', parts[0]);
												el.store('tip:text', parts[1]);
											}
										});
										var JTooltips = new Tips( $$('.hasTip') , { maxTitleChars: 50, fixed: false});
										//PaseAjaxResponse( response );
									}
								}.bind( this) 
							}).send();
		},
		stop:function(){ $clear(this.isRun ); },
		play:function( delay, direction, wait ){
			this.stop(); 
			if(!wait){ this[direction](false); }
			this.isRun = this[direction].periodical(delay,this,false);
		}
	} );
}
