
var data = 
{
	xmlLaws: '',
	xmlDensity: '',
	v1: '',
	v2: '',
	v3: '',
	v4: '',
	v5: '',
	v6: '',
	v7: '',
	va: '',
	vb: '',
	vc: '',
	vd: '',
	ve: '',
	vf: '',
	vg: '',
	chart2scale: '',
	chart3scale: ''
}


var qsArgs = {};


function loadQS(obj)
{
	var qs = document.location.search.length > 1 ? document.location.search.substr(1,document.location.search.length) : ''
		
	var pairs = qs.split('&');	
	for(var i=0; i<pairs.length; i++)
	{
		var key = pairs[i].split('=')[0];
		var val = pairs[i].split('=')[1];
		obj[key] = val;
	}
}

function lookupData(doc, nodeName, nodeVal)
{
	nodeVal = trim(nodeVal.toLowerCase());
	
	var xmlRows = doc.documentElement.childNodes;
	
	for(var r=0; r<xmlRows.length; r++)
	{		
		var xmlCols = xmlRows[r].childNodes;
		for(var c=0; c<xmlCols.length; c++)
		{
			var xmlCol = xmlCols[c];
			if(xmlCol.nodeName == nodeName)
			{
				if(trim(xmlCol.childNodes[0].nodeValue.toLowerCase()) == nodeVal)
				{										
					loadVars(xmlRows[r]);
					return;
				}
			}
		}
	}
	
	alert('no data for ' + nodeName + ' = ' + nodeVal);
}

function loadVars(xmlRow)
{
	var xmlCols = xmlRow.childNodes;
	for(var c=0; c<xmlCols.length; c++)
	{
		//skip text nodes
		if(xmlCols[c].nodeType == 1)
		{
			var nodeName = xmlCols[c].nodeName;
			var nodeValue = xmlCols[c].childNodes[0].nodeValue;

			data[nodeName] = trim(nodeValue);
		}
	}
}

function init()
{

	var cb1 = 
	{
		success: loadDataSuccess,
		failure: loadDataFailure,
		argument: ['xmlLaws']
	}
	
	YAHOO.util.Connect.asyncRequest('GET', 'laws_exported.xml', cb1, null);
	
	var cb2 = 
	{
		success: loadDataSuccess,
		failure: loadDataFailure,
		argument: ['xmlDensity']
	}
	
	YAHOO.util.Connect.asyncRequest('GET', 'density_exported.xml', cb2, null);	
	
	YAHOO.util.Event.addListener('lstStates', 'change', changeState);
	YAHOO.util.Event.addListener('lstCities', 'change', changeCity);
	
}

function loadDataSuccess(o)
{
	data[o.argument[0]] = o.responseXML;

	if(typeof(data.xmlLaws) == 'object' && typeof(data.xmlDensity) == 'object') 
	{
		display();
	}
}

function loadDataFailure(o)
{
	alert('Error reading data ');
}

function loadList(ctl, doc, nodeName, selected, filterName, filterVal)
{
	//clear out existing list;
	for(var i=ctl.options.length; i>0; i--)
	{
		ctl.options[i] = null;
	}
	
	var xmlRows = doc.documentElement.childNodes;
	
	for(var r=0; r<xmlRows.length; r++)
	{		
		var xmlCols = xmlRows[r].childNodes;
		
		var inFilter = true;
		
		if(filterName && filterVal)
		{
			inFilter = false;
			
			for(var c=0; c<xmlCols.length; c++)
			{
				var xmlCol = xmlCols[c];
				if(xmlCol.nodeName == filterName)
				{					
					if(trim(xmlCol.childNodes[0].nodeValue.toLowerCase()) == trim(filterVal.toLowerCase()))
					{
						inFilter = true;
					}
					break;
				}
			}		
		}
		
		if(inFilter)
		{
			for(var c=0; c<xmlCols.length; c++)
			{
				var xmlCol = xmlCols[c];
				if(xmlCol.nodeName == nodeName)
				{
					var opt = document.createElement('option')
					opt.value = trim(xmlCol.childNodes[0].nodeValue);
					opt.innerHTML = opt.value;
					if(opt.value == selected) opt.selected = true;
					try
					{
						ctl.options[ctl.options.length] = opt;
					}
					catch(e)
					{
						ctl.options.appendChild(opt);
					}

					break;
				}
			}
		}
	}

}

function changeState()
{
	if(document.location.href.indexOf('statelaws') >= 0)
	{
		if(this.selectedIndex > 0)
		{
			document.location.href = 'statelaws_results.html?s=' + this.options[this.selectedIndex].value;
		}
	}
	else
	{		
		loadList(document.getElementById('lstCities'), data.xmlDensity, 'vb', '', 'va', this.options[this.selectedIndex].value)	
	}
}

function changeCity()
{
	var ctl_state = document.getElementById('lstStates');
	var s = ctl_state.options[ctl_state.selectedIndex].value;
	
	var href = document.location.href;
	href = href.substr(0,href.lastIndexOf('.'));
	if(href.indexOf('_results') > 0)
	{
		href = href.substr(0,href.indexOf('_results'));
	}
	href += '_results.html?s=' + s + '&c=' + this.options[this.selectedIndex].value;
	document.location.href = href;
	//'numberofsalons_results.html?s=' + s + '&c=' + this.options[this.selectedIndex].value;
}

function display()
{

	loadQS(qsArgs);
	
		
	var state = decodeURI(qsArgs['s']);
	var city = decodeURI(qsArgs['c']);
	
	if(document.getElementById('lstStates'))
	{
		loadList(document.getElementById('lstStates'), data.xmlLaws, 'v1', state)
	}
	
	if(state != 'undefined')
	{
		if(document.getElementById('lstCities'))
		{
			loadList(document.getElementById('lstCities'), data.xmlDensity, 'vb', city, 'va', state)
		}
		
		if(document.getElementById('g1bar1'))
		{
			lookupData(data.xmlLaws, 'v1', state);
			
			document.getElementById('var_v1_1').innerHTML = data.v1 + ' ';
			document.getElementById('var_v1_2').innerHTML = data.v1 + ' ';
			
			var v1s = data.v1.lastIndexOf('s') == data.v1.length-1 ? data.v1 + '\' ' : data.v1 + '\'s ';
			
			document.getElementById('var_v1_3').innerHTML = v1s;
			document.getElementById('var_v1_4').innerHTML = v1s;
			document.getElementById('var_v1_5').innerHTML = v1s;
			document.getElementById('var_v1_6').style['display'] = data.v1 == 'Ohio' ? 'block' : 'none';
			document.getElementById('var_v1_7').href += '?s=' + data.v1;
			document.getElementById('var_v1_8').innerHTML = data.v1 + ' ';
			
			document.getElementById('var_v2_1').innerHTML = data.v2 == 'Yes' ? 'a state law related  to indoor tanning,' : '<u>no</u> state law related  to indoor tanning.';
			if(data.v2 == 'Yes')
			{
				document.getElementById('var_v2_2').style['display'] = 'block';
				document.getElementById('var_v2_3').style['visibility'] = 'hidden';
				document.getElementById('var_v3_1').innerHTML = data.v3 == 'Yes' ? 'included' : '<u>did not</u> include'			
			}
			else
			{
				document.getElementById('var_v2_2').style['display'] = 'none';	
				document.getElementById('var_v2_3').style['visibility'] = 'visible';
			}

			document.getElementById('var_v4_1').innerHTML = data.v4;
			
			document.getElementById('var_v5_1').src = data.v5 == 'Yes' ? 'images/checkbox_checked.gif' : 'images/checkbox.gif';
			document.getElementById('var_v5_1').alt = data.v5 == 'Yes' ? 'checked' : 'not checked';

			document.getElementById('var_v6_1').src = data.v6 == 'Yes' ? 'images/checkbox_checked.gif' : 'images/checkbox.gif';
			document.getElementById('var_v6_1').alt = data.v6 == 'Yes' ? 'checked' : 'not checked';
			
			document.getElementById('var_v7_1').src = data.v7 == 'Yes' ? 'images/checkbox_checked.gif' : 'images/checkbox.gif';
			document.getElementById('var_v7_1').alt = data.v7 == 'Yes' ? 'checked' : 'not checked';
			
			if(data.v2 == 'Yes' && data.v5 != 'Yes' && data.v6 != 'Yes' && data.v7 != 'Yes')
			{
				document.getElementById('var_vcombo').style['display'] = 'block';
			}
			else
			{
				document.getElementById('var_vcombo').style['display'] = 'none';
			}
			
			setTimeout(function(){setGraph('g1bar1','g1lbl1',100,data.v4,148,100)}, 30);
			setTimeout(function(){setGraph('g1bar2','g1lbl2',100,29,148,100)}, 50);
			setTimeout(function(){setGraph('g1bar3','g1lbl3',100,51.79,148,100)}, 70);
			setTimeout(function(){setGraph('g1bar4','g1lbl4',100,100,148,100)}, 90);

		}

	}
	
	if(city != 'undefined')
	{		
		lookupData(data.xmlDensity, 'vb', city);
		
		var city_state = trim(data.vb);
		var city = city_state;
		
		if(city.lastIndexOf(' ') == city.length - 3) // && city != 'Washington DC')
		{
			city = city.substr(0, city.length - 3);
		}
		
		if(document.location.href.indexOf('salonpractices_results') >= 0)
		{
			document.getElementById('var_vb_1').innerHTML = city_state;		
			document.getElementById('var_vg_1').innerHTML = data.vg;
		}
		
		if(document.getElementById('g2'))
		{
			document.getElementById('var_vb_1').innerHTML = city_state + ' ';
			document.getElementById('var_vb_2').innerHTML = city + ' ';
			document.getElementById('var_vb_3').innerHTML = city + ' ';
			document.getElementById('var_vb_4').innerHTML = city + ' ';
			document.getElementById('var_vb_5').innerHTML = city + ' ';		

			//for density data, get next multiple of 5 higher than max of (avg.salons, #salons, #macdonalds, #starbucks)
			//divide that number by 5 to get the size of each step in the scale, then round it up to the next multiple of 5
			//ex; max(42, 11, 9, 6) = 42, round up to 45
			//45 / 5 (steps to be used in scale) = 9, round up to 10. Scale will be 10 / 20 / 30 / 40 / 50, to safely include values 42, 11, 9 & 6

			//density vs. mcdonalds & starbuck
			var chart2maxval = findMax([42, data.vc, data.vd, data.ve]);
			data.chart2scale = ceiling(ceiling(chart2maxval,5) / 5, 5);		

			//set the chart scale legend
			for(var i=0; i<=5; i++)
			{
				document.getElementById('g2scale'+i).innerHTML = i * data.chart2scale;
			}

			setTimeout(function(){setGraph('g2bar1','g2lbl1',(data.chart2scale * 5),42,139,(data.chart2scale * 5),3)}, 30);
			setTimeout(function(){setGraph('g2bar2','g2lbl2',(data.chart2scale * 5),data.vc,139,(data.chart2scale * 5))}, 50);
			setTimeout(function(){setGraph('g2bar3','g2lbl3',(data.chart2scale * 5),data.vd,139,(data.chart2scale * 5))}, 70);
			setTimeout(function(){setGraph('g2bar4','g2lbl4',(data.chart2scale * 5),data.ve,139,(data.chart2scale * 5))}, 90);
		}
		
		if(document.getElementById('g3'))
		{
			document.getElementById('var_vb_6').innerHTML = city;
			document.getElementById('var_vb_7').innerHTML = city;
		
			//density vs. avg		
			var chart3maxval = findMax([11.8, data.vf]);
			data.chart3scale = ceiling(ceiling(chart3maxval,5) / 3, 5);

			for(var i=0; i<=3; i++)
			{
				document.getElementById('g3scale'+i).innerHTML = i * data.chart3scale;
			}		

			setTimeout(function(){setGraph('g3bar1','g3lbl1',(data.chart3scale * 3),data.vf,110,(data.chart3scale * 3))}, 30);
			setTimeout(function(){setGraph('g3bar2','g3lbl2',(data.chart3scale * 3),11.8,110,(data.chart3scale * 3))}, 50);
			
		}
		
	}	

}


function setGraph(id,lid,start,tgt,height,max)
{
	start-=2;
	if(start > tgt)
	{
		document.getElementById(id).style['top'] = height - (height * start / max) + 'px';
		setTimeout(function(){setGraph(id,lid,start,tgt,height,max)}, 30);
	}
	else
	{
		document.getElementById(id).style['top'] = height - (height * tgt / max) + 'px';
		document.getElementById(lid).innerHTML = tgt;
		document.getElementById(lid).style['top'] = height - (height * tgt / max) + 5 + 'px';
	}
}

function trim(s)
{
	var rxpTrim = new RegExp('^[ \t]+|[ \t]+$','g')
	return s.replace(rxpTrim, '');

}

function findMax(list)
{	
	var m;
	for(var i=0; i<list.length; i++)
	{
		if(!m || parseFloat(list[i]) > parseFloat(m)) m=list[i];
	}
	return m;
}

function ceiling(start, increment)
{
	//return the lowest number >= start that is a multiple of increment
	var val = increment;
	while(parseFloat(val) < parseFloat(start)) 
	{
		val += increment;
	}
	return val;
}

YAHOO.util.Event.onDOMReady(init);
