//URL to Menu Link
var urlMenuMap = [ ['/diamonds/detail','/diamonds/search'], ['/diamonds/search','/diamonds/search'],
									 ['/diamonds/results','/diamonds/search'],['/diamonds/saved','/diamonds/search'],
                   ['/form_responders/custom_diamond_search','/buying-diamonds']]

function setCookie(c_name,value,expiredays) {
        var exdate=new Date()
        exdate.setDate(exdate.getDate()+expiredays)
        document.cookie=c_name+ "=" +escape(value)+
        ((expiredays==null) ? "" : ";expires="+exdate.toGMTString())

}

function getCookie(c_name) {
        if (document.cookie.length>0)
          {
          c_start=document.cookie.indexOf(c_name + "=")
          if (c_start!=-1)
                {
                c_start=c_start + c_name.length+1
                c_end=document.cookie.indexOf(";",c_start)
                if (c_end==-1) c_end=document.cookie.length
                return unescape(document.cookie.substring(c_start,c_end))
                }
          }
        return ""

} 

window.onload = function() {
	var out = '';
	//$('headerTableRight').update();
	if (window.location.pathname == '/' && getCookie('lumhp') == '') {
		setCookie('lumhp',true);
		window.location = '/';
	} 
	if (window.location.pathname == '/diamonds/search' && getCookie('lumds') == '') {
		setCookie('lumds',true);
		window.location = '/diamonds/search';
	} 
	$A($('mainNavigationTable').getElementsByTagName('a')).each(function(e) {
		var path_parts = window.location.href.split('/');	
		var path_part = path_parts.slice(3,4).toString() ;
		var main_path_part = e.href.split('/').slice(3,4).toString() ;
		//$('headerTableRight').update($('headerTableRight').innerHTML + '<br/>' + path_part + ':' + main_path_part)
	        //alert(path_part)	
		if (e.href == window.location.href || main_path_part == path_part) {
			//$('headerTableRight').update($('headerTableRight').innerHTML + '<br/>' + 'Adding ' + e.href)
			Element.addClassName(e,'current');
			return true;
		} else  {
			for(var i=0;i<urlMenuMap.length;i++) {
				if (window.location.href.indexOf(urlMenuMap[i][0]) != -1 && e.href.indexOf(urlMenuMap[i][1]) != -1) {
				  //$('headerTableRight').update($('headerTableRight').innerHTML + '<br/>' + 'Adding ' + e.href)
			    Element.addClassName(e,'current');
			    return true;
				}
			}
		}
  });
}
var lumD = {
	//Also set highest and lowest values for each shape
	//Slider spread will be of shape selected with most diamonds
	priceSliderSpread : [],
	pricePerCaratSliderSpread : [],
	tableSliderSpread : [],
	caratSliderSpread : [],
	cutSliderSpread   : [],
	colorSliderSpread : [],
	minSliderValue    : 0,
	maxSliderValue    : 230,
	priceSliderSections : 16,
	priceSliderPadding  : 23,
	sliderColorAdjust   : 23,
	sliderWidth         : 207,
	isLoaded            : false,
	sliders             : [],
	hasDatagrid         : true,
	advanced            : ['polish','symmetry','depth','table','lw_ratio','flour','retail_per_carat'],
	sectional           : ['cut','color','clarity','polish','symmetry','flour'],
	//These sliders have 1 px movement
	sectionBySlider     : [['price',16],['carat',16],['lw_ratio',1],['depth',1],['retail_per_carat',16],['table',1]],
	//These move depending on how many parts they have
	partsBySlider       : [['cut',4],['color',8],['clarity',9],['flour',5],['symmetry',4],['polish',4]],
	spreadBySlider      : [['price','lumD.priceSliderSpread'],['carat','lumD.caratSliderSpread'],
												 ['lw_ratio','lumD.lwRatioSliderSpread'],['depth','lumD.depthSliderSpread'],
												 ['retail_per_carat','lumD.pricePerCaratSliderSpread'],['table','lumD.tableSliderSpread'],
												 ['cut','lumD.cutSliderSpread'],['color','lumD.colorSliderSpread'],['clarity','lumD.claritySliderSpread'],
												 ['flour','lumD.flourSliderSpread'],['symmetry','lumD.symmetrySliderSpread'],
												 ['polish','lumD.polishSliderSpread']],
	sliderTimeOut       : null,
	editingOffsets      : false,
	
	newSearchSliders  : function() {
		lumD.hasDatagrid = false;
		lumD.maxSliderValue = 470;
		lumD.sliderWidth    = 447;
		lumD.priceSliderPadding  = 29;
		lumD.sliderColorAdjust = 29
	},
	homeSearchSliders  : function() {
		lumD.hasDatagrid = false;
		lumD.maxSliderValue = 230;
		lumD.sliderWidth    = 207;
		lumD.priceSliderPadding  = 23;
	},
	initializeSliders : function(total) {
		if (lumD.hasDatagrid) {
			var shapes = lumD.selectedShapes();
			//if only round shape, hide lw_ratio advanced option
			if (shapes.length == 1 && shapes[0] == 'B') {
				lumD.hideAdvancedOption('lw_ratio');
			} else {
				lumD.showAdvancedOption('lw_ratio');
			}
			var qs = new Querystring()
			var sliderUpdateTO = 1000;
			lumD.fixSpread('price',shapes,diamondShapes);
			lumD.fixSpread('retail_per_carat',shapes,diamondPerCaratShapes);
			lumD.fixSpread('carat',shapes,diamondCaratShapes);
			lumD.fixSpread('table',shapes,diamondTableShapes);
			lumD.fixSpread('depth',shapes,diamondDepthShapes);
			lumD.fixSpread('lw_ratio',shapes,diamondLWRatioShapes);
			lumD.updateShapeForSliders();
			//display advanced sliders
			setTimeout('lumD.setupAdvancedOptions()',2000);
			
			//if (lumD.getStartValue('price') < )
			if (qs.get('price')) {
				var price_parts = qs.get('price').split('-')
				lumD.updateOffset('price',price_parts[0],price_parts[1]);
				lumD.updateSliderPositions('price',price_parts[0],price_parts[1]);
			}
			else {
				lumD.updateOffset('price',lumD.priceSliderSpread[0],lumD.priceSliderSpread[lumD.priceSliderSections]);
			}
			if (qs.get('retail_per_carat')) {
				var parts = qs.get('retail_per_carat').split('-')
				lumD.updateOffset('retail_per_carat',parts[0],parts[1]);
				lumD.updateSliderPositions('retail_per_carat',parts[0],parts[1]);
			}
			else {
			lumD.updateOffset('retail_per_carat',lumD.pricePerCaratSliderSpread[0],lumD.pricePerCaratSliderSpread[lumD.priceSliderSections]);      }
			if (qs.get('carat')) {
				var carat_parts = qs.get('carat').split('-')
				lumD.updateOffset('carat',parseFloat(carat_parts[0]),parseFloat(carat_parts[1]));
				//alert(lumD.valueToPoint(parseFloat(carat_parts[1]),lumD.caratSliderSpread,16));
				lumD.updateSliderPositions('carat',parseFloat(carat_parts[0]),parseFloat(carat_parts[1]));
				
			}
			else {
				lumD.updateOffset('carat',lumD.caratSliderSpread[0],lumD.caratSliderSpread[lumD.priceSliderSections]);
			}
			if (qs.get('lw_ratio')) {
				var parts = qs.get('lw_ratio').split('-')
				lumD.updateOffset('lw_ratio',parseFloat(parts[0]),parseFloat(parts[1]));
				lumD.updateSliderPositions('lw_ratio',parseFloat(parts[0]),parseFloat(parts[1]));
			}
			else {
				lumD.updateOffset('lw_ratio',lumD.lwRatioSliderSpread[0],lumD.lwRatioSliderSpread[1]);
			}
			if (qs.get('cut')) {
				var cut_parts = qs.get('cut').split(',')
				//setTimeout(function () {lumD.updatePartitionedSliderPositions('cut',cut_parts) },sliderUpdateTO);
				lumD.updatePartitionedSliderPositions('cut',cut_parts,true);
			} else {
				lumD.cutSliderChange(lumD.minSliderValue,lumD.maxSliderValue);
			}
			if (qs.get('color')) { 
				lumD.updatePartitionedSliderPositions('color',qs.get('color').split(','),true);
				//setTimeout(function () {lumD.updatePartitionedSliderPositions('color',qs.get('color').split(',')) },3000);
			} else {
				lumD.colorSliderChange(lumD.minSliderValue,lumD.maxSliderValue);
			}
			if (qs.get('clarity')) { 
				lumD.updatePartitionedSliderPositions('clarity',qs.get('clarity').split(','),true);
				//setTimeout(function () {lumD.updatePartitionedSliderPositions('clarity',qs.get('clarity').split(',')) },sliderUpdateTO);
			} else {
				lumD.claritySliderChange(lumD.minSliderValue,lumD.maxSliderValue);
			}
			if (qs.get('flour')) {
				lumD.updatePartitionedSliderPositions('flour',qs.get('flour').split(','),true);
			} else {
				lumD.flourSliderChange(lumD.minSliderValue,lumD.maxSliderValue);
			}
			if (qs.get('polish')) {
				lumD.updatePartitionedSliderPositions('polish',qs.get('polish').split(','),true);
			} else {
				lumD.polishSliderChange(lumD.minSliderValue,lumD.maxSliderValue);
			}
			if (qs.get('symmetry')) {
				lumD.updatePartitionedSliderPositions('symmetry',qs.get('symmetry').split(','),true);
			} else {
				lumD.symmetrySliderChange(lumD.minSliderValue,lumD.maxSliderValue);
			}
			if (qs.get('table')) {
				var parts = qs.get('table').split('-')
				lumD.updateOffset('table',parseFloat(parts[0]),parseFloat(parts[1]));
				lumD.updateSliderPositions('table',parseFloat(parts[0]),parseFloat(parts[1]));
			}
			else {
				lumD.updateOffset('table',lumD.tableSliderSpread[0],lumD.tableSliderSpread[1]);
			}
			if (qs.get('depth')) {
				var parts = qs.get('depth').split('-')
				lumD.updateOffset('depth',parseFloat(parts[0]),parseFloat(parts[1]));
				lumD.updateSliderPositions('depth',parseFloat(parts[0]),parseFloat(parts[1]));
			}
			else {
				lumD.updateOffset('depth',lumD.depthSliderSpread[0],lumD.depthSliderSpread[1]);
			}
		} else {
			//setup for simpler first search page
			lumD.updateShapeForSliders();
			lumD.cutSliderChange(lumD.minSliderValue,lumD.maxSliderValue);
			lumD.colorSliderChange(lumD.minSliderValue,lumD.maxSliderValue);
			lumD.claritySliderChange(lumD.minSliderValue,lumD.maxSliderValue);
		}
		//total cached, so don't refresh
		if (!total) {
		  setTimeout('lumD.refreshGrid();',2000);
		} else {
		  lumD.isLoaded = true;
	    	lumD.updateSearchMeasure(total);
		   //lumD.checkAllShapes();
	
		}
	},
	//Update grid via sliders, but only after so much time has elasped since a slider was last moved
	updateSliderTimeOut : function() {
		if (lumD.sliderTimeOut) {
			clearTimeout(lumD.sliderTimeOut);
		}
	  if (lumD.isLoaded) {
		  lumD.sliderTimeOut = setTimeout('lumD.refreshGrid();',300);
		}
	},
	updatePartitionedSliderPositions: function(name,parts,dontMoveSlider) {
		 var spread =  eval(arrayByKey(name,lumD.spreadBySlider));
		 var sections = arrayByKey(name,lumD.partsBySlider);
		 var minV = spread.indexOf([parts[0]]) * lumD.maxSliderValue / sections
		 var maxV = (spread.indexOf([parts[parts.length-1]]) + 1) * lumD.maxSliderValue / sections
		//var maxHack = sections <= 5 || (parts.length/2 <= 2) ? (lumD.sliderWidth / sections) : 0
		 //var maxV = spread.indexOf(parts[parts.length-1]) * lumD.maxSliderValue / sections + 
		        ///    lumD.priceSliderPadding + (lumD.maxSliderValue / sections)
		 //debug(name + ':' + maxV);
		 $('offset_end_'+name).innerHTML = parts.join(',');
		 var slider = lumD.getSlider(name);
		// if (name == 'color') debug('ups: ' + minV + 'x' + maxV);
		 slider.setMinValue(minV,true,true,true);
		 slider.setMaxValue(maxV,true,true,true);
		 //Don't move during loading
		 if (! dontMoveSlider) {
		   lumD.adjustSliderHighlight(name,minV,maxV);
		 }
		 //setTimeout("lumD.adjustSliderHighlight('" + name + "'," + minV + "," + maxV + ")",5000);
	},
	//done by initializer if there is an url search query
	updateSliderPositions : function(name,start,end) {
		var maxV = lumD.updateEndPos($('offset_end_'+name+'_input'))
		
		//var spread   = eval(arrayByKey(name,lumD.spreadBySlider));
		//var numberOfSections  = spread.length - 2;
		//var maxV = lumD.valueToPoint(end,spread,numberOfSections);
		//var minV = lumD.valueToPoint(start,spread,numberOfSections);
		//alert(maxV);
		//slider.setMaxValue(maxV,true,true,true);
		var minV = lumD.updateStartPos($('offset_start_'+name+'_input'))
		//var slider = lumD.getSlider(name)
		//slider.setMaxValue(maxV,true,true,true);
		//slider.setMinValue(minV,true,true,true);
		lumD.adjustSliderHighlight(name,minV,maxV);
		lumD.editingOffsets = false;
		//update again to hide slight changes made by slider
		setTimeout("lumD.updateOffset('" + name + "'," + start + ',' + end +')',500);
	},
	updateEndPos : function(el) {
		lumD.editingOffsets = true;
		var val = el.value;
		var field = el.id.replace('offset_end_','').replace('_input','');
		var amount = lumD.fromTextField(field,val);
		//alert(amount)
		var minAmount = lumD.fromTextField(field,$('offset_start_'+field+'_input').value);
		//if (amount < minAmount) amount = minAmount;
		$('offset_end_'+field+'_input').value = lumD.formatTextField(field,amount);
		
		var slider   = arrayByKey(field,lumD.sliders)
		var spread   = eval(arrayByKey(field,lumD.spreadBySlider));
		var sections = arrayByKey(field,lumD.sectionBySlider);
		var minV = spread[0];
		var maxV = spread[sections];
		//if (field == 'price') {
		//	alert(maxV);
		//}
		for(var i=0;i<spread.length;i++) {
			if (i == spread.length - 1) {
				var currentSection = i;
				if (amount > maxV) amount = maxV
				break;
			}
			if (spread[i] <= amount && spread[i+1] > amount) {
				var currentSection = i
			  break;
			} 
			if (i == 0 && spread[i] >= amount) {
				var currentSection = i;
				if (amount < minV) amount = minV
			  break;
			}
		}
		//price fix
		currentSection = currentSection == 17 ? 16 : currentSection
		var percent = (amount - spread[currentSection]) / (spread[currentSection+1] - spread[currentSection])
		
		//if (field == 'price') {
		//alert('Section '+currentSection+':'+spread[currentSection+1]+' ' + lumD.priceSliderSpread);
		//}
		
		var px = currentSection * (lumD.sliderWidth/sections) + (percent * lumD.sliderWidth/sections) + lumD.priceSliderPadding;
		slider.setMaxValue(px,true,true,true);
		return px;
	},
	updateStartPos : function(el) {
		lumD.editingOffsets = true;
		var val = el.value;
		var field = el.id.replace('offset_start_','').replace('_input','');
		var amount = lumD.fromTextField(field,val);
		var minAmount = lumD.fromTextField(field,$('offset_end_'+field+'_input').value);
		$('offset_start_'+field+'_input').value = lumD.formatTextField(field,amount);
		var slider   = arrayByKey(field,lumD.sliders)
		var spread   = eval(arrayByKey(field,lumD.spreadBySlider));
		var sections = arrayByKey(field,lumD.sectionBySlider);

		var minV = spread[0];
		var maxV = spread[sections];
		
		for(var i=0;i<spread.length;i++) {
			if (i == spread.length - 1) {
				var currentSection = i;
				if (amount > maxV) amount = maxV
				break;
			}
			if (spread[i] <= amount && spread[i+1] > amount) {
				var currentSection = i
			  break;
			} 
			if (i == 0 && spread[i] >= amount) {
				var currentSection = i;
				if (amount < minV) amount = minV
			  break;
			}
		}
		
		var percent = (amount - spread[currentSection]) / (spread[currentSection+1] - spread[currentSection])
		var px = currentSection * (lumD.sliderWidth/sections) + (percent * lumD.sliderWidth/sections);
		slider.setMinValue(px,true,true,true);
		return px;
	},
	getStartPos : function(field) {
		var slider   = arrayByKey(field,lumD.sliders)
		return slider.minSlider.getValue()
	},
	getEndPos : function(field) {
		var slider   = arrayByKey(field,lumD.sliders)
		return slider.maxSlider.getValue()
	},
	priceSliderChange : function(minV,maxV) {
		lumD.updateSliderOffsets('price',minV,maxV,lumD.priceSliderSpread);
	},
	pricePerCaratSliderChange : function(minV,maxV) {
		lumD.updateSliderOffsets('retail_per_carat',minV,maxV,lumD.pricePerCaratSliderSpread);
	},
	tableSliderChange : function(minV,maxV) {
		lumD.updateSliderOffsets('table',minV,maxV,lumD.tableSliderSpread,1);
	},
	depthSliderChange : function(minV,maxV) {
		//debug(minV + 'x' + maxV);
		//maxV -= 480;
		lumD.updateSliderOffsets('depth',minV,maxV,lumD.depthSliderSpread,1);
	},
	lwRatioSliderChange : function(minV,maxV) {
		lumD.updateSliderOffsets('lw_ratio',minV,maxV,lumD.lwRatioSliderSpread,1);
	},
  caratSliderChange : function(minV,maxV) {
		lumD.updateSliderOffsets('carat',minV,maxV,lumD.caratSliderSpread);
	},
	cutSliderChange : function(minV,maxV) {
		 var maxVAdjusted = maxV-lumD.priceSliderPadding
		 var minWithinSection = Math.floor(minV/lumD.sliderWidth * 4);
		 var maxWithinSection = Math.ceil(maxVAdjusted/lumD.sliderWidth * 4);
		 $('offset_end_cut').innerHTML = lumD.cutSliderSpread.slice(minWithinSection,maxWithinSection);
		 lumD.adjustSliderHighlight('cut',minV,maxV);
		 lumD.updateSliderTimeOut();
	},
  polishSliderChange : function(minV,maxV) {
		 var maxVAdjusted = maxV-lumD.priceSliderPadding
		 var minWithinSection = Math.floor(minV/lumD.sliderWidth * 4);
		 var maxWithinSection = Math.ceil(maxVAdjusted/lumD.sliderWidth * 4);
		 $('offset_end_polish').innerHTML = lumD.polishSliderSpread.slice(minWithinSection,maxWithinSection);
		lumD.adjustSliderHighlight('polish',minV,maxV);
		lumD.updateSliderTimeOut();
	},
	symmetrySliderChange : function(minV,maxV) {
		 var maxVAdjusted = maxV-lumD.priceSliderPadding
		 var minWithinSection = Math.floor(minV/lumD.sliderWidth * 4);
		 var maxWithinSection = Math.ceil(maxVAdjusted/lumD.sliderWidth * 4);
		 $('offset_end_symmetry').innerHTML = lumD.symmetrySliderSpread.slice(minWithinSection,maxWithinSection);
		 lumD.adjustSliderHighlight('symmetry',minV,maxV);
		 lumD.updateSliderTimeOut();
	},
  flourSliderChange : function(minV,maxV) {
		 var maxVAdjusted = maxV-lumD.priceSliderPadding
		 var minWithinSection = Math.floor(minV/lumD.sliderWidth * 5);
		 var maxWithinSection = Math.ceil(maxVAdjusted/lumD.sliderWidth * 5);
		 $('offset_end_flour').innerHTML = lumD.flourSliderSpread.slice(minWithinSection,maxWithinSection);
		 //debug('flour change:' + minV +'x'+ maxV);
		 lumD.adjustSliderHighlight('flour',minV,maxV);
		 lumD.updateSliderTimeOut();
	},
	colorSliderChange : function(minV,maxV) {
		 var maxVAdjusted = maxV-lumD.priceSliderPadding
		 var minWithinSection = Math.floor(minV/lumD.sliderWidth * 8);
		 var maxWithinSection = Math.ceil(maxVAdjusted/lumD.sliderWidth * 8);
		 $('offset_end_color').innerHTML = lumD.colorSliderSpread.slice(minWithinSection,maxWithinSection);
		 //debug($('offset_end_color').innerHTML + 'x' + lumD.colorSliderSpread);
		 //alert(minV + 'x' + maxV);
		 
		 lumD.adjustSliderHighlight('color',minV,maxV);
		 
		 lumD.updateSliderTimeOut();
	},
	
	claritySliderChange : function(minV,maxV) {
		 var maxVAdjusted = maxV-lumD.priceSliderPadding
		 var minWithinSection = Math.floor(minV/lumD.sliderWidth * 9);
		 var maxWithinSection = Math.ceil(maxVAdjusted/lumD.sliderWidth * 9);
		 $('offset_end_clarity').innerHTML = lumD.claritySliderSpread.slice(minWithinSection,maxWithinSection);
		 lumD.adjustSliderHighlight('clarity',minV,maxV);
		 lumD.updateSliderTimeOut();
	},
	updateSliderOffsets : function(name,minV,maxV,spread,spreadLength) {
		lumD.updateSliderOffsetsNew(name,minV,maxV,spread)
		return;
		var sections = spreadLength ? spreadLength : lumD.priceSliderSections
		var maxVAdjusted = maxV-lumD.priceSliderPadding
		var minWithinSection = Math.floor(minV/lumD.sliderWidth * sections);
		var maxWithinSection = Math.ceil(maxVAdjusted/lumD.sliderWidth * sections);
		//var percentWithinMaxSection = (1 - Math.abs((maxWithinSection) - (maxVAdjusted/lumD.sliderWidth * sections))).toFixed(2)
		var percentWithinMaxSection = Math.abs((maxWithinSection) - (maxVAdjusted/lumD.sliderWidth * sections)).toFixed(2)
		var percentWithinMinSection = Math.abs((minWithinSection) - (minV/lumD.sliderWidth * sections)).toFixed(2)
		
		var maxPrice = lumD.calcPrice(maxWithinSection,sections,percentWithinMaxSection,spread);
		var minPrice = lumD.calcPrice(minWithinSection,sections,percentWithinMinSection,spread);
   
		if (minPrice > maxPrice) minPrice = maxPrice;
		lumD.adjustSliderHighlight(name,minV,maxV);
		lumD.updateOffset(name,minPrice,maxPrice);
	  
		lumD.updateSliderTimeOut();
	},
	updateSliderOffsetsNew : function(name,minV,maxV,spread) {
		maxV = lumD.fixMax(maxV,minV);
		minV = lumD.fixMin(minV,maxV);
		var numberOfSections  = spread.length - 2;
		
		var sectForMin = lumD.getSectionForValue(minV,numberOfSections);
		var sectForMax = lumD.getSectionForValue(maxV,numberOfSections);
		
		var widthOfSect = lumD.sliderWidth / numberOfSections;
		var rateOfMinSect = lumD.getSectionRate(spread,sectForMin,widthOfSect);
		var rateOfMaxSect = lumD.getSectionRate(spread,sectForMax,widthOfSect);
		var previousPointForMin = lumD.sectionToPoint(sectForMin,numberOfSections);
		var previousPointForMax = lumD.sectionToPoint(sectForMax,numberOfSections);
		var distanceFromPrevSectForMin = minV - previousPointForMin;
		var distanceFromPrevSectForMax = maxV - previousPointForMax;
		var valueForMin = rateOfMinSect * distanceFromPrevSectForMin + spread[sectForMin];
		var valueForMax = rateOfMaxSect * distanceFromPrevSectForMax + spread[sectForMax];
		//if (name == 'depth') debug(minV + 'x' + maxV);
		lumD.adjustSliderHighlight(name,minV,maxV);
		lumD.updateOffset(name,valueForMin,valueForMax);
		lumD.updateSliderTimeOut();
		//reverse process
		/*
		var revSectForMin = lumD.valueToSection(valueForMin,spread,numberOfSections);
		var revSectForMax = lumD.valueToSection(valueForMax,spread,numberOfSections);
		var revRateOfMinSect = lumD.getSectionRate(spread,revSectForMin,widthOfSect);
		var revRateOfMaxSect = lumD.getSectionRate(spread,revSectForMax,widthOfSect);
		var revValueDistFromPrevMin  = valueForMin - spread[revSectForMin];
		var revValueDistFromPrevMax  = valueForMax - spread[revSectForMax];
		var revPointFromPrevMin = revValueDistFromPrevMin / revRateOfMinSect;
		var revPointFromPrevMax = revValueDistFromPrevMax / revRateOfMaxSect;
		var pointMin = revPointFromPrevMin + lumD.sectionToPoint(revSectForMin,numberOfSections);
		var pointMax = revPointFromPrevMax + lumD.sectionToPoint(revSectForMax,numberOfSections);
		//debug(name +':' + ' minXmax:' + minV + 'x' +maxV + ' sectMinxMax' + sectForMin + 'x' + sectForMax + ' ratesOfMinMax:' +
			//		  rateOfMinSect + 'x' + rateOfMaxSect + ' distFromMinMax:' + distanceFromPrevSectForMin + 'x' + distanceFromPrevSectForMax +
				//		' previousMinMAxSect:' + previousPointForMin + 'x' + previousPointForMax + ' valueForMinMax:' + valueForMin + 'x' + 
				//		valueForMax);
		//debug(name + ' points:' + minV + 'x' + maxV + ' values: ' + valueForMin+ ' x ' + valueForMax + ' sectMinMax:' + 
		//  			revSectForMin + 'x' + revSectForMax + ' distFromPrevMinMax:' + revValueDistFromPrevMin + 'x' + revValueDistFromPrevMax +
		//		' newPointsMinMax:' + pointMin + 'x' + pointMax
 		//);
		*/
	},
	valueToPoint : function(value,spread,numberOfSections) {
		//reverse process
		var widthOfSect = lumD.widthOfSection(numberOfSections); 
		
		var revSectForMin = lumD.valueToSection(value,spread,numberOfSections);
		
		//var revSectForMax = lumD.valueToSection(valueForMax,spread,numberOfSections);
		var revRateOfMinSect = lumD.getSectionRate(spread,revSectForMin,widthOfSect);
		
		//var revRateOfMaxSect = lumD.getSectionRate(spread,revSectForMax,widthOfSect);
		var revValueDistFromPrevMin  = value - spread[revSectForMin];
		
		//var revValueDistFromPrevMax  = valueForMax - spread[revSectForMax];
		var revPointFromPrevMin = revValueDistFromPrevMin / revRateOfMinSect;
		//var revPointFromPrevMax = revValueDistFromPrevMax / revRateOfMaxSect;
		var point = revPointFromPrevMin + lumD.sectionToPoint(revSectForMin,numberOfSections);
		
		return point;
		//var pointMax = revPointFromPrevMax + lumD.sectionToPoint(revSectForMax,numberOfSections);
	},
	widthOfSection : function(numberOfSections) {
		return lumD.sliderWidth / numberOfSections;
	},
	fixMax : function(maxV,minV) {
		maxV = maxV-lumD.priceSliderPadding;
		if (maxV < 0) maxV = 0;
		return maxV;
	},
	fixMin : function(minV,maxV) {
		if (minV > maxV) minV = maxV;
		return minV;
	},
	getSectionForValue : function(value,numberOfSections) {
		return Math.floor(value/lumD.sliderWidth * numberOfSections);
	},
	/* rate of changed per slider pixel */
	getSectionRate : function(spread,section,widthOfSect) {
		return (spread[section+1] - spread[section]) / widthOfSect;
	},
	sectionToPoint : function(section,numberOfSections) {
		return lumD.sliderWidth / numberOfSections * section;
	},
	valueToSection : function(value,spread,numberOfSections) {
		for(var i =0;i<numberOfSections;i++) {
			if (spread[i+1] > value) return i;
		}
		return numberOfSections-1;
	},
	//move background image
	adjustSliderHighlight : function(name,minV,maxV) {
		
		var delta = maxV - minV
		if (delta >= lumD.maxSliderValue) {return;}
		
		var sliderfg = $('slider_'+name+'_fg')
		var slider = lumD.getSlider(name)
		
		//var tickSize = slider.activeSlider.thumb.tickSize;
		//if (slider.activeSlider == slider.minSlider) {
		  //$(sliderfg).style.left = (minV + 1) + 'px';
		//}
		$(sliderfg).style.left = (minV + 1) + 'px';
    //Adjust the width of the highlight to match inner boundary
		//debug('delta:' +delta + ' width ' + Math.max(delta - 1,0));
		//sticking out a bit on partitioned sliders
		if (lumD.sectional.indexOf(name) != -1) {
			delta -= 4;
		}
		$(sliderfg).style.width = Math.max(delta - 1 + lumD.sliderColorAdjust,0) + 'px';
		//if (name == 'flour') {debug('slider high: ' +$(sliderfg).style.left + 'x' + $(sliderfg).style.width); }

	},
	updateOffset : function(name,minPrice,maxPrice) {
		if (lumD.editingOffsets) {
			lumD.editingOffsets = false;
			return;
		}
		//formats for after slider updates
		switch (name) {
			case 'price':
		    if (minPrice) $('offset_start_'+name+'_input').value = formatCurrency(minPrice,true)
		    if (maxPrice) $('offset_end_'+name+'_input').value = formatCurrency(maxPrice,true)
			  break;
			case 'retail_per_carat':
			  if (minPrice) $('offset_start_'+name+'_input').value = formatCurrency(minPrice,true)
		    if (maxPrice) $('offset_end_'+name+'_input').value = formatCurrency(maxPrice,true)
				break;
			case 'carat':
			  if (minPrice) $('offset_start_'+name+'_input').value = minPrice.toFixed(2)
		    if (maxPrice) $('offset_end_'+name+'_input').value = maxPrice.toFixed(2)
				break;
		  case 'table':
			  if (minPrice) $('offset_start_'+name+'_input').value = minPrice.toFixed(1)
		    if (maxPrice) $('offset_end_'+name+'_input').value = maxPrice.toFixed(1)
				break;
			case 'depth':
			  if (minPrice) $('offset_start_'+name+'_input').value = minPrice.toFixed(1)
		    if (maxPrice) $('offset_end_'+name+'_input').value = maxPrice.toFixed(1)
				break;
			case 'lw_ratio':
			  if (minPrice) $('offset_start_'+name+'_input').value = minPrice.toFixed(2)
		    if (maxPrice) $('offset_end_'+name+'_input').value = maxPrice.toFixed(2)
				break;
		}
	},
	//Formatting for entering fields
	formatTextField : function(name,value) {
		switch (name) {
			case 'price':
			  return formatCurrency(value,true);
			case 'retail_per_carat':
			  return formatCurrency(value,true);
		  default:
			  return value;
		}
	},
	fromTextField : function(name,value) {
		switch (name) {
			case 'price':
			  return fromCurrency(value);
		  case 'retail_per_carat':
			  return fromCurrency(value);
		  default:
			  return value;
		}
	},
	updateShapeForSliders : function(shape,total) {
		var shapes = lumD.selectedShapes();
		//if only round shape, hide lw_ratio advanced option
		if (lumD.hasDatagrid) {
			if (shapes.length == 1 && shapes[0] == 'B') {
				lumD.hideAdvancedOption('lw_ratio');
			} else {
				lumD.showAdvancedOption('lw_ratio');
			}
		}
		
		lumD.fixSpread('price',shapes,diamondShapes);
		lumD.fixSpread('carat',shapes,diamondCaratShapes);
		
		if (lumD.hasDatagrid) {
		lumD.fixSpread('retail_per_carat',shapes,diamondPerCaratShapes);
		lumD.fixSpread('table',shapes,diamondTableShapes);
		lumD.fixSpread('depth',shapes,diamondDepthShapes);
		lumD.fixSpread('lw_ratio',shapes,diamondLWRatioShapes);
		}
		//only update values if at end points
		if (lumD.getStartPos('price') == lumD.minSliderValue) {
      lumD.updateOffset('price',lumD.priceSliderSpread[0],false);
		} 
		if (lumD.getEndPos('price') == lumD.maxSliderValue || lumD.getEndPos('price') == 0) {
		  lumD.updateOffset('price',false,lumD.priceSliderSpread[lumD.priceSliderSections]);
		} 
	 	if (lumD.getStartPos('carat') == lumD.minSliderValue) {
		  lumD.updateOffset('carat',lumD.caratSliderSpread[0],false);
		}
		if (lumD.getEndPos('carat') == lumD.maxSliderValue || lumD.getEndPos('carat') == 0) {
			lumD.updateOffset('carat',false,lumD.caratSliderSpread[lumD.priceSliderSections]);
		}
		
		if (lumD.hasDatagrid) {
			if (lumD.getStartPos('retail_per_carat') == lumD.minSliderValue) {
				lumD.updateOffset('retail_per_carat',lumD.pricePerCaratSliderSpread[0],false);
			}
			if (lumD.getEndPos('retail_per_carat') == lumD.maxSliderValue) {
			 lumD.updateOffset('retail_per_carat',false,lumD.pricePerCaratSliderSpread[lumD.priceSliderSections]);
			}
			if (lumD.getStartPos('table') == lumD.minSliderValue) {
				lumD.updateOffset('table',lumD.tableSliderSpread[0],false);
			}
			if (lumD.getEndPos('table') == lumD.maxSliderValue) {
				lumD.updateOffset('table',false,lumD.tableSliderSpread[1]);
			}
			if (lumD.getStartPos('depth') == lumD.minSliderValue) {
				lumD.updateOffset('depth',lumD.depthSliderSpread[0],false);
			}
			if (lumD.getEndPos('depth') == lumD.maxSliderValue) {
				lumD.updateOffset('depth',false,lumD.depthSliderSpread[1]);
			}
			if (lumD.getStartPos('lw_ratio') == lumD.minSliderValue) {
				lumD.updateOffset('lw_ratio',lumD.lwRatioSliderSpread[0],false);
			}
			if (lumD.getEndPos('lw_ratio') == lumD.maxSliderValue) {
				lumD.updateOffset('lw_ratio',false,lumD.lwRatioSliderSpread[1]);
			}
		}
		if (!total) {
		   lumD.updateSliderTimeOut();
  	    } else {
		  lumD.isLoaded = true;
	    	lumD.updateSearchMeasure(total);
		   //lumD.checkAllShapes();
	    }
	},
	//If no shapes are selected, get spread of shape with most diamonds and min,max of all shapes
	//If one shape is selected, get spread of that shape
	//If multiple shapes are selected, get spread of shape with most diamonds, and min,max of shapes selected
	fixSpread : function(name,shapes,spreadForShapes) {
		switch (name) {
			case 'price':
		    lumD.priceSliderSpread = lumD.getSpread(shapes,spreadForShapes);
				//alert(lumD.priceSliderSpread);
			  break;
			case 'retail_per_carat':
			  lumD.pricePerCaratSliderSpread = lumD.getSpread(shapes,spreadForShapes);
				break;
			case 'carat':
			  lumD.caratSliderSpread = lumD.getSpread(shapes,spreadForShapes);
				break;
			case 'table':
			  lumD.tableSliderSpread = lumD.getSpread(shapes,spreadForShapes,1);
				//alert(lumD.tableSliderSpread);
				break;
			case 'depth':
			  lumD.depthSliderSpread = lumD.getSpread(shapes,spreadForShapes,1);
				break;
			case 'lw_ratio':
			  lumD.lwRatioSliderSpread = lumD.getSpread(shapes,spreadForShapes,1);
				break;
		}
	},
	getSpread : function(shapes,spreadForShapes,spreadLength) {
		var spread = []
		var length = spreadLength ? spreadLength : lumD.priceSliderSections
		if (shapes.length == 0) {
			var spread = lumD.getSpreadWithMost(spreadForShapes,spreadLength);
			var min_and_max = lumD.getSpreadMinMax(spreadForShapes,spreadLength);
			spread[0] = min_and_max[0]
			spread[length]  = min_and_max[1]
		} else if (shapes.length == 1) {
			var spread = arrayByKey(shapes[0],spreadForShapes);
		} else {
			var spreadWithSelectedShapes = lumD.getShapesFromSpread(shapes,spreadForShapes)
			//alert(spreadWithSelectedShapes);
			var spread = lumD.getSpreadWithMost(spreadWithSelectedShapes,spreadLength);
			var min_and_max = lumD.getSpreadMinMax(spreadWithSelectedShapes,spreadLength);
			spread[0] = min_and_max[0]
			spread[length]  = min_and_max[1]
			
			//alert(spread);
		}
		return spread;
	},
	getShapesFromSpread : function(shapes,spreadForShapes) {
		var spread = []
		//$('diamond_debugger').innerHTML = spreadForShapes;
		for(var i=0;i<spreadForShapes.length;i++) {
			if (shapes.indexOf(spreadForShapes[i][0]) != -1) {
				//alert(spreadForShapes[i]);
			  spread.push(spreadForShapes[i]);
		  }
	  }
		return spread;
	},
	getSpreadWithMost : function(spreadForShapes,spreadLength) {
		var maxV = 0;
		var length = spreadLength ? spreadLength : lumD.priceSliderSections
		var lastArrayV = length + 1
		var most = []
	  for(var i=0;i<spreadForShapes.length;i++) {
			if (maxV < spreadForShapes[i][1][lastArrayV]) {
			  most = cloneArray(spreadForShapes[i][1]);
		  }
	  }
		return most;
	},
	getSpreadMinMax : function(spreadForShapes,spreadLength) {
		var minV = 100000;
		var maxV = 0;
		var length = spreadLength ? spreadLength : lumD.priceSliderSections
	  for(var i=0;i<spreadForShapes.length;i++) {
			if (maxV < spreadForShapes[i][1][length]) {
			  maxV = spreadForShapes[i][1][length];
		  }
			if (minV > spreadForShapes[i][1][0]) {
				minV = spreadForShapes[i][1][0]
			}
	  }
		return [minV,maxV];
	},
	calcPrice : function(currentSection,sections,percent,spread) {
		if (currentSection == sections) { // Last section
		  return spread[sections]
		} else {
			return (spread[currentSection] + ((spread[currentSection+1] - spread[currentSection]) * percent))
		}
	},
	selectedShapes : function() {
		var shapes = $('diamondShapes').getElementsByTagName('input');
		var shapesAry = []
		for(var i = 0;i<shapes.length;i++) {
			if (shapes[i].checked)
			  shapesAry.push(shapes[i].value);
		}
		return shapesAry;
	},
	checkAllShapes : function() {
		var shapes = $('diamondShapes').getElementsByTagName('input');
		for(var i = 0;i<shapes.length;i++) {
			shapes[i].checked = true;
		}	
	},
	refreshLiveGrid : function() {
		 livegrid.gridAry['datagrid'].options.requestParameters = lumD.requestParams();
     livegrid.gridAry['datagrid'].resetContents()
     livegrid.gridAry['datagrid'].requestContentRefresh(0)
	},
	requestParams : function() {
		var params = []
		//when not main diamond datagrid
		if (!$('offset_start_price')) return params;
		params.push('shapes=' + lumD.selectedShapes().join(','))
		params.push('price=' + [lumD.getStartValue('price'),lumD.getEndValue('price')].join('-'))
		params.push('carat=' + [lumD.getStartValue('carat'),lumD.getEndValue('carat')].join('-'))
		//alert('Color:'+ $('offset_end_color').innerHTML);
		params.push('cut=' + $('offset_end_cut').innerHTML)
		params.push('color=' + $('offset_end_color').innerHTML)
		params.push('clarity=' + $('offset_end_clarity').innerHTML)
		if (lumD.hasDatagrid) {
		params.push('retail_per_carat=' + [lumD.getStartValue('retail_per_carat'),lumD.getEndValue('retail_per_carat')].join('-'))

		params.push('polish=' + $('offset_end_polish').innerHTML)
		params.push('flour=' + $('offset_end_flour').innerHTML)
		params.push('symmetry=' + $('offset_end_symmetry').innerHTML)
		params.push('table=' + [lumD.getStartValue('table'),lumD.getEndValue('table')].join('-'))
		params.push('depth=' + [lumD.getStartValue('depth'),lumD.getEndValue('depth')].join('-'))
		params.push('lw_ratio=' + [lumD.getStartValue('lw_ratio'),lumD.getEndValue('lw_ratio')].join('-'))
		params.push('with_fields=' + lumD.advancedOptions().join(','));
		}
		return params
	},
	getStartValue : function(field) {
		return $('offset_start_'+field+'_input').value
	},
	getEndValue : function(field) {
		return $('offset_end_'+field+'_input').value
	},
	saveDiamonds : function() {
		window.location = '/diamonds/saved'
	},
	toggleAdvancedOption : function(el) {
		var field = el.id.replace('with_options_','')
		var slider_id = 'slider_' + field + '_wrapper'
		if ($(slider_id)) {
		  if (el.checked) {
			  Element.show(slider_id)
				lumD.resetSlider(field);
		  } else {
			  Element.hide(slider_id)
		  }
		}
		lumD.setCheckBoxColumn();
	  lumD.refreshGrid();
	},
	refreshGrid : function() {
		livegrid.changeNumResults(0)
		if (lumD.hasDatagrid) {
			var url = '/diamonds/update_grid'
		} else {
			var url = '/diamonds/update_number'
			if ($('updating')) Element.show('updating')
		}
		if ($('updating') || $('grid_wrapper')) new Ajax.Request(url, { parameters : lumD.requestParams().join('&')});
	},
	hideAdvancedOption : function(opt) {
	  var el = $('with_options_'+ opt);
		el.checked = false;
		Element.hide(el);
		Element.hide('with_options_label_' + opt);
		var slider_id = 'slider_' + opt + '_wrapper'
		Element.hide(slider_id);
		lumD.setCheckBoxColumn();
	},
	showAdvancedOption : function(opt) {
	  var el = $('with_options_'+ opt);
		Element.show(el);
		Element.show('with_options_label_' + opt);
		lumD.setCheckBoxColumn();
	},
	advancedOptions : function() {
		var opts = []
		for(var i=0;i<lumD.advanced.length;i++) {
			var el = $('with_options_'+ lumD.advanced[i])
			if (el.checked) {
				opts.push(el.value);
			}
		}
		return opts;
	},
	setCheckBoxColumn : function() {
		var columnForShape = lumD.selectedShapes().length > 1 ? 1 : 0;
		livegrid.statusKey = 6 + lumD.advancedOptions().length + columnForShape;
  },
	//when page is loaded
	setupAdvancedOptions : function() {
		for(var i=0;i<lumD.advanced.length;i++) {
			var slider_id = 'slider_' + lumD.advanced[i] + '_wrapper'
			var el = $('with_options_'+ lumD.advanced[i])
			if (el.checked) {
			  Element.show(slider_id)
				//lumD.resetSlider(lumD.advanced[i]);
		  } else {
			  Element.hide(slider_id)
		  }
		}
		lumD.setCheckBoxColumn();
	},
	showAdvancedOptions : function() {
		var opts = lumD.advancedOptions()
		for(var i=0;i<opts.length;i++) {
			var th_id = 'sort_by_' + opts[i] + '_th'
			var slider_id = 'slider_' + opts[i] + '_wrapper'
			Element.show(th_id)
			if ($(slider_id)) Element.show(slider_id)
		}
	},
	addCompareDiamond : function(id) {
		//var span = $('datagridrow_datagrid_id_'+id);
	  ///lumD.addCompareClass(id);
		new Ajax.Request('/diamonds/add_compare_diamond/'+id);
	},
	addCompareClass : function(id) {
		var span = $('datagridrow_datagrid_id_'+id);
		var cells = $(span.parentNode.parentNode).getElementsByTagName('td');
		for(var i=0;i<cells.length;i++) {
		  Element.addClassName(cells[i].childNodes[0],'compareDiamondRow');
		}
	},
	removeCompareDiamond : function(id) {
		var span = $('datagridrow_datagrid_id_'+id);
		var row = $(span.parentNode.parentNode)
		Element.removeClassName(row,'compareDiamondRow');
		new Ajax.Request('/diamonds/remove_compare/'+id);
	},
	swapImageType : ['enlarged','inRing','rollover'],
	swapImage : function(type) {
		for(var i=0;i<lumD.swapImageType.length;i++) {
		  Element.hide(lumD.swapImageType[i] + 'Diamond');
			Element.removeClassName(lumD.swapImageType[i],'active')
		}
		Element.show(type + 'Diamond')
		if (type == 'enlarged') {
			$('rolloverText').update(arrayByKey('enlarged',diamondRolloverText));
		} else if (type == 'inRing') {
			 $('ringColorImage').src='/images/goldring.jpg'
			$('rolloverText').update(arrayByKey('in_a_ring',diamondRolloverText));
		}
		Element.addClassName(type,'active')
	},
	//Save for after rollover
	savedSwapImage : null,
	rolloverDiamond : function(pos,name) {
		for(var i=0;i<lumD.swapImageType.length;i++) {
			if (Element.visible(lumD.swapImageType[i] + 'Diamond')) {
				lumD.savedSwapImage = lumD.swapImageType[i]
			}
		  Element.hide(lumD.swapImageType[i] + 'Diamond');
		}
		Element.show('rolloverDiamond')
		
		$('rolloverText').update(arrayByKey(name,diamondRolloverText));
		$('rolloverDiamond').style.backgroundPosition = '0px '+pos+'px';
	},
	rolloutDiamond : function() {
		Element.hide('rolloverDiamond')
		if (lumD.savedSwapImage) {
			var type = lumD.savedSwapImage
		} else {
			var type = 'enlarged'
		}
		if (type == 'enlarged') {
		  $('rolloverText').update(arrayByKey('enlarged',diamondRolloverText));
		} else if (type == 'inRing') {
			$('rolloverText').update(arrayByKey('in_a_ring',diamondRolloverText));
			if ($('ringColorImage').src.match('whitering.jpg')) {
				lumD.updateBandColor('white');
			}
		}
		Element.show(type+ 'Diamond')
	},
	updateBandColor : function(color) {
		$('ringBandColor').update(color);
	},
	toggleBand : function(lnk) {
		if ($(lnk).innerHTML == 'yellow') {
		  $('ringColorImage').src='/images/whitering.jpg'
			lumD.updateBandColor('white');
		} else {
			$('ringColorImage').src='/images/goldring.jpg'
			lumD.updateBandColor('yellow');
		}
	},
	resetSlider : function(field) {
		var slider = arrayByKey(field,lumD.sliders);
		slider.setValues(lumD.minSliderValue,lumD.maxSliderValue);
	},
	getSlider : function(field) {
		return arrayByKey(field,lumD.sliders);
	},
	showDiamondName : function(name) {
		var el = $('diamond_shape_name_'+name);
		var image = $('diamond_shape_image_'+name);
		Element.show(el);
		var image_pos = Position.positionedOffset(image);
		el.style.left = image_pos[0] - 15 + 'px'
		el.style.top  = (image_pos[1] + 40) + 'px'
	},
	hideDiamondName : function(name) {
		var el = $('diamond_shape_name_'+name);
		Element.hide(el);
	},
	hideDiamondNames : function() {
		var shape_names = document.getElementsByClassName('diamondShapeName');
		for(var i=0;i<shape_names.length;i++) {
			Element.hide(shape_names[i]);
		}
	},
	updateSearchMeasure : function(count,dtotal) {
		if (!$('diamondSearchRuler')) return;
		var total = dtotal ? dtotal : 50000;
		var height = 430;
		var minHeight = 20;
		var measureSize = Math.round(height * count/total);
		var countPadding = 0;
		measureSize = measureSize > total ? total : measureSize;
		measureSize = measureSize < minHeight ? minHeight : measureSize;
		if (measureSize < minHeight) {
			countPadding = minHeight - measureSize;
		}
		totalHeight = (height - measureSize) < 0 ? 0 : height - measureSize;
		//alert(height + 'x' + measureSize)
		$('diamondSearchRuler').style.height = measureSize + 'px';
		$('diamondSearchRulerPadding').style.height = totalHeight +'px'; 
		var nums = document.getElementsByClassName('number_of_diamonds');
		//alert(nums.length)
		for(var i=0;i<nums.length;i++) {
			$(nums[i]).innerHTML = addCommas(count).replace('.00','');
			//$(nums[i]).style.marginBottom =  '-' + countPadding + 'px'
		}
		//alert('height: ' + $('diamondSearchRuler').style.height + ' : Padding: ' + $('diamondSearchRuler').style.paddingTop);
	}
}
//Returns second value of array, where first value is key
function arrayByKey(key,array) {
	for(var i=0;i<array.length;i++) {
		if (key == array[i][0]) {
			return array[i][1];
		}
	}
}
function addCommas(nStr)
{
	if (isNaN(nStr)) { return '0.00';}
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	
	if (x.length > 1 && x[1].length == 0) {
		x2 = '.' + x[1] + '0'
	} else if(x.length > 1 && x[1].length == 1) {
		x2 = '.' + x[1] + '0'
	} else if(x.length > 1 && x[1].length >= 2) {
		x2 = '.' + x[1]
	} else {
	  x2 = '.00';
	}

	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
  return x1 + x2;
	
}

function fromCurrency(str) {
	return parseFloat(str.replace(/\$/g,'').replace(/,/g,''));
}

function formatCurrency(str,no_decimal) {
	if (no_decimal) {
	  return '$' + addCommas(str).replace(/\.\d+$/,'');
	} else {
		return '$' + addCommas(str);
	}
}

function arrayDebug(array) {
	if (!$('diamond_debugger')) return;
	var out = '';
	for(var i=0;i<array.length;i++) {
		out += array[i] + "<br/>";
	}
	$('diamond_debugger').innerHTML = out;
}
function debug(text) {
	$('diamond_debugger').style.display = '';
	$('diamond_debugger').innerHTML = text + '<br/><br/>' + $('diamond_debugger').innerHTML;
}
function debug2(text) {
	$('diamond_debugger').style.display = '';
	$('diamond_debugger').innerHTML = text;
}
function cloneArray(array) {
 var dup = []
 for(var i=0;i<array.length;i++) {
	dup[i] = array[i]; 
 }
 return dup;
}
/* Client-side access to querystring name=value pairs
	Version 1.3
	28 May 2008
	
	License (Simplified BSD):
	http://adamv.com/dev/javascript/qslicense.txt
*/
function Querystring(qs) { // optionally pass a querystring to parse
	this.params = {};
	
	if (qs == null) qs = location.search.substring(1, location.search.length);
	if (qs.length == 0) return;

// Turn <plus> back to <space>
// See: http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4.1
	qs = qs.replace(/\+/g, ' ');
	var args = qs.split('&'); // parse out name/value pairs separated via &
	
// split out each name=value pair
	for (var i = 0; i < args.length; i++) {
		var pair = args[i].split('=');
		var name = decodeURIComponent(pair[0]);
		
		var value = (pair.length==2)
			? decodeURIComponent(pair[1])
			: name;
		
		this.params[name] = value;
	}
}

Querystring.prototype.get = function(key, default_) {
	var value = this.params[key];
	return (value != null) ? value : default_;
}

Querystring.prototype.contains = function(key) {
	var value = this.params[key];
	return (value != null);
}
var order = {
	steps   : ['basic','billing','shipping','confirm'],
	completedSteps : [],
	
	editStep : function(step) {
		for(var i=0;i<order.steps.length;i++) {
			Element.hide(order.steps[i] + '_checkout')
		}
		order.showEditLinks();
		order.hideEditLink(step);
		Element.show(step + '_checkout');
	},
	showEditLinks : function() {
		for(var i=0;i<order.completedSteps.length;i++) {
			Element.show(order.completedSteps[i] + '_edit_link')
			order.showCheckedImage(order.completedSteps[i]);
		}
	},
	hideEditLink : function(step) {Element.hide(step + '_edit_link');order.hideCheckedImage(step); },
	addCompletedStep : function(step) {
		if (order.completedSteps.indexOf(step) == -1) {order.completedSteps.push(step)}
	},
	CCRejected : function() {
		$('basic_checkout').hide();
		order.addCompletedStep('basic');		
		order.showEditLinks();
		$('checkout_steps').show();
	},
	showCheckedImage : function(step) {Element.show(step + '_checked') },
	hideCheckedImage : function(step) {Element.hide(step + '_checked') },
	
	clearErrorMessages : function() {
		$$('.checkoutErrors').each(function(e) { e.update(); })
	},
	validateSetting : function() {
		var form = $('setting_form');
		var settings = form.getInputs('radio', 'setting_id');
		var setting_selected = settings.detect(function(e) { return e.checked;});
		var size_selected    = $F('size');
		var message = 'Please choose both a metal type, and a ring size';
		if (!setting_selected || size_selected.length == 0) {
			 alert(message);
			 return false;
		}
		return true;
	},
	updateTotals : function(grandTotal,salesTax) {
		$$('.grandTotal').each(function(e) { e.update(grandTotal); });
		$$('.salesTax').each(function(e) { e.update(salesTax); });
	},
	showShipping : function() {
		$$('.shipBox').each(function(e) { e.show(); });
		order.hideEditLink('shipping');
	},
	hideShipping : function() {
		$$('.shipBox').each(function(e) { e.hide(); });
	}

}

var bubble = {
	current : null,
	
	load : function(name,options) {
		bubble.current = name;
		var left = (options && options.left) ? options.left : 250
		var posElement = (options && options.posEl) ? options.posEl : 'slider_'+name+'_wrapper'
		new Ajax.Updater('bubble_loader','/bubbles/show/'+name,{onComplete : function(request) {
			
			var pos = Position.cumulativeOffset($(posElement));
			var bubbleHeight = Element.getDimensions('bubble_loader').height;
			var top = bubbleHeight/2;
			var posTop = pos[1] - top;
			var windowHeight = getWindowHeight();
			var windowSize = getWindowSize();
	    var pageOffset = getScrollXY()
			var pageYOffset = pageOffset[1];
			var pageXOffset = pageOffset[0];
			var realYOffset = windowHeight + pageYOffset;
			var realXOffset = windowSize[0] + pageXOffset;
			var bubbleYOffset = pos[1] - top;
			var bubbleBottom = pos[1] + top;
			var bubbleTop = pos[1] - top;
			var bubbleRight = pos[0] + left + Element.getDimensions('bubble_loader').width;
			var overHang  = bubbleBottom - realYOffset;
		  var topOverHang = bubbleTop + pageYOffset;
			//alert('bubTop:' + bubbleTop + ' ' + ' yOffset:' + pageYOffset + ' windowHeight:' +windowHeight + ' bubHeight:' 
				//		 + bubbleHeight);
			var rightOverHang = bubbleRight - realXOffset + 30;
			var bubbleXOffset = pos[0] + left;
			//alert('bubbleRight:' + bubbleRight + ' pageXOffset:'+pageXOffset + ' rightOverHang:'+rightOverHang);
			//var html = 'windowHeight:' + windowHeight + '  bubbleHeight:' + bubbleHeight + ' bubbleTop:' + bubbleYOffset + 
			//      ' posTop:' + pos[1] + 'pageYOffset: ' + pageOffset[1] + ' realYOffset:' + realYOffset + ' overHang:' + overHang;
		  //$('bubble_loader').innerHTML = html + $('bubble_loader').innerHTML;
			//$('bubble_loader').style.top = pos[1] - top + 'px';
			if (overHang > 0) {
				bubbleYOffset = bubbleYOffset - overHang
			}
			//alert(topOverHang);
			if (topOverHang < 0) {
				bubbleYOffset = bubbleYOffset - topOverHang
			}
			if (rightOverHang > 0) {
				bubbleXOffset = bubbleXOffset - rightOverHang;
			}
			//Bubble is too big, make sure X is showing
			if (bubbleHeight > windowHeight) {
				bubbleYOffset = 0;
			}
			$('bubble_loader').style.top = bubbleYOffset + 'px';
			$('bubble_loader').style.left =  bubbleXOffset + 'px';
			
			 $('bubble_loader').style.display = '';
			
		}});
	},
	show : function(name) {
		if (bubble.current == name) {
			Element.show('bubble_loader');
		} else {
	    //they've moved to another section, so don't show current again
			bubble.current = null;
		}
	},
	hide : function(name) {
		//if (bubble.current == name) {
			//bubble.current = null;
		//}
	  Element.hide('bubble_loader');
	},
	compareShow : function(name) {
		var pos = Position.positionedOffset($('slider_'+name+'_wrapper'));
		var qb  = 'question_bubble_' + name;
	  //$(qb).style.top  = (pos[1] - 30)+ 'px';
	  $(qb).style.left = (pos[0] - 10) + 'px';
	}
}

var compare = {
	currentSort : null,
	currentSortDir : null,
	sortBy : function(name) {
		if (compare.currentSort) {
			if (name == compare.currentSort) {
				if (compare.currentSortDir == 'asc') {
					compare.currentSortDir = 'desc';
					$(compare.currentSort).removeClassName('active');
			    $(compare.currentSort).addClassName('active_desc');
				} else {
					compare.currentSortDir = 'asc';
					$(compare.currentSort).removeClassName('active_desc');
			    $(compare.currentSort).addClassName('active');
				}
			} else {
			  $(compare.currentSort).removeClassName('active');
			  $(compare.currentSort).removeClassName('active_desc');
				compare.currentSortDir = 'asc';
			  $(name).addClassName('active')
			}
		} else {
			compare.currentSortDir = 'asc';
			$(name).addClassName('active');
		}
		compare.currentSort = name;
	}
}

function getWindowHeight() {
			var windowHeight = 0;
			if (typeof(window.innerHeight) == 'number') {
				windowHeight = window.innerHeight;
			}
			else {
				if (document.documentElement && document.documentElement.clientHeight) {
					windowHeight = document.documentElement.clientHeight;
				}
				else {
					if (document.body && document.body.clientHeight) {
						windowHeight = document.body.clientHeight;
					}
				}
			}
			return windowHeight;
		}
		function setContent() {
			if (document.getElementById) {
				var windowHeight = getWindowHeight();
				if (windowHeight > 0) {
					var contentElement = document.getElementById('bubble_loader');
					var contentHeight = contentElement.offsetHeight;
					if (windowHeight - contentHeight > 0) {
						contentElement.style.position = 'relative';
						contentElement.style.top = ((windowHeight / 2) - (contentHeight / 2)) + 'px';
					}
					else {
						contentElement.style.position = 'static';
					}
				}
			}
		}
		function getScrollXY() {
  var scrOfX = 0, scrOfY = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
  return [ scrOfX, scrOfY ];
}
function getWindowSize() {
  var myWidth = 0, myHeight = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = window.innerWidth;
    myHeight = window.innerHeight;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
    myHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
    myHeight = document.body.clientHeight;
  }
  return [myWidth,myHeight];
}
var diamondRolloverText = [ ['length','Length = distance from "top to bottom" of diamond as it would sit in a ring.'],
														['width','Width = distance "across" diamond as it would sit in a ring.'],
														['depth','Depth % = depth of diamond divided by width of diamond.'],
														['lw_ratio','L/W Ratio = length of diamond divided by width of diamond.'],
														['table','Table % = width of table divided by width of diamond.'],
														['culet','Culet = small facet or point at the bottom of diamond pavilion.'],
														['girdle','Girdle = outer edge of diamond where crown meets pavilion.'],
														['in_a_ring','<span class="noBold">How a diamond of this <a href="/glossary/Size___Shape_on_Ring" onclick="window.open(this.href,null,\'scrollbars=1,resizable=1,width=760,height=600\');return false;">size and shape</a> would appear on a 2mm <a href="#" onclick="lumD.toggleBand(this)" id="ringBandColor" title="change color">yellow</a> gold band.</span>'],
														['enlarged','<span class="noBold">This is a <a href="/glossary/Sample_Image" onclick="window.open(this.href,null,\'scrollbars=1,resizable=1,width=760,height=600\');return false;">sample image</a></span>']
													]
		

