jQuery(function() {
	initRandomBox();
	initAnchors();
	initInViewport();
	initMobileNav();
	initInputActive();
	initCheckBanner();
	initTypewrite();
	initPhotoCarousel();
	initTabsData();
	initServicesText();
	//initSmoothScroll();
	initParallaxScroll();
	initBodyBackground();
});

 

jQuery(window).on('load', function() {
	initTabs();
});

// initBodyBackground
function initBodyBackground(){
	jQuery('[data-background]').each(function() {
		var self = jQuery(this),
			selfValue = self.data('background'),
			targetElem = 'body';
		
		jQuery(window).scroll(function(e){
			backgroundChange();
		});
		function backgroundChange(){
			var win = jQuery(window),
				scrollTop = win.scrollTop(),
				selfHeight = self.outerHeight(),
				selfTop = self.offset().top,
				winHeight = win.outerHeight() / 2;
			
			
			if((scrollTop + winHeight) > selfTop && scrollTop < (selfHeight + selfTop)) {
				jQuery(targetElem).addClass(selfValue);
			} else {
				jQuery(targetElem).removeClass(selfValue);
			}
		}
	});
}

// initSmoothScroll
function initSmoothScroll(){
	jQuery("html").smoothWheel();
}

// initParallaxScroll()
function initParallaxScroll(){
	jQuery('.parallax-box').each(function() {
		var self = jQuery(this);
		
		jQuery(window).on('load scroll',function(e){
			parallaxScroll();
		});
		
		function parallaxScroll(){
			var win = jQuery(window),
				scrollTop = win.scrollTop(),
				selfTop = self.offset().top,
				winWidth = win.outerWidth(),
				winHeight = win.outerHeight();
				
			if(winWidth > 767 && winWidth < 992){
				var scrollSpeed = self.data('speed') / 1000;
			} else if(winWidth > 991){
				var scrollSpeed = self.data('speed') / 500;
			} else {
				var scrollSpeed = 0;
			}
			if((scrollTop + winHeight) > selfTop) {
				var topPosition = (scrollTop + winHeight) - selfTop ;
				//console.log(self);

				//self.css('top',(0-(topPosition * scrollSpeed))+'px');
				self.css({"transform": "translate3d(0px, " + (0-(topPosition * scrollSpeed)) + "px, 0px)"});
			}
		}
	});
	
	jQuery('.img-box').each(function() {
		var self = jQuery(this),
			activeClass = 'in';
		
		jQuery(window).on('load scroll',function(e){
			checkViewport();
		});
		jQuery('.tabset a').on('click', function(){
			jQuery('.tab').find('.img-box').addClass(activeClass);
		})
		function checkViewport(){
			var win = jQuery(window),
				scrollTop = win.scrollTop(),
				selfHeight = self.outerHeight(),
				selfTop = self.offset().top,
				winHeight = win.outerHeight() * 0.9;
			
			if((scrollTop + winHeight) > selfTop && scrollTop < (selfHeight + selfTop)) {
				self.addClass(activeClass);
			} else {
				//self.removeClass(activeClass);
			}
		}
	});
};

// services text row
function initServicesText(){
	jQuery('.services').each(function() {
		var holder = jQuery(this),
			
			topRow = holder.find('.services-text-row'),
			topRowText = topRow.find('.text'),
			
			article = holder.find('.article'),
			articleText = article.find('.text'),
			
			activeClass = 'active';
		
		topRowText.each(function() {
			var self = jQuery(this),
				selfOrder = self.data('text'),
				//selfPadding = self.css('padding-top').replace("px", ""),
				//selfPosition = self.offset().top + selfPadding,
				selfPosition = self.offset().top,
				releventBox = article.find('[data-text='+ selfOrder +']');
			
			self.html(article.find('[data-text='+ selfOrder +']').html());
			
			jQuery(window).on('load scroll resize orientationchange',function(){
				var win = jQuery(this),
					winHeight = win.outerHeight();
					winScroll = win.scrollTop() + (winHeight / 4),
					topRowPosition = topRow.offset().top,
					releventBoxPosition = releventBox.offset().top,
					topPositionBox = winScroll - topRowPosition;
				
				if(winScroll > topRowPosition && winScroll < releventBoxPosition){
					//self.css('top', topPositionBox);
					self.css({"transform": "translate3d(0px, " + topPositionBox + "px, 0px)"});
				}
			})
		});
		
	});
};


// Photo Carousel
function initPhotoCarousel(){
	jQuery('.photo-carousel').each(function() {
		var holder = jQuery(this),
			slideset = holder.find('.slideset'),
			slide = holder.find('.slide'),
			slideHeading = slideset.find('.slide.heading'),
			pagination = holder.find('.pagination'),
			paginationItem = pagination.find('li'),
			hoverClass = 'hover',
			activeClass = 'active';
		
		paginationItem.each(function() {
			var self = jQuery(this),
				target = self.data('photo');
			
			self.hover(
				function(){
					self.addClass(hoverClass);
					pagination.addClass(hoverClass);
					slideset.find('[data-photo="'+ target +'"]').addClass(activeClass).siblings().removeClass(activeClass);
				},
				function(){
					self.removeClass(hoverClass);
					pagination.removeClass(hoverClass);
					slideHeading.addClass(activeClass).siblings().removeClass(activeClass);
				}
			);
		});
	});
};

// check banner and add class on body
function initCheckBanner(){
	jQuery('body').each(function() {
		var holder = jQuery(this),
			heroSection = holder.find('.banner'),
			pageClass = 'page-has-banner';
		
		if(heroSection.length){
			holder.addClass(pageClass);
		}
	});
};

// Typewrite
function initTypewrite(){
	jQuery(".typewriter").typewriter({'speed':100});
};

// Tabs
function initTabsData(){
	
	jQuery('.tabset').each(function() {
		var tabs    = jQuery(this),
			tabsItem = tabs.find('li'),
			tabLink = tabs.find('a'),
			activeClass    = 'active',
			tabHiddenClass = 'js-tab-hidden';
			
		// check itms each tab
		tabLink.each(function() {
			var self       = jQuery(this),
				selfParent = self.parent(),
				selfTarget = self.attr('href'),
				totalItems = jQuery(selfTarget).find('.item').length;
			
			self.append('<sup>' + totalItems + '</sup>');
		});
	});
	jQuery('.tabset-holder').each(function() {
		var holder = jQuery(this),
			opener = holder.find('.opener'),
			dropdown = holder.find('.tabset'),
			dropdownLink = dropdown.find('a'),
			activeClass    = 'active';
		
		opener.on('click', function(e){
			e.preventDefault();
			holder.toggleClass(activeClass);
			e.stopPropagation();
		});
		dropdownLink.on('click', function(){
			holder.removeClass(activeClass);
		});
		jQuery(window).click(function(e){
			if(!$(e.target).closest(dropdown).length){
				holder.removeClass(activeClass);
			}
		})
	});
}

// Tabs
function initTabs(){
	jQuery('.tabset').tabset({
		tabLinks: 'a',
		addToParent: true,
		defaultTab: true,
		animSpeed: 500,
		autoHeight: true
	});
}

// for Mobile Navigation

function initMobileNav(){
	jQuery('body').each(function() {
		var holder = jQuery(this),
			navOpener = holder.find('.nav-opener'),
			navigation = holder.find('#nav'),
			menuActiveClass = 'nav-active';
		
		navOpener.on('click', function(e){
			e.preventDefault();
			holder.toggleClass(menuActiveClass);
			e.stopPropagation();
		})
		
		jQuery(window).click(function(event){
			if( !$(event.target).closest(navigation).length){
				holder.removeClass(menuActiveClass);
			}
		})
	});
}
// init Search Reset
function initInputActive(){
	jQuery('.form-group').each(function() {
		var holder = jQuery(this),
			input = holder.find('input, textarea'),
			focusClass = 'focus',
			activeClass = 'active';
		
		input.on('change keyup', function(){
			checkInputVal();
		});
		input.on('focus', function(){
			holder.addClass(focusClass);
		});
		input.on('blur', function(){
			holder.removeClass(focusClass);
		});
		
		checkInputVal();
		function checkInputVal(){
			if(input.val().length) {
				holder.addClass(activeClass);
			} else {
				holder.removeClass(activeClass);
			}
		}
	});
}

// random element init
function initRandomBox() {
	jQuery('.random-images .image').randomBox({
		type: 'random'
	});
	jQuery('.random-slogans .text').randomBox({
		type: 'random'
	});
}

// initialize smooth anchor links
function initAnchors() {
	new SmoothScroll({
		anchorLinks: '.scroll-arrows a[href^="#"]:not([href="#"])',
		extraOffset: 0,
		activeClasses: 'parent',
		anchorActiveClass: 'd-none',
		sectionActiveClass: '',
		wheelBehavior: 'none',
		animDuration: 4000
	});
}

// in view port init
function initInViewport() {
	jQuery('.viewport-item, .viewport-section').itemInViewport({
		activeClass: 'in',
	});
}


(function($, w, d, undefined) {

	function typewriter() {

		// Globals 
		var self = this, speed;

		function init(element, options) {
						// Set Globals
			var str;
			var indice = -1;

			self.options = $.extend( {}, $.fn.typewriter.options, options );
			$currentElement = $(element);
			elementStr = $currentElement.text().replace(/\s+/g, ' ');
			dataSpeed  = $currentElement.data("speed") || self.options.speed;
			console.log(dataSpeed);
			$currentElement.empty();
			var showText = setInterval(
				function(){
					if (indice++ < elementStr.length) {
						$currentElement.append(elementStr[indice]);
					}else{
						clearInterval(showText);
					}
				}, dataSpeed);
			// self.animation = setInterval(function(){animate_calification()}, 20);
		}

		
		return {
			init: init
		}
	}

	// Plugin jQuery
	$.fn.typewriter = function(options) {
		return this.each(function () {
			var writer =  new typewriter();
			writer.init(this, options);
			$.data( this, 'typewriter', writer);
		});
	};

	$.fn.typewriter.options = {
		'speed' : 300
	};

})(jQuery, window, document);

// jQuery RandomBox plugin
;(function($){
	$.fn.randomBox = function(o) {
		var options = $.extend({
			type: 'random'
		},o);

		// show random block
		if(options.type === 'random') {
			var randomIndex = getRandomInt(0, this.length - 1);
			this.hide().eq(randomIndex).show();
		}
		// randomly sort blocks
		else {
			var holder = this.parent();
			var elements = this;
			var elementsCount = elements.length;
			if (elementsCount > 1) {
				elements.remove();
				var indices = [];
				for (i = 0; i < elementsCount; i++) {
					indices[indices.length] = i;
				}
				indices = indices.sort(getRandomOrd);
				$(indices).each(function(j,k) {
					holder.append(elements.eq(k));
				});
			}
		}
		return this;
	}
	function getRandomInt(min, max) {
		return Math.floor(Math.random() * (max - min + 1)) + min;
	}
	function getRandomOrd() {
		return(Math.round(Math.random())-0.5);
	}
}(jQuery));

// tabset plugin
!function(t,s){"use strict";function a(t,s){this.$holder=t,this.options=s,this.init()}a.prototype={init:function(){this.$tabLinks=this.$holder.find(this.options.tabLinks),this.setStartActiveIndex(),this.setActiveTab(),this.options.autoHeight&&(this.$tabHolder=t(this.$tabLinks.eq(0).attr(this.options.attrib)).parent()),this.makeCallback("onInit",this)},setStartActiveIndex:function(){var t,s=this.getClassTarget(this.$tabLinks),a=s.filter("."+this.options.activeClass),i=this.$tabLinks.filter("["+this.options.attrib+'="'+location.hash+'"]');this.options.checkHash&&i.length&&(a=i),t=s.index(a),this.activeTabIndex=this.prevTabIndex=-1===t?this.options.defaultTab?0:null:t},setActiveTab:function(){var s=this;this.$tabLinks.each(function(a,i){var e=t(i),n=s.getClassTarget(e),o=t(e.attr(s.options.attrib));a!==s.activeTabIndex?(n.removeClass(s.options.activeClass),o.addClass(s.options.tabHiddenClass).removeClass(s.options.activeClass)):(n.addClass(s.options.activeClass),o.removeClass(s.options.tabHiddenClass).addClass(s.options.activeClass)),s.attachTabLink(e,a)})},attachTabLink:function(t,s){var a=this;t.on(this.options.event+".tabset",function(t){t.preventDefault(),a.activeTabIndex===a.prevTabIndex&&a.activeTabIndex!==s&&(a.activeTabIndex=s,a.switchTabs()),a.options.checkHash&&(location.hash=jQuery(this).attr("href").split("#")[1])})},resizeHolder:function(t){var s=this;t?(this.$tabHolder.height(t),setTimeout(function(){s.$tabHolder.addClass("transition")},10)):s.$tabHolder.removeClass("transition").height("")},switchTabs:function(){var t=this,s=this.$tabLinks.eq(this.prevTabIndex),a=this.$tabLinks.eq(this.activeTabIndex),i=this.getTab(s),e=this.getTab(a);i.removeClass(this.options.activeClass),t.haveTabHolder()&&this.resizeHolder(i.outerHeight()),setTimeout(function(){t.getClassTarget(s).removeClass(t.options.activeClass),i.addClass(t.options.tabHiddenClass),e.removeClass(t.options.tabHiddenClass).addClass(t.options.activeClass),t.getClassTarget(a).addClass(t.options.activeClass),t.haveTabHolder()?(t.resizeHolder(e.outerHeight()),setTimeout(function(){t.resizeHolder(),t.prevTabIndex=t.activeTabIndex,t.makeCallback("onChange",t)},t.options.animSpeed)):t.prevTabIndex=t.activeTabIndex},this.options.autoHeight?this.options.animSpeed:1)},getClassTarget:function(t){return this.options.addToParent?t.parent():t},getActiveTab:function(){return this.getTab(this.$tabLinks.eq(this.activeTabIndex))},getTab:function(s){return t(s.attr(this.options.attrib))},haveTabHolder:function(){return this.$tabHolder&&this.$tabHolder.length},destroy:function(){var s=this;this.$tabLinks.off(".tabset").each(function(){var a=t(this);s.getClassTarget(a).removeClass(s.options.activeClass),t(a.attr(s.options.attrib)).removeClass(s.options.activeClass+" "+s.options.tabHiddenClass)}),this.$holder.removeData("Tabset")},makeCallback:function(t){if("function"==typeof this.options[t]){var s=Array.prototype.slice.call(arguments);s.shift(),this.options[t].apply(this,s)}}},t.fn.tabset=function(s){var i=Array.prototype.slice.call(arguments),e=i[0],n=t.extend({activeClass:"active",addToParent:!1,autoHeight:!1,checkHash:!1,defaultTab:!0,animSpeed:500,tabLinks:"a",attrib:"href",event:"click",tabHiddenClass:"js-tab-hidden"},s);return n.autoHeight=n.autoHeight,this.each(function(){var t=jQuery(this),o=t.data("Tabset");"object"==typeof s||void 0===s?t.data("Tabset",new a(t,n)):"string"==typeof e&&o&&"function"==typeof o[e]&&(i.shift(),o[e].apply(o,i))})}}(jQuery,jQuery(window));

//! SmoothScroll module
!function(t,o){var n,i,e,s=t(window),r="onwheel"in document||document.documentMode>=9?"wheel":"mousewheel DOMMouseScroll";function a(o,s,a){var c;document.body&&(s="number"==typeof s?{duration:s}:s||{},n=n||t("html, body"),c=s.container||n,"number"==typeof o&&(o={top:o}),i&&e&&i.off(r,e),s.wheelBehavior&&"none"!==s.wheelBehavior&&(e=function(t){"stop"===s.wheelBehavior?(c.off(r,e),c.stop()):"ignore"===s.wheelBehavior&&t.preventDefault()},i=c.on(r,e)),c.stop().animate({scrollLeft:o.left,scrollTop:o.top},s.duration,function(){e&&c.off(r,e),t.isFunction(a)&&a()}))}function c(o){this.options=t.extend({anchorLinks:'a[href^="#"]',container:null,extraOffset:null,activeClasses:null,easing:"swing",animMode:"duration",animDuration:800,animSpeed:1500,anchorActiveClass:"anchor-active",sectionActiveClass:"section-active",wheelBehavior:"stop",useNativeAnchorScrolling:!1},o),this.init()}c.prototype={init:function(){this.initStructure(),this.attachEvents(),this.isInit=!0},initStructure:function(){var o=this;this.container=this.options.container?t(this.options.container):t("html,body"),this.scrollContainer=this.options.container?this.container:s,this.anchorLinks=jQuery(this.options.anchorLinks).filter(function(){return jQuery(o.getAnchorTarget(jQuery(this))).length})},getId:function(t){try{return"#"+t.replace(/^.*?(#|$)/,"")}catch(t){return null}},getAnchorTarget:function(o){var n=this.getId(t(o).attr("href"));return t(n.length>1?n:"html")},getTargetOffset:function(t){var o=t.offset().top;return this.options.container&&(o-=this.container.offset().top-this.container.prop("scrollTop")),"number"==typeof this.options.extraOffset?o-=this.options.extraOffset:"function"==typeof this.options.extraOffset&&(o-=this.options.extraOffset(t)),{top:o}},attachEvents:function(){var o=this;if(this.options.activeClasses&&this.anchorLinks.length){this.anchorData=[];for(var n=0;n<this.anchorLinks.length;n++){var i=jQuery(this.anchorLinks[n]),e=o.getAnchorTarget(i),r=null;t.each(o.anchorData,function(t,o){o.block[0]===e[0]&&(r=o)}),r?r.link=r.link.add(i):o.anchorData.push({link:i,block:e})}this.resizeHandler=function(){o.isInit&&o.recalculateOffsets()},this.scrollHandler=function(){o.refreshActiveClass()},this.recalculateOffsets(),this.scrollContainer.on("scroll",this.scrollHandler),s.on("resize.SmoothScroll load.SmoothScroll orientationchange.SmoothScroll refreshAnchor.SmoothScroll",this.resizeHandler)}this.clickHandler=function(t){o.onClick(t)},this.options.useNativeAnchorScrolling||this.anchorLinks.on("click",this.clickHandler)},recalculateOffsets:function(){var o=this;t.each(this.anchorData,function(t,n){n.offset=o.getTargetOffset(n.block),n.height=n.block.outerHeight()}),this.refreshActiveClass()},toggleActiveClass:function(t,o,n){t.toggleClass(this.options.anchorActiveClass,n),o.toggleClass(this.options.sectionActiveClass,n)},refreshActiveClass:function(){var o=this,n=!1,i=this.container.prop("scrollHeight"),e=this.scrollContainer.height(),r=this.options.container?this.container.prop("scrollTop"):s.scrollTop();this.options.customScrollHandler?this.options.customScrollHandler.call(this,r,this.anchorData):(this.anchorData.sort(function(t,o){return t.offset.top-o.offset.top}),t.each(this.anchorData,function(t){var s=o.anchorData.length-t-1,a=o.anchorData[s],c="parent"===o.options.activeClasses?a.link.parent():a.link;r>=i-e?s===o.anchorData.length-1?o.toggleActiveClass(c,a.block,!0):o.toggleActiveClass(c,a.block,!1):!n&&(r>=a.offset.top-1||0===s)?(n=!0,o.toggleActiveClass(c,a.block,!0)):o.toggleActiveClass(c,a.block,!1)}))},calculateScrollDuration:function(t){return"speed"===this.options.animMode?Math.abs(this.scrollContainer.scrollTop()-t.top)/this.options.animSpeed*1e3:this.options.animDuration},onClick:function(t){var o=this.getAnchorTarget(t.currentTarget),n=this.getTargetOffset(o);t.preventDefault(),a(n,{container:this.container,wheelBehavior:this.options.wheelBehavior,duration:this.calculateScrollDuration(n)}),this.makeCallback("onBeforeScroll",t.currentTarget)},makeCallback:function(t){if("function"==typeof this.options[t]){var o=Array.prototype.slice.call(arguments);o.shift(),this.options[t].apply(this,o)}},destroy:function(){var o=this;this.isInit=!1,this.options.activeClasses&&(s.off("resize.SmoothScroll load.SmoothScroll orientationchange.SmoothScroll refreshAnchor.SmoothScroll",this.resizeHandler),this.scrollContainer.off("scroll",this.scrollHandler),t.each(this.anchorData,function(t){var n=o.anchorData.length-t-1,i=o.anchorData[n],e="parent"===o.options.activeClasses?i.link.parent():i.link;o.toggleActiveClass(e,i.block,!1)})),this.anchorLinks.off("click",this.clickHandler)}},t.extend(c,{scrollTo:function(t,o,n){a(t,o,n)}}),o.SmoothScroll=c}(jQuery,this);

// jQuery In Viewport plugin
!function(e,o){"use strict";var t,i=(t={},{init:function(){var i=this;this.addHolder("win",o),o.on("load.blockInViewport resize.blockInViewport orientationchange.blockInViewport",function(){e.each(t,function(o,t){i.calcHolderSize(t),e.each(t.items,function(e,o){i.calcItemSize(e,o)})})})},addHolder:function(o,i){var l=this,s={holder:i,items:{},props:{height:0,scroll:0}};t[o]=s,i.on("scroll.blockInViewport",function(){l.calcHolderScroll(s),e.each(s.items,function(e,o){l.calcItemScroll(e,o)})}),this.calcHolderSize(t[o])},calcHolderSize:function(e){var o=window.self!==e.holder[0]?e.holder.offset():0;e.props.height=e.holder.get(0)===window?window.innerHeight||document.documentElement.clientHeight:e.holder.outerHeight(),e.props.offset=o?o.top:0,this.calcHolderScroll(e)},calcItemSize:function(e,o){o.offset=o.$el.offset().top-o.holderProps.props.offset,o.height=o.$el.outerHeight(),this.calcItemScroll(e,o)},calcHolderScroll:function(e){e.props.scroll=e.holder.scrollTop()},calcItemScroll:function(o,t){var i,l,s,r=t.holderProps.props;switch(t.options.visibleMode){case 1:l=t.offset<r.scroll+r.height/2||t.offset+t.height<r.scroll+r.height,i=t.offset>r.scroll||t.offset+t.height>r.scroll+r.height/2;break;case 2:l=l||t.offset<r.scroll+r.height/2||t.offset+t.height/2<r.scroll+r.height,i=i||t.offset+t.height/2>r.scroll||t.offset+t.height>r.scroll+r.height/2;break;case 3:l=l||t.offset<r.scroll+r.height/2||t.offset<r.scroll+r.height,i=i||t.offset+t.height>r.scroll||t.offset+t.height>r.scroll+r.height/2;break;default:l=l||t.offset<r.scroll+r.height/2||t.offset+Math.min(t.options.visibleMode,t.height)<r.scroll+r.height,i=i||t.offset+t.height-Math.min(t.options.visibleMode,t.height)>r.scroll||t.offset+t.height>r.scroll+r.height/2}i&&l?t.state||(t.state=!0,t.$el.addClass(t.options.activeClass).trigger("in-viewport",!0),(t.options.once||e.isFunction(t.options.onShow)&&t.options.onShow(t))&&delete t.holderProps.items[o]):(s=t.offset<r.scroll+r.height&&t.offset+t.height>r.scroll,!t.state&&!isNaN(t.state)||s||(t.state=!1,t.$el.removeClass(t.options.activeClass).trigger("in-viewport",!1)))},addItem:function(o,i){var l="item"+this.getRandomValue(),s={$el:e(o),options:i},r=s.$el.closest(i.holder),h=r.data("in-viewport-holder");r.length?h||(h="holder"+this.getRandomValue(),r.data("in-viewport-holder",h),this.addHolder(h,r)):h="win",s.holderProps=t[h],t[h].items[l]=s,this.calcItemSize(l,s)},getRandomValue:function(){return(1e5*Math.random()).toFixed(0)},destroy:function(){o.off(".blockInViewport"),e.each(t,function(o,t){t.holder.off(".blockInViewport"),e.each(t.items,function(e,o){o.$el.removeClass(o.options.activeClass),o.$el.get(0).itemInViewportAdded=null})}),t={}}});i.init(),e.fn.itemInViewport=function(o){return o=e.extend({activeClass:"in-viewport",once:!0,holder:"",visibleMode:1},o),this.each(function(){this.itemInViewportAdded||(this.itemInViewportAdded=!0,i.addItem(this,o))})}}(jQuery,jQuery(window));


/**
 * Created by IntelliJ IDEA.
 *
 * User: phil
 * Date: 15/11/12
 * Time: 11:04 AM
 *
 */
(function ($) {

	var self = this, container, running=false, currentY = 0, targetY = 0, oldY = 0, maxScrollTop= 0, minScrollTop, direction, onRenderCallback=null,
			fricton = 0.96, // higher value for slower deceleration
			vy = 0,
			stepAmt = 1,
			minMovement= 0.1,
			ts=0.1;

	var updateScrollTarget = function (amt) {
		targetY += amt;
		vy += (targetY - oldY) * stepAmt;
	  
		oldY = targetY;


	}
	var render = function () {
		if (vy < -(minMovement) || vy > minMovement) {

			currentY = (currentY + vy);
			if (currentY > maxScrollTop) {
				currentY = vy = 0;
			} else if (currentY < minScrollTop) {
					vy = 0;
					currentY = minScrollTop;
				}
		   
			container.scrollTop(-currentY);

			vy *= fricton;
			
		 //   vy += ts * (currentY-targetY);
			// scrollTopTweened += settings.tweenSpeed * (scrollTop - scrollTopTweened);
			// currentY += ts * (targetY - currentY);

			if(onRenderCallback){
				onRenderCallback();
			}
		}
	}
	var animateLoop = function () {
		if(! running)return;
		requestAnimFrame(animateLoop);
		render();
		//log("45","animateLoop","animateLoop", "",stop);
	}
	var onWheel = function (e) {
		//e.preventDefault();
		var evt = e.originalEvent;
	   
		var delta = evt.detail ? evt.detail * -1 : evt.wheelDelta / 40;
		var dir = delta < 0 ? -1 : 1;
		if (dir != direction) {
			vy = 0;
			direction = dir;
		}

		//reset currentY in case non-wheel scroll has occurred (scrollbar drag, etc.)
		currentY = -container.scrollTop();
		
		updateScrollTarget(delta);
	}

	/*
	 * http://paulirish.com/2011/requestanimationframe-for-smart-animating/
	 */
	window.requestAnimFrame = (function () {
		return  window.requestAnimationFrame ||
				window.webkitRequestAnimationFrame ||
				window.mozRequestAnimationFrame ||
				window.oRequestAnimationFrame ||
				window.msRequestAnimationFrame ||
				function (callback) {
					window.setTimeout(callback, 1000 / 60);
				}; 
			  
				
	})();

	/*
	 * http://jsbin.com/iqafek/2/edit
	 */
	var normalizeWheelDelta = function () {
		// Keep a distribution of observed values, and scale by the
		// 33rd percentile.
		var distribution = [], done = null, scale = 30;
		return function (n) {
			// Zeroes don't count.
			if (n == 0) return n;
			// After 500 samples, we stop sampling and keep current factor.
			if (done != null) return n * done;
			var abs = Math.abs(n);
			// Insert value (sorted in ascending order).
			outer: do { // Just used for break goto
				for (var i = 0; i < distribution.length; ++i) {
					if (abs <= distribution[i]) {
						distribution.splice(i, 0, abs);
						break outer;
					}
				}
				distribution.push(abs);
			} while (false);
			// Factor is scale divided by 33rd percentile.
			var factor = scale / distribution[Math.floor(distribution.length / 3)];
			if (distribution.length == 500) done = factor;
			return n * factor;
		};
	}();


	$.fn.smoothWheel = function () {
		//  var args = [].splice.call(arguments, 0);
		var options = jQuery.extend({}, arguments[0]);
		return this.each(function (index, elm) {

			if(!('ontouchstart' in window)){
				container = $(this);
				container.bind("mousewheel", onWheel);
				container.bind("DOMMouseScroll", onWheel);

				//set target/old/current Y to match current scroll position to prevent jump to top of container
				targetY = oldY = container.get(0).scrollTop;
				currentY = -targetY;
				
				minScrollTop = container.get(0).clientHeight - container.get(0).scrollHeight;
				if(options.onRender){
					onRenderCallback = options.onRender;
				}
				if(options.remove){
					log("122","smoothWheel","remove", "");
					running=false;
					container.unbind("mousewheel", onWheel);
					container.unbind("DOMMouseScroll", onWheel);
				}else if(!running){
					running=true;
					animateLoop();
				}

			}
		});
	};


})(jQuery);