(function($){

$.fn.extend({

navs:function(opt){

	if(opt===undefined)

		opt={}

	var ret=this

	this.each(function(i){

		var th=$(this),

			data=th.data('_navs'),

			root={

			  	"undefined":function(){

					var _={

						enable:true,

						hover:false,

						event:'click',

						activeCl:'active',

						navLink:'a[data-type=nav]',

						backLink:'a[data-type=back]',

						closeLink:'a[data-type=close]',

						targeted:true,

						blockSame:true,

						preFu:function(){

							_.li.each(function(i){

								var th=$(this)

								th.data({num:i})

								if(th.hasClass(_.activeCl))

									_.n=i,

									_.curr=th,

									_.hoverIn(th)

							})

						},

						refreshFu:function(){

							var _=this

							_.li.each(function(i){

								var th=$(this)

								if(th.hasClass(_.activeCl))

									_.curr=th,

									_.n=th.data('num')

							})

							if(_.curr)

								_.hoverIn(_.curr),

								_.li.not(_.curr).each(function(){

									_.hoverOut($(this))

								})

							

						},

						changeFu:function(n){

							if(n==_.n&&_.blockSame)

								return false

							if(!_.enable)

								return false

							_.n=n

							_.li.removeClass(_.activeCl)

							_.li.eq(n).addClass(_.activeCl)

							_.refreshFu()

							_.onChangeFu(n)

						},

						onChangeMas:[],

						onChangeFu:function(param){

							$(_.onChangeMas).each(function(){

								if(typeof this=='function')

									this.call(_.me,param,_)

							})

						},						

						nextFu:function(){

							var n=_.n

							_.changeFu(++n<_.li.length?n:0)

						},

						prevFu:function(){

							var n=_.n

							_.changeFu(--n>=0?n:_.li.length-1)

						},

						controlsFu:function(){

							_.li.each(function(i){

								var li=$(this)

								$('>a',li)

									.bind(_.event,function(){

										_.changeFu(i)

										return false

									})									

							})

						},

						navFu:function(){

							$(_.navLink)

								.live(_.event,function(){

									if(_.targeted)

										if(!_.me.is($(this.target)))

											return false

									if(!_.enable)

										return false

									_.prev=_.n

									_.n=-1

									_.curr=false

									_.li.removeClass(_.currCl)

									_.li.each(function(){_.hoverOut($(this))})

									_.onChangeFu($(this).attr('href'))

									return false

								})

							$(_.backLink)

								.live(_.event,function(){

									if(_.targeted)

										if(!_.me.is($(this.target)))

											return false

									_.changeFu(_.prev)

									return false

								})

							$(_.closeLink)

								.live(_.event,function(){

									_.prev=_.n

									_.n=-1

									_.curr=false

									_.li.removeClass(_.currCl)

									_.li.each(function(){_.hoverOut($(this))})

									_.onChangeFu('close')

								})

						},

						closeFu:function(){

							_.prev=_.n

							_.n=-1

							_.curr=false

							_.li.removeClass(_.currCl)

							_.li.each(function(){_.hoverOut($(this))})

							_.onChangeFu('close')

						},

						hoverFu:function(){

							_.li.each(function(i){

								$('>a',this)

									.bind('mouseenter',function(){

										if(_.hover&&!_.li.eq(i).hasClass(_.activeCl))

											_.hoverIn(_.li.eq(i))

									})

									.bind('mouseleave',function(){

										if(_.hover&&!_.li.eq(i).hasClass(_.activeCl))

											_.hoverOut(_.li.eq(i))										

									})

							})

						},

						init:function(){

							_.me=this

							_.ul=$('>ul',_.me)

							_.li=$('>li',_.ul)

							_.preFu()

							_.controlsFu()

							_.navFu()

							_.hoverFu()

							_.hoverOut(_.li)

							_.refreshFu()

						},

						hoverIn:function(){},

						hoverOut:function(){}

					}

					if(opt)

						$.extend(_,opt)

					if(!data)

						_.init.call(th),

						th.data({_navs:data=_})

					else

						_=data

					ret=_

				},

				"object":function(){

					$.extend(data,opt)					

				},

				"function":function(){

					data.onChangeMas.push(opt)					

				},

		  		"number":function(){

					data.changeFu(opt)					

				},

				"string":function(){

					if(opt=='next'||opt=='prev'||opt=='close')

						({

						next:function(){

							data.nextFu()

						},

						prev:function(){

							data.prevFu()

						},

						close:function(){

							data.closeFu()

						}

						})[opt]()

				},

				"boolean":function(){

					data.enable=opt

				}

			},

			fu=root[typeof opt]

		

		if(!data&&opt!=undefined)

			root['undefined'](opt)

		if(data.enable||opt===true)

			fu()

	})

	return ret

}

})

})(jQuery)
