(function($){
	var ik=typeof jQuery=='function', self, _dim=[], changed=null, active=false;

	if (ik){
		jQuery.fn.ikScroll=function(options){
			var s={
				name:"scrollbar",
				container:null,
				scrollee:null,
				classname:null,
				position:(options.position===undefined)?'right':options.position,
				positionVal:(options.positionVal===undefined)?null:options.positionVal,
				positionObj:(options.positionObj===undefined)?null:options.positionObj,
				toggle:(options.toggle===undefined)?'width': options.toggle,
				size:(options.size===undefined)?[40, 80]: options.size};
  			settings=jQuery.extend(s, options);
			return scrollObj.add();};}
	
	scrollObj={
		inited:false,
		top	:null,
		bar	:null,
		scrollTarget:null,
		pointerTarget:null,
		toggleBound:null,
		trackHeight:null,
		curScrollOffset:false,
		add:function(){
			if(!this.inited)this.inited=this.init.call(this);
			this.scrollee=settings.scrollee;
			this.scrollee.wrap('<div id="container" style="position:absolute; left:0px; top:0px; height:100%; width:100%; overflow:hidden; z-index:'+this.scrollee.css('z-index')+'"></div>');
			this.container=$('#container');
			if(this.setScroll()== null)return null;
			return;
		},
		detectAppend:function(e){
			if(self&&(!changed||(changed&&changed!=e.type))){
				if(e.type=="DOMNodeRemoved")self.instanceLive();
				changed=e.type; 
				setTimeout(function(){changed=null;}, 2000);
			};
			return false;
		},
		init:function(){
			self=this;
			this.top=settings.container;
			this.bar=this.getBar();		
			return true;
		},
		doWheel:function(e, d){
			var scrollBounds=[0, self.container.height()-self.scrollee.height()];
			var targetPos=self.scrollee.offset().top+(d*self.trackHeight*0.5);
			targetPos=(d>0)?((targetPos <= scrollBounds[0])?targetPos:scrollBounds[0]):((targetPos >= scrollBounds[1])?targetPos:scrollBounds[1]);
			self.bar.pointer.animate({top: -targetPos*(1 /self.scrollRatio)}, {queue: false, duration:100});
			self.scrollee.animate({top: targetPos}, {queue: false, duration:100});
			if(!self.curScrollOffset)self.curScrollOffset=self.scrollee.offset().top;
		},
		instanceLive:function(verdict){ 
			if(verdict){
				self.bar.pointer.css('top', 0)
				self.bar.container.css('visibility', 'visible')
				self.top.bind("DOMNodeRemoved", self.detectAppend).bind("DOMNodeInserted", self.detectAppend);
				self.container.mousewheel(self.doWheel);
				self.scrollee.bind("resize", self.setScroll);
				active=true;
			}else{
				active=false;
				self.top.unbind("DOMNodeRemoved", self.detectAppend).unbind("DOMNodeInserted", self.detectAppend);
				self.bar.container.css('visibility', 'hidden')
				self.scrollee.unbind("resize", self.setScroll);
				self.container.unmousewheel(self.doWheel); 
				self._toggle[settings.toggle].exec(null, 'hide');
			};
		},
		setScroll:function(){ 
			_dim= self.getDimensions();
			self.container.height( _dim[1]-self.container.offset().top);
			self.bar.container.css({left: ((settings.positionVal)?settings.positionVal:self._position[settings.position].call(self))});
			self.scrollRatio=self.scrollee.get(0).scrollHeight*(1/self.trackHeight);
			self.pageRatio=self.container.height()/self.scrollee.get(0).scrollHeight;
			if(!self.bar.hasClass('live'))self._initLive();
			if(self.pageRatio<1){
				self.bar.pointer.height(self.pageRatio*self.trackHeight);
				if(self.scrollee.offset().top+self.scrollee.height()<self.container.height()){	
					self.scrollTarget=(self.container.height()<self.scrollee.height())?self.container.height()-self.scrollee.height():0;
					self.scrollee.css({top: self.scrollTarget});
				};
				if(self.scrollTarget){
					self.pointerTarget=((-(self.scrollTarget /self.scrollRatio))+self.bar.pointer.height()>self.trackHeight)?self.trackHeight-parseFloat(self.bar.pointer.height()):-(self.scrollTarget /self.scrollRatio);
					self.bar.pointer.css({top: self.pointerTarget});
				};
				self._toggle[settings.toggle].init();
				if(!active)self.instanceLive(true);
				self._toggle[settings.toggle].exec(null, 'full');
				return true;
			}else{
				if(active)self.instanceLive();
				if(active)self._toggle[settings.toggle].exec(null, 'hide');
				return null;
			};
		},
		scrollButUp:function(e){
			var scrollBound;
			if(e.target.id=='scrollUp'||$(e.target).parent().attr('id')== 'scrollUp'){
				scrollBound=self.scrollee.offset().top+self.container.height();
				if(scrollBound <= 0){
					self.bar.pointer.animate({top: -(scrollBound*(1/self.trackHeight))}, {queue: false, duration:250});
					self.scrollee.animate({top: scrollBound}, {queue: false, duration:500});
				}else{
					self.bar.pointer.animate({top: 0}, {queue: false, duration:250});
					self.scrollee.animate({top: 0}, {queue: false, duration:500});
				};
			}else if(e.target.id=='scrollDown'||$(e.target).parent().attr('id')== 'scrollDown'){
				scrollBound=self.scrollee.offset().top-self.container.height();
				if(scrollBound >= self.container.height()-self.scrollee.height()){
					self.bar.pointer.animate({top: -(scrollBound /self.scrollRatio)}, {queue: false, duration:250});
					self.scrollee.animate({top: scrollBound}, {queue: false, duration:500});
				}else{
					self.bar.pointer.animate({top: -((self.container.height()-self.scrollee.height())/self.scrollRatio)}, {queue: false, duration:250});
					self.scrollee.animate({top: self.container.height()-self.scrollee.height()}, {queue: false, duration:500});
				};
			};
			if(!self.curScrollOffset)self.curScrollOffset=self.scrollee.offset().top;
			return false;
		},
		resetScroll:function(){
			self.scrollee.css({top: 0});
		},
		_initLive:function(){
			self.bar.addClass('live');
			self.bar.container.mouseup(self.scrollButUp);
			self.bar.container.mouseover(self._toggle[settings.toggle].exec);
			self.bar.container.mouseout(self._toggle[settings.toggle].exec);
			self.bar.pointer.draggable({
				axis:'y', 
				containment:'parent' ,
				start:function(){self.bar.container.addClass('parked')},
				stop:function(){self.bar.container.removeClass('parked')},
				drag:function(e){
					if(self.bar.pointer.position().top >= 0&&self.bar.pointer.position().top<settings.size[1]-self.bar.pointer.height())self.scrollee.css ({top: -self.bar.pointer.position().top*self.scrollRatio });
					if(!self.curScrollOffset)self.curScrollOffset=self.scrollee.position().top;
					return false;
				}
			});
		},
		_hoverButton:function(e){
			if(e.type=='mouseover'){
				$(this).find('.hi').fadeIn();
			}else{
				$(this).find('.hi').fadeOut();
			};
		},
		_toggle:{
			width:{
				init:function(){
					if(self.bar.data('view'))self.bar.removeData('view');
					if(settings.position=='right'){
						self.bar.container.css({left: self.bar.container.offset().left-20});
						self.bar.css({left: 20})
					}; 
					self.bar.data('view',{stat: 'hide', full: settings.size[0], park: 10, hide: 0, bound: ((settings.position=="left")?self.bar.offset().left+settings.size[0]:self.bar.offset().left)});
				},
				exec:function(e, stat){
					if(!self.bar.container.hasClass('parked')){
						if(e)e.stopPropagation();
						var a=(e)?((e.target.id==self.bar.container.attr('id')||e.currentTarget.id==self.bar.container.attr('id'))?true: false):((stat)?true:false);
						if(a){
							var b=(self.bar.data('view').stat=='park')?true:null;
							if(b&&e)var c=((c=e.clientY-(self.bar.height()* 0.5))<0)?0:((c+self.bar.height()>_dim[1])? _dim[1]-self.bar.height():c);
							self.bar.data('view').stat=(stat)?stat:((e.type=='mouseover' ||(((self.position=='left')?e.clientX<self.bar.data('view').bound:e.clientX>self.bar.data('view').bound)))?'full':'park');
							self.bar.animate({width: self.bar.data('view')[self.bar.data('view').stat]}, {queue: false, duration:250});
							if(b)self.bar.animate({top:((e)?c:self.bar.offset().top)}, {queue: false, duration:800});
						};
						return false;
					};
				}
			}
		},
		_position:{
			right:function(obj){
				return (!obj)?settings.container.offset().left+settings.container.width():obj.offset().left
			},
			left:function(obj){
				return (!obj)?settings.container.offset().left-self.bar.width():obj.offset().left
			}
		},
		getBar:function(){
			if(!$('#scrollBar').length){
				var b='<div class="scrollContainer" id="scrollContainer">'
										+	'<div class="scrollBar" id="scrollBar">'									
	        							+	'	<div id="scrollTrack">'
                    					+	'		<div id="scrollPointer" class="scrollPointer ui-widget-header"></div></div>'
										+	'	<div class="scrollBut" id="scrollUp">'
        	       						+	'		<img src="images/scroll/scrollUp.png" alt="scroll up" width="22" height="15" border="0" class="lo" />'
            	   						+	'		<img src="images/scroll/scrollUp_hi.png" alt="scroll up" width="22" height="15" border="0" class="hi" /></div>'
                    					+	'	<div class="scrollBut" id="scrollDown">'
               							+	'		<img src="images/scroll/scrollDown.png" alt="scroll down" width="22" height="15" border="0" class="lo" />'
               							+	'		<img src="images/scroll/scrollDown_hi.png" alt="scroll down" width="22" height="15" border="0" class="hi" /></div></div></div>';
				$('div#wrapper').append(b);
		//	alert(b);
				$("img[src$='.png']").not('.png').addClass('png');
				DD_belatedPNG.fix('.png');	
			};
			self.bar= $('#scrollBar');
			self.bar.container= $('#scrollContainer');
			self.bar.track= $('#scrollTrack');
			self.bar.pointer= $('#scrollPointer');
			self.bar.buttons= $('div.scrollBut');
			self.bar.up= $('#scrollUp');
			self.bar.down= $('#scrollDown');
			self.bar.container.css({	'z-index': self._topZ(), width: settings.size[0]+'px', 
												left: ((!settings.positionVal )?self._position[settings.position] .call(self.bar.container, settings.positionObj):settings.position)});		//			self.bar.container.css({left: ((!settings.positionVal )?self._position[settings.position] .call(self.bar.container, settings.positionObj):settings.position)});
			self.bar.css		({height: settings.size[1]+'px'});
			self.bar.pointer.css({width: settings.size[0]+'px'});
			self.bar.track.css({width: settings.size[0]+'px', height: settings.size[1]-(self.bar.down.find('img').attr('height')* 2)+'px'});
			self.bar.buttons.css({width: settings.size[0]+'px', height: self.bar.down.find('img').attr('height')+'px', left: '0px'});
			self.bar.down.css({ top: settings.size[1]-self.bar.down.find('img').attr('height')+'px'});
			self.trackHeight= self.bar.track.height();
			return self.bar;
		},
		getDimensions:function(){  
			return _dim=[((!jQuery.support.leadingWhitespace)?document.body.clientWidth:window.innerWidth), ((!jQuery.support.leadingWhitespace)?document.body.clientHeight:window.innerHeight)];
		},
		_topZ	:function(){
	    	var maxZ=Math.max.apply(null, $.map($('body>*'), function(e, n){if($(e).css('position')== 'absolute')return parseInt($(e).css('z-index'))|| 1;}));
	    	return maxZ;
		}
	}
	$(window).resize(
		function (e){
			try{
				if(self.bar.hasClass('live')){
					self.setScroll();
				}
			}catch(er){
			}
		});
})(jQuery);
