var sortTables = [];

function createRequest(){
	return (window.XMLHttpRequest) ? new XMLHttpRequest() : (window.ActiveXObject) ? new ActiveXObject("MSXML2.XMLHTTP") : null
};

function sendRequest(request, path, target){
	request.open("GET", path, true);
	request.onreadystatechange = function(){
		if (request.readyState == 4) {
			if (request.status == 200) {
				addContentItems(request, document.getElementById(target), target);
			}
		}
	}
	request.send(null);
};

function addContentItems(request, target, t){
	var xml = request.responseXML;
	var fields = xml.getElementsByTagName("SchemaField");
	var field = {};
	var milestones = { "v60": 1100000000000, "v61": 1200000000000, "v70": 1300000000000};
	var compat60;
	var compat61;
	var compat70;
	var siemonly;
	var orderedfields = [];
	var rvfields = [];
	var cvfields = [];
	var otherfields = [];
	var allfields = [];
	var rows = [];
	var detailhdrs = [];
	var details = [];
	var trRow;
	var trDetailHdr;
	var trDetail;
	var td;
	var nodename;

	for (var i = fields.length-1; i > -1; i--) {
		/* Poor-man's E4X, reflect the XML into a JavaScript object */
		field = {};
		
		for (var j = fields[i].childNodes.length-1; j > -1; j--) {
			if (fields[i].childNodes[j].nodeName == "#text") { 
				continue; 
			} else {
				nodename = fields[i].childNodes[j].nodeName;
				field[nodename] = addChildren(fields[i].childNodes[j]);
				if ( field[nodename] == "" || field[nodename][0] == "$" ) { /* Indicates that the source XML didn't have a setting for these fields */
					switch(nodename) {
						 case "Size":
							 field[nodename] = "(native)";
							 break;
						 case "Legacy":
							 field[nodename] = "none";
							 break;
						 case "Column":
							 field[nodename] = "not stored";
							 break;
						 case "Notes":
							 field[nodename] = document.createTextNode("No notes defined");
							 break;
						 case "BNF":
							 field[nodename] = document.createTextNode("No format defined");
							 break;
						 default:
							break;
					}
				}
			}
		}
		
		/* We put the schema elements in four different arrays, depending on whether they are primary fields (which have a defined order), RV fields, CV fields, or other */
		if ( field.Order != "" ) {
			orderedfields[Number(field.Order)] = field;
		} else if ( field.Name.substr(0,2) == "cv" ) {
			field.Label = field.Label + field.Name.substr(2);
			cvfields[Number(field.Name.substr(2))] = field;
		} else if ( field.Name.substr(0,2) == "rv" && field.Label == "ReservedVar" ) {
			field.Label = field.Label + field.Name.substr(2);
			rvfields[Number(field.Name.substr(2))] = field;
		} else {
			otherfields.push(field);
		}
	}
		
	/* Since some of the RVs are used for labeled schema fields, eliminate the blank entries from this array (do the others just to be sure) */
	for (var j = orderedfields.length - 1; j > -1; j-- ) {
		if ( typeof orderedfields[j] == "undefined" ) {
			orderedfields.splice(j, 1);
		}
	}
	for (var j = cvfields.length - 1; j > -1; j-- ) {
		if ( typeof cvfields[j] == "undefined" ) {
			cvfields.splice(j, 1);
		}
	}
	for (var j = rvfields.length - 1; j > -1; j-- ) {
		if ( typeof rvfields[j] == "undefined" ) {
			rvfields.splice(j, 1);
		}
	}
	
	allfields = orderedfields.concat(otherfields, rvfields, cvfields);
	
	var j = allfields.length;
	for (var i = 0; i < j; i++) {
		field = allfields[i];

		// Construct two rows for the table, inserting the various 'field' values
		// First, the summary row 
		trRow = document.createElement("tr");
		trRow.className = (i % 2 == 0) ? "rowEven" : "rowOdd";
		trRow.id = field.Name;
		trRow.onclick = showDetails;
		// Insert the tag name
		td = document.createElement("td");
		td.className = "tagname";
		td.innerHTML = field.Name;
		trRow.appendChild(td);
		// Insert the label
		td = document.createElement("td");
		td.className = "label";
		td.innerHTML = field.Label;
		trRow.appendChild(td);
		// And the description
		td = document.createElement("td");
		td.className = "description";
		td.innerHTML = field.Description;
		trRow.appendChild(td);
		rows[i] = trRow;
		
		// Now a detail header row
		trDetailHdr = document.createElement("tr");
		trDetailHdr.className = "detailhdr";
		trDetailHdr.style.display = "none";
		trDetailHdr.onclick = hideDetails;
		// Insert the tag name
		td = document.createElement("td");
		td.className = "tagname";
		td.innerHTML = field.Name;
		trDetailHdr.appendChild(td);
		// Insert the label
		td = document.createElement("td");
		td.className = "label";
		td.innerHTML = field.Label;
		trDetailHdr.appendChild(td);
		// And the description
		td = document.createElement("td");
		td.className = "description";
		td.innerHTML = field.Description;
		trDetailHdr.appendChild(td);
		detailhdrs[i] = trDetailHdr;
		
		// And finally the platform details
		trDetail = document.createElement("tr");
		trDetail.className = "details";
		trDetail.onclick = hideDetails;
		trDetail.style.display = "none";
		// All the details go in a single td
		td = document.createElement("td");
		td.className = "info";
		td.colSpan = 3;
		/* Inject the detail info into the detail table section */
		compat60 = Number(field.Created) < milestones.v61 ? "#62981F" : "#666666";
		compat61 = Number(field.Created) < milestones.v70 ? "#62981F" : "#666666";
		compat70 = "#62981F";
		siemonly = "none"; /* Will set to line-through once we know how we can determine if the field is not in SLM */
		td.innerHTML = '<table><tbody><tr><td><dl><dt>Size</dt><dd>' + field.Size + '</dd><dt>Datatype</dt><dd>' + field.Type + 
			'</dd></dl><dl><dt>Legacy Variable</dt><dd>' + field.Legacy + '</dd><dt>DB Column</dt><dd>' + field.Column + '</dd></dl><p class="notes">' +
			'<p class="bnf"/></td><td><table class="compat"><tbody><tr><th colspan="3">Compatibility</th></tr><tr><td>Sentinel 6.0+</td><td style="background-color:' + 
			compat60 + '"></td><td>&nbsp;</td></tr><tr><td>Sentinel 6.1+</td><td style="background-color:' + compat61 +
			'"></td><td style="text-decoration:' + siemonly + '">SLM 1.0+</td></tr><tr><td>Sentinel 7.0+</td><td style="background-color:'	+ 
			compat70 + '"></td><td>&nbsp;</td></tr></tbody></table></td></tr></tbody></table>';
		var notesnode = td.getElementsByTagName("p")[0];
		var bnfnode = td.getElementsByTagName("p")[1];
		notesnode.appendChild(field.Notes);
		bnfnode.appendChild(field.BNF);
		trDetail.appendChild(td);
		details[i] = trDetail;
	}
	var table = target.getElementsByTagName("table")[0];
	addRowsToTable(table, rows, detailhdrs, details);
};

function addChildren(xmlnode) {
	switch (xmlnode.childNodes.length) {
		case 0:
			return "";
			break;
		case 1:
			if (xmlnode.nodeName == "Notes" || xmlnode.nodeName == "BNF") {
				return document.createTextNode(xmlnode.firstChild.data);  /* Notes and BNF expects node elements */
			} else {
				return xmlnode.firstChild.data;
			}
			break;
		default:
			var tmpNode = document.createElement("div");
			for (var k=0; k < xmlnode.childNodes.length; k++ ) {
				if (xmlnode.childNodes[k].nodeType == 3) {
					tmpNode.appendChild(document.createTextNode(xmlnode.childNodes[k].data));
				} else {
					var tmpStr;
					if (navigator.appName == "Microsoft Internet Explorer") {
						tmpStr = xmlnode.childNodes[k].xml;
					} else {
						try {
							tmpStr = new XMLSerializer().serializeToString(xmlnode.childNodes[k]);
						}
						catch(e) {
							tmpStr = "(browser error)"
						}
					}
					tmpNode.innerHTML = tmpNode.innerHTML + tmpStr;
				}
			}
			return tmpNode;
			break;
	}
}


function addRowsToTable(table, rows, detailhdrs, details){
	var tbody = table.getElementsByTagName("tbody")[0];
	while (tbody.hasChildNodes()) {
		tbody.removeChild(tbody.firstChild);
	}

	for (var i = 0; i < rows.length; i++) {
		tbody.appendChild(rows[i]);
		tbody.appendChild(detailhdrs[i]);
		tbody.appendChild(details[i]);
	}
};

function showDetails(e){
    if (document.getElementById && !document.all) {
        var targetObj = e.target;
    }
    else {
        var targetObj = window.event.srcElement;
    }
    
    if (targetObj.tagName != "TR" && targetObj.tagName != "TD") {
        return true;
    }
    
    this.style.display = "none";
    this.nextElementSibling.style.display = (document.all) ? "block" : "table-row";
    this.nextElementSibling.nextElementSibling.style.display = (document.all) ? "block" : "table-row";
};

function hideDetails(e){
	if (document.getElementById && !document.all) {
        var targetObj = e.target;
    }
    else {
        var targetObj = window.event.srcElement;
    }
    
    if (targetObj.tagName != "TR" && targetObj.tagName != "TD") {
        return true;
    }
    
    if (this.className == "detail") {
    	this.style.display = "none";
        this.previousElementSibling.style.display = "none"
        this.previousElementSibling.previousElementSibling.style.display = (document.all) ? "block" : "table-row";
    } else {
    	this.style.display = "none";
        this.previousElementSibling.style.display = (document.all) ? "block" : "table-row";
        this.nextElementSibling.style.display = "none";
    }
};


function TabSet(id,forcetabid) {
	this.id = id;
	this.current = null;

	if(document.getElementById && window.name != "printer_friendly") {
		var activeCk = readCookie("tabset-" + id); // used to keep tab state on back button
		if (location.href.indexOf("tab=") >= 0) { activeCk = "urldefined"; }
		else if (forcetabid) { activeCk = forcetabid; }
		
		var tabset = document.getElementById(id);
		var heads = tabset.getElementsByTagName("h3");
		var tabheads = document.createElement("div");
		tabheads.className = "tabGrp";
		var tabSelected = false;
		
		for(var i = heads.length-1; i >= 0 ; i--) {
			var tab = document.createElement("div");
			tab.tabset = this;
			tab.className = "tab-head";
			tab.id = heads[i].className;
			heads[i].style.display = "none";
			var txt = heads[i].firstChild.nodeValue;
			tab.appendChild(document.createTextNode(txt));
			tabheads.insertBefore(tab,tabheads.firstChild);
			tab.onclick = onClickTab;
			hidePlatform(tab);

			if((activeCk == "urldefined" && location.href.indexOf("tab="+i) >= 0) || (forcetabid && forcetabid == i) || (activeCk != null && activeCk == txt) || (i == 0 && tabSelected == false)) {
				tab.className += " selected";
				this.current = tab;
				tabSelected = true;
				showPlatform(tab);
			}
		}
		tabset.insertBefore(tabheads,tabset.firstChild);
	}

	function onClickTab() {
		if (this.className.indexOf("selected") < 0) {
			var j;
			if (typeof _clickTab != 'undefined') { _clickTab(this); }
			var current = this.tabset.current;
			if (current != null) {
				current.className = current.className.replace(" selected","");
				hidePlatform(current);
				this.className += " selected";
				showPlatform(this);
			}
			this.tabset.current = this;
			document.cookie = "tabset-" + this.tabset.id + "=" + this.firstChild.nodeValue;
		}
	}
};

function hidePlatform(tab) {
	var hideme = [];
	hideme = document.getElementsByClassName(tab.id.substr(4));
	for (var j = hideme.length-1; j > -1; j--) {
		hideme[j].style.display = "none";
	}
};

function showPlatform(tab) {
	var showme = [];
	showme = document.getElementsByClassName(tab.id.substr(4));
	for (var j = showme.length-1; j > -1; j--) {
		showme[j].style.display = (document.all) ? "block" : "table-row";
	}
};


