/* 
CommunityHealthStudies.org
California Department of Public Health
Environmental Health Investigations Branch
Designed and Created by LaMa Media LLC (LaMaMedia.com)
Copyright (c) 2008 - All rights reserved

*/

// ****************************************************************
// STUDY POWER CALCULATOR
// ****************************************************************

var vDistribution = new Array( 0.00000,0.00399,0.00798,0.01197,0.01595,0.01994,0.02392,0.02790,0.03188,0.03586,0.03983,0.04380,0.04776,0.05172,0.05567,0.05962,0.06356,0.06749,0.07142,0.07535,0.07926,0.08317,0.08706,0.09095,0.09483,0.09871,0.10257,0.10642,0.11026,0.11409,0.11791,0.12172,0.12552,0.12930,0.13307,0.13683,0.14058,0.14431,0.14803,0.15173,0.15542,0.15910,0.16276,0.16640,0.17003,0.17364,0.17724,0.18082,0.18439,0.18793,0.19146,0.19497,0.19847,0.20194,0.20540,0.20884,0.21226,0.21566,0.21904,0.22240,0.22575,0.22907,0.23237,0.23565,0.23891,0.24215,0.24537,0.24857,0.25175,0.25490,0.25804,0.26115,0.26424,0.26730,0.27035,0.27337,0.27637,0.27935,0.28230,0.28524,0.28814,0.29103,0.29389,0.29673,0.29955,0.30234,0.30511,0.30785,0.31057,0.31327,0.31594,0.31859,0.32121,0.32381,0.32639,0.32894,0.33147,0.33398,0.33646,0.33891,0.34134,0.34375,0.34614,0.34849,0.35083,0.35314,0.35543,0.35769,0.35993,0.36214,0.36433,0.36650,0.36864,0.37076,0.37286,0.37493,0.37698,0.37900,0.38100,0.38298,0.38493,0.38686,0.38877,0.39065,0.39251,0.39435,0.39617,0.39796,0.39973,0.40147,0.40320,0.40490,0.40658,0.40824,0.40988,0.41149,0.41308,0.41466,0.41621,0.41774,0.41924,0.42073,0.42220,0.42364,0.42507,0.42647,0.42785,0.42922,0.43056,0.43189,0.43319,0.43448,0.43574,0.43699,0.43822,0.43943,0.44062,0.44179,0.44295,0.44408,0.44520,0.44630,0.44738,0.44845,0.44950,0.45053,0.45154,0.45254,0.45352,0.45449,0.45543,0.45637,0.45728,0.45818,0.45907,0.45994,0.46080,0.46164,0.46246,0.46327,0.46407,0.46485,0.46562,0.46638,0.46712,0.46784,0.46856,0.46926,0.46995,0.47062,0.47128,0.47193,0.47257,0.47320,0.47381,0.47441,0.47500,0.47558,0.47615,0.47670,0.47725,0.47778,0.47831,0.47882,0.47932,0.47982,0.48030,0.48077,0.48124,0.48169,0.48214,0.48257,0.48300,0.48341,0.48382,0.48422,0.48461,0.48500,0.48537,0.48574,0.48610,0.48645,0.48679,0.48713,0.48745,0.48778,0.48809,0.48840,0.48870,0.48899,0.48928,0.48956,0.48983,0.49010,0.49036,0.49061,0.49086,0.49111,0.49134,0.49158,0.49180,0.49202,0.49224,0.49245,0.49266,0.49286,0.49305,0.49324,0.49343,0.49361,0.49379,0.49396,0.49413,0.49430,0.49446,0.49461,0.49477,0.49492,0.49506,0.49520,0.49534,0.49547,0.49560,0.49573,0.49585,0.49598,0.49609,0.49621,0.49632,0.49643,0.49653,0.49664,0.49674,0.49683,0.49693,0.49702,0.49711,0.49720,0.49728,0.49736,0.49744,0.49752,0.49760,0.49767,0.49774,0.49781,0.49788,0.49795,0.49801,0.49807,0.49813,0.49819,0.49825,0.49831,0.49836,0.49841,0.49846,0.49851,0.49856,0.49861,0.49865,0.49869,0.49874,0.49878,0.49882,0.49886,0.49889,0.49893,0.49896,0.49900,0.49903,0.49906,0.49910,0.49913,0.49916,0.49918,0.49921,0.49924,0.49926,0.49929,0.49931,0.49934,0.49936,0.49938,0.49940,0.49942,0.49944,0.49946,0.49948,0.49950,0.49952,0.49953,0.49955,0.49957,0.49958,0.49960,0.49961,0.49962,0.49964,0.49965,0.49966,0.49968,0.49969,0.49970,0.49971,0.49972,0.49973,0.49974,0.49975,0.49976,0.49977,0.49978,0.49978,0.49979,0.49980,0.49981,0.49981,0.49982,0.49983,0.49983,0.49984,0.49985,0.49985,0.49986,0.49986,0.49987,0.49987,0.49988,0.49988,0.49989,0.49989,0.49990,0.49990,0.49990,0.49991,0.49991,0.49992,0.49992,0.49992,0.49992,0.49993,0.49993,0.49993,0.49994,0.49994,0.49994,0.49994,0.49995,0.49995,0.49995,0.49995,0.49995,0.49996,0.49996,0.49996,0.49996,0.49996,0.49996,0.49997,0.49997,0.49997,0.49997,0.49997,0.49997,0.49997,0.49997,0.49998,0.49998,0.49998,0.49998);


var vS1obj, vS2obj, vS3obj, vSPobj, vEnum, vEdis, vUnum, vUdis, vDistMax;

var vSliderTop = 0;
var vSliderBot = 100;
var vSliderScale = 1;
var vSliderRange = ((vSliderBot - vSliderTop) * vSliderScale);
var vFilters = { digits: '([0-9]*)' , letters: '([A-Za-z]*)' };

function fSPSetup() {
	vS1obj = fDOM("si1", 0);
	vS2obj = fDOM("si2", 0);
	vS3obj = fDOM("si3", 0);
	vSPobj = fDOM("sosp", 0);
	vEnum = fDOM("enum", 0);
	vEdis = fDOM("edis", 0);
	vUnum = fDOM("unum", 0);
	vUdis = fDOM("udis", 0);
	vDistMax = (vDistribution.length - 1);
	if (!vIE) fDW('<style>#spcover {left: -62px;} .spnums {padding-left: 30px;}</style>');
	setTimeout('fSPCalc()', 100);
}

function fSPCalc() {
	var samplesize, unexposed, exposed;
	var n1, n2, p1, p2, p3, q1, q2, q3, d2, r, r0, sample;
	var r12bot, r1, r2top, r2, pos, power, height, color, value;
	var r0 = 0;

	samplesize = parseInt(vS1obj.value);
	unexposed = parseInt(vS2obj.value);
	exposed = parseInt(vS3obj.value);
	
	if (exposed >= unexposed) {
		n1 = (samplesize / 2);
		n2 = n1;
		p1 = (unexposed / 100);
		p2 = (exposed / 100);
		
		q1 = 1-p1;
		q2 = 1-p2;
		p3 = (((n1*p1)+(n2*p2))/(n1+n2));
		q3 = (1-p3);
		d2 = Math.abs(p2-p1);
		
		r12bot = Math.sqrt(((p1*q1)/n1)+((p2*q2)/n2));
		r1 = (d2 / r12bot);
		r2top = Math.sqrt((p3*q3)*((1/n1)+(1/n2)));
		r2 = (1.96*(r2top / r12bot));
		r = (r1-r2);
		sample = ((n1 * p3) * q3);
		if (isNaN(r) || isNaN(sample) || sample < 5) {
			power = 0;
			value = "N/A";
		} else {
			if (r < 0) { r0 = 1; r = (r * -1); }
			pos = parseInt(r*100);
			if (pos > vDistMax) pos = vDistMax;
			power = (vDistribution[pos] + .5);
			if (r0) power = (1 - power);
			power = parseInt(power * 100);
			if (power == 100) power = 99;
			if (power <= 2) power = 0;
			value = (power + "%");
		}

		if (power < 70) color = "#ffa0a0";
		else if (power < 80) color = "#ffff90";
		else color = "#80ff80";
		fStyle("sosp", "background-color", color);
		vSPobj.value = value;
		height = (100 - power);
		fStyle("spcover", "height", (height + "px"));
		vEnum.value = n2;
		vUnum.value = n1;
		vEdis.value = parseInt(n2*p2);
		vUdis.value = parseInt(n1*p1);
	}
	
	//setTimeout('fSPCalc()', 100);
}

function fLimitDigits(rField) {
	var tOKChars;
	var tValue = rField.value
	var tFilter = new RegExp('^' + vFilters['digits'] + '$');
	if (!tFilter.test(tValue)) {
		tFilter = new RegExp(vFilters['digits']);
		tOKChars = tValue.match(tFilter);
		if (tOKChars) rField.value = tValue.match(tFilter)[1];
		return false;
	}
	return true;
}

function fUnTooHigh() {
	fStyle("untoohigh", "color", "#ffffff");
	fStyle("untoohigh", "background-color", "#468364");
	setTimeout('fUnTooHighOff()', 1500);
}

function fUnTooHighOff() {
	fStyle("untoohigh", "color", "#468364");
	fStyle("untoohigh", "background-color", "#deedf7");
}


// ****************************************************************
// SLIDER CODE
// ****************************************************************

(function() {
	var Event = YAHOO.util.Event,
	Dom   = YAHOO.util.Dom,
	lang  = YAHOO.lang,
	s1, s2, s3;
	
	Event.onDOMReady(function() {
	
		s1 = YAHOO.widget.Slider.getVertSlider("sb1","st1", vSliderTop, vSliderBot);
		s2 = YAHOO.widget.Slider.getVertSlider("sb2","st2", vSliderTop, vSliderBot);
		s3 = YAHOO.widget.Slider.getVertSlider("sb3","st3", vSliderTop, vSliderBot);
		
		s1.getRealValue = function() {
			var tValue = Math.round(this.getValue() * vSliderScale);
			return(((tValue * -1) + vSliderRange) * 100); // SS RANGE MULT
		}
		s2.getRealValue = function() {
			var tValue = Math.round(this.getValue() * vSliderScale);
			return((tValue * -1) + vSliderRange);
		}
		s3.getRealValue = function() {
			var tValue = Math.round(this.getValue() * vSliderScale);
			return((tValue * -1) + vSliderRange);
		}
		
		s1.subscribe("change", function() {
			var tField = Dom.get("si1");
			var tVal = s1.getRealValue();
			tField.value = tVal;
			Dom.get("sb1").title = "Sample Size = " + tVal;
			fSPCalc();
		});
		s2.subscribe("change", function() {
			var tField = Dom.get("si2");
			var tVal = s2.getRealValue();
			tField.value = (tVal + "%");
			Dom.get("sb2").title = "Unexposed = " + tVal + "%";
			fLimitP2();
			fSPCalc();
		});
		s3.subscribe("change", function() {
			var tField = Dom.get("si3");
			var tVal = s3.getRealValue();
			tField.value = (tVal + "%");
			Dom.get("sb3").title = "Exposed = " + tVal + "%";
			fLimitP2();
			fSPCalc();
		});
		
		s1.subscribe("slideStart", function() {});
		s1.subscribe("slideEnd", function() {});

		s2.subscribe("slideStart", function() {});
		s2.subscribe("slideEnd", function() { fLimitP2(); });

		s3.subscribe("slideStart", function() {});
		s3.subscribe("slideEnd", function() { fLimitP2(); });

		function fLimitP2() {
			var t2 = s2.getRealValue();
			var t3 = s3.getRealValue();
			if (t2 > t3) {
				var tPos = Math.round(t3 / vSliderScale);
				tPos = (vSliderBot - tPos);
				s2.setValue(tPos);
				fUnTooHigh();
			}
		}
		
		s1.setValue(vSliderBot, true);
		s2.setValue(vSliderBot, true);
		s3.setValue(vSliderBot, true);
		
		Event.on("si1", "keydown", function(e) {
			var k = Event.getCharCode(e);
			if (k === 13 || k === 9) {
				var v = parseFloat(this.value, 10);
				v = (lang.isNumber(v)) ? v : 0;
				v = (((v * -1)/100) + vSliderRange); // SS RANGE MULT
				s1.setValue(Math.round(v/vSliderScale));
			}
		});
		Event.on("si2", "keydown", function(e) {
			var k = Event.getCharCode(e);
			if (k === 13 || k === 9) {
				var v = parseFloat(this.value, 10);
				v = (lang.isNumber(v)) ? v : 0;
				v = ((v * -1) + vSliderRange);
				s2.setValue(Math.round(v/vSliderScale));
			}
		});
		Event.on("si3", "keydown", function(e) {
			var k = Event.getCharCode(e);
			if (k === 13 || k === 9) {
				var v = parseFloat(this.value, 10);
				v = (lang.isNumber(v)) ? v : 0;
				v = ((v * -1) + vSliderRange);
				s3.setValue(Math.round(v/vSliderScale));
			}
		});
	
	});
})();
