var dw = {
	//BEGIN application variables
	vars: {
		labels:{},
		skuObj: [],
		filteredSkuList: [],
		sorting: [],
		pidList: [],
		pagePidList: [],
		pagePidIds: [],
		catPidList: [],
		currentPage: false,
		totalPages: 0,
		view: 0,
		compOpen: false,
		scrollbar: false,
		leftScrollers: [],
		getThese: []
	},

	compChart: {
		recWidth: 290,
		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]

			//capture initial load states
			filter.initialLoadState = filter.loadState

			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]){
//n
					if(sku[filter.filter].constructor == Array){
						for(var k=0; k < sku[filter.filter].length; k++){
							dw.setOption(sku, sku[filter.filter][k], filter, true)
						}
					}else{
						dw.setOption(sku, sku[filter.filter], filter)
					}
				}
//e
			}
			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;
					filter.loadState = filterFromCookie.loadState;
				}

			}

		}

		//determine what is in the comp grid
		if(dw.config.filterMemory){
			//comp open or closed
			var compOpen = dw.retrieveFilterFromCookie('compOpen')
			if(compOpen){
				dw.vars.compOpen = compOpen
			}

			//comp products
			var compCookie = dw.retrieveFilterFromCookie('comp')
			if(compCookie){
				if(compCookie.length>0){
					dw.comp = compCookie
					Utility.callService({
						service:dw.config.services.getPids.href,
						method:dw.config.services.getPids.method,
						pars:Utility.getPars(dw.config.services.getPids.pars,{productId:dw.comp}),
						onComplete: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

							}
							dw.rebuildDropZone()
							if(dw.vars.compOpen){
								dw.viewChart()
							}
						}
					});
				}
			}
		}

		//alert(document.cookie.toString())

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

//n
	setOption: function(sku, val, filter, list){
		if(!filter.options[val]){

			filter.options[val] = sku.status

			var display = sku[filter.optionsDisplay]

			if(list){
				display = val
			}

			if(filter.optionsDisplayFn){
				display = filter.optionsDisplayFn(display)
			}

			//populate labels array
			dw.vars.labels[filter.filter][val] = display
		}
	},
//e

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

		if(obj.constructor == Object){
			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(dw.vars.scrollbar){
					dw.vars.scrollbar.getElement().fire(':resize')
					console.log('scrollbar')
				}
				//add transition
				dw.effects.loadingPid(pidRec)
			}
		}
		dw.vars.getThese = []
	},

	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++){
			if(dw.config.filters[i].displayType =="checkBox"){
				document.cookie = "DWsavedFilterState_"+ dw.config.filters[i].filter +"=" + escape('{fiteredValues:') + escape(Object.toJSON(dw.config.filters[i].fiteredValues)) + escape(',options:') + escape(Object.toJSON(dw.config.filters[i].options)) + escape(',displayType:"') + escape(dw.config.filters[i].displayType) + escape('",loadState:"') + escape(dw.config.filters[i].loadState) +escape('"}')+"; path=/ringfinder"
			}
		}

		document.cookie = "DWsavedFilterState_currentPage="+dw.vars.currentPage +"; path=/ringfinder"
		document.cookie = "DWsavedFilterState_comp="+escape(Object.toJSON(dw.comp)) +"; path=/ringfinder"
		document.cookie = "DWsavedFilterState_compOpen="+dw.vars.compOpen +"; path=/ringfinder"
	},

	updatePage: function(init){

		//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"){
			if(init && dw.config.filterMemory){
				var cPage = dw.retrieveFilterFromCookie('currentPage')
				if(cPage){
					dw.vars.currentPage = cPage
				}else{
					dw.vars.currentPage = 0;
				}
			}else{
				dw.vars.currentPage = 0;
			}
			dw.config.paginationFn()
		}

		//call for pids
		dw.goToPage(dw.vars.currentPage)
	},

	goToPage: function(page){
		if(dw.vars.getThese.length == 0){

			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 = '';
			}

			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)

						if(dw.vars.scrollbar)
							dw.vars.scrollbar.getElement().fire(':resize')

						// add pids from cache to 'other matches'
						if(dw.config.expressShop){
							es.buildOtherMatches(dw.cache.pids[pidId])
						}

					}else{
						dw.vars.getThese.push(pidId)
						dw.vars.pagePidList.push(i)
					}
				}
			}

			if(dw.vars.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:dw.vars.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()
					}
				}
			}
		}
	},
	//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 = $('compareItemHolder')
		var chart = $('viewChart')
		var clear = $('clearChart')

		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 = 'block'
			area.removeClassName('backOn')

			//rebuild html
			for(var i=0; i<dw.comp.length; i++){
				var rec = $(area).e('div','bottom',{className:'rec',innerHTML:'<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()
				}
			}
			$(area).e('div','bottom',{className:'clear', innerHTML:'&nbsp;'})
		}else{
			//hide stuff
			area.addClassName('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
			views.buildCompare(data, ele.select('.content')[0])
		}
	},

	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(){
		dw.vars.compOpen = true

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

		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'

			//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','234x394')
				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','234x394')
				imgBack.appendChild(img)
				imgBack.href = data.productBaseURL + data.productId
				imgBack.carry = data;
				imgBack.onclick = function(){
					omni_productClick(this.carry)
				}
			}

			//title
			if(dw.config.expressShop){
				var title = $(div).e('div','bottom',{className:'link',innerHTML: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');
				}
			}else{
				var title = $(div).e('a','bottom',{className:'link',innerHTML:views.getTitle(data)})
				title.href = data.productBaseURL + data.productId
				title.carry = data;
				title.onclick = function(){
					omni_productClick(this.carry)
				}
			}

			//remove from list
			//var remove = Df.e('div',div,{className:'removeFromChart'})
			var remove = $(div).e('div','bottom',{className:'removeFromChart'})
			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','234x394')
				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','234x394')
				imgBack.appendChild(img)
				imgBack.href = data.productBaseURL + data.productId
				imgBack.carry = data;
				imgBack.onclick = function(){
					omni_productClick(this.carry)
				}
			}

			div.appendChild(imgBack)


			//colors
			//Df.e('div',div,{innerHTML:views.getColor(data), className:"Colors"})
			$(div).e('div','bottom',{innerHTML:views.getColor(data), className:"Colors"})

			//price
			//Df.e('div',div,{innerHTML:views.getPrice(data), className:"Price"})
			$(div).e('div','bottom',{innerHTML:views.getPrice(data), className:"Price"})
			//Df.e('div',div,{className:"breakerActive"})
			$(div).e('div','bottom',{className:"breakerActive"})

			//description
			//Df.e('div', div, { innerHTML: data.longDescription, className:"Description"})
			$(div).e('div', 'bottom', { innerHTML: data.longDescription, className:"Description"})

/* DELETE ME
			//buy now
			if(dw.config.expressShop){
				var buy = Df.e('div',div,{className:'buyNow',innerHTML:'Buy Now'})
				title.pidId = data.productId
				title.promoId = data.promoId
				buy.onclick = function(){
					showProductPopup(this.pidId,dw.config.services.getExpressShop.pars.categoryID,'0', this.promoId, 'wide');
				}
			}else{
				var buy = Df.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 Labels
				var td = document.createElement('td')
				td.className = 'padLabel'
				td.innerHTML = attsAry[i].label + ':'
				tr.appendChild(td)

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

		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
			//Df.e('div',ele,{className:'viewing'})
			$(ele).e('div','bottom',{className:'viewing'})
			//Df.e('div',ele,{id:'compGridPages', className:'cDarkBlue', innerHTML:'1-3'})
			$(ele).e('div','bottom',{id:'compGridPages', className:'cDarkBlue', innerHTML:'1-3'})
			//Df.e('div',ele,{className:'of',innerHTML:'of '+dw.comp.length})
			$(ele).e('div','bottom',{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(){
		dw.vars.compOpen = false

		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(init){

		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){

//b
							if(sku[filter.filter].constructor == Array){
								for(var k=0; k < sku[filter.filter].length; k++){
									if(p == sku[filter.filter][k]){

										flag = true
										break loopster
									}
								}
							}
							else{
								if(p == sku[filter.filter]){
									flag = true
									break loopster
								}
							}
//e
						}
					}
					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){

				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){
//b
						if(sku[filter.filter].constructor == Array){
							var valTest = false
							loopie:
							for(var k=0; k < sku[filter.filter].length; k++){
								if(Utility.valTest(filter.fiteredValues, sku[filter.filter][k])){
									valTest = true
									break loopie
								}
							}
						}
						else{
							var valTest = Utility.valTest(filter.fiteredValues,sku[filter.filter])
						}
//e
						if(valTest == false){
							sku.status = 0
						}
					}
				}
			}

		}

		//alert('finish')
		dw.updatePage(init)
	},

	//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(){

		dw.grabscrolltops();

		$('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]
			
			if(dw.config.hideEmptyFilters){
				var display  = 0;

				for(p in filter.options){
					if(filter.options[p] != 0){
						display++;
					}
				}
			}else{
				if(Utility.countObject(filter.options)>0){
					var display = 2;
				}else{
					var display = 0;
				}
			}
			//alert(display);
			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 = Df.e('h3',filterRec,{innerHTML:'&nbsp;&nbsp;&nbsp;'+filter.displayName})
				var filterName = $(filterRec).e('h3','bottom',{innerHTML:'&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 = views.setInfo(dw.config.filters[ii].info)
					//var obj = Df.e('div',filterRec,{className:'info'})
					var obj = $(filterRec).e('div','bottom',{className:'info'})
					var ins = new Df.Tip(obj,{
						data:info,
						pointerOrientation: 'right',
						xOrientation: 'right',
						yOrientation: 'center',
						animate: {
							time:200,
							opacity:.99
						}

					})
				}

				var clearFloat = document.createElement('br')
				clearFloat.clear = 'all'
				filterRec.appendChild(clearFloat)

				//display check mark
				if(filter.fiteredValues.length > 0){
					var seq = Utility.valTest(dw.vars.sorting,filter.stackOrder)
					if(seq){
						if(dw.config.displayClickOrder){
							//Df.e('span',filterName,{innerHTML:seq.key+1})
							$(filterName).e('span','bottom',{innerHTML:seq.key+1})
						}else{
							//Df.e('span',filterName)
							$(filterName).e('span','bottom')
						}
					}
				}

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

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

					for(p in filter.options){

						//determine className
						var className = 'breakerActive'

						if(filter.options[p] == 2){
							className = 'breakerChecked'
						}else if(filter.options[p] == 0){
							className = 'breakerDisabled'
						}
					var node2 = document.createElement('div');
					node2.className = className;
						var html = dw.vars.labels[filter.filter][p]
						//var opt = Df.e('div',node2,{innerHTML:'&nbsp;',className:"checkImg"})
						var opt = $(node2).e('div','bottom',{innerHTML:'&nbsp;',className:"checkImg"})
						//var opt2 = Df.e('div',node2,{innerHTML:html,className:"checkTxt"})
						var opt2 = $(node2).e('div','bottom',{innerHTML:html,className:"checkTxt"})
						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.goToPage(0)
								dw.rebuildCheckBox(this.option, this.status, this.key)
							}
							opt2.onclick = function(){
								dw.goToPage(0)
								dw.rebuildCheckBox(this.option, this.status, this.key)
							}
						}
					node.appendChild(node2);
					}
					//var space = Df.e('div',node,{innerHTML:'.'})
					var space = $(node).e('div','bottom',{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>'
					//Df.e('div',node,{className:'label',innerHTML:html})
					$(node).e('div','bottom',{className:'label',innerHTML:html})

					//var sliderOuter = Df.e('div',node,{className:'sliderBack'})
					var sliderOuter = $(node).e('div','bottom',{className:'sliderBack'})
					//var slider = Df.e('div',sliderOuter,{className:'slider'})
					var slider = $(sliderOuter).e('div','bottom',{className:'slider'})

					//Df.e('div',node,{className:'pre'})
					$(node).e('div','bottom',{className:'pre'})
					//Df.e('div',node,{className:'post'})
					$(node).e('div','bottom',{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 = Df.e('div',$('filterHolder'),{innerHTML:'Expand All',className:'plus'})
		var node = $('filterHolder').e('div','bottom',{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 = Df.e('div',$('filterHolder'),{innerHTML:'Collapse All',className:'minus'})
		var node = $('filterHolder').e('div','bottom',{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 nodeB = $('filterHolder').e('div','bottom',{innerHTML:'Reset Selections',className:'reset'})
		var nodeT = $('filterHolder').e('div','top',{innerHTML:'Reset Selections',className:'reset'})
		nodeT.onclick = function(){
			dw.goToPage(0)
			dw.reset();
		}

		nodeB.onclick = function(){
			dw.goToPage(0)
			dw.reset();
		}

		dw.createLeftScrollers()

	},

	reset: function(){
		for(var i=0; i<dw.config.filters.length; i++){
			var filter = dw.config.filters[i]

			//clear out filter choices
			filter.fiteredValues = []
			for(p in filter.options){
				filter.options[p] = 1
			}

			//reset filter open close states
			filter.loadState = filter.initialLoadState
		}
		for(var i=0; i<dw.vars.skuObj.length; i++){
			dw.vars.skuObj[i].status = 1
		}
		dw.vars.leftScrollers = []
		Df.Scrollbar._instances = []
		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 Df.RangeSlider(slider,{type:'range', values:valuesAry, onStopL:function(){
			calc();
			dw.goToPage(0)
			dw.config.paginationFn();
		},onStopH:function(){
			calc();
			dw.goToPage(0)
			dw.config.paginationFn();
		},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){

				//sorter element
				var sorter = $('midRow').e('select','bottom',{className:'sorter'})
				var data = []
				for(var i=0; i<dw.config.sorters.length; i++){
					sorter.options[i]=new Option(dw.config.sorters[i].label,i)
				}
				sorter.options[0].selected=true
				sorter.observe('change', function(e){
					dw.config.sorters[this.selectedIndex].fn(dw.vars.skuObj);
					dw.goToPage(0);
					dw.updatePage();
				})
			}
		}
	},
	//END html representation of filters object

	createLeftScrollers: function() {
		for(var s=0;s<$$('div.contents').length;s++) {
			var s1 = $$('div.contents')[s].scrollbar({
				holder:$$('div.contents')[s].up(),
				clickPixel: false,
				positionY:false,
				positionX:false,
				classNames: {
					y: {
						holder: 'yHolder2',
						prev: 'ArrowUp',
						next: 'ArrowDown',
						area: 'SlideArea',
						marker: 'marker'
					}
				}
			});
		}

		if(dw.vars.leftScrollers.length>0)
			dw.setScrollTop(false);
	},

	setScrollTop: function(get){
		if(get){
			for(var i=0; i<Df.Scrollbar._instances.length; i++){
				dw.vars.leftScrollers[i] = {};
				if(Df.Scrollbar._instances[i].eles.y.marker){
					dw.vars.leftScrollers[i].sTop = Df.Scrollbar._instances[i].eles.y.marker.getStyle('top');
				}else{
					dw.vars.leftScrollers[i].sTop = '0px';
				}
			}
		}else{
			for(var i=0; i<Df.Scrollbar._instances.length; i++){
				var sTop = dw.vars.leftScrollers[i].sTop;
				if(Df.Scrollbar._instances[i].eles.y.marker && sTop != null){
					Df.Scrollbar._instances[i].scrollY(parseInt(sTop));
				}
			}
		}
	},

	//onload call
	setup: function(){
		dw.vars.scrollbar.barYLeft = function(){
			return this.dems.holder.width
		}

		dw.vars.scrollbar.barYTop = function(){
			return 0
		}

		if(dw.config.filterMemory){
			window.onbeforeunload = function(){
				dw.setFilterCookie()
			}
		}

		//build sorters
		dw.buildSorters()

		dw.vars.skuObj = obj

		//set promo close button action
		$('promoClose').onclick = function(){
			dw.effects.closePromo()
		}

		//sort views array
		dw.config.views.descend('min')

		dw.buildBuckets()
	}
}