/**
 * CastFire player's initial javascript
 * (c) CastFire.com 2009
 * @author Ivan Kirnev <ivan.kirnev@gmail.com>
 */
 (function($) { 
	jQuery.fn.divScroll = function(options){

		var $DivScroll = { version: "1.0" };
	
		var $DivScroll = {
			scrollerBack: "div.scroller-up",
			scrollerForward: "div.scroller-down",
			classScrollerBackHover: "scroller-up-hover",
			classScrollerForwardHover: "scroller-down-hover",
			classScrollerDisabled: "x-item-disabled",
			scrollWrapper: "div.scrollWrapper",
			scrollType: "vertical",
			scrollSpeed_:500,
			callbackEndBack: function(){},
			callbackEndForward: function(){},
			div: this,
			exec: function(){//debugger;
				var sw = this.div.find(this.scrollWrapper);
				
				this.div.css('overflow','hidden');
				if(this.height) this.div.height(this.height);
				if(this.width) this.div.width(this.width);
				
				if(this.scrollType == "horizontal") {
					if(!this.scrollWidth) {
						var ch = sw.children();
						this.scrollWidth = 0
						for(var i=0; i<ch.length; i++){
							this.scrollWidth += $J(ch[i]).outerWidth();
						}
					}
					sw.width(this.scrollWidth);
				}
				
				this.div.find(this.scrollerBack).addClass(this.classScrollerDisabled); 
				var d = (this.scrollType == "vertical" ?
						(sw.height() - this.div.height()):
						(sw.width() - this.div.width())
				);
				if(d <= 0){
					this.div.find(this.scrollerForward).addClass(this.classScrollerDisabled); 
				}

				this.div.find(this.scrollerBack).hover(
					(function(ds) { return function() {
						ds.div.find(ds.scrollerBack).addClass(ds.classScrollerBackHover); 
						ds.onScrollerBack();
					}; }) (this),
					(function(ds) { return function() {
						ds.div.find(ds.scrollerBack).removeClass(ds.classScrollerBackHover);
						ds.onScrollerBackStop();
					}; }) (this)
				)

				this.div.find(this.scrollerForward).hover(
					(function(ds) { return function() {
						ds.div.find(ds.scrollerForward).addClass(ds.classScrollerForwardHover); 
						ds.onScrollerForward();
					}; }) (this),
					(function(ds) { return function() {
						ds.div.find(ds.scrollerForward).removeClass(ds.classScrollerForwardHover);
						ds.onScrollerForwardStop();
					}; }) (this)
				)
				return this;
			},
			append: function(html){
				var sw = this.div.find(this.scrollWrapper);//debugger;
				sw.append(html);
				var toHide = false;
				if(this.div.css("display").toLowerCase() == "none"){
					this.div.show();
					toHide = true;
				}
				if(this.scrollType == "horizontal") {
					var ch = sw.children();
					this.scrollWidth = 0
					for(var i=0; i<ch.length; i++){
						this.scrollWidth += $J(ch[i]).outerWidth();
					}
					sw.width(this.scrollWidth);
				}
				var d = (this.scrollType == "vertical" ?
						(sw.height() - this.div.height() + (parseInt(sw.css("top")) || 0)):
						(sw.width() - this.div.width() + (parseInt(sw.css("left")) || 0))
				);
				if(toHide) this.div.hide();
				if(d > 0){
					this.div.find(this.scrollerForward).removeClass(this.classScrollerDisabled); 
				}
			},
			remove: function(elem){
				var sw = this.div.find(this.scrollWrapper);
				if(typeof(elem)=="object"){
					$J(elem).remove();
				}
				if(typeof(elem)=="string"){
					sw.find(elem).remove();
				}
				var toHide = false;
				if(this.div.css("display").toLowerCase() == "none"){
					this.div.show();
					toHide = true;
				}
				if(this.scrollType == "horizontal") {
					var ch = sw.children();
					this.scrollWidth = 0
					for(var i=0; i<ch.length; i++){
						this.scrollWidth += $J(ch[i]).outerWidth();
					}
					sw.width(this.scrollWidth);
				}
				var d = (this.scrollType == "vertical" ?
						(sw.height() - this.div.height() + (parseInt(sw.css("top")) || 0)):
						(sw.width() - this.div.width() + (parseInt(sw.css("left")) || 0))
				);
				if(toHide) this.div.hide();
				if(d <= 0){
					this.div.find(this.scrollerForward).addClass(this.classScrollerDisabled); 
				}
			},
			show: function(elem){
				var sw = this.div.find(this.scrollWrapper);
				if(typeof(elem)=="object"){
					$J(elem).show();
				}
				if(typeof(elem)=="string"){
					sw.find(elem).show();
				}
				var toHide = false;
				if(this.div.css("display").toLowerCase() == "none"){
					this.div.show();
					toHide = true;
				}
				if(this.scrollType == "horizontal") {
					var ch = sw.children();
					this.scrollWidth = 0
					for(var i=0; i<ch.length; i++){
						this.scrollWidth += $J(ch[i]).outerWidth();
					}
					sw.width(this.scrollWidth);
				}
				var d = (this.scrollType == "vertical" ?
						(sw.height() - this.div.height() + (parseInt(sw.css("top")) || 0)):
						(sw.width() - this.div.width() + (parseInt(sw.css("left")) || 0))
				);
				if(toHide) this.div.hide();
				if(d > 0){
					this.div.find(this.scrollerForward).removeClass(this.classScrollerDisabled); 
					if(//($J.browser.msie || $J.browser.opera) && 
						this.div.find(this.scrollerForward).hasClass(this.classScrollerForwardHover)){
						this.div.find(this.scrollerForward).mouseover();
					}
				}
			},
			onScrollerBack: function(speed){
				var sw = this.div.find(this.scrollWrapper);
				var d = (this.scrollType == "vertical" ?
						(parseInt(sw.css("top")) || 0):
						(parseInt(sw.css("left")) || 0)
				);
				if(d < 0){
					d = Math.abs(d);

					var speed = parseInt(1000*d/(speed||this.scrollSpeed||this.scrollSpeed_));
					sw.animate(
						(this.scrollType == "vertical" ? {top: "+=" + d + "px"} : {left: "+=" + d + "px"}), 
						speed,
						(function(ds) { return function() {
							ds.div.find(ds.scrollerBack).addClass(ds.classScrollerDisabled); 
							var sw = ds.div.find(ds.scrollWrapper);
							var d = (ds.scrollType == "vertical" ?
									(sw.height() - ds.div.height() + (parseInt(sw.css("top")) || 0)):
									(sw.width() - ds.div.width() + (parseInt(sw.css("left")) || 0))
							);
							if(d > 0){
								ds.div.find(ds.scrollerForward).removeClass(ds.classScrollerDisabled);
							}
							ds.callbackEndBack();
						}; }) (this)
					)
				}
			},
			onScrollerForward: function(speed, nonstop, callbackEndForward){
				var sw = this.div.find(this.scrollWrapper);
				var d = (this.scrollType == "vertical" ?
						(sw.height() - this.div.height() + (parseInt(sw.css("top")) || 0)):
						(sw.width() - this.div.width() + (parseInt(sw.css("left")) || 0))
				);
				if(d > 0){
					var fnStop = this.onScrollerForwardStop;
					if(nonstop){
						this.onScrollerForwardStop = function(){}
					}
					var speed = parseInt(1000*d/(speed||this.scrollSpeed||this.scrollSpeed_));
					sw.animate(
						(this.scrollType == "vertical" ? {top: "-=" + d + "px"} : {left: "-=" + d + "px"}), 
						speed, 
						(function(ds, fnStop) { return function() {
							ds.onScrollerForwardStop = fnStop;
							ds.div.find(ds.scrollerForward).addClass(ds.classScrollerDisabled); 
							var sw = ds.div.find(ds.scrollWrapper);
							var d = (ds.scrollType == "vertical" ?
									(parseInt(sw.css("top")) || 0):
									(parseInt(sw.css("left")) || 0)
							);
							if(d < 0){
								ds.div.find(ds.scrollerBack).removeClass(ds.classScrollerDisabled);
							}
							if(callbackEndForward){
								callbackEndForward();
							}else{
								ds.callbackEndForward();
							}
						}; }) (this,fnStop)
					)
				}
			},
			onScrollerBackStop: function(){
				try{
					this.div.find(this.scrollWrapper).stop();
				}catch(e){}
				var sw = this.div.find(this.scrollWrapper);
				var d = (this.scrollType == "vertical" ?
						(sw.height() - this.div.height() + (parseInt(sw.css("top")) || 0)):
						(sw.width() - this.div.width() + (parseInt(sw.css("left")) || 0))
				);
				if(d > 0){
					this.div.find(this.scrollerForward).removeClass(this.classScrollerDisabled);
				}
			},
			onScrollerForwardStop: function(){
				try{
					this.div.find(this.scrollWrapper).stop();
				}catch(e){}
				var sw = this.div.find(this.scrollWrapper);
				var d = (this.scrollType == "vertical" ?
						(parseInt(sw.css("top")) || 0):
						(parseInt(sw.css("left")) || 0)
				);
				if(d < 0){
					this.div.find(this.scrollerBack).removeClass(this.classScrollerDisabled);
				}
			}
		}
		$DivScroll = $J.extend($DivScroll, options);
		return $DivScroll.exec();
	};
})(jQuery);

