/*BOOM_ADD_FILE

X.addFile('category.js',{
	fullpath:_BOOM_DEBUG_===true?'csjs/category.source.js':'csjs/category.source.js',
	requires:['mike.js'],
	mods:['list-show','category']
});

BOOM_ADD_FILE*/


X.add('list-show',function(C){
	var $=jQuery,
		mark=C.mark,
		ListShow,
		CONF={
			//获得数据的接口
			url:'',
			pageWrap:'.pagelist',
			listWrap:'.content',
			
			//拼装html的函数
			assemble:null,
			
			//加载中的函数
			loading:null,
			
			onPageCut:null
		}
		
	ListShow=function(container,conf){
		this._init(container,conf);
	};
	
	ListShow.CONF=CONF;
	
	ListShow.prototype={
		_init:function(container,conf){
		
			this.opt=C.merge(CONF,conf);
			
			var opt=this.opt,
				pageWrap=container.find(opt.pageWrap),
				listWrap=container.find(opt.listWrap);
				
			this.id=mark(container,C.guid());
			
			this.pageWrap=mark(pageWrap,C.guid());
			
			this.listWrap=mark(listWrap,C.guid());
			
			this._pageHandler=$.proxy(this,'_pageHandler');
			
			this._callback=$.proxy(this,'_callback');
			
			this._bindPage();
			

		},
		
		//取数据
		get:function(page){
			var url=this.opt.url;

			$.ajax({
				url:url,
				data:this._sendData()+'&page='+page,
				dataType:'json',
				success:this._callback
			});
			
			this.page=page;
			this._loading(true);
		},
		
		_sendData:function(){
			return ''
		},
		
		_callback:function(data){
			
			this._loading(false);

			var check=this.opt.check?this.opt.check:this._check;
			if(check(data)===false){
				return;
			}

			//装载
			if(this.opt.assemble){
				this.opt.assemble(data);
			}
			else{
				this._assemble(data);
			}
			
			//更新翻页
			this._updatePage(this.page,this.pageTotal);
			
			if(this.opt.onPageCut){
				this.opt.onPageCut.call(this);
			}
		},
		
		//装载html
		//将总页数给this.pageTotal
		_assemble:function(){
			
		},
		
		//检查是否正确返回
		_check:function(data){
			if(data.flag!='1'){
				C.indicate(data.msg,'error',3000);
				return false;
			}
		},
		//加载中
		_loading:function(state){
			if(this.opt.loading){
				return this.opt.loading(state);
			}
			var container=C.mark(this.id),
				loading=container.find('.loading');
			
			if(state==true){
				loading.css('height',container.height()||50);
				loading.css('display','block');
			}
			else{
				loading.css('display','none');
			}
		},
		//更新分页
		_updatePage:function(page,pageTotal){
			var wrap=C.mark(this.pageWrap);
			
			wrap.html(new C.BasePage(page,pageTotal).getHTML());
		},
		//分页handler
		_pageHandler:function(event){
			var target=event.target;
			
			if(!$.nodeName(target,'a')){
				return;
			}
			event.stopPropagation();
			event.preventDefault();
			
			var target=$(target),
				href=target.attr('href'),
				number=href.substring(href.lastIndexOf('#')+1),
				page=Number(number);
			
			this.get(page);
		},
		//添加分页事件
		_bindPage:function(){
			var pageWrap=C.mark(this.pageWrap);
			
			pageWrap.bind('click',this._pageHandler);
		}
	};
	
	C.ListShow=ListShow;
	
	
},{requires:['page']});



X.add('category',function(C){
	var $=jQuery,
		mark=C.mark,
		guid=C.guid,
		ListShow=C.ListShow;
	
	var ITEM_CLS='categoryItem',
		CATE_WRAP_CLS='categoryFilter',
		CHECKED_CLS='checked',
		DISABLED_CLS='disabled',
		
		CONTAINER_CLS='categoryContainer',
		PAGE_WRAP_CLS='pagelist',
		ITEM_COUNT_CLS='category-itemCount',
		PPI_CLS='category-ppi',
		SORT_SELECT_CLS='category-sort-select',
		CLEAR_FILTER_CLS='js_clearFilter',
		CLEAR_ALL_FILTER_CLS='js_clearAllFilter';
		
		
	var container=$('.'+CONTAINER_CLS).eq(0),
		
		container=mark(container,guid());
		
		
	var _query_={
			ppi : 20,
			sort:0
		},

		
		_xhr_,
		
		_categoryShow_,
		
		_filters_=[],
		
		_lastFilter_;
	
	
	function CategoryShow(container,conf){
		CategoryShow.superclass._init.call(this,container,{
			url:'category.php'
		});
	}
	
	C.extend(CategoryShow,ListShow,{
		_sendData:function(page){
			return 'category='+C.JSON.stringify(_query_);
		},
		_assemble:function(data){

			var ar=data.content.items,
				len=ar.length,
				i=0,
				obj,
				fragment=document.createDocumentFragment(),
				li,
				wrap=mark(this.listWrap);
				
			for(;i<len;i++){
				obj=ar[i];
				li=$('<li>').html('<div class="nail"><a href="'+obj.link+'"><img src="'+obj.pic+'" /></a></div>\
				<dl>\
				<dt><a href="'+obj.link+'">'+obj.title+'</a></dt>\
				<dd class="price">￥'+obj.price+'</dd>\
				</dl>');
				fragment.appendChild(li[0]);
			}
			

			wrap.empty();
			wrap.append(fragment);
			
			$('.'+ITEM_COUNT_CLS).html(data.content.itemTotal);
			
			setPPI.call(this,data.content.itemTotal);
			
			this.pageTotal=data.content.pageTotal;
			
			this._resetFilter(data);
		},
		_resetFilter:function(data){
			var status=data.content.status,
				items=$('a.'+ITEM_CLS);
			
			items.each(function(){
				var elem=$(this),
					n=elem.attr('data-name'),
					v=elem.attr('data-value');
				
				if(n==_lastFilter_){
					return;
				}
				
				if(status[n]&&$.inArray(v,status[n])>-1){
					
					elem.removeClass(DISABLED_CLS);
				}
				else if(!elem.hasClass(CHECKED_CLS)){
					elem.addClass(DISABLED_CLS);
				}
			});
		}
	});
	
	
	
		
	function setPPI(total){
		var ppi=_query_.ppi,
			con=$('#'+this.id).find('.'+PPI_CLS);
		
		if(total>=100){
			con.html(ppi==20?'每页显示100个':'每页显示20个');
		}
		else{
			con.html(ppi==20?'显示全部':'每页显示20个');
		}
	}
	
	
	
	function delItem(ar,item){
		var len=ar.length,
			i=0;
			
		for(;i<len;i++){
			if(ar[i]==item){
				ar.splice(i,1);
				i--;
			}
		}
	}
	
	function request(){
		
		if(!_categoryShow_){
			_categoryShow_=new CategoryShow(mark(container));
		}
		
		_categoryShow_.get(1);
		
		
		
	}
	
	//判断是否显示清除所有
	function checkClear(){
		var ar=_filters_,
			len=ar.length,
			i=0,
			btn=$('.'+CATE_WRAP_CLS).find('.'+CLEAR_ALL_FILTER_CLS);
		
		for(;i<len;i++){			
			if(mark(ar[i]).data('filter')){
				btn.css('display','block');
				return;
			}
		}
		
		btn.css('display','none');
	}
	
	//清除某个filter
	function clearFilter(id){
		
		var box=mark(id);
		var key='';
		
		//silder
		if(box.find('div.category-price-range').length>0){
			var range=box.data('range');
			box.find('div.category-price-range').slider({values:[range[0],range[1]]});
			box.find('.slider-range-left').html(range[0]);
			box.find('.slider-range-right').html(range[1]);
		}
		else{
			box.find('.'+ITEM_CLS).each(function(){
				var elem=$(this);
				if(!key){
					key=elem.attr('data-name');
				}
				elem.removeClass(CHECKED_CLS);
			});			
		}
		

		
		if(key&&_query_[key]){
			_query_[key]=[];
		}
		
		box.data('filter',false);
		box.find('.'+CLEAR_FILTER_CLS).css('display','none');	
	}
	
	//筛选
	$('.'+CATE_WRAP_CLS).bind('click',function(event){
		var target=event.target;
		
		if(!$.nodeName(target,'a')){
			return;
		}
		
		target=$(target);
		
		if(!target.hasClass(ITEM_CLS)){
			return;
		}
		
		event.preventDefault();
		event.stopPropagation();
		
		if(target.hasClass(DISABLED_CLS)){
			return;
		}
		
		var t=target.attr('data-name'),
			v=target.attr('data-value');
		
		if(!_lastFilter_){
			_lastFilter_=t;
		}
		
		if(target.hasClass(CHECKED_CLS)){
			delItem(_query_[t],v);
			request();
			target.removeClass(CHECKED_CLS);
		}
		else{
			_query_[t].push(v);
			target.addClass(CHECKED_CLS);
			request();		
		}
		
		
		//显示clear按钮
		var box=mark(target.attr('data-box')),
			clearLink=box.find('.'+CLEAR_FILTER_CLS);
			
		clearLink.css('display','none');
		box.data('filter',false);
		box.find('a.'+ITEM_CLS).each(function(){
			var elem=$(this);
			if(elem.hasClass(CHECKED_CLS)){
				clearLink.css('display','block');
				box.data('filter',true);
			}
		});
		
		checkClear();
		
	});
	
	//清除筛选
	$('.'+CATE_WRAP_CLS).bind('click',function(event){
		var target=event.target;
		
		if(!$.nodeName(target,'a')){
			return;
		}
		
		target=$(target);
		
		if(!target.hasClass(CLEAR_FILTER_CLS)){
			return;
		}
		
		event.preventDefault();
		event.stopPropagation();

		
		clearFilter(target.attr('data-box'));
		request();
		checkClear();			
	});
	
	//清楚所有
	$('.'+CLEAR_ALL_FILTER_CLS).bind('click',function(event){
		event.stopPropagation();
		event.preventDefault();
		
		$.each(_filters_,function(index,item){
			clearFilter(item);
		});
		
		checkClear();
		
		request();
	});
	
	
	//每页显示多少个
	$('.'+PPI_CLS).bind('click',function(event){
		event.preventDefault();
		event.stopPropagation();
		
		_query_.ppi=_query_.ppi==20?100:20;
		
		request();		
	});
	
	
	//排序
	$('.'+SORT_SELECT_CLS).bind('change',function(event){
		var select=$(this);
		
		_query_.sort=select.val();
		
		request();
	});

	
	
	
	
	//[{type:1,title:'类型',name:'color',items:[{text:'红',value:'red'}]}]
	function _createFilter(data){
		var len=data.length,
			i=0,
			fragment=document.createDocumentFragment(),
			elem=null,
			item,
			itemId;
			
		for(;i<len;i++){
			item=data[i];
			itemId=C.guid();
			switch (item.type){
				case '1':
					elem=_createFilterScroll(item,itemId);
					break;
				case '2':
					elem=_createFilterShort(item,itemId);
					break;
				case '3':
					elem=_createFilterSlider(item,itemId);
					break;
			}
			
			fragment.appendChild(elem);
			_filters_.push(itemId);
		}
		
		$('.'+CATE_WRAP_CLS).append(fragment);
		
		request();
	}
	
	
	function _createList(data,type,id){
		var elem=$('<div>',{className:'category','id':id});
		var strAr=['<div class="hd fix"><h3><a class="on">'+data.title+'</a></h3> <a href="#" class="clear '+CLEAR_FILTER_CLS+'" data-name="data.name" data-box="'+id+'">清除</a></div>\
			<div class="bd">\
			<ul class="catelist '+(type?'catelist-scroll':'catelist-short fix')+'">'
			];
			
		var ar=data.items,
			len=ar.length,
			i=0,
			item;
			
		for(;i<len;i++){
			item=ar[i];
			strAr.push('<li><a href="#" class="categoryItem" data-name="'+data.name+'"   data-value="'+item.value+'" data-box="'+id+'" >'+item.text+'</a></li>')
		}
		
		strAr.push('</ul></div>');
		elem.html(strAr.join(''));
		return elem[0];
	}
	
	function _createFilterShort(data,id){
		_query_[data.name]=[];
		return _createList(data,false,id);
	}
	
	function _createFilterScroll(data,id){
		_query_[data.name]=[];
		return _createList(data,true,id);
	}
	
	function _createFilterSlider(data,id){
		_query_[data.name]=[];
		
		var elem=$('<div>',{className:'category',id:id});
		var str='<div class="hd fix" ><h3><a class="on">'+data.title+'</a></h3> <a href="#" class="clear '+CLEAR_FILTER_CLS+'" data-name="data.name" data-box="'+id+'">清除</a></div>\
				<div class="bd">\
				<div class="slider">\
				<div class="bar category-price-range">\
				</div>\
				<p class="v1">￥(<span class="slider-range-left">'+data.range[0]+'</span>)</p>\
				<p class="v2">￥(<span class="slider-range-right">'+data.range[1]+'</span>)</p>\
				</div>';	
				
		
		elem.html(str);	
		
		elem.data({range:[data.range[0],data.range[1]]});
		
		elem.find('div.category-price-range').slider({
			range:true,
			min:data.range[0],
			max:data.range[1],
			values:[data.range[0],data.range[1]],
			slide:function(event,ui){
				elem.find('.slider-range-left').html(ui.values[0]);
				elem.find('.slider-range-right').html(ui.values[1]);
				_query_[data.name][0]=ui.values[0];
				_query_[data.name][1]=ui.values[1];
				
			},
			stop:function(event,ui){
				var clearLink=elem.find('.'+CLEAR_FILTER_CLS).css('display','block');
				var range=elem.data('range');
			
				if(range[0]==ui.values[0]&&range[1]==ui.values[1]){
					elem.data('filter',false);
					clearLink.css('display','none');
				}
				else{
					elem.data('filter',true);
					clearLink.css('display','block');
				}
				checkClear();
				request();
			}
		});	
		
		return elem[0];
	}
	
	
	C.Category={
		filter:_createFilter,
		request:request
	}
	
},{requires:['json','list-show','jquery-ui.js']});

