var dw = {
	//BEGIN application variables
	vars: {
		labels:{},
		skuObj: [],
		filteredSkuList: [],
		sorting: [],
		pidList: [],
		pagePidList: [],
		pagePidIds: [],
		catPidList: [],
		currentPage: false,
		sorter: 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

	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.filterMemory){
				//grab saved cookie filter states
				var filterFromCookie = dw.retrieveFilterFromCookie(filter.filter)
				if(filterFromCookie){
					filter.options = filterFromCookie.options;
					filter.fiteredValues = filterFromCookie.fiteredValues;
				}
			}*/

		}

		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.filterSkus()
	},

	retrieveFilterFromCookie: function(name){
		var str = 'DWsavedFilterState_'+name+'='
		var c_start=document.cookie.indexOf(str)
		if (c_start!=-1){
			c_start=c_start + str.length
			var c_end=document.cookie.indexOf(";",c_start)
			//return(unescape(document.cookie.substring(c_start,c_end)))
			return Utility.evalJSON(unescape(document.cookie.substring(c_start,c_end)))
		}
	},
	//END one time onload functions


	//BEGIN update results methods
	parsePids: function(obj){

		obj = Utility.evalJSON(obj.responseText)

		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)
			if(i == 4 || i == 9 || i == 14){
				pidRec.className+=" pidRowEnd";
			}
			//add transition
			dw.effects.loadingPid(pidRec)

		}
	},

	setFilterCookie: function(){
		var exdate=new Date()
		exdate.setTime(exdate.getTime() + dw.config.filterMemory)
		//set filter setting as a cookie
		for(var i=0; i<dw.config.filters.length; i++){
			document.cookie= 'DWsavedFilterState_'+ dw.config.filters[i].filter +'='+ escape('{"fiteredValues":'+ Object.JSONstring(dw.config.filters[i].fiteredValues) +',"options":'+ Object.JSONstring(dw.config.filters[i].options) +'}') +';expires='+ exdate.toGMTString()
		}
	},

	updatePage: function(){

		//set filter setting as a cookie
		if(dw.config.filterMemory){
			dw.setFilterCookie();
		}

		//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)
		new CMTagGenerator(null, null, null, null, null, null, null, {resultCount: dw.vars.pidList.length}, null).giftWizardResults();

	},

	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 = '';
		if(dw.config.expressShop){
			$('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'
					if(dw.config.expressShop){
//						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
			});
		}

		if(dw.config.expressShop){
			/*
			if (page != 0){
				es.getOmPids(0);
			}
			*/
		}

		//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(dw.config.expressShop){
				if($('holder2').style.display == 'block'){
					hideExpressShop()
				}
			}
		}

		document.getElementsByClassName("brand").each( function(el) {
			if (el){
				if(views.hasOverflow(el) ) {
					Element.removeClassName(el,"brand");
					Element.addClassName(el,"brand2")
				}
			}
		});
	},
	//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(dw.config.expressShop){
			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 = 'inline'
			}else{
				chart.style.display = 'none'
			}
			clear.style.display = 'block'
			backImage.className = ''

			//rebuild html
			for(var i=0; i<dw.comp.length; i++){
				//var rec = $E('div',area,{className:'rec',innerHTML:views.getTitle(dw.cache.pids[dw.comp[i]],22)})
				var rec = $E('div',area,{className:'rec',innerHTML:'<img src="'+views.pullImage(dw.cache.pids[dw.comp[i]],'main','v194')+'" />'})
				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', innerHTML:'&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(dw.config.expressShop){
			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){
								var seq = 0
								if(data[f + 'DisplaySequence']){
									seq = parseInt(data[f + 'DisplaySequence'])
								}
								attsAry.push({filter:f, label:data[f + 'Label'], seq:seq})
							}
						}
					}
				}
			}

			var td = document.createElement('td')
			var div = document.createElement('div')
			div.className = 'holder'

			//remove from list
			var remove = $E('div',div,{className:'removeFromChart',innerHTML:'Remove'})
			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
			if(dw.config.expressShop){
				var imgBack = document.createElement('div')
				imgBack.className = 'imgBack'
				var img = document.createElement('img')
				img.src = views.pullImage(data,'main','T144x194')
				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');
				}
			}else{
				var imgBack = document.createElement('a')
				imgBack.className = 'imgBack'
				var img = document.createElement('img')
				img.src = views.pullImage(data,'main','T144x194')
				imgBack.appendChild(img)
				imgBack.href = data.productBaseURL + data.productId
			}

			div.appendChild(imgBack)



			//title
			if(dw.config.expressShop){
				var title = $E('div',div,{className:'link',innerHTML:views.getTitle(data)})
				title.pidId = data.productId
				title.promoId = data.promoId
				title.onclick = function(){
				}
			}else{
				var title = $E('a',div,{className:'link',innerHTML:views.getTitle(data)})
				title.href = data.productBaseURL + data.productId
			}

			//price
			$E('div',div,{innerHTML:views.getPrice(data), className:"Price"})

			//buy now
			if(dw.config.expressShop){
				var buy = $E('div',div,{className:'buyNow',innerHTML:'Buy Now'})
				title.pidId = data.productId
				title.cp = data.skus.sid
				buy.onclick = function(){
					//showProductPopup(this.pidId,dw.config.services.getExpressShop.pars.categoryID,'0', this.promoId, 'wide');
				}
			}else{
				var buy = $E('a',div,{className:'buyNow',innerHTML:'Buy Now'})
				buy.href = data.productBaseURL + data.productId
			}

			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])
			}
		}

		//sorting attributes
		if(dw.config.compareAttributesSoringFn){
			dw.config.compareAttributesSoringFn(attsAry)
		}

		//strip out unused
		if(dw.config.stripUnusedAtts){
			var temparray = []
			for(var i=0; i<attsAry.length; i++){
				var att = attsAry[i];
				loopy:
				for(var j=0; j<dw.comp.length; j++){
					var prod = dw.cache.pids[dw.comp[j]]
					if(prod[att.filter]){
						temparray.push(attsAry[i])
						break loopy;
					}
				}
			}
			attsAry.length = 0
			attsAry = attsAry.concat(temparray)
			temparray = null
		}

		//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'

			//go left
			var control = document.createElement('div')
			control.id = 'compGridPreviousButton'
			control.className = 'leftArrowOff'
			control.onclick = null
			ele.appendChild(control)

			//viewing
			$E('div',ele,{className:'viewing'})
			$E('div',ele,{id:'compGridPages', className:'cDarkBlue', innerHTML:'1-3'})
			$E('div',ele,{className:'of',innerHTML:'of '+dw.comp.length})

			//go right
			var control = document.createElement('div')
			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);
		}
		$('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(dw.config.expressShop){
			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

	grabscrolltops: function(){
		for(var i=0; i<dw.config.filters.length; i++){
			var filter = dw.config.filters[i]
			if(filter.retainScrollTop !== false){
				var filterrec = $('filter_'+dw.config.appId+'_'+filter.filter);
				var cont = document.getElementsByClassName('contents',filterrec)[0];
				if(cont){
					filter.retainScrollTop = cont.scrollTop
				}
			}
		}
	},

	//BEGIN html representation of filters object
	displayHtml: function(){

		var recs = dw.vars.pidList.length;
		if(recs>8){
			$("pidHolder").style.height = (3 *370) + 'px';//"1110px";
		}else if(recs>4){
			$("pidHolder").style.height = (2 *370) + 'px'//"740px";
		}else{
			$("pidHolder").style.height = "370px";
		}
		dw.grabscrolltops();
		$('filterHolder').innerHTML = ''

		var node = $E('div',$('filterHolder'),{innerHTML:'',className:'reset top'})
			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.vars.sorting.length = 0;

			dw.updatePage()
		}
		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]

			if(dw.config.hideEmptyFilters){
				var display  = 0;

				for(p in filter.options){
					if(filter.options[p] != 0){
						display++;
					}
				}
			}else{
				var display = 2;
			}
			if(display > 1){
				var filterHld = document.createElement('div')
				filterHld.className = 'filterHld'
				filterHld.id = 'filter_'+dw.config.appId+'_'+filter.filter;
				var filterRec = document.createElement('div')

				filterRec.className = 'filterRec'
				if(filter.holderClass){
					Element.addClassName(filterRec,filter.holderClass)
				}

				//filter name
				var filterName = $E('h3',filterRec,{innerHTML:''+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){


						if(dw.config.displayClickOrder){
							$E('span',filterName,{innerHTML:seq.key+1})
						}else{
							$E('span',filterName)
						}


					}
				}

				//for check boxes
				if(filter.displayType == 'checkBox'){

					var node = document.createElement('div');
					node.className = 'contents';

					for(p in filter.options){

						//determine className
						var className = 'imgActive'
						var className2 = ''
						if(filter.options[p] == 2){
							className = 'imgChecked'
						}else if(filter.options[p] == 0){
							className = 'imgDisabled'
							className2 = 'txtDisabled'
						}
					var node2 = document.createElement('div');
					node2.className = 'breaker';
						var html = dw.vars.labels[filter.filter][p]
						var opt = $E('div',node2,{innerHTML:'&nbsp;',className:"checkImg "+className})
						var opt2 = $E('div',node2,{innerHTML:html,className:"checkTxt "+className2})
						opt.option = p
						opt.status = filter.options[p]
						opt.key = ii
						opt2.option = p
						opt2.status = filter.options[p]
						opt2.key = ii
						if(filter.options[p] != 0){
							opt.onclick = function(){
								dw.rebuildCheckBox(this.option, this.status, this.key)
							}
							opt2.onclick = function(){
								dw.rebuildCheckBox(this.option, this.status, this.key)
							}
						}
					node.appendChild(node2);
					}
					var space = $E('div',node,{innerHTML:'.'})
					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);

					//reset scroll top
					if(parseInt(filter.retainScrollTop)){
						node.scrollTop = filter.retainScrollTop;
					}

				}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',innerHTML: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'),{innerHTML:'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'),{innerHTML:'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'),{innerHTML:'',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.vars.sorting.length = 0;

			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',$('midRow'),{className:'presorter', innerHTML:'Sort'})
				

				//sorter element
				dw.vars.sorter = $E('div',$('midRow'),{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(dw.vars.sorter,{data:data,initialValue:0,onComplete: function(){

				}});
			}
		}
	},
	//END html representation of filters object

	//onload call
	setup: function(){

		//build sorters
		dw.buildSorters()

		dw.vars.skuObj = obj
/*
		//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.buildBuckets()
	}
}
