var parentPath = "";

function requestFCVBSkip(data, supports) {
    return requestFCVBElements(data, supports);
}

function responseFCVBSkip(data, supports) {
    return responseFCVBElements(data, supports);
}

function VBRequestElemValue(data, supports) {
    if (data == null) {
        return "";
    }
    var str = "";
    if (data.xmlType == "STRTYPE") {
        return '"ab"';
    }
    if (data.xmlType == "IDTYPE") {
        return '"200000-1011023419"';
    }
    if (data.xmlType == "BOOLTYPE") {
        return 'True';
    }
    if (data.xmlType == "DATETYPE") {
        return 'DateTime.Parse("12/15/2007")';
    }
    if (data.xmlType == "DATETIMETYPE") {
        return 'DateTime.Parse("12/15/2007 12:15:12"),false';
    }
    if (data.xmlType == "INTTYPE") {
        return '6';
    }
    if (data.xmlType == "AMTTYPE") {
        return '10.01';
    }
    if (data.xmlType == "PRICETYPE") {
        return '15.65';
    }
    if (data.xmlType == "PERCENTTYPE") {
        return '20.00';
    }
    if (data.xmlType == "QUANTYPE") {
        return '2';
    }
    if (data.xmlType == "GUIDTYPE") {
        return 'System.Guid.NewGuid().ToString()';
    }
    if (data.xmlType == "ENUMTYPE") {
        if (typeof(data.fcEnumValues) != "undefined") {
        	var tmp = data.fcEnumValues[0];
        	if (tmp.indexOf("[DEFAULT]") > 0) {
        		tmp = tmp.substring(0,tmp.indexOf("[DEFAULT]"));
        	}
            return codeType("EN" + data.fcName) + "." + tmp;
        }
    }
    return '"' + data.fcType + '"';
}

function VBResponseElemType(data, supports) {
    if (data == null) {
        return "";
    }
    var str = "";
    if (data.xmlType == "STRTYPE") {
        return codeType('String');
    }
    if (data.xmlType == "IDTYPE") {
        return codeType('String');
    }
    if (data.xmlType == "BOOLTYPE") {
        return codeType('Boolean');
    }
    if (data.xmlType == "DATETYPE" || data.xmlType == "DATETIMETYPE") {
        return codeType('DateTime');
    }
    if (data.xmlType == "INTTYPE") {
        return codeType('Integer');
    }
    if (data.xmlType == "AMTTYPE") {
        return codeType('Double');
    }
    if (data.xmlType == "PRICETYPE") {
        return codeType('Double');
    }
    if (data.xmlType == "PERCENTTYPE") {
        return codeType('Double');
    }
    if (data.xmlType == "QUANTYPE") {
        return codeType('Integer');
    }
    if (data.xmlType == "GUIDTYPE") {
        return codeType('String');
    }
    if (data.xmlType == "ENUMTYPE") {
        if (typeof(data.fcEnumValues) != "undefined") {
            return codeType("EN" + data.fcName);
        }
    }
    return codeType(data.fcType);
}

function requestFCVBAttrs(data, supports) {
    if (data == null) {
        return "";
    }
    var str = requestFCVBAttributes(data, supports);
    return str;
}

function requestFCVBElements(data, supports) {
    if (data == null) {
        return "";
    }
  var str = "";
  if (typeof(data.elements) != 'undefined' && data.elements != null) {
      var i;
      for (i=0; i<data.elements.length; i++) {
          str += requestFCVB(data.elements[i],supports);
      }
  }
  return str;
}

function responseFCVBElements(data, supports) {
    if (data == null) {
        return "";
    }
  var str = "";
  if (typeof(data.elements) != 'undefined' && data.elements != null) {
      var i;
      for (i=0; i<data.elements.length; i++) {
          str += responseFCVB(data.elements[i],supports);
      }
  }
  return str;
}

function requestFCVBOR(data, supports) {
    if (data == null) {
        return "";
    }
    var str = "";
    var oldParent = parentPath;
    if (typeof(data.fcListOf) != "undefined") {
    	var varname = getVariable(data.fcName + 'Element');
	    str += 'Dim ' + varname + ' as ' + codeType(data.fcListOf.fcType) + '<br/>\n';
	    str += varname + ' =' + parentPath + data.fcName + '.Append()<br/>\n';
	    parentPath = varname + '.';   
    } else {
    	parentPath = parentPath + data.fcName + ".";  
    }
	if (typeof(data.elements) != 'undefined' && data.elements != null) {
	    var i;
    	var varname = getVariable(data.fcName + 'ElementType');
    	str += 'Dim ' + varname + 'as ' + codeType('String') + '<br/>\n'
	    str += varname + ' = "' + data.elements[0].fcName + '";' + '<br/>';
	    for (i=0; i<data.elements.length; i++) {
	    	str += 'if (' + varname + ' == "' + data.elements[i].fcName + '") then<br/>';
	    	str += '<div class="codeverb-indent">\n';
	        str += requestFCVB(data.elements[i],supports);
	        str += '</div>\nEnd If<br/>\n';
	    }
	}
    parentPath = oldParent;
    return str;
}

function responseFCVBOR(data, supports) {
    if (data == null) {
        return "";
    }
    var str = "";
    var oldParent = parentPath;
    str += "if (not " + parentPath + data.fcName + " is nothing) then<br/>\n";
	str += '<div class="codeverb-indent">\n';
	var haveLoop = 0;
	var itername = getVariable('i');
	if (typeof(data.fcListOf) != "undefined") {
		haveLoop = 1;
		str +=     'Dim ' + itername + ' as Integer<br/>\n';
		str +=     'for ' + itername + ' = 0 to ' + parentPath + data.fcName + '.Count - 1<br/>\n';
		str +=     '<div class="codeverb-indent">\n';
		var varname = getVariable(data.fcListOf.fcType.substring(1));
		str +=         'Dim ' + varname + ' as ' + codeType(data.fcListOf.fcType) + '<br/>\n';
		str +=         varname + ' = ' + parentPath + data.fcName + '.GetAt(' + itername + ')<br/>\n';
		parentPath = varname + '.';
	} else {
		parentPath = parentPath + data.fcName + ".";
	}
	var i;
	for (i=0; i<data.elements.length; i++) {
	    str +=     'if (not ' + parentPath + data.elements[i].fcName + ' is nothing) then<br/>\n';
		str +=     '<div class="codeverb-indent">\n';
		str += responseFCVB(data.elements[i], supports);
		str +=     '</div>\nEnd If<br/>\n';	
	}
	if (typeof(data.fcListOf) != "undefined") {
		str +=     '</div>\nNext ' + itername + '<br/>\n';	
	}
	str += '</div>\nEnd If<br/>\n';
	parentPath = oldParent;
	return str;
}

function requestFCVBAggregate(data, supports) {
    if (data == null) {
        return "";
    }
    var str = "";
    var oldParent = parentPath;
    if (typeof(data.fcListOf) != "undefined" && data.fcListOf != null) {
    	var varname = getVariable(data.xmlName);
        str += 'Dim ' + varname + ' as ' + codeType(data.fcListOf.fcType) + '<br/>\n';
        str += varname + '=' + parentPath + data.fcName + '.Append()<br/>\n';
        parentPath = varname + '.';
    } else {
        if (data.fcType != "nothing") {
        	parentPath += data.fcName + '.';
        }
    }
    //str += requestFCVBAttrs(data, supports);
    str += requestFCVBElements(data, supports);
    parentPath = oldParent;
    return str;
}

function responseFCVBAggregate(data, supports) {
    if (data == null) {
        return "";
    }
    var str = "";
    var oldParent = parentPath;
    if (typeof(data.fcListOf) != "undefined" && data.fcListOf != null) {
        str += 'if (not ' + parentPath + data.fcName + ' is nothing)<br/>\n';
		str += '<div class="codeverb-indent">\n';
		var itername = getVariable('i');
		str +=     'Dim ' + itername + ' as ' + codeType('Integer');
		str +=     'for ' + itername + ' = 0  to ' + parentPath + data.fcName + '.Count - 1<br/>\n';
		str +=     '<div class="codeverb-indent">\n';
		var varname = data.fcListOf.fcType.substring(1);
		str +=        'Dim ' + varname + ' as ' + codeType(data.fcListOf.fcType) + '<br/>\n';
		str +=        varname + ' = ' + parentPath + data.fcName + '.GetAt(' + itername + ')<br/>\n';
		parentPath = data.fcListOf.fcType.substring(1);
		str += responseFCVBElements(data, supports);
		str +=     '</div>\nNext ' + itername + '<br/>\n';			
		str += '</div>\nEnd If<br/>\n';	
    } else {
        parentPath = parentPath + data.fcName + ".";
        if (!data.required) {
            str += 'if (not ' + parentPath + ' is nothing) then<br/>\n';
			str += '<div class="codeverb-indent">\n';
	    }   
        str += responseFCVBElements(data, supports);
        if (!data.required) {
            str += '</div>\nEnd If<br/>\n';
        }
    }
    parentPath = oldParent;
    return str;
}
        

function requestFCVBAttributes(data, supports)
{
    if (data == null) {
        return "";
    }
  var str = "";
  if (typeof(data.attributes) != 'undefined' && data.attributes != null) {
      if (data.attributes.length > 0) {
          str += codeComment("'Set attributes<br/>\n");
      	  var i;
          for (i=0; i<data.attributes.length; i++) {
              str += requestFCVBElement(data.attributes[i],supports);
          }
       }
   }
  return str;   
}

function requestFCVBElement(data, supports)
{
    if (data == null) {
        return "";
    }
    var str = "";
    str += codeComment("'Set field value for " + data.fcName + '<br/>');
    if (typeof(data.count) != "undefined" && typeof(data.count) == "string" && data.count.indexOf("n") >= 0) {
        str += codeComment("'May create more than one of these if needed<br/>");
        str += parentPath + data.fcName + '.Add(' + VBRequestElemValue(data, supports) + ');<br/>\n';
    } else {
    	str += parentPath + data.fcName + '.SetValue(' + VBRequestElemValue(data, supports) + ');<br/>\n';
    	str += requestFCVBAttributes(data, supports);
    }
    return str;
}

function responseFCVBElement(data, supports)
{
    if (data == null) {
        return "";
    }
    var str = "";
    str += codeComment("'Get value of " + data.fcName + '<br/>');
    var varname = getVariable(data.xmlName);
    if (data.required) {
        str += 'Dim ' + varname + ' as ' + codeType(VBResponseElemType(data, supports)) + '<br/>\n';
        str += varname + ' = ' + parentPath + data.fcName + '.GetValue()<br/>\n';
    } else {
        str += 'if ( not ' + parentPath + data.fcName + ' is nothing) then<br/>\n';
		str += '<div class="codeverb-indent">\n';
        str +=     'Dim ' + varname + ' as ' + codeType(VBResponseElemType(data, supports)) + '<br/>\n';		
        str +=     varname + ' = ' + parentPath + data.fcName + '.GetValue()<br/>\n';
		str += '</div>\nEnd If<br/>\n';		
    }	   
    return str;
}

function requestFCVB(data,parentSupports) {
  var colspan;
  var str = ""
    if (data == null) {
        return "";
    }
  var supports = updateSupports(parentSupports, data);
  if (!supportsCheckedEditions(supports)) {
      return str;
  }
  if (!checkSDKVers(data)) {
      return str;
  }
  if (!data.fcType) {
      return str;
  } else if (data.fcType == "skip") {
      str += requestFCVBSkip(data, supports);
  } else if (data.xmlType == "OR") {
      str += requestFCVBOR(data, supports);
  } else if (data.xmlType == "Aggregate" || data.xmlType == "List" || data.xmlType == "skip") {
      str += requestFCVBAggregate(data, supports);
  } else {
      str += requestFCVBElement(data, supports);
  }
  return str;
}

function responseFCVB(data, parentSupports) {
    var str = "";
    if (data == null) {
        return "";
    }
    var supports = updateSupports(parentSupports, data);
    if (!supportsCheckedEditions(supports)) {
        return str;
    }
    if (!checkSDKVers(data)) {
        return str;
    }
    if (!data.fcType) {
        return str;
    } else if (data.fcType == "skip") {
        str += responseFCVBSkip(data, supports);
    } else if (data.xmlType == "OR") {
        str += responseFCVBOR(data, supports);
    } else if (data.xmlType == "Aggregate") {
        str += responseFCVBAggregate(data, supports);
    } else if (data.xmlType == "List") {
        str += responseFCVBAggregate(data, supports);
    } else {
        str += responseFCVBElement(data, supports);
    }
    return str;
}

function FCVBBuild(data, supports) {
    if (data == null) {
        return "";
    }
    var str = "";
    str += 'Public Sub Build' + data.xmlName + '(requestMsgSet as ' + codeType('IMsgSetRequest') + ')<br/>\n';
    str += '<div class="codeverb-indent">\n';
    str +=     'Dim ' + data.xmlName + ' as ' + codeType(data.fcName) + '<br/>\n';
    str +=     data.xmlName + '= requestMsgSet.Append' + _vars['selectedMsg'] + 'Rq()<br/>\n'
    parentPath =  data.xmlName + ".";
    str += requestFCVB(data, supports);
    str += '</div>\n';
    str += 'End Sub<br/><br/>\n';
    return str;
}

function FCVBParse(data, supports) {
    if (data == null) {
        return "";
    }
    var str = "";
    str += 'Public Sub Walk' + data.xmlName + '( responseMsgSet as ' + codeType('IMsgSetResponse') + ')<br/>\n';
    str += '<div class="codeverb-indent">\n';
    str +=     'if (responseMsgSet is nothing) then<br/>\n';
    str +=     '<div class="codeverb-indent">\n';
    str +=         'Exit Sub<br/>\n';
    str +=     '</div>\nEnd If<br/><br/>\n';
    str +=     'Dim responseList as ' + codeType('IResponseList') + '<br/>\n';
    str +=     'responseList = responseMsgSet.ResponseList<br/>\n';
    str +=     'if (responseList is nothing) then<br/>\n';
    str +=     '<div class="codeverb-indent">\n';
    str +=         'Exit Sub<br/>\n';
    str +=     '</div>\nEnd If<br/><br/>\n';
    str +=     codeComment("'if we sent only one request, there is only one response, we'll walk the list for this sample<br/>");
    str +=     'for j=0 to responseList.Count-1<br/>\n';
    str +=     '<div class="codeverb-indent">\n';
    str +=         'Dim response as ' + codeType('IResponse') + '<br/>\n';
    str +=         'response = responseList.GetAt(i)<br/>\n';
    str +=         codeComment("'check the status code of the response, 0=ok, >0 is warning<br/>");
    str +=         'if (response.StatusCode &gt;= 0) then <br/>\n';
    str +=         '<div class="codeverb-indent">\n';
    str +=             codeComment('//the request-specific response is in the details, make sure we have some<br/>');
    str +=             'if (not response.Detail is nothing) then<br/>\n';
    str +=             '<div class="codeverb-indent">\n';
    str +=                 codeComment("//make sure the response is the type we're expecting<br/>");
    str +=                 'Dim responseType as ' +  codeType('ENResponseType') + '<br/>\n';
    str +=                 'responseType = CType(response.Type.GetValue(),' + codeType('ENResponseType') + ');<br/>\n';
    str +=                 'if (responseType == ' + codeType('ENResponseType') + '.rt' + data.xmlName + ') then<br/>\n';
    str +=                 '<div class="codeverb-indent">\n';
    if (typeof(data.elements) != "undefined" && data.elements != null) {
        var detail = data.elements[0];
        str +=                 codeComment("'//upcast to more specific type here, this is safe because we checked with response.Type check above<br/>");
        str +=                 'Dim ' + detail.xmlName + ' as ' + codeType(detail.fcType) + '<br/>\n';
    	str +=                 detail.xmlName + ' = CType(response.Detail,' + codeType(detail.fcType) + ')<br/>\n';
    	str +=                 '<b>Walk' + detail.xmlName + '(' + detail.xmlName + ');</b><br/>\n';
    }
    str +=                 '</div>\nEnd If<br/>\n';
    str +=             '</div>\nEnd If<br/>\n';
    str +=         '</div>\nEnd If<br/>\n';
    str +=     '</div>\nNext j<br/>\n';
    str += '</div>\nEnd Sub<br/>\n';
    str += '<br/><br/><br/>\n';
    if (typeof(data.elements) != "undefined" && data.elements != null) {
        var detail = data.elements[0];
     	str += 'Public Sub Walk' + detail.xmlName + '(' + detail.xmlName + ' as ' + codeType(detail.fcType) + ')<br/>\n';
        str += '<div class="codeverb-indent">\n';
        str +=     'if (' + detail.xmlName + ' is nothing) then<br/>\n';
	    str +=     '<div class="codeverb-indent">\n';
	    str +=         'Exit Sub<br/>\n';
	    str +=     '</div>\nEnd If<br/><br/>\n';
        parentPath = detail.xmlName + '.';
        str +=     codeComment("'Go through all the elements of " + detail.fcType + '<br/>');
        str +=     responseFCVBElements(detail, supports);
	    str += '</div>\nEnd Sub<br/>\n';
	    str += '<br/><br/><br/>\n';
    }
    return str;
}    

function FCVBHeader() 
{
    var str = "";
    str += codeComment("'The following sample code is generated as an illustration of <br/>");
    str += codeComment("'Creating requests and parsing responses ONLY<br/>");
    str += codeComment("'This code is NOT intended to show best practices or ideal code<br/>");
    str += codeComment("'Use at your most careful discretion<br/><br/>");
    str += 'imports System<br/>\n';
    str += 'imports System.Net<br/>\n';
    str += 'imports System.Drawing<br/>\n';
    str += 'imports System.Collections<br/>\n';
    str += 'imports System.ComponentModel<br/>\n';
    str += 'imports System.Windows.Forms<br/>\n';
    str += 'imports System.Data<br/>\n';
    str += 'imports System.IO<br/>\n';
    str += 'imports Interop.QBFC7<br/>\n';
    str += '<br/>\n';
    str += 'Module <span class="xmlverb-ns-name">com.intuit.idn.samples</span><br/>\n';
    str += '<div class="codeverb-indent">\n';
    str += '   Public Class Sample<br/>\n';
    str +=     '<div class="codeverb-indent">\n';
    str +=     'Public Sub  Do' + _vars['selectedMsg'] + '()<br/>\n';
    str +=     '<div class="codeverb-indent">\n';
    str +=         'Dim sessionBegun as ' + codeType('Boolean') + '<br/>\n';
    str +=         'sessionBegun = False<br/>\n';
    str +=         'Dim connectionOpen as '  + codeType('Boolean') + '<br/>\n'
    str +=         'connectionOpen = False<br/>\n';
    str +=         'Dim sessionManager as ' + codeType('QBSessionManager') + '<br/>\n';
    str +=         'sessionManager = nothing<br/><br/>\n';
    str +=         'Try<br/>\n';
    str +=         '<div class="codeverb-indent">\n';
    str +=             codeComment("'Create the session Manager object<br/>");
    str +=             'sessionManager = new QBSessionManager<br/><br/>\n';
    str +=             codeComment("'Create the message set request object to hold our request<br/>");
    var major = maxSDK.substring(0,1);
    var minor = maxSDK.substring(2);
    str +=             'Dim requestMsgSet as ' + codeType('IMsgSetRequest') + '<br/>\n';
    str +=             'requestMsgSet = sessionManager.CreateMsgSetRequest("US",' + major + ',' + minor + ')<br/>\n';
    str +=             'requestMsgSet.Attributes.OnError = ENRqOnError.roeContinue<br/><br/>\n';
    str +=             '<b>Build' + _vars['selectedMsg'] + 'Rq(requestMsgSet)</b><br/><br/>\n';
    str +=             codeComment("'Connect to QuickBooks and begin a session<br/>");
    str +=             'sessionManager.OpenConnection("","Sample Code from OSR")<br/>\n';
    str +=             'connectionOpen = True<br/>\n';
    str +=             'sessionManager.BeginSession("", ENOpenMode.omDontCare)<br/>\n';
    str +=             'sessionBegun = True<br/><br/>\n';
    str +=             codeComment("'Send the request and get the response from QuickBooks<br/>");
    str +=             'Dim responseMsgSet as ' + codeType('IMsgSetResponse') + '<br/>\n';
    str +=             'responseMsgSet = sessionManager.DoRequests(requestMsgSet)<br/><br/>\n';
    str +=             codeComment("'End the session and close the connection to QuickBooks<br/>");
    str +=             'sessionManager.EndSession()<br/>\n';
    str +=             'sessionBegun = False<br/>\n';
    str +=             'sessionManager.CloseConnection()<br/>\n';
    str +=             'connectionOpen = False<br/><br/>\n';
    str +=             '<b>Walk' + _vars['selectedMsg'] + 'Rs(responseMsgSet)</b><br/>\n';
    str +=         '</div>\n';
    str +=         'Catch e as Exception<br/>\n';
    str +=         '<div class="codeverb-indent">\n';
    str +=             'MessageBox.Show(e.Message, "Error");<br/>\n';
    str +=             'if (sessionBegun) then <br/>\n';
    str +=             '<div class="codeverb-indent">\n';
    str +=                 'sessionManager.EndSession();<br/>\n';
    str +=             '</div>\n';
    str +=             'End If<br/>\n';
    str +=             'if (connectionOpen) then<br/>\n';
    str +=             '<div class="codeverb-indent">\n';
    str +=                 'sessionManager.CloseConnection();<br/>\n';
    str +=             '</div>\n';
    str +=             'End If<br/>\n';
    str +=         '</div>\n';
    str +=         'End Try<br/>\n';
    str +=         '</div>\n';
    str +=     'End Sub<br/>\n';
    return str;
}
 

function renderFCVBCode(targ) {
    showUS = _vars['showUS'][0];
    showOE = _vars['showOE'][0];
    showCA = _vars['showCA'][0];
    showUK = _vars['showUK'][0];
    datadir = _vars['dataDir'][0];
    indent = "";
    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 supports = {US:true, CA:true, UK:true, OE:true};
    var content = '<b:xhtml>\n';
    content += FCVBHeader();
    content += FCVBBuild(messageDataJSON, supports);
    content += '<br/><br/><br/>\n';
    content += FCVBParse(respDataJSON, supports);
    content += '</div>\n';
    content += 'End Class<br/>\n';
    content += '</div>\n';
    content += 'End Module<br/>\n';
    content += '</b:xhtml>\n';
    //alert(content)
    //content += requestFCVB(data, supports);
    bpc.render(content,'replacechildren', targ);
    //bpc.task(['b:action', 'settext', 'b:value', content], _current);
    return content;
}

