// Copyright (C) 2008 Robert W. Clarke Consulting, all rights reserved.// do not remove this copyright noticefunction getPopData(){ // called by systemInit()	// function makes the master population data array	// the data is for 1960, 1970, and 1980 through 2005. The first element is 1960 and the third element is 1980	var ary=new Array();	ary['AL'] = "3267,3444,3894,3919,3925,3934,3952,3973,3992,4015,4024,4030,4050,4099,4154,4214,4260,4297,4331,4368,4405,4430,4452,4467,4480,4502,4525,4558";	ary['AK'] = "226,303,402,418,450,488,514,532,544,539,542,547,553,570,589,599,603,604,609,613,620,625,628,632,641,649,658,664";	ary['AZ'] = "1302,1775,2718,2810,2890,2969,3067,3184,3308,3437,3535,3622,3684,3789,3916,4065,4245,4432,4587,4737,4883,5024,5166,5296,5438,5578,5740,5939";	ary['AR'] = "1786,1923,2286,2293,2294,2306,2320,2327,2332,2342,2343,2346,2357,2383,2416,2456,2494,2535,2572,2601,2626,2652,2679,2692,2707,2726,2750,2779";	ary['CA'] = "15717,19971,23668,24286,24820,25360,25844,26441,27102,27777,28464,29218,29960,30471,30975,31275,31484,31697,32019,32486,32988,33499,34003,34527,34988,35457,35842,36132";	ary['CO'] = "1754,2210,2890,2978,3062,3134,3170,3209,3237,3260,3262,3276,3308,3387,3496,3614,3724,3827,3920,4018,4117,4226,4327,4427,4498,4548,4602,4665";	ary['CT'] = "2535,3032,3108,3129,3139,3162,3180,3201,3224,3247,3272,3283,3292,3303,3301,3309,3316,3324,3337,3349,3365,3386,3412,3432,3458,3486,3499,3510";	ary['DE'] = "446,548,594,596,599,605,612,618,628,637,648,658,670,683,695,706,718,730,741,751,763,775,786,795,806,818,830,844";	ary['DC'] = "764,757,638,637,634,632,633,635,638,637,630,624,605,601,598,595,589,581,572,568,565,570,571,569,565,558,554,551";	ary['FL'] = "4952,6791,9746,10193,10471,10750,11040,11351,11668,11997,12306,12638,13033,13370,13651,13927,14239,14538,14853,15186,15487,15759,16049,16351,16678,16993,17385,17790";	ary['GA'] = "3943,4588,5463,5568,5650,5728,5835,5963,6085,6208,6316,6411,6513,6653,6817,6978,7157,7328,7501,7685,7864,8046,8230,8416,8582,8747,8918,9073";	ary['HI'] = "633,770,965,978,994,1013,1028,1040,1052,1068,1080,1095,1113,1137,1159,1173,1188,1197,1204,1212,1215,1210,1212,1222,1234,1248,1262,1275";	ary['ID'] = "667,713,944,962,974,982,991,994,990,985,986,994,1012,1041,1072,1109,1145,1177,1203,1229,1252,1276,1300,1321,1344,1368,1395,1429";	ary['IL'] = "10081,11110,11427,11443,11423,11409,11412,11400,11387,11391,11390,11410,11453,11569,11694,11810,11913,12008,12102,12186,12272,12359,12440,12519,12587,12650,12712,12763";	ary['IN'] = "4662,5195,5490,5480,5468,5450,5458,5459,5454,5473,5492,5524,5558,5616,5675,5739,5794,5851,5906,5955,5999,6045,6092,6126,6155,6196,6227,6272";	ary['IA'] = "2758,2825,2914,2908,2888,2871,2859,2830,2792,2767,2768,2771,2781,2798,2818,2837,2851,2867,2880,2891,2903,2918,2928,2931,2934,2941,2953,2966";	ary['KS'] = "2179,2249,2364,2385,2401,2416,2424,2427,2433,2445,2462,2473,2481,2499,2532,2557,2581,2601,2615,2635,2661,2678,2693,2701,2712,2724,2734,2745";	ary['KY'] = "3038,3221,3661,3670,3683,3694,3695,3695,3688,3683,3680,3677,3694,3722,3765,3812,3849,3887,3920,3953,3985,4018,4049,4067,4089,4117,4142,4173";	ary['LA'] = "3257,3645,4206,4283,4353,4395,4400,4408,4407,4344,4289,4253,4222,4253,4293,4316,4347,4379,4399,4421,4440,4461,4469,4465,4475,4490,4507,4524";	ary['ME'] = "969,994,1125,1133,1137,1145,1156,1163,1170,1185,1204,1220,1232,1237,1239,1242,1243,1243,1249,1255,1259,1267,1277,1286,1297,1308,1315,1322";	ary['MD'] = "3101,3924,4217,4262,4283,4313,4365,4413,4487,4566,4658,4727,4800,4868,4923,4972,5023,5070,5112,5157,5204,5255,5312,5380,5442,5512,5561,5600";	ary['MA'] = "5149,5689,5737,5769,5771,5799,5841,5881,5903,5935,5980,6015,6023,6018,6029,6061,6095,6141,6180,6226,6272,6317,6362,6395,6412,6418,6407,6399";	ary['MI'] = "7823,8882,9262,9209,9115,9048,9049,9076,9128,9187,9218,9253,9311,9400,9479,9540,9598,9676,9759,9809,9848,9897,9956,10003,10039,10078,10104,10121";	ary['MN'] = "3414,3806,4076,4112,4131,4141,4158,4184,4205,4235,4296,4338,4390,4441,4496,4556,4610,4660,4713,4763,4813,4873,4934,4985,5024,5062,5097,5133";	ary['MS'] = "2178,2217,2521,2539,2557,2568,2578,2588,2594,2589,2580,2574,2579,2599,2624,2655,2689,2723,2748,2777,2805,2828,2849,2858,2866,2881,2901,2921";	ary['MO'] = "4320,4678,4917,4932,4929,4944,4975,5000,5023,5057,5082,5096,5129,5171,5217,5271,5324,5378,5432,5481,5522,5562,5606,5643,5681,5719,5760,5800";	ary['MT'] = "675,694,787,795,804,814,821,822,814,805,800,800,800,810,826,845,861,877,886,890,892,898,904,906,910,918,927,936";	ary['NE'] = "1411,1485,1570,1579,1582,1584,1589,1585,1574,1567,1571,1575,1582,1596,1612,1626,1639,1657,1674,1686,1696,1705,1713,1719,1727,1738,1748,1759";	ary['NV'] = "285,489,800,848,882,902,925,951,981,1023,1075,1137,1221,1296,1351,1411,1499,1582,1666,1764,1853,1935,2018,2095,2168,2242,2333,2415";	ary['NH'] = "607,738,921,937,948,958,977,997,1025,1054,1083,1105,1112,1110,1118,1129,1143,1158,1175,1189,1206,1222,1241,1259,1275,1288,1299,1310";	ary['NJ'] = "6067,7171,7365,7407,7431,7468,7515,7566,7622,7671,7712,7726,7763,7815,7881,7949,8014,8083,8150,8219,8287,8360,8434,8505,8576,8640,8685,8718";	ary['NM'] = "951,1017,1303,1333,1364,1394,1417,1438,1463,1479,1490,1504,1522,1555,1595,1636,1682,1720,1752,1775,1793,1808,1822,1833,1855,1879,1903,1928";	ary['NY'] = "16782,18241,17558,17568,17590,17687,17746,17792,17833,17869,17941,17983,18021,18123,18247,18375,18459,18524,18588,18657,18756,18883,18999,19091,19165,19228,19281,19255";	ary['NC'] = "4556,5084,5882,5957,6019,6077,6164,6254,6322,6404,6481,6565,6664,6784,6897,7043,7187,7345,7501,7657,7809,7949,8078,8198,8313,8422,8540,8683";	ary['ND'] = "632,618,653,660,669,677,680,677,669,661,655,646,638,636,638,641,645,648,650,650,648,644,641,636,634,633,636,637";	ary['OH'] = "9706,10657,10798,10788,10757,10738,10738,10735,10730,10760,10799,10829,10864,10946,11029,11101,11152,11203,11243,11277,11312,11335,11364,11385,11405,11432,11450,11464";	ary['OK'] = "2328,2559,3025,3096,3206,3290,3286,3271,3253,3210,3167,3150,3149,3175,3221,3252,3281,3308,3340,3373,3405,3437,3454,3466,3487,3505,3524,3548";	ary['OR'] = "1769,2092,2633,2668,2665,2653,2667,2673,2684,2701,2741,2791,2860,2929,2992,3060,3121,3184,3247,3304,3352,3394,3431,3473,3522,3563,3591,3641";	ary['PA'] = "11319,11801,11864,11859,11845,11838,11815,11771,11783,11811,11846,11866,11903,11982,12049,12120,12166,12198,12220,12228,12246,12264,12286,12296,12324,12365,12394,12430";	ary['RI'] = "859,950,947,953,954,956,962,969,977,990,996,1001,1006,1011,1013,1015,1016,1017,1021,1025,1031,1040,1051,1058,1069,1076,1080,1076";	ary['SC'] = "2383,2591,3122,3179,3208,3234,3272,3303,3343,3381,3412,3457,3501,3570,3620,3663,3705,3749,3796,3860,3919,3975,4024,4060,4103,4147,4198,4255";	ary['SD'] = "681,666,691,690,691,693,697,698,696,696,698,697,697,704,713,722,731,738,742,744,746,750,756,758,760,765,771,776";	ary['TN'] = "3567,3926,4591,4628,4646,4660,4687,4715,4739,4783,4822,4854,4894,4967,5050,5138,5231,5327,5417,5499,5570,5639,5703,5747,5790,5842,5893,5963";	ary['TX'] = "9580,11199,14229,14746,15331,15752,16007,16273,16561,16622,16667,16807,17057,17398,17760,18162,18564,18959,19340,19740,20158,20558,20949,21334,21722,22099,22472,22860";	ary['UT'] = "891,1059,1461,1515,1558,1595,1622,1643,1663,1678,1689,1706,1731,1780,1837,1898,1960,2014,2068,2120,2166,2203,2243,2288,2337,2379,2421,2470";	ary['VT'] = "390,445,511,516,519,523,527,530,534,540,550,558,565,569,573,578,584,589,594,597,600,605,610,613,616,619,621,623";	ary['VA'] = "3967,4651,5347,5444,5493,5565,5644,5715,5812,5932,6037,6120,6217,6301,6414,6510,6593,6671,6751,6829,6901,7000,7104,7192,7286,7383,7481,7567";	ary['WA'] = "2853,3413,4132,4236,4277,4300,4344,4400,4453,4532,4640,4746,4903,5026,5161,5279,5375,5481,5570,5675,5770,5843,5911,5992,6066,6131,6207,6288";	ary['WV'] = "1860,1744,1950,1954,1950,1945,1928,1907,1882,1858,1830,1807,1793,1799,1806,1818,1820,1824,1823,1819,1816,1812,1807,1801,1805,1810,1813,1817";	ary['WI'] = "3952,4418,4706,4726,4729,4721,4736,4748,4756,4778,4822,4857,4905,4964,5025,5085,5134,5185,5230,5266,5298,5333,5374,5404,5439,5472,5504,5536";	ary['WY'] = "330,332,470,492,506,510,505,500,496,477,465,458,454,459,466,473,480,485,488,489,491,492,494,494,499,502,506,509";		var sc,i,year,xyear,ci,ary_pop,base_pop,inc_pop;	var pop_mult = 1000;	for(sc in ary){		ary_pop = ary[sc].split(",");		ary[sc] = new Array();						ary[sc][1960] = ary_pop[0] * pop_mult;		ary[sc][1970] = ary_pop[1] * pop_mult;		year = 1980;		for(i=2;i<ary_pop.length;i++){			ary[sc][year] = ary_pop[i] * pop_mult;			year++;		}		// extrapolate 1961 to 1969		base_pop = ary[sc][1960];		inc_pop = Math.round((ary[sc][1970] - ary[sc][1960])/10);		ci = 1;		for(xyear=1961;xyear<=1969;xyear++){			ary[sc][xyear] = base_pop + inc_pop * ci;			ci++;		}		// extrapolate 1971 to 1979		base_pop = ary[sc][1970];		inc_pop = Math.round((ary[sc][1980] - ary[sc][1970])/10);		ci = 1;		for(xyear=1971;xyear<=1979;xyear++){			ary[sc][xyear] = base_pop + inc_pop * ci;			ci++;		}			}		return ary;}function getYears(){	var ary = new Array();	for(var y=1960;y<=2005;y++){		ary.push(y);	}	return ary;}// make array for state namesvar ary_state = new Array();ary_state['AL']="Alabama";ary_state['AK']="Alaska";ary_state['AZ']="Arizona";ary_state['AR']="Arkansas";ary_state['CA']="California";ary_state['CO']="Colorado";ary_state['CT']="Connecticut";ary_state['DE']="Delaware";ary_state['DC']="District of Columbia";ary_state['FL']="Florida";ary_state['GA']="Georgia";ary_state['HI']="Hawaii";ary_state['ID']="Idaho";ary_state['IL']="Illinois";ary_state['IN']="Indiana";ary_state['IA']="Iowa";ary_state['KS']="Kansas";ary_state['KY']="Kentucky";ary_state['LA']="Louisiana";ary_state['ME']="Maine";ary_state['MD']="Maryland";ary_state['MA']="Massachusetts";ary_state['MI']="Michigan";ary_state['MN']="Minnesota";ary_state['MS']="Mississippi";ary_state['MO']="Missouri";ary_state['MT']="Montana";ary_state['NE']="Nebraska";ary_state['NV']="Nevada";ary_state['NH']="New Hampshire";ary_state['NJ']="New Jersey";ary_state['NM']="New Mexico";ary_state['NY']="New York";ary_state['NC']="North Carolina";ary_state['ND']="North Dakota";ary_state['OH']="Ohio";ary_state['OK']="Oklahoma";ary_state['OR']="Oregon";ary_state['PA']="Pennsylvania";ary_state['RI']="Rhode Island";ary_state['SC']="South Carolina";ary_state['SD']="South Dakota";ary_state['TN']="Tennessee";ary_state['TX']="Texas";ary_state['UT']="Utah";ary_state['VT']="Vermont";ary_state['VA']="Virginia";ary_state['WA']="Washington";ary_state['WV']="West Virginia";ary_state['WI']="Wisconsin";ary_state['WY']="Wyoming";// ---------------------------------------------------------------------------------------------------------------function getDataRange(){ // called by initSystem()	// this function returns the range of data for all years and all states	// for both population and deltapop			// find the state that has the most pop for any given year	// find the state that has the least pop for any given year	// find the state that has the most delta pop for any given year	// find the state that has the least delta pop for any given year (could be negative)	var state, yi, popu, dpop;	var tmin = 1e20;	var tmax = -1e20;	var dmin = 1e20;	var dmax = -1e20;		for(state in ary_state){		for(yi=0;yi<ary_years.length;yi++){			// population			popu = ary_popdat[state][ary_years[yi]];			if(popu < tmin){ tmin = popu; }			if(popu > tmax){ tmax = popu; }			// deltapop			if(yi > 0){ // no delta for first record				dpop = ary_popdat[state][ary_years[yi]] - ary_popdat[state][ary_years[yi-1]];				if(dpop < dmin){ dmin = dpop; }				if(dpop > dmax){ dmax = dpop; }			}		}	}		// now break up the overall range into 10 increments (10 colors), do for both tpop and dpop	// now build the formatted range array (used later to set state colors)	// ary_range['tpop' | 'dpop'][0-9]['min' | 'max']	var ary = new Array();		// set range sections for tpop (total population)	var tpop_range_inc = Math.round((tmax-tmin)/10);	ary['tpop'] = new Array();		var i;	for(i=0;i<=9;i++){		ary['tpop'][i] = new Array();				ary['tpop'][i]['min'] = tmin + i * tpop_range_inc;		ary['tpop'][i]['max'] = ary['tpop'][i]['min'] + tpop_range_inc - 1; // decrement by one						if(i == 9){ // the last range, don't decrement			ary['tpop'][i]['max'] = tmax;		}	}		// set range sections for dpop (change in population)	// the first section will be for negative numbers	var dpop_range_inc = Math.round((dmax-0)/9);	ary['dpop'] =  new Array();		ary['dpop'][0] =  new Array();	ary['dpop'][0]['min'] = dmin;	ary['dpop'][0]['max'] = 0;		ary['dpop'][1] =  new Array();	ary['dpop'][1]['min'] = 0;	ary['dpop'][1]['max'] = dpop_range_inc - 1; 		for(i=2;i<=9;i++){		ary['dpop'][i] =  new Array();						ary['dpop'][i]['min'] = (i-1) * dpop_range_inc;		ary['dpop'][i]['max'] = ary['dpop'][i]['min'] + dpop_range_inc - 1; // decrement by one				if(i == 9){ // the last range, don't decrement			ary['dpop'][i]['max'] = dmax;		}	}		return ary; }// ---------------------------------------------------------------------------------var ary_range, ary_popdat, ary_years;var system_init = false;function initSystem(){ // this function is called when page loads	ary_years = getYears();	ary_popdat = getPopData();	ary_range = getDataRange();	buildMapLegendHTML();	updateLegend('tpop');	document.forms.control_form.dtype[0].checked = true;	document.forms.control_form.rate[1].checked = true;	document.forms.control_form.loop.checked = true;	buildFrames();	system_init = true;}var ary_frames = new Array();function buildFrames(){	// this function sets the map xml for all frames	var i;	for(i=0;i<ary_years.length;i++){		ary_frames[i] = new Array();		ary_frames[i]['tpop'] = makeXML(i,'tpop');		ary_frames[i]['dpop'] = makeXML(i,'dpop');	}}// set the colors that will be used for the map and key, each type must have 10 elementsvar ary_colors = new Array();ary_colors['tpop'] = new Array("FFFF99","CCFF99","99FF99","99CC99","999966","CC9966","CC6633","CC3300","990000","CC0000"); // for population scaleary_colors['dpop'] = new Array("FFFF00","FFCCFF","FF99FF","FF66FF","FF33FF","FF00FF","CC0099","CC3300","990000","CC0000"); // for population change scalefunction getColorCode(type,val){ // called by makeXML()	// this function returns a color code according to range		// get the index value for the range where the value belongs	var i, rmin, rmax;	var si = -1;	for(i=0;i<ary_range['tpop'].length;i++){		if((val >= ary_range[type][i]['min'])&&(val <= ary_range[type][i]['max'])){			si = i;			break;		}	}		if(si < 0){ // error, could not find the index for the color within range		return "000000"; // make it black	} else {		return ary_colors[type][si];	}}var ary_legend = new Array();function buildMapLegendHTML(){	// this function makes the html for the map legend	var i,t,type;	var ary_types = new Array('tpop','dpop');			for(t=0;t<ary_types.length;t++){		type = ary_types[t];		ary_legend[type] = '<table width="100%"  border="0" cellspacing="2" cellpadding="0">';		ary_legend[type] += '<tr align="CENTER">';		for(i=0;i<ary_colors[type].length;i++){			ary_legend[type] += '<td class="rangetext">' + formaThousands(ary_range[type][i]['min']) + '&nbsp;<br />' + formaThousands(ary_range[type][i]['max']) + '&nbsp;</td>';		}		ary_legend[type] += '</tr><tr align="CENTER">';		for(i=0;i<ary_colors[type].length;i++){			ary_legend[type] += '<td bgcolor="#' + ary_colors[type][i] + '" width="10%">&nbsp;</td>';		}		ary_legend[type] += '</tr><tr align="CENTER">';		if(type == "tpop"){			ary_legend[type] += '<td class="legendtitle" colspan="10">State Population Totals</td>';		}		if(type == "dpop"){			ary_legend[type] += '<td class="legendtitle" colspan="10">State Population Change</td>';		}		ary_legend[type] += '</tr></table>';	}}function formaThousands(nnum){	var nstr = nnum.toString();	var re = new RegExp('(-?[0-9]+)([0-9]{3})');	while(re.test(nstr)) {		nstr = nstr.replace(re, '$1,$2');	}	return nstr;}// ------------------------------------------------------------------------------------------function generatePopTable(){	var state,html,year,tpop;	html = '<table cellspacing="0" cellpadding="4" border="1">';	html += '<tr align="CENTER">';	html += '<th>STATE</th>';	for(year=1960;year<=2005;year++){		html += '<th>' + year + '</th>';	}	html += '</tr>';	for(state in ary_state){		html += '<tr align="RIGHT">';		html += '<th align="LEFT" nowrap>' + state + ' - ' + ary_state[state] + '</th>';		for(year=1960;year<=2005;year++){			tpop = ary_popdat[state][year];			html += '<td>' + formaThousands(tpop) + '</td>';		}		html += '</tr>';	}	html += '</table>';	return html;}