function MM_findObj(n, d) { //v4.01
  var p,i,x; if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function recalculate() {
	calculateHole(1, false);
	calculateHole(2, false);
	calculateHole(3, false);
	calculateHole(4, false);
	calculateHole(5, false);
	calculateHole(6, false);
	calculateHole(7, false);
	calculateHole(8, false);
	calculateHole(9, false);
	calculateHole(10, false);
	calculateHole(11, false);
	calculateHole(12, false);
	calculateHole(13, false);
	calculateHole(14, false);
	calculateHole(15, false);
	calculateHole(16, false);
	calculateHole(17, false);
	calculateHole(18, false);
}
function recalculate(modified) {
	calculateHole(1, false, modified);
	calculateHole(2, false, modified);
	calculateHole(3, false, modified);
	calculateHole(4, false, modified);
	calculateHole(5, false, modified);
	calculateHole(6, false, modified);
	calculateHole(7, false, modified);
	calculateHole(8, false, modified);
	calculateHole(9, false, modified);
	calculateHole(10, false, modified);
	calculateHole(11, false, modified);
	calculateHole(12, false, modified);
	calculateHole(13, false, modified);
	calculateHole(14, false, modified);
	calculateHole(15, false, modified);
	calculateHole(16, false, modified);
	calculateHole(17, false, modified);
	calculateHole(18, false, modified);
}

function calculateHole(hole, typing) {
	var holeScore = MM_findObj('hole' + hole);
	if (holeScore != null && holeScore.value.length != 0) {
		if (typing & (holeScore.value == '-' || holeScore.value > 1 || holeScore.value == 0)) {	
			var nextHole = eval(hole) + 1;
			var nextHoleScore = MM_findObj('hole' + nextHole);
			if (nextHoleScore == null) {
				nextHoleScore = MM_findObj('released');
			}
			nextHoleScore.focus();
			nextHoleScore.select();
		}
		calculatePBScore(hole);
	}
	if (hole < 10) {
		calculateOutScore();
	}
	else {
		calculateInScore();
	}
	calculateSummaryScore();
}
function calculateHole(hole, typing, modified) {
	var holeScore = MM_findObj('hole' + hole);
	if (holeScore != null && holeScore.value.length != 0) {
		if (typing & (holeScore.value == '-' || holeScore.value > 1 || holeScore.value == 0)) {	
			var nextHole = eval(hole) + 1;
			var nextHoleScore = MM_findObj('hole' + nextHole);
			if (nextHoleScore == null) {
				nextHoleScore = MM_findObj('released');
			}
			nextHoleScore.focus();
			nextHoleScore.select();
		}
		if(modified) {
			calculateModifiedPBScore(hole);
		}
		else {
			calculatePBScore(hole);
		}
	}
	if (hole < 10) {
		calculateOutScore();
	}
	else {
		calculateInScore();
	}
	calculateSummaryScore();
}
function calculatePBScore(hole) {
	var holeScore = getFieldValue('hole' + hole);
	var pbScore = '0';
	if (holeScore.length > 0 && isInteger(holeScore)) {
		pbScore = getLabelValue('hole' + hole + 'ParOwn') - holeScore + 2;
		if (pbScore < 0 || holeScore < 1) {
			pbScore = 0;
		}
	}
	setLabelValue('hole' + hole + 'PbScore', pbScore);
}

function calculateModifiedPBScore(hole) {
	var holeScore = getFieldValue('hole' + hole);
	var pbScore = '0';
	if (holeScore.length > 0 && isInteger(holeScore) && holeScore != 0) {
		var diff = getLabelValue('hole' + hole + 'ParOwn') - holeScore;
		if(diff > 2) {
			pbScore = 8;
		}
		else if (diff == 2) {
			pbScore = 5;
		}
		else if (diff == 1) {
			pbScore = 2;
		}
		else if (diff == 0) {
			pbScore = 0;
		}
		else if (diff == -1) {
			pbScore = -1;
		}
		else {
			pbScore = -3;
		}
	}
	else if (holeScore.length > 0) {
		pbScore = -3;
	}
	setLabelValue('hole' + hole + 'PbScore', pbScore);
}

function calculateOutScore() {
	var score = 0;
	var pbScore = 0;
	for (i = 1; i < 10; i++) {
		var holeScore = getFieldValue('hole' + i);
		if (holeScore != null && holeScore.length > 0 && isInteger(holeScore)) {
			score = score + eval(holeScore);
		}
		var holePbScore = getLabelValue('hole' + i + 'PbScore');
		if (holePbScore != null && holePbScore.length > 0 && isInteger(holePbScore)) {
			pbScore = pbScore + eval(holePbScore);
		}
	}
	setLabelValue('outScore', score);
	setLabelValue('outPbScore', pbScore);
}

function calculateInScore() {
	var score = 0;
	var pbScore = 0;
	for (i = 10; i < 19; i++) {
		var holeScore = getFieldValue('hole' + i);
		if (holeScore != null && holeScore.length > 0 && isInteger(holeScore)) {
			score = score + eval(holeScore);
		}
		var holePbScore = getLabelValue('hole' + i + 'PbScore');
		if (holePbScore != null && holePbScore.length > 0 && isInteger(holePbScore)) {
			pbScore = pbScore + eval(holePbScore);
		}
	}
	setLabelValue('inScore', score);
	setLabelValue('inPbScore', pbScore);
}

function calculateSummaryScore() {
	var score = 0;
	var pbScore = 0;
	var parSum = 0;
	var ownParSum = 0;
	for (i = 1; i < 19; i++) {
		var holeScore = getFieldValue('hole' + i);
		if (holeScore != null && holeScore.length > 0 && isInteger(holeScore)) {
			score = score + eval(holeScore);
		}
		var holePbScore = getLabelValue('hole' + i + 'PbScore');
		if (holePbScore != null && holePbScore.length > 0 && isInteger(holePbScore)) {
			pbScore = pbScore + eval(holePbScore);
		}
		var holePar = getLabelValue('hole' + i + 'Par');
		if (holePar != null && holePar.length > 0 && isInteger(holePar)) {
			parSum = parSum + eval(holePar);
		}
		var holeParOwn = getLabelValue('hole' + i + 'ParOwn');
		if (holeParOwn != null && holeParOwn.length > 0 && isInteger(holeParOwn)) {
			ownParSum = ownParSum + eval(holeParOwn);
		}
	}
	setLabelValue('totalScore', score);
	setLabelValue('totalPbScore', pbScore);
	
	var lpScore = score - (ownParSum - parSum);
	setLabelValue('totalLpScore', lpScore);
}

function getFieldValue(key) {
	var keyObj = MM_findObj(key);
	if (keyObj != null) {
		return keyObj.value;
	}
	return null;
}

function getLabelValue(key) {
	var keyObj = MM_findObj(key);
	if (keyObj != null) {
		if (document.all) {
			return keyObj.innerText;
		}
		else {
			return keyObj.innerHTML;
		}
	}
	return null;
}

function setLabelValue(key, value) {
	var keyObj = MM_findObj(key);
	if (keyObj != null) {	
		if (document.all) {
			keyObj.innerText = value;
		}
		else {
			keyObj.innerHTML = value;
		}
	}
}

function isDigit(num) {
	if (num.length>1){return false;}
	var string="1234567890";
	if (string.indexOf(num)!=-1){return true;}
	return false;
}

function isInteger(val){
	if (val == null || val.length == 0){return false;}
	if("-".indexOf(val) == 0) {
		val = val.substr(1);
		if(val.length == 0) {return false;}
	}
	for(var i=0;i<val.length;i++){
		if(!isDigit(val.charAt(i))){return false;}
	}
	return true;
}

function addNexGolfError(errorMsg) {
	var errorElement = MM_findObj('nexgolfError');
	if (errorElement!=null) {
		errorElement.style.display='block';
		errorElement.appendChild(document.createTextNode(errorMsg));
		errorElement.appendChild(document.createElement('br'));
	}
}
	function showHcpUpdateDialog1() {
		var obj = MM_findObj("dialog2");	
		if (obj == null || obj.style.visibility == "hidden") {
			var obj = MM_findObj("dialog1");
  			if (obj) {
  				obj.style.visibility = "visible";
  			}
		}
	}
	function showHcpUpdateDialog2() {
		var obj = MM_findObj("dialog2");
  		if (obj) {
  			obj.style.visibility = "visible";
  		}
  		var obj = MM_findObj("dialog1");
  		if (obj) {
  			obj.style.visibility = "hidden";
  		}
	}
	function closeHcpUpdateDialog1() {
		var obj = MM_findObj("dialog1");
  		if (obj) {
  			obj.style.visibility = "hidden";
  		}
	}
	function closeHcpUpdateDialog2() {
		var obj = MM_findObj("dialog2");
  		if (obj) {
  			obj.style.visibility = "hidden";
  		}
  		var obj = MM_findObj("dialog1");
  		if (obj) {
  			obj.style.visibility = "hidden";
  		}
  		//return confirm;
	}
