var indent;

function e(name) {
    return '<span class="xmlverb-element-name">' + name + '</span>';
}

function a(name, value) {
    var str = '<span class="xmlverb-attr-name"> ' + name + '</span>';
    str += '="';
    str += '<span class="xmlverb-attr-content">' + value + '</span>';
    str += '"';
    return str;
}

function c(comment) {
    return str = '<span class="xmlverb-comment">      &lt;!-- ' + comment + ' --&gt;</span>';
}

function t(text) {
    return str = '<span class="xmlverb-text">' + text + '</span>';
}

function nl() {
    return '<div class="xmlverb-element-block"></div>\n';
}

function incIndent() {
    return '<div class="xmlverb-indent">\n';
}
function decIndent() {
    return '</div>\n';
}

function handleOPSSkip(data, supports) {
    var i;
    if (data == null) {
        return "";
    }
    var str = ""
    if (typeof(data) == "undefined") {
    	//alert("handleOPSSkip: data is undef");
    	return;
    }
    if (data.elements != null) {
        for (i=0; i<data.elements.length; i++) {
            str += writeXMLOPS(data.elements[i], supports);
        }
    }
    return str;
}

function handleOPSOR(data, supports) {
    if (data == null) {
        return "";
    }
    var str = "";
    if (typeof(data) == "undefined") {
    	//alert("handleOPSOR: data is undef");
    	return;
    }
  if (typeof(data.elements) != 'undefined' && data.elements != null) {
  	  if (data.elements.length > 1) {
 	  	  str += c('BEGIN OR') + nl();
	      var i;
	      for (i=0; i<data.elements.length; i++) {
	          str += incIndent();
	          str += writeXMLOPS(data.elements[i],supports);
	          str += decIndent();
	          if (i+1<data.elements.length) {
	              str += c('OR') + nl();
	          }
	      }
  		  str += c('END OR') + nl();
      } else {
      	  str += handleOPSSkip(data, supports);
      }
  }
  return str; 
}

function getComment(data) {
    if (data == null) {
        return "";
    }
    if (typeof(data) == "undefined") {
    	//alert("getComment: data is undef");
    	return;
    }
    if (data.count == null) {
        return "";
    }
    if (data.count == "0 - 1") {
        return c('optional');
    }
    if (data.count == "0 - n") {
        return c('optional, may repeat');
    }
    if (data.count == "1") {
        return c('required');
    }
    if (data.count == "1 - n") {
        return c("required, may repeat");
    }
    return c("must occur " + data.count + " times");
}

function getOPSTypeStr(data) {
    if (data == null) {
        return "";
    }
    if (typeof(data) == "undefined") {
    	//alert("OPSTypeStr: data is undef");
    	return;
    }
    var str = '';
    str += data.xmlType;
    return str;
}

function handleOPSElements(data, supports) {
    if (data == null) {
        return "";
    }
    var str = "";
    if (typeof(data) == "undefined") {
    	//alert("handleOPSElements: data is undef");
    	return;
    }
  if (typeof(data.elements) != 'undefined' && data.elements != null) {
      var i;
      for (i=0; i<data.elements.length; i++) {
          str += writeXMLOPS(data.elements[i],supports);
      }
  }
  return str;
}

function getOPSAttrs(data, parentSupports)
{
    if (data == null) {
        return "";
    }
    var str = "";
    if (typeof(data) == "undefined") {
    	//alert("getOPSAttrs: data is undef");
    	return;
    }
  if (typeof(data.attributes) != 'undefined' && data.attributes != null) {
      var j;
      for (j=0; j<data.attributes.length; j++) {
          var supports = updateSupports(parentSupports, data.attributes[j]);
          if (supportsCheckedEditions(supports)) {
              if (data.attributes[j].xmlType != "skip") {
                str+= a(data.attributes[j].xmlName,data.attributes[j].xmlType);
              }
          }
      }
  }
  return str;
}
function handleOPSAggregate(data, supports)
{
    if (data == null) {
        return "";
    }
    var str = "";
    if (typeof(data) == "undefined") {
    	//alert("handleOPSAgg: data is undef");
    	return;
    }
    str += indent + '&lt;' + e(data.xmlName) + getOPSAttrs(data, supports) + '&gt;' + getComment(data) + '\n';
    str += incIndent();
    str += handleOPSElements(data, supports);
    str += decIndent();
    str += indent + '&lt;/' + e(data.xmlName) + '&gt;' + nl();
    return str;
}

function handleXMLList(data, supports)
{
    if (data == null) {
        return "";
    }
    var str = "";
    if (typeof(data) == "undefined") {
    	//alert("handleXMLList: data is undef");
    	return;
    }
    if (typeof(data.elements) != 'undefined' && data.elements) {
        str += writeXMLOPS(data, supports);
    }
    return str;
}

function handleOPSElement(data, supports)
{
    if (data == null) {
        return "";
    }
    var str = "";
    if (typeof(data) == "undefined") {
    	//alert("handleOPSElement: data is undef");
    	return;
    }
    if (data.xmlType == "ENUMTYPE" && typeof(data.xmlEnumValues) != 'undefined') {
        var vals = "";
        for (j = 0; j<data.xmlEnumValues.length; j++) {
            if (vals != "") {
                vals += ", ";
            }
            vals += data.xmlEnumValues[j];
        }
        if (vals != "") {
            str += c(data.xmlName + " may have one of the following values: " + vals) + nl();
        }
    }
    str += indent + '&lt;' + e(data.xmlName) + ' ' + getOPSAttrs(data, supports) + '&gt;' ;
    str += t(getOPSTypeStr(data)) + '&lt;/' + e(data.xmlName) + '&gt;' + getComment(data) + nl();
    return str;
}

function writeXMLOPS(data, parentSupports) {
  var colspan;
  var reqSDK = 1;
  var hlStart;
  var hlEnd;
  var str = "";
    if (data == null) {
        return "";
    }
    if (typeof(data) == "undefined") {
    	//alert("writeXMLOPS: data is undef");
    	return;
    }
  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 (!data.xmlType || data.xmlType == "skipwithchildren") {
      return str;
  }
  if (data.xmlType == "skip") {
      str += handleOPSSkip(data, supports);
  } else if (data.xmlType == "OR") {
      str += handleOPSOR(data, supports);
  } else if (data.xmlType == "Aggregate") {
      str += handleOPSAggregate(data, supports);
  } else if (data.xmltype == "List") {
      str += handleOPSList(data, supports);
  } else {
      str += handleOPSElement(data, supports);
  }
  return str;
}

function XMLOpsHeader(XMLType) 
{
    var str = "<b:xhtml>\n";
    str += '<div class="xmlverb-default xmlverb-nomargins">\n';
    str += '<div class="xmlverb-element-block">';
    str += '&lt;?xml version="1.0" encoding="utf-8"?&gt;';
    str += '</div>\n';
    str += '<div class="xmlverb-element-block">';
    str += '&lt;?' + XMLType + ' version="' + maxSDK + '"?&gt;';
    str += '</div>\n';
    str += '<div class="xmlverb-element-block">';
    str += '&lt;'+ e(XMLType.toUpperCase()) +'&gt;';
    str += '</div>\n';
    str += '<div class="xmlverb-indent">\n';
    str += '&lt;'+ e(XMLType.toUpperCase() + 'MsgsRq');
    if (XMLType != "qbmsxml") {
        str += a('onError','stopOnErrror') + '&gt;\n';
    } else {
        str += '&gt;\n';
    }
    str += '<div class="xmlverb-indent">\n';
    return str;
}

function XMLOpsTrailer(XMLType)
{
    var str = "";
    str += '</div>\n';
    str += indent + '&lt;/' + e(XMLType.toUpperCase() + 'MsgsRq') + '&gt;\n';
    str += '</div>\n';
    str += '&lt;/' + e(XMLType.toUpperCase()) + '&gt;<br/>\n';
    str += '</div>\n';
    str += '</b:xhtml>\n';
    return str;
}
 
function renderXMLOps(targ) {
    showUS = _vars['showUS'][0];
    showOE = _vars['showOE'][0];
    showCA = _vars['showCA'][0];
    showUK = _vars['showUK'][0];
    datadir = _vars['dataDir'][0];
    indent = "";
    //alert("in renderXMLOps");
    var msgData = _vars['messageDataJSON'][0];
    var messageDataJSON;
    if (msgData != "") {
        messageDataJSON = eval('(' + msgData + ')');
    }
    var respData = _vars['responseData'][0];
    var respDataJSON;
    if (respData != "") {
        respDataJSON = eval('(' + respData + ')');
    }
    rowcount = 0;
    maxSDK = _vars['maxSDKVersion'][0];
    var docroot = _vars['docroot'][0];
    var supports = {US:true, CA:true, UK:true, OE:true};
    var content = XMLOpsHeader(docroot);
    content += writeXMLOPS(messageDataJSON, supports);
    content += writeXMLOPS(respDataJSON, supports);
    content += XMLOpsTrailer(docroot);
    bpc.render(content,'replacechildren', targ);
}
