var g_arr_commands;
var g_cur_cmd_idx = 0;
var g_cmd_count = 0;
var g_xhr = false;
var g_rawText = "";
var g_Form = false;
var g_URL = "";
var g_Method = "POST";
var g_quit_on_failure = true;
var g_error = false;  //set to true if any command fails
var g_bAsync = false;

/**
  * Call this to start the process
  *     Function initGlobals needs to be called first
  *
  * @param cmds Comma delimited list of commands to call in order
  * @param recall Boolean Set to false when calling for the first time
  *
  * @see initGlobals
  */
function sendCommands(cmds, recall)
{
    //if we are calling for the first time
    if( recall == false)
    {
        disable_controls();
        g_arr_commands = cmds.split(",");
        g_cur_cmd_idx = 0;
        g_cmd_count = g_arr_commands.length;
    }else{
        g_cur_cmd_idx = g_cur_cmd_idx + 1;
    }

    //if we have sent all commands
    if(g_cur_cmd_idx == g_cmd_count)
    {
        enable_controls();
        return true;
    }

    //form required to have a hidden element cmd
    //  <input id="cmd" type="hidden" name="cmd" value=""/>
    var elAction = document.getElementById('cmd');
    g_Form.cmd.value = trimWhitespace(g_arr_commands[g_cur_cmd_idx]);

    //create request, initialize and call
    g_xhr = new scks_XHR();             //initialize class
	g_xhr.setAsync(g_bAsync);
    g_xhr.setForm(g_Form);              //required for getting form values
    g_xhr.setURL(g_URL);                //url of server script to call
    g_xhr.setCallback(xhrCallback);     //handles the xhr return
    g_xhr.setMethod(g_Method);          //POST or GET
    g_xhr.sendRequest();                //send the request

}

/**
  * Need to initialize globals seperately as they
  * will be used for all calls.
  *  Required to be called before sendCommands is
  *     called the first time
  * Form required to have results area
  *    <div id="results"></div>
  *
  * @param frm Form object
  * @param url Server script to call
  * @param method POST or GET
  * @param qfail true: stops calling commands if one fails; false: continues list of commands even if one fails
  *
  * @see sendCommands
  */
function initGlobals(frm, url, method, qfail)
{
    g_Form = frm;
    g_URL = url;
    g_Method = method;
    g_quit_on_failure = qfail;
    //form required to have results area
    //  <div id="results"></div>
    //clear it for new call
    var results = document.getElementById('results');
    if( results )
    {
        results.innerHTML = "&nbsp;";
        results.style.display = 'none';
    }
}

/**
  * Put your information handling code here
  *  I use double bars to delinate the return
  *  value. It's as easy as spitting the return into
  *  an array and processing from there.
  *
  * Example Return System:
  *  The first two values returned need to be the action and result code
  *     Example: action||0
  *  Result code "0" is success
  *  Result code !="0" indicates failure and failure string should be the third value
  *     Example: action||1||error_string
  *  After that it's up to you what you return
  *
  * This function can be edited to process the return anyway you want
  */
function xhrCallback()
{
    var arr_ret;
    var req = g_xhr.XHR();
	var results = document.getElementById('results');
	var outputText = "";

	if( results )
	{
    	//outputText = results.innerHTML;
	}

    if (req.readyState == 4)
    {
        if(req.status == 200)
        {
            //store raw return so it can be accessed if needed
            g_rawText = trimWhitespace( req.responseText );
            var el_test = document.getElementById('clia-test-output');
            if( el_test ) {
                el_test.innerHTML = g_rawText;
            }

            /**************************************************************/
            /* START: Edit in here to handle response from server         */
            /**************************************************************/

            //explode the response string into an array
            arr_ret = req.responseText.split("||");

            //grab the action
            var action = trimWhitespace(arr_ret[0]);

            //store success/error value
            var error = arr_ret[1];

            //if something other than 0 is returned then it is an error
            if(error != "0" && action != "getplus4")
            {
				//handle error here
				g_error = true;
				outputText += "<span class='error'>" + arr_ret[2] + "</span>";
				if( results )
				{
					results.innerHTML = outputText;
                    results.style.display = 'block';
				}
				if(g_quit_on_failure)
				{
					//make sure we enable the controls here
					//since no further processing is done
					enable_controls();
                    var el_loader = document.getElementById('plus4-loader');
                    if( el_loader ) {
                        el_loader.style.display = 'none';
                    }
					return false;
				}else{

					sendCommands("",true);
					return true;
				}
            }
            //otherwise we had a successful call
            outputText += "<span class='success'>";
            //process return based on action sent in
            switch(action)
            {
                case 'save_fsa_fees' : {
                    break;
                }

                case 'save_fsa_bookmark' : {
                    break;
                }

                case 'delete_fsa_bookmark' : {
                    break;
                }

                case 'calc_fsa_fees' : {
                    break;
                }

                case 'init_fsa_calculator': {
                    break;
                }

				case 'get_disease_economics': {
					break;
				}

				case 'get_blank_cpt_data': {
					break;
				}

				case 'get_cpt_data': {
					break;
				}

				case 'get_cpt_guidelines': {
					break;
				}

				case 'set_empty_dme_data': {
					$.loadAnimation.end();

					// Serialized data.
					var dmedata = arr_ret[2];

					// Parse xml.
					if (window.DOMParser) {
						parser = new DOMParser();
						dmedata_xmlDoc = parser.parseFromString(dmedata,"text/xml");
					} else {
						// Internet Explorer
						dmedata_xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
						dmedata_xmlDoc.async = "false";
						dmedata_xmlDoc.loadXML(dmedata);
					}

					// Update page elements.

					// Code Description
					$('#code_description').html('');

					// Place results chart data points in arrays for easy access where [0=>label, 1=>data].

					// Established Ceiling Value
					var ceiling_value 	= [dmedata_xmlDoc.getElementsByTagName("recordset")[0].getElementsByTagName("field")[0].childNodes[0].textContent
										|| dmedata_xmlDoc.getElementsByTagName("recordset")[0].getElementsByTagName("field")[1].childNodes[0].text
										|| "",
										   dmedata_xmlDoc.getElementsByTagName("recordset")[0].getElementsByTagName("field")[1].childNodes[0].textContent
										|| dmedata_xmlDoc.getElementsByTagName("recordset")[0].getElementsByTagName("field")[0].childNodes[0].text
										|| ""
					];

					// Established Floor Value
					var floor_value		= [dmedata_xmlDoc.getElementsByTagName("recordset")[0].getElementsByTagName("field")[0].childNodes[1].textContent
										|| dmedata_xmlDoc.getElementsByTagName("recordset")[0].getElementsByTagName("field")[1].childNodes[1].text
										|| "",
										   dmedata_xmlDoc.getElementsByTagName("recordset")[0].getElementsByTagName("field")[1].childNodes[1].textContent
										|| dmedata_xmlDoc.getElementsByTagName("recordset")[0].getElementsByTagName("field")[0].childNodes[1].text
										|| ""
					];

					// Populate page elements.

					// Code Description
					$('#code_description').html(description);

					// Ceiling Value
					$('#ceiling_value .label').html(ceiling_value[0]);
					$('#ceiling_value .data').html(ceiling_value[1]);

					// Floor Value
					$('#floor_value .label').html(floor_value[0]);
					$('#floor_value .data').html(floor_value[1]);

					// Max Allowable
					$('#max_allowable .label').html('');
					$('#max_allowable .data').html('');

					break;
				}

				case 'set_dme_data': {
					$.loadAnimation.end();

					var dmedata = arr_ret[2];

					// Parse xml.
					if (window.DOMParser) {
						parser = new DOMParser();
						dmedata_xmlDoc = parser.parseFromString(dmedata,"text/xml");
					} else {
						// Internet Explorer
						dmedata_xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
						dmedata_xmlDoc.async = "false";
						dmedata_xmlDoc.loadXML(dmedata);
					}

					if ((dmedata_xmlDoc.getElementsByTagName("type")[0].textContent == "success") || (dmedata_xmlDoc.getElementsByTagName("type")[0].text == "success")) {
						// Success.

						// Code Description
						var description	= dmedata_xmlDoc.getElementsByTagName("grid")[0].getElementsByTagName("row")[0].getElementsByTagName("col")[0].getElementsByTagName("value")[0].textContent
										|| dmedata_xmlDoc.getElementsByTagName("grid")[0].getElementsByTagName("row")[0].getElementsByTagName("col")[0].getElementsByTagName("value")[0].text
										|| "";

						// Place results chart data points in arrays for easy access where [0=>label, 1=>data].

						// Established Ceiling Value
						var ceiling_value 	= [dmedata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[0].getElementsByTagName("col")[0].getElementsByTagName("value")[0].textContent
											|| dmedata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[0].getElementsByTagName("col")[0].getElementsByTagName("value")[0].text
											|| "",
											   dmedata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[0].getElementsByTagName("col")[1].getElementsByTagName("value")[0].textContent
											|| dmedata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[0].getElementsByTagName("col")[1].getElementsByTagName("value")[0].text
											|| ""
						];

						// Established Floor Value
						var floor_value		= [dmedata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[1].getElementsByTagName("col")[0].getElementsByTagName("value")[0].textContent
											|| dmedata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[1].getElementsByTagName("col")[0].getElementsByTagName("value")[0].text
											|| "",
											   dmedata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[1].getElementsByTagName("col")[1].getElementsByTagName("value")[0].textContent
											|| dmedata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[1].getElementsByTagName("col")[1].getElementsByTagName("value")[0].text
											|| ""
						];

						var max_reimb		= [dmedata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[2].getElementsByTagName("col")[0].getElementsByTagName("value")[0].textContent																										   											|| dmedata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[2].getElementsByTagName("col")[0].getElementsByTagName("value")[0].text
											|| "",
											   dmedata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[2].getElementsByTagName("col")[1].getElementsByTagName("value")[0].textContent
											|| dmedata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[2].getElementsByTagName("col")[1].getElementsByTagName("value")[0].text
											|| ""
						];

						// Populate page elements.

						// Code Description
						$('#code_description').html(description);

						// Ceiling Value
						$('#ceiling_value .label').html(ceiling_value[0]);
						$('#ceiling_value .data').html('$'+parseFloat(ceiling_value[1]).toFixed(2));

						// Floor Value
						$('#floor_value .label').html(floor_value[0]);
						$('#floor_value .data').html('$'+parseFloat(floor_value[1]).toFixed(2));

						// Max Allowable
						$('#max_allowable .label').html(max_reimb[0]);
						$('#max_allowable .data').html('$'+parseFloat(max_reimb[1]).toFixed(2));
					} else {
						// FAIL.
						description = dmedata_xmlDoc.getElementsByTagName("value")[0].textContent
							 	   		|| dmedata_xmlDoc.getElementsByTagName("value")[0].text
								  	 	|| "Error.";

						$('#code_description').html(description);
					}

					break;
				}

				case 'get_empty_clia_data': {
					$.loadAnimation.end();

					// Serialized data.
					var cliadata = arr_ret[2];

					// Parse xml.
					if (window.DOMParser) {
						parser = new DOMParser();
						cliadata_xmlDoc = parser.parseFromString(cliadata,"text/xml");
					} else {
						// Internet Explorer
						cliadata_xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
						cliadata_xmlDoc.async = "false";
						cliadata_xmlDoc.loadXML(cliadata);
					}

					// Code Description
					var description = "";

					// Place results chard data points in an array for easy access [0=>label, 1=>data].

					// National Limitation
					var nat_limitation	= [cliadata_xmlDoc.getElementsByTagName("recordset")[0].getElementsByTagName("field")[1].childNodes[0].textContent
										|| cliadata_xmlDoc.getElementsByTagName("recordset")[0].getElementsByTagName("field")[1].childNodes[0].text
										|| "",
										   cliadata_xmlDoc.getElementsByTagName("recordset")[0].getElementsByTagName("field")[0].childNodes[0].textContent
										|| cliadata_xmlDoc.getElementsByTagName("recordset")[0].getElementsByTagName("field")[0].childNodes[0].text
										|| ""
					];

					// Median Value
					var median_value	= [cliadata_xmlDoc.getElementsByTagName("recordset")[0].getElementsByTagName("field")[1].childNodes[1].textContent
										|| cliadata_xmlDoc.getElementsByTagName("recordset")[0].getElementsByTagName("field")[1].childNodes[1].text
										|| "",
										   cliadata_xmlDoc.getElementsByTagName("recordset")[0].getElementsByTagName("field")[0].childNodes[1].textContent
										|| cliadata_xmlDoc.getElementsByTagName("recordset")[0].getElementsByTagName("field")[0].childNodes[1].text
										|| ""
					];

					// Floor Value
					var floor_value		= [cliadata_xmlDoc.getElementsByTagName("recordset")[0].getElementsByTagName("field")[1].childNodes[2].textContent
										|| cliadata_xmlDoc.getElementsByTagName("recordset")[0].getElementsByTagName("field")[1].childNodes[2].text
										|| "",
										   cliadata_xmlDoc.getElementsByTagName("recordset")[0].getElementsByTagName("field")[0].childNodes[2].textContent
										|| cliadata_xmlDoc.getElementsByTagName("recordset")[0].getElementsByTagName("field")[0].childNodes[2].text
										|| ""
					];

					// Current Fee
					var  current_fee 	= [cliadata_xmlDoc.getElementsByTagName("recordset")[1].getElementsByTagName("field")[1].childNodes[0].textContent
										|| cliadata_xmlDoc.getElementsByTagName("recordset")[1].getElementsByTagName("field")[1].childNodes[0].text
										|| "",
										   cliadata_xmlDoc.getElementsByTagName("recordset")[1].getElementsByTagName("field")[0].childNodes[0].textContent
										|| cliadata_xmlDoc.getElementsByTagName("recordset")[1].getElementsByTagName("field")[0].childNodes[0].text
										|| ""
					];

					// Maximum Reimbursement
					var max_reimb		= [cliadata_xmlDoc.getElementsByTagName("recordset")[1].getElementsByTagName("field")[1].childNodes[1].textContent
										|| cliadata_xmlDoc.getElementsByTagName("recordset")[1].getElementsByTagName("field")[1].childNodes[1].text
										|| "",
										   cliadata_xmlDoc.getElementsByTagName("recordset")[1].getElementsByTagName("field")[0].childNodes[1].textContent
										|| cliadata_xmlDoc.getElementsByTagName("recordset")[1].getElementsByTagName("field")[0].childNodes[1].text
										|| ""
					];

					// Populate the document.

					// National Limitation
					$('#national_limitation .label').html(nat_limitation[0]);
					$('#national_limitation .data').html(nat_limitation[1]);

					// Median Value
					$('#median_value .label').html(median_value[0]);
					$('#median_value .data').html(median_value[1]);

					// Floor Value
					$('#floor_value .label').html(floor_value[0]);
					$('#floor_value .data').html(floor_value[1]);

					// Current Fee
					$('#current_fee .label').html(current_fee[0]);
					$('#current_fee .data').html(current_fee[1]);

					// Maximum Reimbursement
					$('#max_reimbursement .label').html(max_reimb[0]);
					$('#max_reimbursement .data').html(max_reimb[1]);

					// Difference
					$('#difference .label').html('');
					$('#difference .data').html('');

					break;
				}

				case 'get_clia_data': {
					$.loadAnimation.end();

					var cliadata = arr_ret[2];

					// Parse xml.
					if (window.DOMParser) {
						parser = new DOMParser();
						cliadata_xmlDoc = parser.parseFromString(cliadata,"text/xml");
					} else {
						// Internet Explorer
						cliadata_xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
						cliadata_xmlDoc.async = "false";
						cliadata_xmlDoc.loadXML(cliadata);
					}

					if ((cliadata_xmlDoc.getElementsByTagName("type")[0].textContent == "success") || (cliadata_xmlDoc.getElementsByTagName("type")[0].text == "success")) {
						// Success.

						// Code Description
						var description = cliadata_xmlDoc.getElementsByTagName("grid")[0].getElementsByTagName("row")[0].getElementsByTagName("col")[0].getElementsByTagName("value")[0].textContent
										|| cliadata_xmlDoc.getElementsByTagName("grid")[0].getElementsByTagName("row")[0].getElementsByTagName("col")[0].getElementsByTagName("value")[0].text
										|| "";

						// Place results chart data points in array for easy access where [0=>label, 1=>data].

						// National Limitation
						var nat_limitation 	= [cliadata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[0].getElementsByTagName("col")[0].getElementsByTagName("value")[0].textContent
											|| cliadata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[0].getElementsByTagName("col")[0].getElementsByTagName("value")[0].text
											|| "",
											   cliadata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[0].getElementsByTagName("col")[1].getElementsByTagName("value")[0].textContent
											|| cliadata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[0].getElementsByTagName("col")[1].getElementsByTagName("value")[0].text
											|| ""
						];

						// Median Value
						var median_val		= [cliadata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[1].getElementsByTagName("col")[0].getElementsByTagName("value")[0].textContent
											|| cliadata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[1].getElementsByTagName("col")[0].getElementsByTagName("value")[0].text
											|| "",
											   cliadata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[1].getElementsByTagName("col")[1].getElementsByTagName("value")[0].textContent
											|| cliadata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[1].getElementsByTagName("col")[1].getElementsByTagName("value")[0].text
											|| ""
						];

						// Floor Value
						var floor_val		= [cliadata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[2].getElementsByTagName("col")[0].getElementsByTagName("value")[0].textContent
											|| cliadata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[2].getElementsByTagName("col")[0].getElementsByTagName("value")[0].text
											|| "",
											   cliadata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[2].getElementsByTagName("col")[1].getElementsByTagName("value")[0].textContent
											|| cliadata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[2].getElementsByTagName("col")[1].getElementsByTagName("value")[0].text
											|| ""
						];

						// Current Fee
						var cur_fee			= [cliadata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[3].getElementsByTagName("col")[0].getElementsByTagName("value")[0].textContent
											|| cliadata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[3].getElementsByTagName("col")[0].getElementsByTagName("value")[0].text
											|| "",
											   cliadata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[3].getElementsByTagName("col")[1].getElementsByTagName("value")[0].textContent
											|| cliadata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[3].getElementsByTagName("col")[1].getElementsByTagName("value")[0].text
											|| ""
						];

						// Maximum Reimbursement
						var max_reimb		= [cliadata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[4].getElementsByTagName("col")[0].getElementsByTagName("value")[0].textContent																										   											|| cliadata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[4].getElementsByTagName("col")[0].getElementsByTagName("value")[0].text
											|| "",
											   cliadata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[4].getElementsByTagName("col")[1].getElementsByTagName("value")[0].textContent
											|| cliadata_xmlDoc.getElementsByTagName("grid")[1].getElementsByTagName("row")[4].getElementsByTagName("col")[1].getElementsByTagName("value")[0].text
											|| ""
						];

						// Populate page elements.

						// Code Description
						$('#code_description').html(description);

						// National Limitation
						$('#national_limitation .label').html(nat_limitation[0]);
						$('#national_limitation .data').html(nat_limitation[1]);

						// Median Value
						$('#median_value .label').html(median_val[0]);
						$('#median_value .data').html(median_val[1]);

						// Floor Value
						$('#floor_value .label').html(floor_val[0]);
						$('#floor_value .data').html(floor_val[1]);

						// Current Fee
						$('#current_fee .label').html(cur_fee[0]);
						$('#current_fee .data').html(cur_fee[1]);

						// Max Reimbursement
						$('#max_reimbursement .label').html(max_reimb[0]);
						$('#max_reimbursement .data').html(max_reimb[1]);

						// Find the difference between current fee and maximum reimbursement.
						var fee		= parseFloat(cur_fee[1].replace(/[$,]+/g,""));
						var reimb	= parseFloat(max_reimb[1].replace(/[$,]+/g,""));

						if (fee == 0) {
							// Set difference label.
							$('#difference .label').html("N/A Until Practice Fee Is Entered");
							// Set difference data.
							$('#difference .data').html("n/a");
							$('#difference .data').css("color", "#ff0000");
						} else {
							var label = "";
							var diff = fee-reimb;

							// Set difference label.
							$('#difference .label').html('');

							// Set difference data.
							if (diff < 0) {
								$('#difference .data').html("$"+(diff*-1).toFixed(2));
								$('#difference .data').css("color", "#ff0000");
							} else {
								$('#difference .data').html("$"+diff.toFixed(2));
							}
						}
					} else {
						// FAIL.
						description =  cliadata_xmlDoc.getElementsByTagName("value")[0].textContent
									|| cliadata_xmlDoc.getElementsByTagName("value")[0].text
									|| "Error.";

						$('#code_description').html(description);
					}

					break;
				}

				case 'set_interlinks': {
					// Serialized data.
					var interlinkdata = arr_ret[2];

					// Parse xml.
					if (window.DOMParser) {
						parser = new DOMParser();
						interlink_xmlDoc = parser.parseFromString(interlinkdata,"text/xml");
					} else {
						// Internet Explorer
						interlink_xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
						interlink_xmlDoc.async = "false";
						interlink_xmlDoc.loadXML(interlinkdata);
					}

					var interlinks = interlink_xmlDoc.getElementsByTagName("grid")[0].getElementsByTagName("row");
					var names = [];

					for (var i=0; i<interlinks.length; i++) {
						// Row [0=>result, 1=>name, 2=>data]
						var row	= [interlinks[i].getElementsByTagName("col")[0].getElementsByTagName("value")[0].textContent
								|| interlinks[i].getElementsByTagName("col")[0].getElementsByTagName("value")[0].text,
								   interlinks[i].getElementsByTagName("col")[1].getElementsByTagName("value")[0].textContent
								|| interlinks[i].getElementsByTagName("col")[1].getElementsByTagName("value")[0].text,
								   interlinks[i].getElementsByTagName("col")[2].getElementsByTagName("value")[0].textContent
								|| interlinks[i].getElementsByTagName("col")[2].getElementsByTagName("value")[0].text
						];

						// Toggle the interlink status.
						toggleInterlink($('#'+row[1]+'>.productBarInput'), row[0]);

						// Set the data.
						$('#'+row[1]+'>.productBarInput').html(row[2]);

						if (row[1] == "icd9") {
							// Embed the ICD-9 CrossLink Lookup tool.
							$("#icd9crosslink .content").flashembed({
								src			: "/themes/rbplus/tools/ICD9CrossLinkLookupInline.swf",
								wmode		: "transparent"
							}, {
								CPTCODE		: $('#cptcode').val(),
								CPTCODEID	: $('#cptcodeid').val(),
								historyUrl	: ''
							});

							var call = "javascript:loadICD9CrossLink()";
							$('#icd9 .productBarInput a').attr('href', call);
						}

						// Log interlink name.
						// :::TODO: What's this used for now?
						names.push(row[1]);
					}

					// Set interlinks that are missing data to 'empty'.
					// :::TODO: Use 'off' instead?  Add text?
					// :::BUG: This doesn't work anymore, now that we're populating codes on an individual basis.
					/*
					$('.interlink').each(function() {
						if (jQuery.inArray($(this).attr('id'), names ) == -1) {
							toggleInterlink($(this).find('.productBarInput'), '-1');
						}
					});
					*/

					break;
				}

				case 'set_overlay_content':
				case 'get_overlay_content': {
					$('#syslink_content .content').html(arr_ret[2]);
					$('#syslink_content').overlay().load();

					break;
				}

				case 'set_calculator_help':
				case 'get_calculator_help': {
					// Parent dimensions delta (for loadAnimatiom shift).
					var parent_height = $('#calculator_help').parent().outerHeight();

					// Get the CLIA Calculator Help element.
					$('#calculator_help').html(arr_ret[2]);

					if ($.loadAnimation.getMask()) {
						// Shift the loading animation.
						$.loadAnimation.getMask().offset({top: $.loadAnimation.getMask().position().top + $('#calculator_help').parent().outerHeight() - parent_height});
					}

					// :::TODO: Adjust height too.
					// ...

					break;
				}

				case 'clia_help_step1':
				case 'clia_help_step2': {
					break;
				}

				case 'xhr_test': {
					outputText = arr_ret[2];
					break;
				}

                case 'getplus4': {
                    var plus4_results = document.getElementById('plus4-results');
                    if( plus4_results ) {
                        results = plus4_results;
                    }
                    //alert( "ret_from_getplus4" );
                    if( arr_ret[1] == 1 ) {
                        alert( arr_ret[2] );
                        jQuery("#plus4-results").empty();
                        jQuery("#plus4-results").html(arr_ret[2]);
                        var el_loader = document.getElementById('plus4-loader');
                        if( el_loader ) {
                            el_loader.style.display = 'none';
                        }
                        return;
                    }
                    var fourRequired = arr_ret[2];
                    var plusFours = arr_ret[3];
                    var arrFours = new Array();
                    if( plusFours != "" ) {
                        arrFours = plusFours.split(":");
                    }
                    var msg = "";
                    g_zip_required = 0;
                    if( fourRequired == 1 ) {
                        if( arrFours.length <= 1 ) {
                            msg = "Plus fours are required but none were found";
                        } else {
                            msg = "CMS requires Zip +4 for your zip code, <br/>please choose the appropriate +4 from the drop down list.";
                            g_zip_required = 1;
                        }
                    } else {
                        if( arrFours.length <= 1 ) {
                            msg = "Plus fours are NOT required and none were found";
                        } else {
                            msg = "Plus fours are NOT required but " + arrFours.length + " were found";
                        }

                    }
                    if( arrFours.length >= 1 ) {
                        var state = arrFours[0];
                        //alert( state );
                        var el_state = document.getElementById('state');
                        if( el_state ) {
                            el_state.value = state;
                        }
                        var el_state_display = document.getElementById('user-state-display');
                        if( el_state_display ) {
                            el_state_display.innerHTML = state;
                        }
                    }
                    var el_select = document.getElementById('selPlus4');
                    var el_input = document.getElementById('plus4');
                    var cur_plus4 = el_input.value;
                    if( el_select && arrFours.length > 1 ) {
                        el_select.options.length = 0;
                        var el = document.createElement('option');
                        el.value = "";
                        var el_text = document.createTextNode("Select One...");
                        el.appendChild( el_text );
                        el_select.appendChild( el );

                        if( fourRequired != 1 ) {
                            var el = document.createElement('option');
                            el.value = "";
                            var el_text = document.createTextNode("Not Required but select if you know");
                            el.appendChild( el_text );
                            el_select.appendChild( el );
                        }

                        for( var i = 1; i < arrFours.length; i++ ) {
                            var el = document.createElement('option');
                            if( jQuery.trim( arrFours[i] ) == jQuery.trim( cur_plus4 ) ) {
                                el.selected = 'selected';
                            }
                            el.value = jQuery.trim( arrFours[i] );
                            var el_text = document.createTextNode( jQuery.trim( arrFours[i] ));
                            el.appendChild( el_text );
                            el_select.appendChild( el );

                        }
                        el_input.style.display = "none";
                        el_select.style.display = "inline";
                    } else if( el_select ) {
                        el_select.style.display = "none";
                        el_input.style.display = "inline";
                    }
                    if( g_first_request != 1 ) {
                        el_select.selectedIndex = 0;
                        el_select.value = "";
                        el_input.value = "";

                    }
                    g_first_request = 0;
                    outputText += msg;
                    var el_loader = document.getElementById('plus4-loader');
                    if( el_loader ) {
                        el_loader.style.display = 'none';
                    }

                    break;
                }
                case 'grid_update': {
                    var el_frame = document.getElementById('grid_preview_frame');
                    el_frame.src = el_frame.src;
                    break;
                }
                case 'webservice': {
                    if( arr_ret[2] == 'grids_found' ) {
                        // we have a proper structure
                        var grid_count = arr_ret[3];
                        var grid_layout = arr_ret[4];
                        var arrGrids = arr_ret[5].split("~~");
                        var el_settings = "";
                        var i = 0;
                        for( i = 1; i <= 4; i++ ) {
                            el_settings = document.getElementById('assistant-add-grid-' + i );
                            el_settings.style.display = "none";
                        }
                        if( arrGrids.length > 0 ) {
                            var arrColumnLayout = Array();
                            for( i = 1; i <= arrGrids.length; i++ ) {
                                var arrValues = arrGrids[i-1].split("|");
                                if( arrValues.length != 10 ) {
                                    outputText += "Not enough Grid Values: " + arrValues.length + ". Contact Developer. ";
                                    break;
                                }
                                el_settings = document.getElementById('assistant-add-grid-' + i );
                                el_settings.style.display = "block";
                                for( var v = 0; v < arrValues.length; v++ ) {
                                    if( arrValues[v] == "-none-" ) {
                                        arrValues[v] = "";
                                    }
                                }
                                var column_count = arrValues[0];
                                var column_widths = arrValues[1];
                                var column_types = arrValues[2];
                                var grid_headers = arrValues[3];
                                var column_template = arrValues[4];
                                var grid_title = arrValues[5];
                                var columns_available = arrValues[6];
                                var layout_column = arrValues[7];
                                var grid_name = arrValues[8];
                                var column_align = arrValues[9];

                                var el_tmp = document.getElementById('grid_headers-' + i);
                                el_tmp.value = grid_headers;

                                el_tmp = document.getElementById('grid_column_template-' + i);
                                el_tmp.value = column_template;

                                el_tmp = document.getElementById('grid_column_widths-' + i);
                                el_tmp.value = column_widths;

                                el_tmp = document.getElementById('grid_column_align-' + i);
                                el_tmp.value = column_align;

                                el_tmp = document.getElementById('grid_title-' + i);
                                el_tmp.value = grid_title;

                                el_tmp = document.getElementById('grid_data_types-' + i);
                                el_tmp.value = column_types;

                                el_tmp = document.getElementById('grid_columns_available-' + i);
                                el_tmp.value = columns_available;
                                el_tmp = document.getElementById('grid_columns_available_text-' + i );
                                el_tmp.innerHTML = columns_available;

                                el_tmp = document.getElementById('grid-name-text-' + i);
                                el_tmp.innerHTML = grid_name;
                                el_tmp = document.getElementById('grid-name-' + i);
                                el_tmp.value = grid_name;

                                arrColumnLayout[i] = layout_column;

                            }
                            var el_tmp = document.getElementById('assist_grid_layout');
                            el_tmp.value = grid_layout;
                            var el_tmp = document.getElementById('assist_grid_layout_text');
                            el_tmp.innerHTML = grid_layout + " Column(s)";
                            arr_ret[2] = arrGrids.length + " grid(s) retrieved";
                            var el_grid_count = document.getElementById('grid_count');
                            el_grid_count.value = arrGrids.length;
                            loadColumnLayoutOptions( grid_layout, arrGrids.length, arrColumnLayout );
                        } else {
                            outputText += "No Grids Found in return. Contact Developers";
                        }
                    }
                    outputText += arr_ret[2];

                    break;
                }
                case 'site_group':
                {
                    arr_ret[2] = trimWhitespace( arr_ret[2] )
                    if( arr_ret[2] == 0 )
                    {
                        //submit login
                        var el_form = document.getElementById('loginform');
                        el_form.submit();
                    } else if( arr_ret[2] == 1 )
                    {
                        //user doesn't exist
                        alert("User could not be found");
                    } else {
                        //arr_ret[2] == 2
                        // wrong site
                        var group_name = trimWhitespace(arr_ret[3]);
                        var group_url = trimWhitespace(arr_ret[4]);
                        alert( "Our records indicate you belong to the " + group_name + " group\n and are forwarding you to their website" );
                        window.location = "http://" + group_url;
                    }

                    break;
                }
                case 'cmd_getlicensee':
                {
                    document.licenseeform.name.value = arr_ret[2];
					var arr_diseases = arr_ret[3].split(",");
					if( arr_diseases.length > 0 && arr_diseases[0] != 'none')
					{
						for( var i = 0; i < arr_diseases.length; i ++ )
						{
							var el = document.getElementById('disease_' + arr_diseases[i]);
							if( el )
							{
								el.checked = true;
							}
						}
					}
					break;
				}
				case 'set_email':
				{
					if( arr_ret[2] == 1 )
					{
						alert( 'Process Failed\n' + arr_ret[3] );
					} else {
						alert( 'Saved' );
					}
					break;
				}
				case 'send_email':
				{

					if( arr_ret[2] < 0 )
					{
						alert( 'Process Failed\n' + arr_ret[3] );
					} else {
						var el = document.getElementById('send_output');
						el.innerHTML = "Success: " + arr_ret[2] + " emails sent";
					}

					break;
				}
				case 'guest_login':
				{
					arr_ret[2] = trimWhitespace(arr_ret[2]);
					if( arr_ret[2] != "false" )
					{
						//document.guestlogin.action = document.getElementById('frm_action').value;
						document.guestlogin.submit();
					} else {
						var conf = confirm( "We can not find a guest account with that email address.\n        1.Click 'Ok' to signup for a guest account now.\n        2.Click 'Cancel' to input your email address again." );
						if( ! conf )
						{
							document.guestlogin.email.focus();
						} else {
							var el = document.getElementById('guest_login_container');
							el.style.display = "none";
							var el = document.getElementById('guest_registration_text');
							el.style.display = "block";

							el = document.getElementById('accountemail');
							el.value = document.guestlogin.email.value;
							document.guestform.accountfirstname.focus();
						}
						return false;

					}
					break;
				}
				case 'upload_init':
				{
					for( var i = 0; i < g_arrFileIDS.length; i++ )
					{
						if( g_arrFileIDS[i] != 'upload_canceled' )
						{
							var el = document.getElementById( g_arrFileIDS[i] + '_delete_button' );
							if( el.src.indexOf( 'btn-completed.gif' ) == -1 )
							{
								el.src = 'img/uploader/btn-scheduled.gif';
							}
						}
					}
					swf_upload_control.startUpload();
					break;
				}
				case 'new_lcd':
				{
					//deletes an import request before it has been started
					if( arr_ret[2] == 1 )
					{
						ifr = document.getElementById('scheduled_imports');
						 var now = new Date();
						ifr.src = ifr.src + "&time=" + now.getMinutes() + now.getSeconds();
					} else {
						alert( "Import Request Failed: " + action + "\n" + arr_ret[2] + " : " + arr_ret[3] );
					}
					break;
				}
				case 'delete_import':
				case 'save_import':
				{
					//deletes an import request before it has been started
					if( arr_ret[2] == 1 )
					{
						window.location.reload();
					} else {
						alert( "Import Request Failed: " + action + "\n" + arr_ret[2] + " : " + arr_ret[3] );
					}
					break;
				}
				case 'run_now':
				{
					var el = document.getElementById( arr_ret[2] + '_status' );
					var status = trimWhitespace( arr_ret[4] );
					el.innerHTML = status;
					g_nStatus = status;
					break;
				}
				case 'check_status':
				{
					var status = "";
					var el = document.getElementById( 'status_wrapper' );
					for( i = 0; i < arr_ret.length - 2; i++ )
					{
						status += trimWhitespace( arr_ret[3] ) + "<br />";
					}
					el.innerHTML = status;
					g_nStatus = status;
					g_nCheckingStatus = 0;
					break;
				}
                //case 'action':...
                default:
                {

                    g_error = true;
                    outputText += "Unrecognized Action: " + action;
                    if(g_quit_on_failure)
                    {
                        //make sure we enable the controls here
                        //since no further processing is done
                        enable_controls();
                        return false;
                    }else{
                        sendCommands("",true);
                        return true;
                    }
                    return false;

                }

            }
			if(  results )
			{
            	results.innerHTML = outputText + '</span>';
                results.style.display = 'block';

			}


            /**************************************************************/
            /* END: Edit in here to handle response from server           */
            /**************************************************************/

            //Recall function to send the next command
            //  sendCommands will evaluate whether it needs
            //  to create another request or exit
            sendCommands("",true);
            return true;
        }else{
            //status.innerHTML = gXMLhttp.status;
            //progress_bar.src = pic_progress_static.src;
        }



    }

}

/**
  * Code to disable any controls the user should not
  *  be able to use during the request
  */
function disable_controls()
{
    var el_loading = document.getElementById('xhr-loading-icon');
    var el_assist_link = document.getElementById('assistant-defaults');
    if( el_loading ) {
        el_loading.style.display = 'inline';
        if( el_assist_link ) {
            el_assist_link.style.display = 'none';
        }
    }
    /*var obj = document.getElementById('lstGroups');
    obj.disabled = true;

    obj = document.getElementById('img_delete_group');
    gDeleteImage = obj.src;
    obj.src = 'images/garbage_disabled.gif';
    obj = document.getElementById('lnk_delete_group');
    obj.disabled = true;*/

}

/**
  * Code to enable any controls disabled
  *  when the request was started
  */
function enable_controls()
{
    var el_loading = document.getElementById('xhr-loading-icon');
    var el_assist_link = document.getElementById('assistant-defaults');
    if( el_loading ) {
        el_loading.style.display = 'none';
        if( el_assist_link ) {
            el_assist_link.style.display = 'inline';
        }
    }
    /*var obj = document.getElementById('lstGroups');
    obj.disabled = false;

    obj = document.getElementById('img_delete_group');
    obj.src = gDeleteImage;
    obj = document.getElementById('lnk_delete_group');
    obj.disabled = false;*/


}


// Remove leading and trailing whitespace from a string
function trimWhitespace(string) {
   var newString  = '';
   var substring  = '';
   beginningFound = false;
    if( typeof( string ) == "undefined" ) { return ""; }
   // copy characters over to a new string
   // retain whitespace characters if they are between other characters
   for (var i = 0; i < string.length; i++) {

      // copy non-whitespace characters
      if (string.charAt(i) != ' ' && string.charAt(i) != '\n' && string.charAt(i) != '\r' && string.charCodeAt(i) != 9) {

         // if the temporary string contains some whitespace characters, copy them first
         if (substring != '') {
            newString += substring;
            substring = '';
         }
         newString += string.charAt(i);
         if (beginningFound == false) beginningFound = true;
      }

      // hold whitespace characters in a temporary string if they follow a non-whitespace character
      else if (beginningFound == true) substring += string.charAt(i);
   }
   return newString;
}
