function handleXMLSkip(data, supports) {
    var i;
    var str = "";
    //alert("handleXMLSkip: " + typeof(data));
    if (typeof(data.elements) != 'undefined' && data.elements != null) {
        for (i=0; i<data.elements.length; i++) {
            str += writeXMLOSR(data.elements[i], supports);
        }
    }
    return str;
}

function handleXMLOR(data, supports) {
  var str = "";
  //alert("handleXMLOR: " + typeof(data));
  if (typeof(data.elements) != 'undefined' && data.elements != null) {
      if (data.elements.length > 1) {
		  str += '<b:treelistrow b:behavior="treelistNoRowSelect">\n';
		  str += '<b:treelistcell>' + 'BEGIN OR' + '</b:treelistcell>\n';
		  str += '<b:treelistcell></b:treelistcell>\n';
		  str += '<b:treelistcell></b:treelistcell>\n';
		  str += '<b:treelistcell></b:treelistcell>\n'; //MAX(qboe)
		  str += '<b:treelistcell></b:treelistcell>\n'; //Imp
		  str += '<b:treelistcell></b:treelistcell>\n';
	      var i;
	      for (i=0; i<data.elements.length; i++) {
	          str += '<b:treelistchildren>\n';
	          str += writeXMLOSR(data.elements[i],supports);
	          str += '</b:treelistchildren>\n';
	          str += '</b:treelistrow>\n';
	          if (i+1<data.elements.length) {
	              str += '<b:treelistrow b:behavior="treelistNoRowSelect">\n';
	              str += '<b:treelistcell>' + 'OR' + '</b:treelistcell>\n';
	              str += '<b:treelistcell></b:treelistcell>\n';
	              str += '<b:treelistcell></b:treelistcell>\n';
	              str += '<b:treelistcell></b:treelistcell>\n'; //MAX(qboe)
	              str += '<b:treelistcell></b:treelistcell>\n'; //Imp
	              str += '<b:treelistcell></b:treelistcell>\n';
	          }
	      }
		  str += '<b:treelistrow b:behavior="treelistNoRowSelect">\n';
		  str += '<b:treelistcell>' + 'END OR' + '</b:treelistcell>\n';
		  str += '<b:treelistcell></b:treelistcell>\n';
		  str += '<b:treelistcell></b:treelistcell>\n';
		  str += '<b:treelistcell></b:treelistcell>\n'; //MAX(qboe)
		  str += '<b:treelistcell></b:treelistcell>\n'; //Imp
		  str += '<b:treelistcell></b:treelistcell>\n';
		  str += '</b:treelistrow>\n';
      } else {
      	  str += handleXMLSkip(data, supports);
      }
  }
  return str; 
}

function getXMLTypeStr(data) {
    var str = '';
    if (data.xmlType != "nothing") {
        if (data.xmlTypeHtml) {
            str += '<a b:behavior="populateDetails" b:url="' + datadir + 'html/' + data.xmlTypeHtml + '">';
        }
        str += data.xmlType;
        if (data.xmlTypeHtml) {
            str += '</a>';
        }
    }
    return str;
}

function handleXMLElements(data, supports) {
  var str = "";
  if (data == null) {
      return str;
  }
  //alert("handleXMLElements: " + typeof(data));
  if (typeof(data.elements) != 'undefined' && data.elements != null) {
      str += '<b:treelistchildren>\n';
      var i;
      for (i=0; i<data.elements.length; i++) {
          str += writeXMLOSR(data.elements[i],supports);
      }
      str += '</b:treelistchildren>\n';
  }
  return str;
}

function handleXMLAggregate(data, supports)
{
    var str = "";
    if (data == null) {
      return str;
    }
    //alert("handleXMLAggregate: " + typeof(data));
    str += '<b:treelistrow b:behavior="treelistNoRowSelect" ' + getFieldMapAttrs(data) + '>\n';
    str += '<b:treelistcell>';
    var hlstart = "";
    var hlend  = "";
    if (typeof(data.xmlNameHtml) != 'undefined' && data.xmlNameHtml) {
        hlstart = '<a b:behavior="populateDetails" b:url="' + datadir + 'html/' + data.xmlNameHtml + '">';
        hlend = '</a>';
    }
    str += hlstart + data.xmlName + hlend + " " + writeQBXMLAttributes(data, supports);
    str += '</b:treelistcell>\n';
    str += '<b:treelistcell></b:treelistcell>\n';
    str += '<b:treelistcell></b:treelistcell>\n';
    str += '<b:treelistcell></b:treelistcell>\n';
    str += '<b:treelistcell>' + getImplementationStr(data, supports) + '</b:treelistcell>\n';
    str += '<b:treelistcell>' + ((data.count == null) ? '' : data.count) + '</b:treelistcell>\n';
    str += handleXMLElements(data, supports);
    str += '</b:treelistrow>\n';
    return str;
}

function handleXMLList(data, supports)
{
    if (data == null) {
        return "";
    }
    var str = "";
    //alert("handleXMLList: " + typeof(data));
    if (typeof(data.elements) != 'undefined' && data.elements) {
        str += writeXMLOSR(data, supports);
    }
    return str;
}

function handleXMLElement(data, supports)
{
    if (data == null) {
        return "";
    }
    var str = "";
    //alert("handleXMLElement: " + typeof(data));
    str += '<b:treelistrow b:behavior="treelistNoRowSelect" ' + getFieldMapAttrs(data) + '>\n';
    str += '<b:treelistcell>'
    str += '<a b:behavior="populateDetails" b:url="' + datadir + 'html/' + data.xmlNameHtml + '">' + data.xmlName + '</a>';
    str += writeQBXMLAttributes(data, supports);
    str += '</b:treelistcell>';
    str += '<b:treelistcell>' + getXMLTypeStr(data) + '</b:treelistcell>\n';
    str += '<b:treelistcell>' + getMaxDTStr(data) + '</b:treelistcell>\n';
    str += '<b:treelistcell>' + getMaxOEStr(data) + '</b:treelistcell>\n';
    str += '<b:treelistcell>' + getImplementationStr(data, supports) + '</b:treelistcell>\n';
    str += '<b:treelistcell>' + ((data.count==null) ? '' : data.count) + '</b:treelistcell>\n';
    str += '</b:treelistrow>\n';
    return str;
}

function writeXMLOSR(data, parentSupports) {
  var colspan;
  var reqSDK = 1;
  var hlStart;
  var hlEnd;
  var str = "";
    if (data == null) {
        return "";
    }
  if (typeof(data) != "object") {
    //alert("writeXMLOSR: " + typeof(data));
  }
  //if (typeof(data) == "object") {
  //	alert("writeXMLOSR: " + data.xmlName);
  //}
  var supports = updateSupports(parentSupports, data);
  if (!supportsCheckedEditions(supports)) {
      //alert("doesn't support checked editions, bailing");
      return str;
  }
  if (!checkSDKVers(data)) {
      //alert("doesn't support SDK version, bailing");
      return str;
  }
  if (typeof(data.xmlType) == 'undefined' || !data.xmlType || data.xmlType == "skipwithchildren") {
      return str;
  }
  if (data.xmlType == "skip") {
      str += handleXMLSkip(data, supports);
  } else if (data.xmlType == "OR") {
      str += handleXMLOR(data, supports);
  } else if (data.xmlType == "Aggregate") {
      str += handleXMLAggregate(data, supports);
  } else if (data.xmltype == "List") {
      str += handleXMLList(data, supports);
  } else {
      str += handleXMLElement(data, supports);
  }
  return str;
}

function renderXMLOSR(data) {
    rowcount = 0;
    //alert("renderXMLOSR: " + typeof(data));
    maxSDK = _vars['maxSDKVersion'][0];
    var supports = {US:true, CA:true, UK:true, OE:true};
    var content = writeHeader("Occurrences");
    content += writeXMLOSR(data, supports);
    content += '</b:treelist>\n';
    return content;
}
