//CORE
;(function($,undefined){
	var _timer=[],
		anc=function(itm){
			if(itm.ancestor&&_fw.meth[itm.ancestor])
					return $.extend(anc(clone(_fw.meth[itm.ancestor])),itm)
			else
				return itm
		},
		_fw=$.fn._fw=function(name,opt){
			var itm
			if(_fw.meth[name])	
				itm=anc(_fw.meth[name])
			$.extend(itm,opt?opt:{})
			this.data(name,itm)
			if('init' in itm)
				itm.init.call(this,itm)
		}
	_fw.meth={}


$.extend($.fn._fw.meth,{
	"ajaxSlider":{
		navLinks:'a[rel=nav]',
		pagEv:'click',
		pagActCl:'active',
		pagArea:'a',
		changeEv:'_change',
		minSleep:300,
		nextBu:false,
		prevBu:false,
		show:false,
		afterChangeFu:function(){},
		afterAnimationCallback:function(){},
		navLinksFu:function(){
			var _=this
			$(_.navLinks).live(_.pagEv,function(){
				_.changeFu(this.href)
				return false
			})
		},
		pagPreFu:function(){
			var _=this,
				pags=_.pags=$(_.pagination),
				tagName=pags.attr('tagName'),
				itms=_.itms=[]
			pags.parent().each(function(){
				$('>'+tagName,this).each(function(i){
					var th=$(this)			
					th.data({num:i})
					itms[i]=(_.pagArea?$('>'+_.pagArea,th):th)
						.bind(_.pagEv,function(){
							_.changeFu(th.data('num'))
							return false
						})
						.attr('href')
				})
			})
		},
		pagFu:function(data){
			var _=this
			if(typeof data==typeof 0)
				_.pags.each(function(){
					var th=$(this)
					if(th.data('num')==data)
						th.addClass(_.pagActCl)						
					else
						th.removeClass(_.pagActCl)
				})
			else
				_.pags.removeClass(_.pagActCl)
			if(_.pagCallback)
				_.pagCallback()
		},
		changeFu:function(data){
			var _=this,
				url=typeof data===typeof 0?_.itms[data]:data,
				curr=_.holder.data('curr')
			if(curr==data)
				return false
			_.holder.data({curr:data})			
			$.ajax({
					url:url,
					cache:false,
					success:function(res){
								_.showFu(res)
							}
					})
			_.holder.append(_.spinner.hide().fadeIn())
			_.pagFu(data)
			_.afterChangeFu.call(_)
			_.holder.trigger(_.changeEv)
		},
		showFu:function(res){
			var _=this
			setTimeout(function(){
				_.holder
					.empty()
					.append(res)
				_.afterAnimationCallback.call(_)
			},_.minSleep)	
		},
		nextFu:function(){
			var _=this,
				curr=_.holder.data('curr')
			if(typeof curr===typeof 0)
				_.changeFu(++curr<_.itms.length?curr:0)
			else
				_.changeFu(0)
		},
		prevFu:function(){
			var _=this,
				curr=_.holder.data('curr')
			if(typeof curr===typeof 0)
				_.changeFu(--curr>=0?curr:_.itms.length-1)
			else
				_.changeFu(0)
		},
		init:function(_){
			var holder=_.holder=this
			
			if(_.navLinks)
				_.navLinksFu()
			if(_.pagination)
				_.pagPreFu()
			if(_.spinner)
				_.spinner=$(_.spinner)				
			if(_.nextBu)
				$(_.nextBu).click(function(){
					_.nextFu()
				})
			if(_.prevBu)
				$(_.prevBu).click(function(){
					_.prevFu()
				})
			if(_.show!=undefined)
				_.changeFu(_.show)
		}
	},
	cScroll:{
			sWidth:false,
			sHeight:false,
			step:'52px',
			duration:300,
			val:0,
			sleep:300,
			scrollTrackCl:'_track',
			scrollShuttleCl:'_shuttle',
			refreshEv:false,
			trackCSS:{
				width:'20px',
				position:'absolute',
				right:0,
				top:0,
				zIndex:2
			},
				shuttleCSS:{
				width:'100%',
				height:'20px',
				position:'absolute'
			},
				wrapCSS:{
				overflow:'hidden',
				position:'relative',
				zIndex:1
			},
			preFu:function(){
				var _=this
				if(_.sHeight)
					_.shuttleCSS.height=_.sHeight
				if(_.sWidth)
					_.trackCSS.width=_.sWidth
				if(_.holder.css('position')=='static')
						_.holder.css({position:'relative'})
				_.step=parseInt(_.step)
				_.wrap=$('<div>')
					.css(_.wrapCSS)
					.height(_.holder.height())
					.html(_.holder.html())
					.appendTo(_.holder.empty())
				_.track=$('<div>')
					.css(_.trackCSS)
					.css({
						top:_.shuttleCSS.height,
						height:_.wrap.height()-parseInt(_.shuttleCSS.height),
						background:'none'
					})
				_.trackWrap=$('<div>')
					.addClass(_.scrollTrackCl)
					.css(_.trackCSS)
					.height('100%')
					.append(_.track)
					.appendTo(_.holder)
				_.delta=_.wrap.attr('scrollHeight')-_.wrap.height()
				if(_.track.slider)
					_.track.slider({
						min:1,max:100,value:100,
						orientation: "vertical",
						slide:function(e,ui){
							_.delta=_.wrap.attr('scrollHeight')-_.wrap.height()
							_.wrap.attr({scrollTop:(100-ui.value)*_.delta/100})
						},
						change:function(e,ui){
							_.val=(101-ui.value)*_.delta/100
						}
					})
				_.shuttle=$('a',_.track).css(_.shuttleCSS).addClass(_.scrollShuttleCl)
				_.holder.one('mousemove',function(){
					_.strechFu()
				})
			},
			scrollFu:function(n){
				var _=this
				if(_.b)
					_.b=false,
					_.val+=n,
					_.val=_.val<0?0:_.val,
					_.val=_.val<=_.delta?_.val:_.delta,
					_.wrap
						.stop()
						.animate({
							scrollTop:_.val
							},{
							duration:_.duration,
							step:function(now){
								_.track.slider({value:100-now/_.delta*100})
							},
							complete:function(){
								_.val=$(this).attr('scrollTop')
							}
						}),
					setTimeout(function(){_.b=true},_.sleep)
			},
			downFu:function(){
				var _=this
				_.scrollFu(_.step)
			},
			upFu:function(){
				var _=this
				_.scrollFu(-_.step)
			},
			strechFu:function(){
				var _=this
				_.delta=_.wrap.attr('scrollHeight')-_.wrap.height()
				_.wrap.attr({scrollTop:(100-_.track.slider('value'))*_.delta/100})
				_.val=(101-_.track.slider('value'))*_.delta/100
			},
			refreshFu:function(){
				var _=this
				_.holder.bind(_.refreshEv,function(){
					var value=(100-_.track.slider('value'))*_.delta/100
					_.wrap.attr('scrollTop',value)
				})
			},
			wheelFu:function(){
				var _=this
				_.b=true
				_.holder.bind('mousewheel',function(e,d){
					if(d<0)
						_.downFu()							
					else
						_.upFu()
					return false
				})
			},
			init:function(_){
				var holder=_.holder=this
				_.preFu()
				if($.fn.mousewheel)
					_.wheelFu()
				if(_.refreshEv)
					_.refreshFu()
			}
		},
	"forms":{
			target:'input[type=text],input[type=password],input[type=tel],input[type=email],textarea',
			buttons:'a[rel=reset],a[rel=submit]',
			event:'click',
			backBu:false,
			afterFu:function(){},
			submitFu:function(){
				var opt=this,
					method=opt.form.attr('method')
				method=!!method?method:'get'
				$.ajax({
					url:opt.form.attr('action'),
					method:method,
					cache:false,
					data:opt.form.serializeArray(),
					success:function(r){
						opt.response=r
						opt.showFu()
					}
				})
			},
			showFu:function(){
				var opt=this
				opt.form.parent().height(opt.form.parent().height())
				opt.form.fadeOut(function(){
					opt.response=$('<div>'+opt.response+'</div>')
						.width(opt.form.width())
						.css({minHeight:opt.form.outerHeight(),width:opt.form.outerWidth()})
					if(opt.backBu)
						opt.backBu=$(opt.backBu),
						opt.response.append(opt.backBu)
					opt.form.before(opt.response)
					opt.form.parent().height('auto')
					opt.backBu.click(function(){
						opt.hideResFu()
						return false
					})
					opt.afterFu()
				})
			},
			hideResFu:function(){
				var opt=this
				opt.form.parent().height(opt.form.parent().height())
				opt.response.remove()
				opt.form.fadeIn(function(){
					opt.form.parent().height('auto')
				})
			},
			init:function(opt){
				var form=opt.form=this,
					inputs=opt.inputs=$(opt.target,form)
				inputs.each(function(){
					var th=$(this)
					th.data({defValue:th.attr('value')})
					th
						.bind('focus',function(){
							if(th.attr('value')==th.data('defValue'))
								th.attr({value:''})
						})
						.bind('blur',function(){
							if(th.attr('value')=='')
								th.attr({value:th.data('defValue')})
						})					
				})
				$(opt.buttons,form).each(function(){
					var th=$(this)
					th.bind(opt.event,function(){
						if(this.rel=='submit')
							opt.submitFu()
						else
						form[0][this.rel]()
						return false
					})
				})
				form.data({opt:opt})
			}
		},
		"shadowBox":{
			target:false,
			showEv:'click',
			fader:true,
			duration:400,
			faderCSS:{
				position:'fixed',
				left:0,
				top:0,
				bottom:0,
				right:0,
				zIndex:9999,
				opacity:.7,
				background:'#000'
			},
			boxCSS:{
				position:'fixed',
				left:'50%',
				top:'50%',
				zIndex:9999
			},
			callback:function(){},
			preFu:function(){
				var _=this
				if(_.fader)
					_.fader=$('<div>')
						.css(_.faderCSS)
						.bind(_.showEv,function(){
							_.hideFu()
							return false
						})
				_.box=$('<div>')
					.css(_.boxCSS)
					.append(_.target)
			},
			showFu:function(){
				var _=this
				_.fader
					.appendTo('body')
					.css({opacity:0})
					.stop()
					.animate({
						opacity:_.faderCSS.opacity
						},{
						duration:_.duration,
						complete:function(){
							_.box
								.appendTo('body')
								.css({
									marginLeft:-_.box.width()/2,
									marginTop:-_.box.height()/2
								})
								.hide()
								.slideDown(_.duration,function(){
									_.callback()
								})
						}						
						})
			},
			hideFu:function(){
				var _=this
				_.box.slideUp(function(){$(this).detach()})
				_.fader
					.stop()
					.animate({
						opacity:0
						},{
						duration:_.duration,
						complete:function(){
							_.fader.detach()
						}
					})
			},
			init:function(_){
				var holder=_.holder=$(this),
					target=_.target=$(_.target)
				if(!target.length)
					return false
				else
					_.preFu()
				holder
					.live(_.showEv,function(){
						_.holder.trigger('mouseout')
						_.showFu()
						return false
					})
			}
		},
		"dropDownMenu":{
			showEv:"mouseenter",
			hideEv:'mouseleave',
			items:'>li',
			visibleCl:'_visible',
			hiddenCl:'_hidden',
			expandCl:'_active',
			area:false,
			easing:'',
			duration:666,
			wait:1000,
			enable:true,
			enableData:'dropDownEnable',
			animationCallback:function(){},
			preFu:function(opt){
				opt.ul.css({opacity:0}).hide()
				return opt
			},
			showFu:function(opt){
				opt.ul					
					.show()
					.css('top',opt.ul.data('top'))
					.stop()
					.animate({
						opacity:1
						},{
						duration:opt.duration,
						easing:opt.easing,
						complete:function(){
									opt.ul.removeClass(opt.hiddenCl).addClass(opt.visibleCl)
									opt.animationCallback.call(this)
								}
						})
			},
			hideFu:function(opt){
				opt.ul
					.stop()
					.animate({
						opacity:0
						},{
						duration:opt.duration,
						easing:opt.easing,
						complete:function(){
									opt.ul.data('top',opt.ul.attr('offsetTop'))
									opt.ul.hide().removeClass(opt.visibleCl).addClass(opt.hiddenCl)
									opt.animationCallback.call(this)
								}
						})
			},
			init:function(opt){
				var ul=opt.ul=this,
					holder=opt.holder=this.parent(),
					items=opt.items=$(opt.items,ul),
					area=opt.area?holder.find(opt.area):holder,
					timer=opt._timer=_timer[_timer.length]=''
				opt=opt.preFu.call(this,opt)||opt
				holder.data(opt.enableData,opt.enable)
				area
					.bind(opt.showEv,function(){
						if(holder.data(opt.enableData))
							clearTimeout(opt._timer),
							holder.addClass(opt.expandCl),
							opt.showFu.call(ul,opt)
						return false
					})
				ul
					.bind(opt.showEv,function(){
						if(holder.data(opt.enableData))
							clearTimeout(opt._timer),
							holder.addClass(opt.expandCl),
							opt.showFu.call(ul,opt)
						return false
					})
				holder
					.bind(opt.hideEv,function(){
						if(holder.data(opt.enableData))
							opt._timer=setTimeout(function(){
								holder.removeClass(opt.expandCl)
								opt.hideFu.call(ul,opt)
							},opt.wait)
					})
			}
		}		
})
})(jQuery)

//HELPERS
;(function($){
	$.fn.extend({
		praParent:function(name){
			var th=$(this)
			while(th=th.parent())
				if(th.is(name))
					break
				else
					if(th.is('html'))
						return false
			return th
		},
		waitImgLoad:function(fn){
			var th=this,
				img=$('img',this),
				num=img.length
			img.each(function(){
				if(!this.complete)
					$(this).load(function(){
						if(!--num)
							fn.call(th)
					})					
				else
					if(!--num)
						fn.call(th)
			})
			return this
		}
	})
})(jQuery)
;(function($){
var types = ['DOMMouseScroll', 'mousewheel'];
$.event.special.mousewheel = {
	setup: function() {
		if ( this.addEventListener )
			for ( var i=types.length; i; )
				this.addEventListener( types[--i], handler, false );
		else
			this.onmousewheel = handler;
	},	
	teardown: function() {
		if ( this.removeEventListener )
			for ( var i=types.length; i; )
				this.removeEventListener( types[--i], handler, false );
		else
			this.onmousewheel = null;
	}
};
$.fn.extend({
	mousewheel: function(fn) {
		return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel");
	},	
	unmousewheel: function(fn) {
		return this.unbind("mousewheel", fn);
	}
});
function handler(event) {
	var args = [].slice.call( arguments, 1 ), delta = 0, returnValue = true;	
	event = $.event.fix(event || window.event);
	event.type = "mousewheel";	
	if ( event.wheelDelta ) delta = event.wheelDelta/120;
	if ( event.detail     ) delta = -event.detail/3;	
	// Add events and delta to the front of the arguments
	args.unshift(event, delta);
	return $.event.handle.apply(this, args);}
})(jQuery);
function clone(obj){
	if(!obj||typeof obj!=typeof {})
		return obj
	if(obj instanceof Array)
		return [].concat(obj)
	var tmp=new obj.constructor(),
		i
	for(i in obj)
		if(obj.hasOwnProperty(i))
			tmp[i]=clone(obj[i])
	return tmp
}
