/**
 * CastFire player's initial javascript
 * (c) CastFire.com 2009
 * @author Ivan Kirnev <ivan@castfire.com>
 */
 (function($) { 
	jQuery.fn.divScroll = function(options){

		var $DivScroll = {
			version: "1.0",
			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,
			scrollEvent: "hover", //hover, click, touch
			is_iOS: false,
			scrollBar: false,
			callbackEndBack: function(){},
			callbackEndForward: function(){},
			div: this,
			exec: function(){
				if(this.height) this.div.height(this.height);
				if(this.width) this.div.width(this.width);
				
				var sw = this.div.find(this.scrollWrapper);
				if(this.scrollType == "horizontal") {
					if(!this.scrollWidth) {
						var ch = sw.children();
						this.scrollWidth = 0
						for(var i=0; i< ch.length; i++){
							this.scrollWidth += $(ch[i]).outerWidth(true);
						}
					}
					sw.width(this.scrollWidth);
				}
				if(!this.is_iOS) {
					if(!this.scrollBar)
						this.exec_OS();
					else
						this.exec_OS_scroll();
				} else {
					this.exec_iOS();
				}
				return this;
			},
			exec_OS_scroll: function() {
				this.div.find(this.scrollerBack).remove();//addClass(this.classScrollerDisabled); 
				this.div.find(this.scrollerForward).remove();//.addClass(this.classScrollerDisabled); 
					
				if(this.scrollType == "horizontal") {
					this.div.css({'overflow-y':'hidden'});
					this.div.css({'overflow-x':'auto'});
				} else {
					this.div.css({'overflow-x':'hidden'});
					this.div.css({'overflow-y':'auto'});
				}

				this.div.scroll(
					(function(ds) { return function() {
					
						if(ds.scrollType == "horizontal") {
							if( ds.div[0].scrollWidth <= ds.div.width() + ds.div.scrollLeft() + 250) {
								ds.callbackEndForward();
							}
						} else {
							if( ds.div[0].scrollHeight <= ds.div.height() + ds.div.scrollTop() + 50) {
								ds.callbackEndForward();
							}
						}
						
					}; }) (this)
				);
	
				return this;
			},
			exec_OS: function() {
				//debugger;
				var sw = this.div.find(this.scrollWrapper);
				this.div.css('overflow','hidden');
				
				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); 
				}

				switch(this.scrollEvent)
				{
				case "click":
					this.div.find(this.scrollerBack).mousedown(
						(function(ds) { return function() {
							ds.div.find(ds.scrollerBack).addClass(ds.classScrollerBackHover); 
							ds.onScrollerBack();
						}; }) (this)
					).mouseup(
						(function(ds) { return function() {
							ds.div.find(ds.scrollerBack).removeClass(ds.classScrollerBackHover);
							ds.onScrollerBackStop();
						}; }) (this)
					);
				  break;
				case "touch":
					this.div.find(this.scrollerBack)[0].addEventListener(
						"touchstart", 
						(function(ds) { return function() {
							ds.div.find(ds.scrollerBack).addClass(ds.classScrollerBackHover); 
							ds.onScrollerBack();
						}; }) (this),
						false
					);
					this.div.find(this.scrollerBack)[0].addEventListener(
						"touchend", 
						(function(ds) { return function() {
							ds.div.find(ds.scrollerBack).removeClass(ds.classScrollerBackHover);
							ds.onScrollerBackStop();
						}; }) (this),
						false
					);
				  break;
				default:
					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)
					)
				}
				
				switch(this.scrollEvent)
				{
				case "click":
					this.div.find(this.scrollerForward).mousedown(
						(function(ds) { return function() {
							ds.div.find(ds.scrollerForward).addClass(ds.classScrollerForwardHover); 
							ds.onScrollerForward();
						}; }) (this)
					).mouseup(
						(function(ds) { return function() {
							ds.div.find(ds.scrollerForward).removeClass(ds.classScrollerForwardHover);
							ds.onScrollerForwardStop();
						}; }) (this)
					)
				  break;
				case "touch":
					this.div.find(this.scrollerForward)[0].addEventListener(
						"touchstart", 
						(function(ds) { return function() {
							ds.div.find(ds.scrollerForward).addClass(ds.classScrollerForwardHover); 
							ds.onScrollerForward();
						}; }) (this),
						false
					);
					this.div.find(this.scrollerForward)[0].addEventListener(
						"touchend", 
						(function(ds) { return function() {
							ds.div.find(ds.scrollerForward).removeClass(ds.classScrollerForwardHover);
							ds.onScrollerForwardStop();
						}; }) (this),
						false
					);
				  break;
				default:
					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;
			},
			exec_iOS: function() {
				this.div.find(this.scrollerBack).remove();//addClass(this.classScrollerDisabled); 
				this.div.find(this.scrollerForward).remove();//.addClass(this.classScrollerDisabled); 
					
				this.iscroll = new iScroll(this.div.find(this.scrollWrapper)[0]);
				this.iscroll.setTransitionTime('50ms');
				if(this.scrollType == "horizontal") {
					this.div.css({'overflow-y':'hidden'});
					ds = this;
					this.iscroll.onScrollEnd = function(){
						if( ds.div[0].scrollWidth <= ds.div.width() - this.x) {
							//ds.callbackEndForward();
						}
					};
				} else {
					this.div.css({'overflow-x':'hidden'});
				}

				return this;
			},
			append: function(html){
				var sw = this.div.find(this.scrollWrapper);//debugger;
				//var lastEl = sw.children().length-1;
				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 += $(ch[i]).outerWidth(true);
					}
					sw.width(this.scrollWidth);
					if(this.is_iOS) {
						//var li = sw.children()[lastEl];
						//sw.blur();
					}
				}
				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"){
					$(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 += $(ch[i]).outerWidth(true);
					}
					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"){
					$(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 += $(ch[i]).outerWidth(true);
					}
					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(//($.browser.msie || $.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 = $.extend($DivScroll, options);
		return $DivScroll.exec();
	};
})(jQuery);


