newRecordIterator = 0;

function clearFileUploadFields(fieldId) {
	if (confirm('Are you sure you want to delete this file?')) {
		document.getElementById(fieldId + "caption").value = '';
		document.getElementById(fieldId + "preview").src = '/assets/images/spacer.gif';
		document.getElementById(fieldId).value = '';
	}
}

function removeRecord(nodeId) {
	removeRecordLinks(nodeId);
	var node = document.getElementById(nodeId);
	var parentNode = node.parentNode;
	parentNode.removeChild(node);
	return false;
}

function moveRecordUp(nodeId) {
	//need to get the node that the element gets inserted after; this is the node two elements up
	var prevNodeIdNode = document.getElementById(nodeId+'LastRecord');
	if (prevNodeIdNode) {
		prevNodeId = prevNodeIdNode.value;
		//if no prevNodeId, the item is the first, so we can't move up; the following if-statement fails
		if (prevNodeId && (prevNodeId != "")) {
			var prevNode2IdNode = document.getElementById(prevNodeId+'LastRecord');
			if (prevNode2IdNode) {
				if (prevNode2IdNode.value && (prevNode2IdNode.value != "")) {
					prevNode2Id = prevNode2IdNode.value;
					moveRecord(nodeId, prevNode2Id);
					//now, the order should be
					//prevNode2
					//node
					//prevNode
					//next node in series
					var finalNodeId = document.getElementById(nodeId+'NextRecord').value;
					document.getElementById(prevNode2Id + "NextRecord").value = nodeId;
					document.getElementById(nodeId+"LastRecord").value = prevNode2Id;
					document.getElementById(nodeId+"NextRecord").value = prevNodeId;
					document.getElementById(prevNodeId+'LastRecord').value = nodeId;
					document.getElementById(prevNodeId+'NextRecord').value = finalNodeId;
					if (document.getElementById(finalNodeId+'LastRecord')) {
						document.getElementById(finalNodeId+'LastRecord').value = prevNodeId;
					}
				} else {  
					//there's no last id, so the item will be moved to first place, which
					//is before the node defined by prevNodeId
					var prev2Node = previousRealSibling(document.getElementById(prevNodeId));
					if (prev2Node) {
						moveRecord(nodeId, prev2Node.id);
					}
					//now, the order should be
					//cloneDummy
					//node
					//prevNode
					//next node in series
					var finalNodeId = document.getElementById(nodeId+'NextRecord').value;
					//the following line assumes that the cloneDummy container is the first div in the parent div
					cloneDummyId=prev2Node.parentNode.getElementsByTagName('div')[0].getElementsByTagName('div')[0].id;
					//alert(cloneDummyId + " = cloneDummy");
					document.getElementById(cloneDummyId + "NextRecord").value = nodeId;
					document.getElementById(nodeId+"LastRecord").value = '';
					document.getElementById(nodeId+"NextRecord").value = prevNodeId;
					document.getElementById(prevNodeId+'LastRecord').value = nodeId;
					document.getElementById(prevNodeId+'NextRecord').value = finalNodeId;
					if (document.getElementById(finalNodeId+'LastRecord')) {
						document.getElementById(finalNodeId+'LastRecord').value = prevNodeId;
					}
				}
			}
		}
	}
	return false;
}

function moveRecordDown(nodeId) {
	if (document.getElementById(nodeId)) {
		var nextNode = nextRealSibling(document.getElementById(nodeId));
		if (nextNode && nextNode.id) {
			moveRecord(nodeId, nextNode.id);
		} else {
			return false;
		}
	}
	//now, update the linked list contained in the inputs.
	//the order should now be:
	//first node in series (if it exists)
	//nextNode
	//node
	//final node in series (if it exists)

	//get id of first node in series
	var firstNodeId = document.getElementById(nodeId+"LastRecord").value;
	var finalNodeId = "";
	if (nextNode && document.getElementById(nextNode.id+'NextRecord')) {
		finalNodeId = document.getElementById(nextNode.id+'NextRecord').value;
	}
	//alert("firstNodeId: "+firstNodeId);
	//alert("finalNodeId: "+finalNodeId);
	if (firstNodeId != "") {
		document.getElementById(firstNodeId+"NextRecord").value = nextNode.id;
	} else {	
		//the moved node must have been the first in the series,
		//so we need to update the cloneDummy
		//the following line assumes that the cloneDummy container is the first div in the parent div
		cloneDummyId=nextNode.parentNode.getElementsByTagName('div')[0].getElementsByTagName('div')[0].id;
		document.getElementById(cloneDummyId+'NextRecord').value = nextNode.id;
	}
	document.getElementById(nextNode.id+'LastRecord').value = firstNodeId;
	document.getElementById(nextNode.id+'NextRecord').value = nodeId;
	document.getElementById(nodeId+'LastRecord').value = nextNode.id;
	document.getElementById(nodeId+'NextRecord').value = finalNodeId;
	if (finalNodeId != "") {
		document.getElementById(finalNodeId+'LastRecord').value = nodeId;
	}
	return false;
}

function moveRecord(nodeId, afterNodeId) {
	//alert(nodeId+" : "+afterNodeId); 
	if ((afterNodeId != "") && document.getElementById(afterNodeId)) {
	        document.getElementById(afterNodeId).parentNode.insertBefore(document.getElementById(nodeId), document.getElementById(afterNodeId).nextSibling);
	}
	return false;
}

function removeRecordLinks(nodeId) {
	//sequencing logic
	var lastElId = "";
	//if (document.getElementById(nodeId)) {
	//	alert ("hit");
	//}
	var lastElIdNode = document.getElementById(nodeId+"LastRecord");
	if (lastElIdNode) {
		lastElId = document.getElementById(nodeId+"LastRecord").value;
	}
	var nextElId = "";
	var nextElIdNode = document.getElementById(nodeId+"NextRecord");
	if (nextElIdNode) {
		nextElId = document.getElementById(nodeId+"NextRecord").value;
	}
		//if it exists, set the passed node's previous sibling to point 
		//to the passed node's next sibling
		if (lastElId && document.getElementById(lastElId+"NextRecord")) {
			document.getElementById(lastElId+"NextRecord").value = nextElId;
		} else {
			//if first statement fails, the deleted record was the first, if autosequencing is on;
			//update the cloneDummy's NextRecord input, if it exists
			cloneDummyId=document.getElementById(nodeId).parentNode.getElementsByTagName('div')[0].getElementsByTagName('div')[0].id;
			if (document.getElementById(cloneDummyId+'NextRecord')) {
				document.getElementById(cloneDummyId+'NextRecord').value = nextElId;
			}
		}
		//if it exists, set the passed node's next sibling to point 
		//to the passed node's last sibling
		if (nextElId && document.getElementById(nextElId+"LastRecord")) {
			document.getElementById(nextElId+"LastRecord").value = lastElId;
		}
	//end sequencing logic
}

function newRecord(cloneId, afterNodeId) {
	//get the total number of records
        var total = document.getElementById(cloneId).parentNode.getElementsByTagName("div").length - 2;  //subtract the "add" div and the clone div
        total++;  //add one, since we're about to create one
	
	var oldCloneId = document.getElementById(cloneId).getElementsByTagName("div")[0].id;
	//sequencing logic
	var isFirst = false;
	//get the id of the next node
	var nextEl = document.getElementById(afterNodeId+"NextRecord");
	var nextId = "";
	if (nextEl) {
		nextId = document.getElementById(afterNodeId+"NextRecord").value;
	} else {
		//the afterNode must be the cloneDummy outer div, so use the old clone id to get the next element
		if (document.getElementById(oldCloneId+"NextRecord")) {
			nextId = document.getElementById(oldCloneId+"NextRecord").value;
		}
		isFirst = true;
	}
	//end sequencing logic

        // Clone the div specified by cloneId
        var newNode = document.getElementById(cloneId).getElementsByTagName("div")[0].cloneNode(true);
	var newId = 'new' + newRecordIterator++;
	var oldId = newNode.id;
	newNode.id = newId;
	newNode.setAttribute("id", newId);

        // DOM inject the wrapper div
        document.getElementById(cloneId).parentNode.insertBefore(newNode, document.getElementById(afterNodeId).nextSibling);
	
        // Reset the onclick events for any new/remove buttons that are <a> tags
        var links = newNode.getElementsByTagName('a');
        for(var i = 0, link; link = links[i]; i++) {
		if (link.getAttributeNode("onClick") && link.getAttributeNode("onClick").value.indexOf('newRecord') >= 0) {
			link.onclick = new Function ("newRecord('" + cloneId + "','" + newId + "')");
		} else if (link.getAttributeNode("onClick") && link.getAttributeNode("onClick").value.indexOf('removeRecord') >= 0) {
			link.onclick = new Function ("removeRecord('" + newId + "');");
		}
        }

        var divs = newNode.getElementsByTagName('div');
        for(var i = 0, div; div = divs[i]; i++) {
                div.id = div.id.replace(/cloneDummyId/g, newId);
		div.id = div.id.replace(oldId, newId);
                if (div.getAttributeNode('name')) {
			div.name = div.name.replace(/cloneDummyId/g, newId);
			div.name = div.name.replace(oldId, newId);
		}
	}
        // Reset the onclick events for any new/remove buttons that are <input> tags
	// Also, reset the name attribute to use the new id instead of the clone id
        var inputs = newNode.getElementsByTagName('input');
        for(var i = 0, inp; inp = inputs[i]; i++) {
		//sequencing logic
		//set the new node's LastRecord and NextRecord inputs
		if (inp.id == oldCloneId+"NextRecord") {
			inp.value = nextId;
			inp.id = newId+"NextRecord";
		}
		if (inp.id == oldCloneId+"LastRecord") {
			if (isFirst) {
				//inp.value = oldCloneId;  //it's the first, so the last record is the clone
				inp.value = '';  //it's the first, so the last record is the clone
			} else {
				inp.value = afterNodeId;
			}
			inp.id = newId+"LastRecord";
		}
		if (inp.id == oldCloneId+"RecordId") {
			inp.value = newId;
			inp.id = newId+"RecordId";
			inp.name="subrecordKeys["+newId+"]";
		}
		//end sequencing logic
                // Set the new input's id and name attribute
                inp.name = inp.name.replace(/cloneDummyId/g, newId);
		inp.name = inp.name.replace(oldId, newId);
		if (inp.getAttributeNode("onClick") && inp.getAttributeNode("onClick").value.indexOf('newRecord') >= 0) {
			inp.onclick = new Function ("newRecord('" + cloneId + "','" + newId + "')");
		} else if (inp.getAttributeNode("onClick") && inp.getAttributeNode("onClick").value.indexOf('removeRecord') >= 0) {
			inp.onclick = new Function ("removeRecord('" + newId + "');");
		} else if (inp.getAttributeNode("onClick")) {
			var onclick=inp.getAttributeNode("onClick").value;
			onclick = onclick.replace(oldId, newId);
			inp.onclick = new Function (onclick);
		}
        }
        var inputs = newNode.getElementsByTagName('select');
        for(var i = 0, inp; inp = inputs[i]; i++) {
                // Set the new input's id and name attribute
                inp.name = inp.name.replace(/cloneDummyId/g, newId);
		inp.name = inp.name.replace(oldId, newId);
		if (inp.getAttributeNode("onClick") && inp.getAttributeNode("onClick").value.indexOf('newRecord') >= 0) {
			inp.onclick = new Function ("newRecord('" + cloneId + "','" + newId + "')");
		} else if (inp.getAttributeNode("onClick") && inp.getAttributeNode("onClick").value.indexOf('removeRecord') >= 0) {
			inp.onclick = new Function ("removeRecord('" + newId + "');");
		} else if (inp.getAttributeNode("onClick")) {
			var onclick=inp.getAttributeNode("onClick").value;
			onclick = onclick.replace(oldId, newId);
			inp.onclick = new Function (onclick);
		}
        }

        // Call the create method to create and associate a new date-picker widgit with the new input
        //datePickerController.create(document.getElementById("date-" + total));

        // No more than 5 inputs
        //if(total == 5) document.getElementById("newline").style.display = "none";

	//sequencing logic
	//set the afterNode's LastRecord input to point to the new record
	var afterNode = document.getElementById(afterNodeId+"NextRecord");
	if (afterNode) {
		document.getElementById(afterNodeId+"NextRecord").value = newId;
	} else {
		//if no afterNode nextRecord input, this record must have been inserted at the beginning;
		//update the clone next record
		if (document.getElementById(oldCloneId+"NextRecord")) {
			document.getElementById(oldCloneId+"NextRecord").value = newId;
		}
	}
	//set the next node's LastRecord input to point to the new record
	if (nextId != "") {
		if (document.getElementById(nextId+"LastRecord")) {
			document.getElementById(nextId+"LastRecord").value = newId;
			document.getElementById(nextId+"LastRecord").setAttribute("value", newId);
		}
	}
	//end sequencing logic

        // Stop the event
        return false;
}

function previousRealSibling(n) {
	do n = n.previousSibling;
	while (n && n.nodeType != 1);
	return n;
}

function nextRealSibling(n) {
	do n = n.nextSibling;
	while (n && n.nodeType != 1);
	return n;
}

function doDropdownNewEntryOnchange(value, newEntryDivId) {
	if (value == "__newEntry__") {
		document.getElementById(newEntryDivId).style.display = "block";
	} else {
		document.getElementById(newEntryDivId).style.display = "none";
	}
}


