(function() {  

jQuery.fn.slideUI = function(config){
	
	config = jQuery.extend({
		value1: "Default value 1"
	},config);

	jQuery.extend(jQuery.easing,
	{
		easeOutQuart: function (x, t, b, c, d) {
		return -c * ((t=t/d-1)*t - 1) + b;		}
	});

	var target = this;

	var slideArea = $(target).find('.slideArea');
	var itemList  = $(target).find('.itemList');
	var item = $(target).find('.items');
	var leftButton = $(target).find('.leftButton');
	var rightButton = $(target).find('.rightButton');
	var pointer = $(target).find('.slidePointer').find('li');
	
	var areaWidth = $(slideArea).width(); // スライド表示エリアの横幅を計測
	var itemWidth = $(item).outerWidth(true); // アイテム単体の横幅を計測
	var itemLength = $(item).length; // 全アイテム数を抽出
	var itemListWidth = itemWidth*itemLength; // アイテム全体の横幅を計測

	$(itemList).css("width",itemListWidth+5);

	$(slideArea).scrollLeft(0);
	
	var itemNum = Math.floor(areaWidth / itemWidth); // 1ページ中のアイテム数の換算
	var pointerNum = Math.ceil(itemLength / itemNum);  // 全ページ数の換算

	
// ページめくりポインターの生成
	for (i=0; i<pointerNum ; i++){
		$(pointer).eq(i).addClass('on');
	}

// 最初に表示するアイテム番号を調べる
	var itemOn=0;
	for (i=0; i < itemLength; i++){ 
		if($(item).eq(i).is('.on')){
			itemOn=i; // On状態のアイテム番号
		}
	}
	
	var page;
	var leftMove;
	var speed = 800;

 // 初期状態のページ数	
	if (itemOn == 0) {
		page = 1;
	} else {
		page = Math.ceil((itemOn+1) / itemNum)+1;
	}
	$(slideArea).animate({ scrollLeft: itemWidth*itemOn }, speed, 'easeOutQuart',pointerOn(page,speed)); // 初期状態へアニメーションする

// 左ボタン処理
	$(leftButton).click(
		function (){
			if (page > 1){
				page--;
				if (itemLength - itemNum < itemNum ){
					leftMove = 0;
				} else {
					if (itemListWidth-leftMove < areaWidth) {
						speed = areaWidth*(areaWidth/(itemListWidth-leftMove))*1.2;
						pointerSpeed = 0;
					} else {
						speed = areaWidth*1.5;
						pointerSpeed = 1;
					}					
					leftMove = (page-1)*(itemNum*itemWidth);
				}

				$(slideArea).animate({ scrollLeft: leftMove }, speed, 'easeOutQuart',pointerOn(page,pointerSpeed));

			}
		}
	);

// 右ボタン処理
	$(rightButton).click(
		function (){
			if (page < pointerNum){
				
				if (itemLength - itemNum < itemNum ){
					leftMove = (itemLength - itemNum)*itemWidth;
				} else {
					leftMove = page*itemNum*itemWidth;
					if (itemListWidth-leftMove < areaWidth) {
						speed = areaWidth*(areaWidth/(itemListWidth-leftMove))*1.2;
						pointerSpeed = 0;
					} else {
						speed = areaWidth*1.5;
						pointerSpeed = 1;
					}
				}
				page++;
				$(slideArea).animate({ scrollLeft: leftMove }, speed, 'easeOutQuart',pointerOn(page,pointerSpeed));
			}
		}
	);	

// ポインター処理
	$(pointer).click(
		function(){
			var target = this;
			var select = $(pointer).index(target);

			if (itemLength - itemNum < itemNum ){
				leftMove = (itemLength - itemNum)*itemWidth;
			} else {
				leftMove = select*itemNum*itemWidth
				if (itemListWidth-leftMove < areaWidth) {
					speed = areaWidth*(areaWidth/(itemListWidth-leftMove))*1.2;
					pointerSpeed = 0;
				} else {
					speed = areaWidth*1.5;
					pointerSpeed = 1;
				}

			}
			if (page-1 > select){
				$(slideArea).animate({ scrollLeft: leftMove }, speed, 'easeOutQuart',pointerOn(select+1,pointerSpeed));
			} else {
				$(slideArea).animate({ scrollLeft: leftMove }, speed, 'easeOutQuart',pointerOn(select+1,pointerSpeed));
			}
			page = select+1;

		}
	);

// ポインターの色変更
	function pointerOn (x,y){
		var fixTimer = setTimeout(function() {
			$(pointer).removeClass('now');
			$(pointer).eq(x-1).addClass('now');
		},y);
	
	}

};
})(jQuery);