var dw = {
	//BEGIN application variables
	vars: {
		labels:{},
		skuObj: [],
		filteredSkuList: [],
		sorting: [],
		pidList: [],
		pagePidList: [],
		pagePidIds: [],
		catPidList: [],
		currentPage: false,
		totalPages: 0,
		view: 0
	},
	
	compChart: {
		recWidth: 173,
		pages: 0,
		width: 0,
		currentPage: 0
	},
	
	cache: {
			pids: {},
			promos:{}
	},
	
	comp: [],
	
	//END application variables
	
	//BEGIN sorting order functions
	addToSortingOrder: function(filter){
		var valTest = Utility.valTest(dw.vars.sorting,filter)
		if(!valTest){
			dw.vars.sorting.push(filter)
			//alert(dw.vars.sorting)
			dw.resortFilterOrder()
		}
	},
	
	removeFromSortingOrder: function(filter){
		var valTest = Utility.valTest(dw.vars.sorting,filter)
		if(valTest){
			dw.vars.sorting.splice(valTest.key,1)
			//alert(dw.vars.sorting)
			dw.resortFilterOrder()
		}
	},
	
	resortFilterOrder: function(){
		var count = dw.vars.sorting.length
		var fullSort = new Array()
		fullSort = fullSort.concat(dw.vars.sorting)
		for(var i=0; i<dw.config.filters.length; i++){
			var valTest = Utility.valTest(dw.vars.sorting,i)
			if(!valTest){
				fullSort.push(i)
			}
		}
		var temp = new Array()
		for(var i=0; i<fullSort.length; i++){
			var valTest = Utility.valTest(dw.config.filters,fullSort[i],'stackOrder')
			temp = temp.concat(dw.config.filters[valTest.key])
		}
		dw.config.filters = temp
	},
	//END sorting order functions
	
	getSkus: function(){
		Utility.callService({
			service:dw.config.services.getSkus.href,
			method:dw.config.services.getSkus.method,
			pars:Utility.getPars(dw.config.services.getSkus.pars),
			onComplete:function(response){
				
				dw.vars.skuObj = Utility.evalJSON(response.responseText);
				
				dw.buildBuckets()
			}
		});
	},
	
	buildBuckets: function(){
		
		for(var i=0; i<dw.vars.skuObj.length; i++){
			var sku = dw.vars.skuObj[i]
			sku.status = 1
			
			//refactor sku object
			if(dw.config.refactorSku){
				sku = dw.config.refactorSku(sku)
			}
		}
		
		//alert('start')
		for(var i=0; i<dw.config.filters.length; i++){
			var filter = dw.config.filters[i]
			
			filter.fiteredValues = []
			filter.options = {}
			filter.stackOrder = i
			
			dw.vars.labels[filter.filter] = {}
			
			for(var j=0; j<dw.vars.skuObj.length; j++){
				var sku = dw.vars.skuObj[j]
				if(sku[filter.filter]){
					//create options array
					filter.options[sku[filter.filter]] = sku.status
					if(filter.optionsDisplayFn){
						var v = filter.optionsDisplayFn(sku[filter.optionsDisplay])
					}else{
						var v = sku[filter.optionsDisplay]
					}
					//populate labels array
					dw.vars.labels[filter.filter][sku[filter.filter]] = v
				}
			}
			filter.optionsCount = Utility.countObject(filter.options)
			
			//sort options
			if(filter.optionsSortParameter && filter.optionsSortFn){
				var tempAry = []
				
				for(p in filter.options){
					if(filter.optionsFilterFn && filter.optionsSortParameter=='filter'){
						tempAry.push({filter:filter.optionsFilterFn(p), optionsDisplay:dw.vars.labels[filter.filter][p]}) 
					}else{
						tempAry.push({filter:p, optionsDisplay:dw.vars.labels[filter.filter][p]})
					}
				}	
				
				filter.optionsSortFn(tempAry);
				
				filter.options = {}
				for(var j=0; j<tempAry.length; j++){
					filter.options[tempAry[j].filter] = 1
				}
			}
		}
		
		if(dw.config.firstTimeLoad || dw.config.everyTimeLoad){
			if(dw.config.firstTimeLoad){
				if(document.cookie.indexOf("firstLoad=true") == -1){
					dw.config.firstTimeLoad()
					//set cookie
					document.cookie = "firstLoad=true"
				}else{
					if(dw.config.everyTimeLoad){
						dw.config.everyTimeLoad()
					}
				}
			}else{
				dw.config.everyTimeLoad()
			}
		}
		
		//sort skus
		if(dw.config.sorters){
			dw.config.sorters[0].fn(dw.vars.skuObj)
		}
		
		dw.updatePage()
	},
	//END one time onload functions
	
	//BEGIN update results methods
	parsePids: function(obj){
		
		obj = Utility.evalJSON(obj.responseText)
		
		//obj = obj.responseText.exe()
		for(var i=0; i<obj.products.length; i++){
			var data = obj.products[i]
			
			//load in cache
			dw.cache.pids[data.productId] = data
			
			//go to view display function
			var pidRec = dw.config.views[dw.vars.view].displayFunction(dw.vars.pagePidList[i],data)
			
			//append to holder
			
			$('pidHolder').appendChild(pidRec)
			
			//add transition
			dw.effects.loadingPid(pidRec)
		}
	},
	
	updatePage: function(){
		//pids to compare
		dw.skuList()
		dw.displayHtml()
		
		//determine and set view
		var rec = Utility.valGreater(dw.config.views,dw.vars.pidList.length,'min')
		dw.vars.view = rec.key
		
		//update html count of filtered pids
		dw.effects.incrementNumber()
		
		dw.vars.totalPages = Math.ceil(dw.vars.pidList.length / dw.config.views[dw.vars.view].recSet)
		
		//build pagination
		if(dw.config.paginationType == "static"){
			dw.vars.currentPage = 0;
			dw.config.paginationFn()
		}
		
		//call for pids
		dw.goToPage(0)
	},
	
	goToPage: function(page){
		
		dw.vars.pagePidList = []
		dw.vars.pagePidIds = []
		dw.vars.currentPage = page
		
		//build pagination
		if(dw.config.paginationType == "reload"){
			dw.config.paginationFn()
		}
		
		//clear page
		$('pidHolder').innerHTML = '';
		$('om_inner').innerHTML = '';
		
		var getThese = []
		for(var i=0; i<dw.config.views[dw.vars.view].recSet; i++){
			var pidId = dw.vars.pidList[(page*dw.config.views[dw.vars.view].recSet)+i]
			if(pidId){
			
				dw.vars.pagePidIds.push(pidId)
				//check cache for pids
				if(dw.cache.pids[pidId]){
					//go to view display function
					var pidRec = dw.config.views[dw.vars.view].displayFunction(i,dw.cache.pids[pidId])
					//append to holder
					$('pidHolder').appendChild(pidRec)
					
					// add pids from cache to 'other matches'
					es.buildOtherMatches(dw.cache.pids[pidId])
					
				}else{
					getThese.push(pidId)
					dw.vars.pagePidList.push(i)
				}
			}
		}
		
		if(getThese.length>0){
			Utility.callService({
				service:dw.config.services.getPids.href,
				method:dw.config.services.getPids.method,
				pars:Utility.getPars(dw.config.services.getPids.pars,{productId:getThese}),
				onComplete:dw.parsePids
			});
		}
		
		//close comp chart window
		if($('compGrid').style.display == 'block'){
			dw.hideChart()	
		}else{
			//close promo window
			if($('promo').style.display == 'block'){
				dw.effects.closePromo()	
			}
	
			//close express shop if open
			if($('holder2').style.display == 'block'){
				hideExpressShop()
			}
		}
	},
	//END update results methods
	
	//BEGIN dropzone functions
	drag: function(obj){
		
		var ins = new drag(obj,{onStart:function(){
			obj.parentNode.style.zIndex = 2;
			//close promo window
			if($('promo').style.display == 'block'){
				dw.effects.closePromo()	
			}
		},onStop: function(){
			var pos = ins.getEndingPosition()
			var ele = ins.getElement()
			
			if(Position.within($('dropZone'), pos[0], pos[1])){
				//if within the dropzone
				dw.comp.push(ele.pidId)
				dw.rebuildDropZone()
				
				//destroy element
				ele.parentNode.style.zIndex = 1
				ele.parentNode.removeChild(ele)
				
				//hide chart icon
				if($('chart_'+ele.pidId)){
					$('chart_'+ele.pidId).style.display = "none"
				}
				
			}else{
				//outside the drop zone
				var start = ins.getStartingPosition()
				Move.XY(ele,{Y:start[0],X:start[1], timerVar:new String().uId(), onComplete:function(){
					obj.parentNode.style.zIndex = 1;
				}})
			}
		}});
	},
	
	rebuildDropZone: function(){
		//close promo window
		if($('promo').style.display == 'block'){
			dw.effects.closePromo()	
		}

		//close express shop if open
		if($('holder2').style.display == 'block'){
			hideExpressShop()
		}
		
		var area = $('compRecArea')
		var chart = $('viewChart')
		var clear = $('clearChart')
		var backImage = $('dropZone')
		
		area.innerHTML = '';
		
		if(dw.comp.length > 0){
			//show stuff
			if(dw.comp.length > 1){
				chart.style.display = 'block'
			}else{
				chart.style.display = 'none'
			}
			clear.style.display = 'inline'
			backImage.className = ''
			
			//rebuild html
			for(var i=0; i<dw.comp.length; i++){
				//var rec = $E('div',area,{className:'rec',html:views.getTitle(dw.cache.pids[dw.comp[i]],22)})
				var rec = $E('div',area,{className:'rec',html:'<img src="'+views.pullImage(dw.cache.pids[dw.comp[i]],'main','T50')+'" />'})
				rec.carry = dw.comp[i]
				rec.onclick = function(){
					//remove from comp array
					dw.removeCompItem(this.carry)
					//rebuild dropzone
					dw.rebuildDropZone()
				}
			}
			$E('div',area,{className:'clear', html:'&nbsp;'})
		}else{
			//hide stuff
			backImage.className = 'backOn'
			chart.style.display = 'none'
			clear.style.display = 'none'
		}
		
	},
	
	removeCompItem: function(id){
		var valTest = Utility.valTest(dw.comp,id)
		dw.comp.splice(valTest.key,1)
		
		//add drag ability and icon if on same page as item
		var valTest = Utility.valTest(dw.vars.pagePidIds,id)
		if(valTest){
			var data = dw.cache.pids[id]
			var ele = $('pidRec-'+id)
			
			//add Icon
			if(dw.vars.view == 0){
				views.addChart(data,ele)
			}else{
				views.addChart(data,$C('content',ele)[0])
			}
			
			//Decide what view to rewrite
			dw.config.views[dw.vars.view].dragReplaceFunction(data,ele)
			
		}
	},
	
	clearChart: function(){
		//close compgrid if open
		if($('compGrid').style.display == 'block'){
			dw.hideChart()
		}
		
		var times = []
		times = times.concat(dw.comp)
		for(var i=0; i<times.length; i++){
			dw.removeCompItem(times[i])
		}
		dw.rebuildDropZone()
	},
	//END dropzone functions
	
	//BEGIN comp grid functions
	viewChart: function(){
		//close promo window
		if($('promo').style.display == 'block'){
			dw.effects.closePromo()	
		}

		//close express shop if open
		if($('holder2').style.display == 'block'){
			hideExpressShop()
		}
		
		var chart = $('compGrid')
		chart.style.display = 'block'
		dw.effects.showCompGrid(chart)
		dw.populateChart()
	},
	
	populateChart: function(){
		//clear content
		$('cgTR').innerHTML = ''
		$('cgTR').style.left = '0px'
		$('cgBL').innerHTML = ''
		$('cgBR').innerHTML = ''
		$('cgBR').style.left = '0px'
		
		var ele = $('compGridViewing')
		ele.innerHTML = ''
		ele.style.display = 'none'
		
		dw.compChart.width = dw.comp.length*dw.compChart.recWidth
		dw.compChart.pages = Math.floor(dw.comp.length/dw.config.scrollItemsBy)
		dw.compChart.currentPage = 1
		
		//build top images area
		var cgTR = $('cgTR')
		cgTR.style.width = dw.compChart.width + 'px'
		var table = document.createElement('table')
		table.cellSpacing = 0
		table.cellPadding = 0
		var tbody = document.createElement('tbody')
		var tr = document.createElement('tr')
		
		var expression = new RegExp("^.+Compare$")
		var attsAry = []
		
		for(var i=0; i<dw.comp.length; i++){
			//get the data
			var data = dw.cache.pids[dw.comp[i]]
			
			//build compgrid attributes array
			if(dw.config.useCompareFlag){
				for(p in data){
					if(expression.test(p) == true){
						if(data[p] == 'true'){
							var f = p.replace('Compare','')
							var valtest = Utility.valTest(attsAry,f,'filter')
							if(!valtest){
								attsAry.push({filter:f, label:data[f + 'Label'], seq:data[f + 'DisplaySequence']})
							}
						}
					}
				}
			}
			
			var td = document.createElement('td')
			var div = document.createElement('div')
			div.className = 'holder'
				
				//title
				var title = $E('div',div,{className:'link',html:views.getTitle(data)})
				title.pidId = data.productId
				title.promoId = data.promoId
				title.onclick = function(){
					showProductPopup(this.pidId,dw.config.services.getExpressShop.pars.categoryID,'0', this.promoId, 'wide');
				}
				
				//price
				$E('div',div,{html:views.getPrice(data)})
				
				//remove from list
				var remove = $E('div',div,{className:'removeFromChart',html:'Remove from Chart'})
				remove.style.padding = '0 0 6px 0'
				remove.carry = data.productId
				remove.onclick = function(){
					if(dw.comp.length>1){
						dw.removeCompItem(this.carry)
						dw.rebuildDropZone()
						dw.populateChart()
					}else{
						dw.clearChart()
					}
				}
				
				//build image
				var imgBack = document.createElement('div')
				imgBack.className = 'imgBack'
				var img = document.createElement('img')
				img.src = views.pullImage(data,'main','THN')
				imgBack.appendChild(img)
				imgBack.pidId = data.productId
				imgBack.promoId = data.promoId
				imgBack.onclick = function(){
					showProductPopup(this.pidId,dw.config.services.getExpressShop.pars.categoryID,'0', this.promoId, 'wide');
				}
			
			div.appendChild(imgBack)
			td.appendChild(div)
			tr.appendChild(td)
		}
		tbody.appendChild(tr)
		table.appendChild(tbody)
		cgTR.appendChild(table)
		
		//add fixed atts
		if(dw.config.compareAttributes){
			for(var i=0; i<dw.config.compareAttributes.length; i++){
				attsAry.push(dw.config.compareAttributes[i])
			}
		}
		attsAry.ASC('seq')
		
		//build bottom attributes area
		
		//bottom left
		var node = $('cgBL')
		var table = document.createElement('table')
		table.cellSpacing = 0
		table.cellPadding = 0
		var tbody = document.createElement('tbody')
		
		for(var i=0; i<attsAry.length; i++){
			var tr = document.createElement('tr')
			var td = document.createElement('td')
			//alt record class
			if(i/2 == Math.ceil(i/2)){
				tr.className = 'alt'
			}
			td.innerHTML = attsAry[i].label
			tr.appendChild(td)
			tbody.appendChild(tr)
		}
		
		table.appendChild(tbody)
		node.appendChild(table)
		
		//bottom right
		var cgBR = $('cgBR')
		cgBR.style.width = dw.compChart.width + 'px'
		var table = document.createElement('table')
		table.cellSpacing = 0
		table.cellPadding = 0
		var tbody = document.createElement('tbody')
		
		for(var i=0; i<attsAry.length; i++){
			var tr = document.createElement('tr')
			if(i/2 == Math.ceil(i/2)){
					tr.className = 'alt'
			}
			for(var j=0; j<dw.comp.length; j++){
				//get the data
				var data = dw.cache.pids[dw.comp[j]]
				var td = document.createElement('td')
				var div = document.createElement('div')
				div.className = 'holder'
					
					if(dw.cache.pids[dw.comp[j]][attsAry[i].filter]){
						div.innerHTML = dw.cache.pids[dw.comp[j]][attsAry[i].filter]
					}else{
						div.innerHTML = '-'
					}
					
				td.appendChild(div)
				tr.appendChild(td)
			}
			tbody.appendChild(tr)
		}
		table.appendChild(tbody)
		cgBR.appendChild(table)
		
		// make the cells the same height
		Utility.matchCellHeights($('cgBL').getElementsByTagName('table')[0],cgBR.getElementsByTagName('table')[0])
		
		//add pagination controls
		if(dw.comp.length>3){
			ele.style.display = 'block'
			
			//viewing
			$E('div',ele,{className:'viewing',html:'Viewing:'})
			$E('div',ele,{id:'compGridPages', className:'cDarkBlue', html:'1-3'})
			$E('div',ele,{className:'of',html:'of '+dw.comp.length})
			
			//go left
			var control = document.createElement('div')
			control.innerHTML = 'Previous'
			control.id = 'compGridPreviousButton'
			control.className = 'leftArrowOff'
			control.onclick = null
			ele.appendChild(control)
			
			//go right
			var control = document.createElement('div')
			control.innerHTML = 'Next'
			control.id = 'compGridNextButton'
			control.className = 'rightArrowOn'
			control.onclick = dw.nextButtonOnclick
			ele.appendChild(control)
		}
	},
	
	previousButtonOnclick: function(){
	 	dw.compChart.currentPage --
		dw.updatePageDisplay()
		var moveto = -1*((dw.compChart.currentPage-1)*(dw.compChart.recWidth*dw.config.scrollItemsBy))
		dw.effects.moveCompGridLeft(moveto)
	},
	
	nextButtonOnclick: function(){
		dw.compChart.currentPage ++
		dw.updatePageDisplay()
		var moveto = -1*((dw.compChart.currentPage-1)*(dw.compChart.recWidth*dw.config.scrollItemsBy))
		var maxto = -1*((dw.compChart.recWidth*dw.comp.length)-(dw.compChart.recWidth*3))
		if(moveto < maxto){
			moveto = maxto
		}
		dw.effects.moveCompGridRight(moveto)
	},
	
	updatePageDisplay: function(){
		var low = ((dw.compChart.currentPage-1)*dw.config.scrollItemsBy)+1
		if(dw.comp.length<(low+dw.config.scrollItemsBy)){
			var html = (dw.comp.length - 2) +'-'+dw.comp.length
		}else{
			var html = low +'-' + (low + 2);
			
			/*if(dw.comp[(((dw.compChart.currentPage-1)*dw.config.scrollItemsBy)+2)]){
				var html = low+'-'+ (((dw.compChart.currentPage-1)*dw.config.scrollItemsBy)+3)
			}else if(dw.comp[(((dw.compChart.currentPage-1)*dw.config.scrollItemsBy)+1)]){
				var html = low+'-'+(((dw.compChart.currentPage-1)*dw.config.scrollItemsBy)+2)
			}else{
				var html = low
			}*/
		}
		$('compGridPages').innerHTML = html
	},
	
	hideChart: function(){
		var chart = $('compGrid')
		dw.effects.hideCompGrid(chart)
		
		//close promo window
		if($('promo').style.display == 'block'){
			dw.effects.closePromo()	
		}

		//close express shop if open
		if($('holder2').style.display == 'block'){
			hideExpressShop()
		}
	},
	
	//END comp grid functions
	
	//BEGIN FILTERING METHODS
	rebuildFilter: function(key){
		
		if(Ajax.activeRequestCount==0){
			
			var filter = dw.config.filters[key]
			
			//rebuild filtered values array
			filter.fiteredValues = []
			for(p in filter.options){
				if(filter.options[p] == 2){
					filter.fiteredValues.push(p)
				}
			}
			
			if(filter.fiteredValues.length == 0){
				//remove from sorting order
				dw.removeFromSortingOrder(filter.stackOrder)
			}else{
				//add to sorting order
				dw.addToSortingOrder(filter.stackOrder)
			}
			
			//refilter list
			dw.filterSkus()
		
		}else{
			setTimeout(function(){
				dw.rebuildFilter(key)			
			},100);
		}
		
	},
	
	filterSkus: function(){
		
		for(var i=0; i<dw.vars.skuObj.length; i++){
			dw.vars.skuObj[i].status = 1
		}
		
		//alert('start')
		for(var i=0; i<dw.config.filters.length; i++){
			var filter = dw.config.filters[i]
			
			if(i==0){
				for(p in filter.options){
					if(filter.options[p] != 2){
						filter.options[p] = 1
					}
				}
			}else{
				var removeFlag = false
				for(p in filter.options){
					var flag = false
					loopster:
					for(var j=0; j<dw.vars.skuObj.length; j++){
						var sku = dw.vars.skuObj[j]
						if(sku.status == 1){
							
							if(p == sku[filter.filter]){
								flag = true
								break loopster
							}
						}
					}
					if(!flag){
						filter.options[p] = 0
						
						if(filter.fiteredValues.length > 0){
							var valTest = Utility.valTest(filter.fiteredValues,p)
							if(valTest){
								removeFlag = true
								filter.fiteredValues.splice(valTest.key,1)
							}
						}
					}else if(filter.options[p] != 2){
						filter.options[p] = 1
					}
				}
				
				if(removeFlag){
					if(filter.fiteredValues.length > 0){
						
						var valTest = Utility.valTest(dw.vars.sorting,dw.config.filters[i].stackOrder)
						if(valTest){
							dw.removeFromSortingOrder(dw.config.filters[i].stackOrder)
						}
					}
				}
			}
			
			if(filter.fiteredValues.length == 0 || filter.fiteredValues.length == filter.optionsCount){
				
				dw.removeFromSortingOrder(filter.stackOrder)
				//set filtered values array to 0
				//filter.fiteredValues = []
			}else{
				
				var j=0
				for(p in filter.options){
					if(filter.options[p] != 0){
						j++
					}
				}
				
				//make empty if full
				if(filter.fiteredValues.length == j){
					//remove from sorting order
					dw.removeFromSortingOrder(filter.stackOrder)
					
				}else if(filter.fiteredValues.length != filter.optionsCount){
					dw.addToSortingOrder(filter.stackOrder)
				}
				
				for(var j=0; j<dw.vars.skuObj.length; j++){
					var sku = dw.vars.skuObj[j]
					
					if(sku.status != 0){
						var valTest = Utility.valTest(filter.fiteredValues,sku[filter.filter])
						
						if(valTest == false){
							sku.status = 0
						}
					}
				}
			}
			
		}
		
		//alert('finish')
		dw.updatePage()
	},
	
	//build unique sku and pid lists
	skuList: function(){
		dw.vars.filteredSkuList = []
		dw.vars.pidList = []
		for(var i=0; i<dw.vars.skuObj.length; i++){
			if(dw.vars.skuObj[i].status == 1){
				dw.vars.filteredSkuList.push(dw.vars.skuObj[i].sid)
				
				var test = Utility.valTest(dw.vars.pidList,dw.vars.skuObj[i].pid)
				if(!test){
					dw.vars.pidList.push(dw.vars.skuObj[i].pid)
				}
			}
		}
	},
	//END FILTERING METHODS
	
	//BEGIN html representation of filters object
	displayHtml: function(){
		$('filterHolder').innerHTML = ''
		
		for(var i=0; i<dw.config.filters.length; i++){
			
			var ii = i
			if(dw.config.stickyFilters){
				var valTest = Utility.valTest(dw.config.filters,i,'stackOrder')
				ii = valTest.key
			}
			 
			var filter = dw.config.filters[ii]
			
			var filterHld = document.createElement('div')
			filterHld.className = 'filterHld'
			
			var filterRec = document.createElement('div')
			
			filterRec.className = 'filterRec'
			if(filter.holderClass){
				Element.addClassName(filterRec,filter.holderClass)
			}
			
			//filter name
			var filterName = $E('h3',filterRec,{html:'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'+filter.displayName})
			filterName.carry = ii
			filterName.onclick = function(){
				dw.effects.toggleFilterDisplay(this.parentNode.parentNode,this.carry)
			}
			
			//info tooltip
			if(filter.info){
				var info = dw.config.filters[ii].info
				var obj = $E('div',filterRec,{className:'info'})
				var ins = new tip(obj,{dataString:info})
			}
			
			//display check mark
			if(filter.fiteredValues.length > 0){
				var seq = Utility.valTest(dw.vars.sorting,filter.stackOrder)
				if(seq){
					$E('span',filterName,{html:seq.key+1})
				}
			}
			
			//for check boxes
			if(filter.displayType == 'checkBox'){
			
				var node = document.createElement('div');
				node.className = 'contents';
				
				for(p in filter.options){
					
					//determine className
					var className = 'active'
					if(filter.options[p] == 2){
						className = 'checked'
					}else if(filter.options[p] == 0){
						className = 'disabled'
					}
					
					var html = dw.vars.labels[filter.filter][p]
					
					var opt = $E('div',node,{html:'&nbsp;&nbsp;&nbsp;&nbsp;'+html,className:className})
					opt.option = p
					opt.status = filter.options[p]
					opt.key = ii
					if(filter.options[p] != 0){
						opt.onclick = function(){
							dw.rebuildCheckBox(this.option, this.status, this.key)
						}
					}
				}
				var space = $E('div',node,{html:'.'})
				space.style.visibility = 'hidden'
				space.style.height = '1px'
				space.style.fontSize = '1px'
				space.style.lineHeight = '1px'
				space.style.display = 'block'
				space.style.clear = 'both'
				
				filterRec.appendChild(node);
				filterHld.appendChild(filterRec);
				$('filterHolder').appendChild(filterHld);
			
			}else if(filter.displayType == 'rangeSlider'){
				//for silders
				var wrapper = document.createElement('div');
				wrapper.className = 'contents';
				
				var node = document.createElement('div')
				node.className = "sliderHolder X"
				node.id = 'id-'+ii
				
				var html = filter.displayName + ': <span></span> - <span></span>'
				$E('div',node,{className:'label',html:html})
				
				var sliderOuter = $E('div',node,{className:'sliderBack'})
				var slider = $E('div',sliderOuter,{className:'slider'})
				
				$E('div',node,{className:'pre'})
				$E('div',node,{className:'post'})
				
				wrapper.appendChild(node)
				filterRec.appendChild(wrapper)
				filterHld.appendChild(filterRec)
				$('filterHolder').appendChild(filterHld)
				
				dw.buildRangeSlider(slider,filter,ii)
			}
			
			//check load state
			if(filter.loadState == 'open'){
				
				//alert(filterRec.offsetHeight)
				filterName.className = 'open'
				setHeight(filter,filterHld,filterRec)
			}else if(filter.loadState !== 'closed'){
				filterName.className = 'open'
				filterHld.style.height = filter.loadState
			}
		}
		
		function setHeight(filter,filterHld,filterRec){
			setTimeout(function(){
				filterHld.style.height = parseInt(filterRec.offsetHeight) + 'px'
				filter.loadState = filterHld.style.height
			},10)
		}
		
		//build controls
		var node = $E('div',$('filterHolder'),{html:'Expand All',className:'plus'})
		node.onclick = function(){
			var nodes = $('filterHolder').getElementsByTagName('h3')
			for(var i=0; i<nodes.length; i++){
				dw.effects.toggleFilterDisplay(nodes[i].parentNode.parentNode,i,'all')
			}
		}
		
		var node = $E('div',$('filterHolder'),{html:'Collapse All',className:'minus'})
		node.onclick = function(){
			var nodes = $('filterHolder').getElementsByTagName('h3')
			for(var i=0; i<nodes.length; i++){
				dw.effects.toggleFilterDisplay(nodes[i].parentNode.parentNode,i,'none')
			}
		}
		
		var node = $E('div',$('filterHolder'),{html:'Reset',className:'reset'})
		node.onclick = function(){
			for(var i=0; i<dw.config.filters.length; i++){
				var filter = dw.config.filters[i]
				
				filter.fiteredValues = []
				for(p in filter.options){
					filter.options[p] = 1
				}
			}
			for(var i=0; i<dw.vars.skuObj.length; i++){
				dw.vars.skuObj[i].status = 1
			}
			dw.updatePage()
		}
		
	},
	
	rebuildCheckBox: function(option, status, key){
		
		//rebuild display attribute
		if(status == 2){
			dw.config.filters[key].options[option] = 1
		}else{
			dw.config.filters[key].options[option] = 2
		}
		
		dw.rebuildFilter(key)
		
	},
	
	buildRangeSlider: function(slider,data,i){
		//convert options object to array
		var lowFlag = false
		var highFlag = false
		var valuesAry = []
		var counter = 0
		for(p in data.options){
			if(data.options[p] != 0){
				if(lowFlag === false){
					if(data.options[p] == 2){
						lowFlag = counter
						highFlag = counter
					}
				}else{
					if(data.options[p] == 2){
						highFlag = counter
					}
				}
				valuesAry.push({name:dw.vars.labels[data.filter][p],value:p})
				counter++
			}
		}
		
		var lowIndex = false
		if(lowFlag !== false){
			lowIndex = lowFlag
		}
		
		var highIndex = false
		if(highFlag !== false){
			highIndex = highFlag
		}
		
		var ins = new Wizzle.slider(slider,{type:'range', values:valuesAry, onStopL:function(){
			calc()
		},onStopH:function(){
			calc()
		},lowValue:new Number(0),highValue:(valuesAry.length-1),lowIndex:lowIndex,highIndex:highIndex});
		
		function calc(){
			var low = ins.getLowValueIndex()
			var high = ins.getHighValueIndex()
			var values = ins.getValues()
			
			for(p in dw.config.filters[i]['options']){
				if(dw.config.filters[i]['options'][p] == 2){
					dw.config.filters[i]['options'][p] = 1
				}
			}
			
			for(j=low;j<=high; j++){
				dw.config.filters[i]['options'][values[j].value] = 2	
			}
			
			dw.rebuildFilter(i)
		}
	},
	
	buildSorters: function(){
		if(dw.config.sorters){
			if(dw.config.sorters.length>1){
				
				$E('div',$('container'),{className:'presorter', html:'Sort By:'})
				
				//sorter element
				var sorter = $E('div',$('container'),{className:'sorter'})
				
				var data = []
				for(var i=0; i<dw.config.sorters.length; i++){
					data.push({label:dw.config.sorters[i].label,val:i})	
				}
				
				var com = new combo(sorter,{data:data,initialValue:0,onComplete: function(){
					dw.config.sorters[sorter.val].fn(dw.vars.skuObj)
					dw.updatePage()
				}});
			}
		}
	},
	//END html representation of filters object
	
	//onload call
	setup: function(){
		
		//build sorters
		dw.buildSorters()
		
		//set the view chart function
		$('viewChart').onclick = function(){
			dw.viewChart()
		}
		//set the view chart function
		$('clearChart').onclick = function(){
			dw.clearChart()
		}
		//set the view chart function
		$('clearChart2').onclick = function(){
			dw.clearChart()
		}
		//set the hide chart function
		$('hideChart').onclick = function(){
			dw.hideChart()
		}
		//set promo close button action
		$('promoClose').onclick = function(){
			dw.effects.closePromo()
		}
		
		//sort views array
		dw.config.views.DESC('min')
		
		//dw.getSkus()
		dw.vars.skuObj = obj
		dw.buildBuckets()
	}
}