/* 
 * ss_stretchytable.js
 * Supports the stretchytable TNT widget
 */

function showNextRow(base, id, callerEl) {
	id++;
	if(document.getElementById != null) {
		var el = document.getElementById(base + '_' + id);

		// Found a row
		if(el != null) {
			if(el.style.display == 'none') {
				el.style.display = '';	
				//addClass(el, 'blankrow');
				//removeClass(prevSibling(el), 'blankrow');
				//Commented because of some random bug, these dont do much anyways.
			}

			// Find the container form
			var formObj = el;
			while(formObj.tagName.toLowerCase() != "form" && formObj.tagName.toLowerCase() != "body") formObj = formObj.parentNode;
			if(formObj.tagName.toLowerCase() == "form" && updateRequired)
				updateRequired(formObj);
	
		// Didn't find a row
		} else {
			var tblEl = callerEl;
			while(!tblEl.tagName || tblEl.tagName.toLowerCase() != "table")
				tblEl = tblEl.parentNode;
				
			var msg; 
			if(tblEl && (msg = tblEl.getAttribute('message_nomorerows'))) alert(msg);
		}
	}
}


function moveRowUp(rowEl) {
	var prev = prevSibling(rowEl);
	
	var o1,o2,tmp;
	if((o1 = getOrderField(rowEl)) && (o2 = getOrderField(prev))) {
		tmp = o1.value;
		o1.value = o2.value;
		o2.value = tmp;
	}
	
	if(prev != null)
		rowEl.parentNode.insertBefore(rowEl, prev);
}
function moveRowDown(rowEl) {
	var next = nextSibling(nextSibling(rowEl));
	
	var o1,o2,tmp;
	if((o1 = getOrderField(rowEl)) && (o2 = getOrderField(next))) {
		tmp = o1.value;
		o1.value = o2.value;
		o2.value = tmp;
	}

	if(next != null)
		rowEl.parentNode.insertBefore(rowEl, next);
}

if(typeof deleteTableRow == 'undefined') {
	function deleteTableRow(rowObj) {	
		rowObj.parentNode.removeChild(rowObj);
	}
}


/*
 * Get the next sibling of el.  if numPrev = 2, it will get the sibling after that one.
 * Setting backwards to true will execute a prevSibling() call instead
 */
function nextSibling(el, numNext, backwards) {
	if(el == null) return null;
	if(numNext == null) numNext = 1;

	// So that we can implement prev and next together	
	if(backwards == true) {
		var startIdx = el.parentNode.childNodes.length-1;
		var idxChange = -1;
	} else {
		var startIdx = 0;
		var idxChange = 1;
	}
	var i, nextSoFar = 0, isNext;
	
	// 1) Iterate through
	for(i = startIdx;(i>=0 && i<el.parentNode.childNodes.length);i += idxChange) {
		if(el.parentNode.childNodes[i].tagName) {			
			// 3) Then keep counting proper nodes (ones with tags)
			if(isNext) nextSoFar++;
			// 4) until we skip the right number
			if(nextSoFar >= numNext) return el.parentNode.childNodes[i];
		}
		// 2)  Until we've found the current node
		if(el.parentNode.childNodes[i] == el) isNext = true;
	}
}
// Get the previous sibling of el.  if numPrev = 2, it will get the sibling before that one.
function prevSibling(el, numPrev) {
	return nextSibling(el, numPrev, true);
}

function initializeStretchyTable(id) {
	var table = document.getElementById(id);
	var i, j, field, fields, row, rows = table.getElementsByTagName('tr');
	
	var prevHadValue = true, hasValue;
	
	for(i=0;row=rows[i];i++) {
		hasValue = false;
		fields = row.getElementsByTagName('input');
		for(j=0;field=fields[j];j++) {
			if(field.name.indexOf('[OrderID]') != -1) continue;
			
			if(field.type == 'radio' || field.type == 'checkbox' && field.checked) hasValue = true;
			if(field.type != 'radio' && field.type != 'checkbox' && field.value) hasValue = true;
		}		
		fields = row.getElementsByTagName('textarea');
		for(j=0;field=fields[j];j++) {
			if(field.value) hasValue = true;
		}		
		fields = row.getElementsByTagName('selected');
		for(j=0;field=fields[j];j++) {
			if(field.selectedIndex) hasValue = true;
		}
		if(hasValue || prevHadValue) row.style.display = '';
		prevHadValue = hasValue;
	}
}

/**
 * Return the field that stores order indexes
 */
function getOrderField(rowEl) {
	var candidateEl = rowEl.getElementsByTagName('input')[0];
	
	var orderElName = candidateEl.name.replace(/\[[^\]]+](\[[^\]]+])$/,'[OrderID]$1')
	var form = ownerForm(candidateEl);
	
	return form.elements[orderElName];
}


/**
 * Find the form that contains this element
 */
function ownerForm(el) {
	while(el.tagName.toLowerCase() != 'form' && el.parentNode) {
		el = el.parentNode;
	}
	if(el.tagName.toLowerCase() == 'form') return el;
}
