/**
 * wSlide 0.1 - http://www.webinventif.fr/wslide-plugin/
 * 
 * Rendez vos sites glissant !
 *
 * Copyright (c) 2008 Julien Chauvin (webinventif.fr)
 * Licensed under the Creative Commons License:
 * http://creativecommons.org/licenses/by/3.0/
 *
 * Date: 2008-01-27
 */
(function($)
{
	$.fn.wslide=function(h)
	{
		h=jQuery.extend
		({
			width:150,
			height:150,
			pos:1,
			col:1,
			effect:'swing',
			fade:false,
			horiz:false,
			autolink:true,
			menuname:'menu1',
			timer:3000,
			duration:1500
		},h);
		function gogogo(g)
		{
			// 設定した数だけ繰り返し
			g.each(function(i)
			{
				var a=$(this);			// スライドウィンドウ部分
				var e=a.attr('id');		// スライドウィンドウのID
				if(e==undefined){e='wslide'+i}	// IDが無い場合は作る
				$(this).wrap('<div class="wslide-wrap" id="'+e+'-wrap"></div>');	// スライドウィンドウを覆うラップを作成
				a=$('#'+e+'-wrap');		// a=スライドウィンドウを覆うラップに再設定
				var b=a.find('ul li');	// スライドする要素
				var f=h.effect;			// エフェクト名
				if(jQuery.easing.easeInQuad==undefined&&(f!='swing'||f!='normal')){f='swing'}
				var g=h.width;
				var j=h.height;
				function resultante(a)
				{
					var b=a;
					b=b.split('px');
					b=b[0];
					return Number(b)
				}
				var k=g-(resultante(b.css('padding-left'))+resultante(b.css('padding-right')));	// 全部つなげた場合の横の総ピクセル数
				var l=j-(resultante(b.css('padding-top'))+resultante(b.css('padding-bottom')));	// 全部つなげた場合の縦の総ピクセル数
				var m=h.col;			// 横列の数
				if(h.horiz){m=Number(b.length+1)}	// horiz指定があれば全て横
				var n='';
				var o=Math.ceil(Number(b.length)/m);	// 縦の数
				// スライドウィンドウからはみ出ている部分は表示しない
				a.css('overflow','hidden').css('position','relative')
					.css('text-align','left').css('height',j+'px').css('width',g+'px').css('margin','0').css('padding','0');
				a.find('ul').css('position','absolute').css('margin','0')
					.css('padding','0').css('width',Number((m+0)*g)+'px').css('height',Number(o*j)+'px');
				b.css('display','block').css('overflow','hidden').css('float','left').css('height',l+'px').css('width',k+'px');
				// スライドの要素の数だけ繰り返し（ナビゲーション作成）
				b.each(function(i)
				{
					var b=a.offset();
					var c=$(this).offset();
					$(this).attr('id',e+'-'+Number(i+1)).attr('rel',Number(c.left-b.left)+':'+Number(c.top-b.top));// IDと座標を登録しておく
					n+=' <a href="#'+e+'-'+Number(i+1)+'">'+Number(i+1)+'</a>'
				});
				if(typeof h.autolink=='boolean')
				{
					// autolink=true の場合は、スライドウィンドウの真下にナビゲーション作成
					if(h.autolink)
					{
						a.after('<div class="wslide-menu" id="'+e+'-menu">'+n+'</div>')
					}
					// false の場合は指定された要素のナビゲーションを読み込み直す（これをしないとちゃんと動かない）
					else
					{
						var ht=$('#'+h.menuname).html();
						$('#'+h.menuname).html(ht)
					}
				}
				// ナビゲーション名を指定した場合
				else if(typeof h.autolink=='string')
				{
					if($('#'+h.autolink).length)
					{
						$('#'+h.autolink).html(n)
					}
					else
					{
						a.after('<div id="#'+h.autolink+'">'+n+'</div>')
					}
				}
				// ナビゲーションがクリックされたら
				var p='#'+e+'-';
				var q="";
				var mn=$('a[href*="'+p+'"]');
				function sliding(sl)
				{
					$('a[href*="'+q+'"]').removeClass("wactive");	// 一旦 wactive クラスを全て消す
					var cl = $('a[href*="'+sl+'"]');
					cl.addClass("wactive");					// クリックされたナビゲーションにだけ wactive クラスを追加
					// リンク先文字からアンカー部分を取り出す（ウィンドウのID）
					var b=cl.attr('href');
					b=b.split('#');
					b='#'+b[1];
					q=b;
					// 座標を取り出す
					var c=$(b).attr('rel');
					c=c.split(':');
					var d=c[1];
					d=-d;
					c=c[0];
					c=-c;
					// フェードイン・フェードアウト
					if(h.fade)
					{
						a.find('ul').animate
						(
							{opacity:0},h.duration/2,f,
							function()
							{
								$(this).css('top',d+'px').css('left',c+'px');
								$(this).animate({opacity:1},h.duration/2,f)
							}
						)
					}
					// エフェクト
					else
					{
						a.find('ul').animate({top:d+'px',left:c+'px'},h.duration,f)
					}
					return false
				}
				// ボタンクリック
				mn.click(function()
				{
					var cl = $(this).attr("href");
					sliding(cl);
					return false;
				});
				// 時間経過でスライド
				if(h.timer>0)
				{
					$.timer(h.timer, function (timer)
					{
						var nx = mn.filter(".wactive").next();
						if( !nx.attr("href") ) nx = mn.parent().children("a:first");
						sliding(nx.attr("href"));
						timer.reset(h.timer);
						// マウスオーバー
						mn.hover(
						function(){
							timer.stop();
						},
						function () {
							timer.reset(h.timer);
						});
						a.hover(
						function(){
							timer.stop();
						},
						function () {
							timer.reset(h.timer);
						});
					});
				}
				// 開始位置設定
				if(h.pos<=0){h.pos=1}
				$('a[href$="'+p+h.pos+'"]').addClass("wactive");
				var r=$('a[href*="'+p+'"]:eq('+Number(h.pos-1)+')').attr('href');
				r=r.split('#');
				r='#'+r[1];
				q=r;
				var s=$(r).attr('rel');
				s=s.split(':');
				var t=s[1];
				t=-t;
				s=s[0];
				s=-s;
				a.find('ul').css('top',t+'px').css('left',s+'px');
			}
		)}
		gogogo(this);
		return this
	}
})(jQuery);

jQuery.timer = function (interval, callback)
 {
 /**
  *
  * timer() provides a cleaner way to handle intervals  
  *
  *	@usage
  * $.timer(interval, callback);
  *
  *
  * @example
  * $.timer(1000, function (timer) {
  * 	alert("hello");
  * 	timer.stop();
  * });
  * @desc Show an alert box after 1 second and stop
  * 
  * @example
  * var second = false;
  *	$.timer(1000, function (timer) {
  *		if (!second) {
  *			alert('First time!');
  *			second = true;
  *			timer.reset(3000);
  *		}
  *		else {
  *			alert('Second time');
  *			timer.stop();
  *		}
  *	});
  * @desc Show an alert box after 1 second and show another after 3 seconds
  *
  * 
  */

	var interval = interval || 100;

	if (!callback)
		return false;
	
	_timer = function (interval, callback) {
		this.stop = function () {
			clearInterval(self.id);
		};
		
		this.internalCallback = function () {
			callback(self);
		};
		
		this.reset = function (val) {
			if (self.id)
				clearInterval(self.id);
			
			var val = val || 100;
			this.id = setInterval(this.internalCallback, val);
		};
		
		this.interval = interval;
		this.id = setInterval(this.internalCallback, this.interval);
		
		var self = this;
	};
	
	return new _timer(interval, callback);
 };
