//YAHOO.namespace("SSDC.api.hit_location");
//var myLogReader = new YAHOO.widget.LogReader();

var api = {
	hitDetails: [],

	drawDiagram: function() {
		//var diagram  = '<div class="armor" id="target-' + target + '">';
		var diagram  = '<div class="armor">';
		    diagram += '  <div class="head"></div>';
		    diagram += '  <div>';
		    diagram += '    <div class="left-arm"></div>';
		    diagram += '    <div class="chest"></div>';
		    diagram += '    <div class="right-arm"></div>';
		    diagram += '  </div>';
		    diagram += '  <div class="abdomen"></div>';
		    diagram += '  <div>';
		    diagram += '    <div class="left-leg"></div>';
		    diagram += '    <div class="right-leg"></div>';
		    diagram += '  </div>';
		    diagram += '</div>';

		return diagram;
	},

	handleSuccess:function(o) {
		//this.processResult(o);
		var hits = [];

		if (o.responseText !== undefined) {
			/*var test = "Transaction id: " + o.tId + "\n";
			test += "HTTP status: " + o.status + "\n";
			test += "Status code message: " + o.statusText + "\n";
			test += "HTTP headers: " + o.getAllResponseHeaders + "\n";
			test += "PHP response: " + o.responseText + "\n";
			test += "Argument object: " + o.argument;*/
			//var test = "\n" + o.responseText;

			// parsing JSON strings can throw a SyntaxError exception, so we wrap the call in a try catch block
			try {
				var result = YAHOO.lang.JSON.parse(o.responseText);
			} catch (e) {
				alert("invalid data");
				document.getElementById('roll').value = "Roll";
				document.getElementById('roll').style.backgroundColor = '#f0f0f0';
			}

			var loc 	  = '';
			var rollContent   = '';
			var targetContent = '';
			var shotContent   = '';

			// diagram output or text output
			var useDiagram = true;
			if (document.getElementById('number-of-rolls').value > 1) {
				useDiagram = false;
			}

			for (var roll = 0; roll < result.length; roll++) { // number of rolls
				if (useDiagram) {
					rollContent += '<div class="roll" id="roll-' + roll + '">';
				} else {
					rollContent += '<div class="roll" id="roll-' + roll + '"><label class="roll-label">Roll #' + (roll + 1) + '</label>';
				}

				targetContent = '';

				var numberOfTargets = result[roll].length;

				for (var target = 0; target < numberOfTargets; target++) { // number of targets

					hits[target] = [];
					hits[target][0] = ''; // head
					hits[target][1] = ''; // left-arm
					hits[target][2] = ''; // chest
					hits[target][3] = ''; // right-arm
					hits[target][4] = ''; // abdomen
					hits[target][5] = ''; // left-leg
					hits[target][6] = ''; // right-leg

					// init hitDetails
					api.hitDetails[target] = [];
					api.hitDetails[target][0] = ''; // head
					api.hitDetails[target][1] = ''; // left-arm
					api.hitDetails[target][2] = ''; // chest
					api.hitDetails[target][3] = ''; // right-arm
					api.hitDetails[target][4] = ''; // abdomen
					api.hitDetails[target][5] = ''; // left-leg
					api.hitDetails[target][6] = ''; // right-leg

					var targetClass = 'target-text';
					if (useDiagram) {
						targetClass = 'target';
					}

					targetContent += '<div class="' + targetClass + '" id="target-' + target + '"><label class="target-label">Target #' + (target + 1) + '</label>';

					/*if (result[roll][0]['concussion'] != undefined) {
						targetContent += '<div class="concussion">';
						//targetContent += '    <label>Concussion:</label>';
						//targetContent += '    <span>' + result[roll][0]['concussion'] + ' (damage type c)</span>';
						targetContent += '    <a class="tooltip" id="concussion-' + target + '">Concussion Damage<span class="closed">' + result[roll][0]['concussion'] + ' (damage type c)</span></a>';
						targetContent += '</div>';
					}*/

					if (useDiagram) {
						targetContent += api.drawDiagram();
					} else {
						shotContent = '';
					}

					for (var shot = 0; shot < result[roll][target].result.length; shot++) { // shots/target
						if (useDiagram) {
							shotContent = '';
						}

						if (result[roll][target].concussion == undefined) {
							label = 'Shot';
						} else {
							label = 'Frag';
						}

						/*shotContent += '<div class="shot" id="shot-' + shot +
						'"><label class="shot-label">' + label + ' #' + (shot + 1) + '</label>';*/
						//shotContent += '<div class="shot"><label class="shot-label">' + (shot + 1) + '</label>';
						shotContent += '<div class="shot">';

						var location = '';
						if (!useDiagram) {
							location = ' (' + result[roll][target].result[shot].loc.replace('-' ,' ') + ')';
						}

						shotContent += '  <div>';
						shotContent += '    <label>Roll:</label>';
						shotContent += '    <span class="result">' + result[roll][target].result[shot].id + location + '</span>';
						shotContent += '  </div>';

						shotContent += '  <div>';
						shotContent += '    <label>Description:</label>';
						shotContent += '    <span>' + result[roll][target].result[shot].descrip + '</span>';
						shotContent += '  </div>';

						shotContent += '  <div>';
						shotContent += '    <label>Effect:</label>';

						if (result[roll][target].result[shot].effect == 'INSTANT DEATH!') {
							shotContent += '    <span class="instant-death">' + result[roll][target].result[shot].effect + '</span>';
						} else {
							shotContent += '    <span>' + result[roll][target].result[shot].effect + '</span>';
						}

						shotContent += '  </div>';

						shotContent += '  <div class="medical">';
						shotContent += '    <label>Medical:</label>';
						shotContent += '    <div class="medical-skills">';
						shotContent += '      <div><label>Basic Medical:</label><div>' +
							result[roll][target].result[shot].basic + '</div></div>';
						shotContent += '      <div><label>Paramedic:</label><div>' +
							result[roll][target].result[shot].paramedic + '</div></div>';
						shotContent += '      <div><label>Surgery:</label><div>' + result[roll][target].result[shot].surgery + '</div></div>';
						shotContent += '    </div>';
						shotContent += '  </div>';

						if ((result[roll][target].result[shot].extra) && (result[roll][target].result[shot].extra.length > 0)) {
							shotContent += '  <div class="extra">';
							shotContent += '    <label>Extra:</label>';
							if (result[roll][target].result[shot].extra.length > 0) {
								shotContent += '    <span>' + result[roll][target].result[shot].extra + '</span>';
							} else {
								shotContent += '    <span>&nbsp;</span>';
							}
							shotContent += '  </div>';
						}

						shotContent += '  <div class="damage">';
						shotContent += '    <label>Damage:</label>';
						shotContent += '    <span>' + result[roll][target].result[shot].damage + '</span>';
						shotContent += '  </div>';

						shotContent += '  <div>';
						shotContent += '    <label>IR:</label>';
						shotContent += '    <span>' + result[roll][target].result[shot].ir + '</span>';
						shotContent += '  </div>';

						//if ((result[roll][target].result[shot].concussion) && (result[roll][target].result[shot].concussion > 0)) {
						if ((result[roll][target].result[shot].concussion) && (result[roll][target].result[shot].concussion != 'undefined')) {
							shotContent += '  <div>';
							shotContent += '    <label>Concussion:</label>';
							shotContent += '    <span>' + result[roll][target].result[shot].concussion + ' (damage type c)</span>';
							shotContent += '  </div>';
						}

						shotContent += '</div>';

						// save hit location to draw after diagrams are rendered
						var targetId = 'div#roll-' + roll + ' div#target-' + target + ' div.' + result[roll][target].result[shot].loc;

						index = api.getIndex(result[roll][target].result[shot].loc);

						// save multiple hits/area
						if (hits[target][index].length == 0) {
							hits[target][index] = targetId;
							api.hitDetails[target][index] = shotContent;
						} else {
							api.hitDetails[target][index] += '<div class="spacer"></div>' + shotContent;
						}
					}

					if (useDiagram) {
						targetContent += '</div>';
					} else {
						targetContent += shotContent + '</div>';
					}
				}
				rollContent += targetContent + '</div>';
			}
			document.getElementById('data').innerHTML = rollContent;

			// draw hit icons
			if (useDiagram) {
				for (target = 0; target < numberOfTargets; target++) {
					for (i = 0; i < 7; i++) {
						if (hits[target][i].length > 0) {
							YAHOO.util.Selector.query(hits[target][i], 'data', true).innerHTML = api.getHitImage(target, 'hit_' + target + '-' + i);
						}
					}
				}

				// apply handlers to each diagram
				for (target = 0; target < numberOfTargets; target++) {
					YAHOO.util.Event.on('target-' + target, 'click', api.singleClick);
				}
			}

			// populate
			/*var id = result.id;

			if (id == 1) {
			id += " <span>CRITICAL SUCCESS!</span>";
			} else if (id == 00) {
			id += " <span>CRITICAL FAILURE!</span>";
			}*/

			// visual feedback the roll completed
			document.getElementById('roll').value = "Roll";
			document.getElementById('roll').style.backgroundColor = '#f0f0f0';
		}
	},

	getHitImage: function(target, id) {
		//var tempId = id.replace('hit_', ''); // i.e. hit_0-3
		var tempId = id.substr(id.indexOf('-')+1);
		return '<a class="tooltip"><img src="/img/api/hit.png" id="' + id + '"/><span class="closed">' + api.hitDetails[target][tempId] + '</span></a>';
		//return '<a class="tooltip"><div class="hit" id="' + id + '" class="closed"></div><span>' + api.hitDetails[target][tempId] + '</span></a>';
	},

	getIndex: function(loc) {
		var index = '';

		switch (loc) {
			case 'head':
				index = 0;
				break;
			case 'left-arm':
				index = 1;
				break;
			case 'chest':
				index = 2;
				break;
			case 'right-arm':
				index = 3;
				break;
			case 'abdomen':
				index = 4;
				break;
			case 'left-leg':
				index = 5;
				break;
			case 'right-leg':
				index = 6;
				break;
		}

		return index;
	},

	singleClick: function(e) {
                var targetId = YAHOO.util.Event.getTarget(e).id; // i.e hit_0-3
		/*if (YAHOO.util.Dom.get(targetId)) {
			if (YAHOO.util.Dom.hasClass(YAHOO.util.Dom.get(targetId).childNodes[1], 'closed')) {
				YAHOO.util.Dom.get(targetId).childNodes[1].style.display = 'block';
				YAHOO.util.Dom.removeClass(YAHOO.util.Dom.get(targetId).childNodes[1], 'closed');
				YAHOO.util.Dom.addClass(YAHOO.util.Dom.get(targetId).childNodes[1], 'open');
			} else {
				YAHOO.util.Dom.get(targetId).childNodes[1].style.display = 'none';
				YAHOO.util.Dom.removeClass(YAHOO.util.Dom.get(targetId).childNodes[1], 'open');
				YAHOO.util.Dom.addClass(YAHOO.util.Dom.get(targetId).childNodes[1], 'closed');
			}*/

		//} else if (YAHOO.util.Dom.get(targetId)) {
		if (YAHOO.util.Dom.get(targetId)) {
			if (YAHOO.util.Dom.get(targetId).nextSibling.className == 'closed') {
				YAHOO.util.Dom.get(targetId).nextSibling.style.display = 'block';
				YAHOO.util.Dom.removeClass(YAHOO.util.Dom.get(targetId).nextSibling, 'closed');
				YAHOO.util.Dom.addClass(YAHOO.util.Dom.get(targetId).nextSibling, 'open');
			} else {
				YAHOO.util.Dom.get(targetId).nextSibling.style.display = 'none';
				YAHOO.util.Dom.removeClass(YAHOO.util.Dom.get(targetId).nextSibling, 'open');
				YAHOO.util.Dom.addClass(YAHOO.util.Dom.get(targetId).nextSibling, 'closed');
			}
		}
                /*
		if (YAHOO.util.Event.getTarget(e).src) {
			var src = YAHOO.util.Event.getTarget(e).src;

			if (src.indexOf('hit.png') > -1) {
				YAHOO.util.Event.getTarget(e).src = src.replace('hit.png', 'patch.png');
			} else {
				YAHOO.util.Event.getTarget(e).src = src.replace('patch.png', 'hit.png');
			}
		}
                */
	},

	startRequest:function() {
		// visual feedback the roll started
		document.getElementById('roll').style.backgroundColor = '#9999cc';
		document.getElementById('roll').value = "rolling...";

		api.hitDetails = []; // reset

		var calledShot = '',
		    db = '',
		    dieNumber = '',
		    dieType = '',
		    grenade = '',
		    gr = ''; // grenade-range
		    ne = '';
		    nr = '',
		    nt = '',
		    numberOfRolls = '',
		    numberOfTargets = '',
		    r = '',
		    rof = '',
		    ws = '';

		// roll-option-manual
		if (document.getElementById('roll-option-manual').checked) {
			if (document.getElementById('manual-roll').value.length > 0) {
				var roll = document.getElementById('manual-roll').value;
			} else {
				var roll = '';
			}
			var rollOption = 'ro=manual&roll=' + roll;

		} else if (document.getElementById('roll-option-grenade').checked) {

			var rollOption = 'ro=grenade';

			// number-of-rolls
			var numberOfRolls = document.getElementById('number-of-rolls');
			if (numberOfRolls.value.length > 0) {
				nr = '&nr=' + numberOfRolls.value;
			}

			// number-of-exposed-areas
			/*var numberOfExposedAreas = document.getElementById('number-of-exposed-areas');
			if (numberOfExposedAreas.value.length > 0) {
				ne = '&ne=' + numberOfExposedAreas.value;
			}*/

			// grenade type
			var d = document.getElementById('grenade-type');
			if (d.options[d.selectedIndex].value.length > 0) {
				grenade = '&gt=' + d.options[d.selectedIndex].value;
			}

			// grenade range
			var d = document.getElementById('grenade-range');
			if (d.options[d.selectedIndex].value.length > 0) {
				gr = '&gr=' + d.options[d.selectedIndex].value;
			}

		} else {
			var rollOption = 'ro=auto';

			// number-of-rolls
			var numberOfRolls = document.getElementById('number-of-rolls');
			if (numberOfRolls.value.length > 0) {
				nr = '&nr=' + numberOfRolls.value;
			}

			// rof
			var rof = document.getElementById('rof');
			if (rof.value.length > 0) {
				r = '&rof=' + rof.value;
			}

			// number-of-targets
			var numberOfTargets = document.getElementById('number-of-targets');
			if (numberOfTargets.value.length > 0) {
				nt = '&nt=' + numberOfTargets.value;
			}

			// distance-between
			var distanceBetween = document.getElementById('distance-between');
			if (distanceBetween.value.length > 0) {
				db = '&db=' + distanceBetween.value;
			}

			// not enough shots for the number of targets?
			if (numberOfTargets.value == 1) {
				shotsPerTarget = Math.floor(rof.value/numberOfTargets.value);
			} else {
				shotsPerTarget = Math.floor((rof.value - distanceBetween.value)/numberOfTargets.value);
			}

			// enough shots for the number of targets?
			if ((numberOfTargets.value > 1) && (shotsPerTarget < 1)) {
				document.getElementById('error').innerHTML = 'ERROR! You have not fired enough shots to cover the number of targets entered.';
				document.getElementById('roll').value = "Roll";
				document.getElementById('roll').style.backgroundColor = '#f0f0f0';
				return false;
			} else {
				document.getElementById('error').innerHTML = '';
			}

			// called shot
			var d = document.getElementById('called-shot');
			if (d.options[d.selectedIndex].value.length > 0) {
				calledShot = '&cs=' + d.options[d.selectedIndex].value;
			}
		}

		// damage/shot (3d4)
		if (!document.getElementById('roll-option-grenade').checked) {

			if (document.getElementById('die-number').value.length > 0) {
				dieNumber = '&dn=' + document.getElementById('die-number').value;
			}

			if (document.getElementById('die-type').value.length > 0) {
				dieType = '&dt=' + document.getElementById('die-type').value;
			}

			// weapon system
			var d = document.getElementById('weapon-system');
			if (d.options[d.selectedIndex].value.length > 0) {
				ws = '&ws=' + d.options[d.selectedIndex].value;
			}
		}

		YAHOO.util.Connect.asyncRequest('POST', '/api/hit_location/result',
		callback, rollOption + ne + nr + r + nt + calledShot + dieNumber + dieType + grenade + gr + ws + db);
	}
};

// define the callback object for success and failure handlers as well as object scope.
var callback = {
	success:api.handleSuccess,
	failure:api.handleFailure,
	scope: api
};

function disable(optionId, fieldId, anotherId) {
	if (anotherId) {
		YAHOO.util.Dom.get(anotherId).setAttribute('disabled', 'disabled');
	}
	YAHOO.util.Dom.get(fieldId).setAttribute('disabled', 'disabled');
	YAHOO.util.Dom.setStyle(optionId, 'opacity', 0.5);
}

function enable(optionId, fieldId, anotherId) {
	if (anotherId) {
		YAHOO.util.Dom.get(anotherId).removeAttribute('disabled');
	}
	YAHOO.util.Dom.get(fieldId).removeAttribute('disabled');
	YAHOO.util.Dom.setStyle(optionId, 'opacity', 1);
}

function init() {
	disable('manual-roll', 'manual-roll');
	enable('option-called-shot', 'called-shot');
	enable('option-damage', 'die-number', 'die-type');
	//disable('option-number-of-exposed-areas', 'number-of-exposed-areas');
	enable('option-number-of-rolls', 'number-of-rolls');
	enable('option-number-of-targets', 'number-of-targets');
	enable('option-rof', 'rof');
	disable('option-grenade-type', 'grenade-type');
	disable('option-grenade-range', 'grenade-range');
	enable('option-weapon-system', 'weapon-system');
	enable('option-distance-between', 'distance-between');
}

// initial state (automatic)
init();

YAHOO.util.Event.on('roll', 'click', api.startRequest);

YAHOO.util.Event.on('roll-option-manual', 'click', function() {
	enable('manual-roll', 'manual-roll');
	disable('option-called-shot', 'called-shot');
	enable('option-damage', 'die-number', 'die-type');
	//disable('option-number-of-exposed-areas', 'number-of-exposed-areas');
	disable('option-number-of-rolls', 'number-of-rolls');
	disable('option-number-of-targets', 'number-of-targets');
	disable('option-rof', 'rof');
	disable('option-grenade-type', 'grenade-type');
	disable('option-grenade-range', 'grenade-range');
	enable('option-weapon-system', 'weapon-system');
	disable('option-distance-between', 'distance-between');
});

YAHOO.util.Event.on('roll-option-automatic', 'click', init);

YAHOO.util.Event.on('roll-option-grenade', 'click', function() {
	disable('manual-roll', 'manual-roll');
	disable('option-called-shot', 'called-shot');
	disable('option-damage', 'die-number', 'die-type');
	//enable('option-number-of-exposed-areas', 'number-of-exposed-areas');
	enable('option-number-of-rolls', 'number-of-rolls');
	disable('option-number-of-targets', 'number-of-targets');
	disable('option-rof', 'rof');
	enable('option-grenade-type', 'grenade-type');
	enable('option-grenade-range', 'grenade-range');
	disable('option-weapon-system', 'weapon-system');
	disable('option-distance-between', 'distance-between');
});

// Array.indexOf does not work in IE
if (!Array.indexOf) {
	Array.prototype.indexOf = function(obj) {
		for (var i; i < this.length; i++) {
			if (this[i] == obj) {
				return i;
			}
		}
		return -1;
	}
}
