// Copyright 2002, 2003 Macromedia, Inc. All rights reserved.

// *************** GLOBALS VARS *****************

var helpDoc = MM.HELP_ssAdvancedRecordset

var SP_Mode = false;  //Since we have different formatting behavior based on whether 
            //the object is a stored proc or not, we use this as a switch to 
            //keep track of what's the current selection.

//The following constants and vars are used to build up the SQL statement.
var CONST_SELECT  = "SELECT";
var CONST_FROM    = "FROM";
var CONST_WHERE   = "WHERE";
var CONST_EQUALS  = "=";
var CONST_ORDERBY = "ORDER BY";
var CONST_AND   = " AND";

var var_select = "*";
var var_from = "";
var var_where = "";
var var_orderby = "";

var gSimpleParamName = "MMColParam"

var ERROR_MESSAGE = "";

var CONN_LIST,PARAM_LIST,SQL_BOX,RS_NAME_BOX,MINUS_BUTTON,PLUS_BUTTON,TREE,
    SELECT_BUTTON,WHERE_BUTTON,ORDERBY_BUTTON;
    
    
// ******************* API **********************

function commandButtons()
{
  return new Array(MM.BTN_OK,     "clickedOK()", 
                   MM.BTN_Cancel, "clickedCancel()", 
                   MM.BTN_Test,   "PopUpTestDialog()", 
                   MM.BTN_Simple, "clickedSimple()", 
                   MM.BTN_Help,   "displayHelp()") 
}


function clickedOK()
{
  MM.RecordsetOK = true

  if (MM.RecordsetPriorRec)
  {
    var errMsg = CheckData(FINAL, MM.RecordsetPriorRec)
  }
  else
  {
    var errMsg = CheckData(FINAL, "")
  }

  if (errMsg != "")
  {
    MM.RecordsetOK = false
    alert(errMsg)
    return
  }

  MM.RecordsetObject = GetDataFromUI()

  RememberAdvancedRecordset()

  window.close()
}


function clickedCancel()
{
  window.close()
}


function PopUpTestDialog()
{

  var msg = CheckData(FOR_TEST, "")
  if (msg != "")
  {
    alert(msg)
    return
  }

  var theSQL = SQL_BOX.value
  
  var noRS = false
  if (theSQL.search(/^\s*insert\s+/i) > -1)
    noRS = true
  if (theSQL.search(/^\s*update\s+/i) > -1)
    noRS = true
  if (theSQL.search(/^\s*delete\s+/i) > -1)
    noRS = true

  if (noRS)
  {
    alert(MM.MSG_CannotTestInsertUpdateDelete)
    return
  }

  var pa = PARAM_LIST.getContents()
  var statement = SQL_BOX.value
  
  // remove SQL comments
  statement = statement.replace(/\/\*[\S\s]*?\*\//g, " ");
  
  statement = ReplaceParamsWithVals(statement, pa)

  // Special case for the handling of <cfif> tag.  
  // Our solution is to execute the statement up to but not including
  // the first cfif tag if one exists.
  if (dw.getDocumentDOM().serverModel.getServerLanguage() == "CFML")
  {
    statement = stripCFIF(statement)
  }

  MMDB.showResultset(CONN_LIST.getValue(), statement)
}


function clickedSimple()
{
  var showAlert = false

  MM.RecordsetObject = GetDataFromUI()
  
  var simpleObj = ParseSimpleSQL(MM.RecordsetObject.sql)
  
  if(simpleObj == false)
  {
    //alert("This SQL statement cannot be viewed in simple mode.")
    showAlert = true
  }
  else if (simpleObj.filterColumn)
  {
    if (MM.RecordsetObject.paramArray.length != 1)
    {
      //alert("There was a where clause and the number of params was not one")
      showAlert = true
    }
    else
    {
      if (MM.RecordsetObject.paramArray[0].name != gSimpleParamName)
      {
        //alert("Close to simple, but the param name is wrong.")
        showAlert = true
      }
      else
      {
        if (GetParamTypeAndName(MM.RecordsetObject.paramArray[0], Trim(RS_NAME_BOX.value)) == false)
        {
          //alert("Could not recognize the runtime parameter code.")
          showAlert = true
        }
      }
    }
  }
  else
  {
    if (MM.RecordsetObject.paramArray.length != 0)
    {
      //alert("There were parameters and there is no where clause.")
      showAlert = true
    }
  }
  
  if (showAlert)
  {
    alert(dwscripts.sprintf(MM.MSG_SQLNotSimple, dwscripts.getRecordsetDisplayName()));
    return
  }


  MM.IsSimpleRecordset = true
  MM.RecordsetSwitchingUI = true
  MM.RecordsetDone = false //we are switching ui's
  window.close()
}


// ***************** LOCAL FUNCTIONS  ******************

function initializeUI()
{
  /*
  This function is called in the onLoad event.  It is responsible
  for initializing the UI.  If we are inserting a recordset, this
  is a matter of populating the connection drop down.

  If we are modifying a recordset, this is a matter of inspecting
  the recordset tag and setting all the form elements.
  */

  //Create global vars for all controls
  CONN_LIST = new ListControl("ConnectionList")
  PARAM_LIST = new GridControl("ParamList")
  SQL_BOX = findObject("theSQL")

  RS_NAME_BOX = findObject("RecordsetName")
  MINUS_BUTTON = findObject("minusButton")
  PLUS_BUTTON = findObject("plusButton")

  TREE = new DBTreeControl("DBTree")

  PopulateConnectionList()
  RS_NAME_BOX.value = CreateNewName()
  SELECT_BUTTON = findObject("SelectButton")
  WHERE_BUTTON = findObject("WhereButton")
  ORDERBY_BUTTON = findObject("OrderByButton")


  if (MM.RecordsetSwitchingUI || MM.RecordsetPriorRec)
  {
    inspectUI()
  }

  if (ERROR_MESSAGE) alert(ERROR_MESSAGE);
  
  elts = document.forms[0].elements;
  if (elts && elts.length)
  {
    elts[0].focus();
    elts[0].select();
  }
}



function RememberAdvancedRecordset()
{

  var path = dreamweaver.getConfigurationPath() + '/ServerBehaviors/Shared/RSSeverModelSwitches.js';
  var metaFile;

  metaFile = MMNotes.open(path, true); // Force create the note file.
  if (metaFile) {
    MMNotes.set(metaFile, 'PREF_rsType', 'ADVANCED');
    MMNotes.close(metaFile);
  }

}


function GetDataFromUI()
{

  var uiData = new Object()

  uiData.name = Trim(RS_NAME_BOX.value)
  uiData.connectionName = CONN_LIST.getValue()
  uiData.paramArray = GetParametersFromUI()
  uiData.sql = SQL_BOX.value
  uiData.isSimple = false
    
  return uiData
}


function inspectUI() 
{
  var ro = MM.RecordsetObject

  //We want to check if this is an exec statement or not. If it's an exec,
  //update, delete, or insert statement,
  //we leave it alone and don't do our fancy formatting.

  var sqlstr = ro.sql
  if  (
    (sqlstr.search(/exec\s*/i) > -1) || 
    (sqlstr.search(/call\s*/i) > -1) ||
    (sqlstr.search(/^\s*update\s+/i) > -1) ||
    (sqlstr.search(/^\s*insert\s+/i) > -1) ||
    (sqlstr.search(/^\s*delete\s+/i) > -1) 
    )
  {
    //Update the SQL_Box
    SQL_BOX.value = ro.sql
    //Set SP_Mode to true
    SP_Mode = true;
  } 
  else
  {
    //Set SP_Mode to false
    SP_Mode = false;

    //Kick in fancy formatting
    if (Trim(ro.sql) == "")
    {
      //do nothing since they may be switching from Simple and we don't
      //want to put the "Select * from" in the SQL box.
    }
    else if( parseSQLString(ro.sql))
    {
      //the parser was able to successfully identify string
        updateSQL_Box();
    }
    else
    {
      //parser failed, so no fancy formatting...
      SQL_BOX.value = ro.sql
    }

  }
  
  RS_NAME_BOX.value = ro.name

  if (!CONN_LIST.pickValue(ro.connectionName))
  {
      CONN_LIST.setIndex(0)
  }
  
  TREE.setConnection(ro.connectionName)

  var delim = ","
  if (ro.paramArray)
  {
    var fillArray = new Array()
    for (i = 0;i < ro.paramArray.length; i++)
      {
      fillArray[i] = new Array()
      thisParam = ro.paramArray[i]
      fillArray[i][0] = thisParam.name
      fillArray[i][1] = thisParam.defaultVal
      fillArray[i][2] = thisParam.runtimeVal
    }

    PARAM_LIST.setContents(fillArray)
    PARAM_LIST.setIndex(0)
  }
}


function CheckData(reason, priorName)
{
  /*
  This function checks all of the input variables to see
  if the user has filled out everything okay...if not
  return an error string.  If so, return empty string
  */

  
  var strOut = ""

  if (reason == FINAL)
  {
    // we don't get here if we are just testing the SQL statement
    var theName = Trim(RS_NAME_BOX.value)
    if (theName == "")
    {
      strOut += MM.MSG_NoRecordsetName;
      return strOut
    }

    if (!IsValidVarName(theName))
    {
      strOut = MM.MSG_InvalidRecordsetName
      return strOut
    }

    if (IsDupeObjectName(theName, priorName))
    {
      return MM.MSG_DupeRecordsetName;
    }

    if (IsReservedWord(theName))
    {
      return dwscripts.sprintf(MM.MSG_ReservedWord, theName);
    }
        
  }

  if (CONN_LIST.getIndex() == 0)
  {
    strOut += MM.MSG_NoConnection;
    return strOut
  }
  
  var theSQL =  SQL_BOX.value

  if (StripChars(" \r\n\t", theSQL) == "")
  {
    strOut += MM.MSG_NoRecordsetSQLStatement;
    return strOut
  }

  switch(dw.getDocumentDOM().serverModel.getServerLanguage())
  {
    case "JavaScript":
    case "VBScript":
    case "Java":

      // we only accept Select statements
      // and calls to sp's
      var validSQL = false
      var callRE = /\s*call\b/i
      if (theSQL.search(callRE) > -1)
        validSQL = true
      var spRE = /^\s*exec\b/i
      if (theSQL.search(spRE) > -1)
        validSQL = true
      var spRE = /^\s*execute\b/i
      if (theSQL.search(spRE) > -1)
        validSQL = true
      var selectRE = /^\s*select\b/i
      if (theSQL.search(selectRE) > -1)
        validSQL = true
      if (!validSQL)
      {
        strOut = MM.MSG_NoRecordsetSQLStatement;
        return strOut
      }

      break

    case "CFML":

      // we only accept Select statements, calls to sp's, and insert/update/delete statements
      var validSQL = false
      var callRE = /\s*call\b/i
      if (theSQL.search(callRE) > -1)
        validSQL = true
      var spRE = /^\s*exec\b/i
      if (theSQL.search(spRE) > -1)
        validSQL = true
      var spRE = /^\s*execute\b/i
      if (theSQL.search(spRE) > -1)
        validSQL = true
      var selectRE = /^\s*select\b/i
      if (theSQL.search(selectRE) > -1)
        validSQL = true
      if (theSQL.search(/\s*insert\s+/i) > -1)
        validSQL = true
      if (theSQL.search(/\s*update\s+/i) > -1)
        validSQL = true
      if (theSQL.search(/\s*delete\s+/i) > -1)
        validSQL = true

      if (!validSQL)
      {
        strOut = MM.MSG_NoRecordsetSQLStatement;
        return strOut
      }
  }
  
  var pa = PARAM_LIST.getContents()
  //alert("the num of params is: " + pa.length)
  if (pa.length > 0)
  {
      strOut = CheckSQLParams(pa, theSQL, reason)
  }
  return strOut
}


function CheckSQLParams(pa, theSQL, reason)
{
  var strOut = ""

  for (var i = 0; i < pa.length; i++)
  {
    var anOption = pa[i]

    var theName = Trim(anOption[0])
    if (theName == "")
    {
      strOut =  strOut = MM.LABEL_ParamRow + (i + 1) + "\n\n" + MM.MSG_MissingParamName
      return strOut
    }
    if (!IsValidVarName(theName))
    {
      strOut = MM.LABEL_ParamRow + (i + 1) + "\n\n" + theName + "\n\n" + MM.MSG_InvalidParamName
      return strOut
    }
    else
    {
      var re = new RegExp("\\b" + theName + "\\b");
      if (theSQL.search(re) == -1)
      {
        strOut = MM.LABEL_ParamRow + (i + 1) + "\n\n" + theName + "\n\n" + MM.MSG_InvalidParamNameNotInSQL
        return strOut
      }
    }


    var theDefaultVal = Trim(anOption[1])
    if (theDefaultVal == "")
    {
      strOut = MM.LABEL_ParamRow + (i + 1) + "\n\n" + MM.MSG_DefaultValMissing + theName
      return strOut
    }


    if (reason == FINAL)
    {
      var theRunTimeVal = Trim(anOption[2])
      if (theRunTimeVal == "")
      {
        strOut = MM.LABEL_ParamRow + (i + 1) + "\n\n" + MM.MSG_RunTimeValMissing + theName
        return strOut
      }

      if (dw.getDocumentDOM().serverModel.getServerLanguage() == "CFML")
      {
        if (theRunTimeVal.search(/^#\S+#$/i) == -1)
        {
          return MM.LABEL_ParamRow + (i + 1) + "\n\n" + MM.MSG_RunTimeValNotCFFormat
        }
      }

    } 
  }

  return ""
}


function GetParametersFromUI()
{
  var gridContents = PARAM_LIST.getContents()
  var paramArray = new Array()

  for (var i = 0; i < gridContents.length; i++)
  {
    var newParam = new Object()
    var oldParam = gridContents[i]
    newParam.name = oldParam[0]
    newParam.defaultVal = oldParam[1]
    newParam.runtimeVal = oldParam[2]
    paramArray.push(newParam)
  }

  return paramArray
}


function DeleteParam()
{
  /*
  This function is called when the user
  clicks on the minus button above the params list box.
  If there is not a selected index in the list, we do
  nothing. 
  */

  PARAM_LIST.del()
  //UpdateMinusButton()
}

function AddParam()
{
    if (dw.isOSX())
  {
    // work around a problem in OSX where the first editable
    // region does not get focus.  Add a defaut name
    // so the user can see that something happened
    PARAM_LIST.object.options.push(new Option(MM.LABEL_Unnamed))
  }
  else
  {
    PARAM_LIST.object.options.push(new Option(""))
  }

  //PARAM_LIST.append()
  //UpdateMinusButton()
}


function UpdateMinusButton()
{
  if (PARAM_LIST.getIndex() >= 0)
  {
    MINUS_BUTTON.src = "../../Shared/UltraDev/Images/MinusButtonEnabled.gif"
  }
  else
  {
    MINUS_BUTTON.src = "../../Shared/UltraDev/Images/MinusButtonDisabled.gif"
  }
}



function stripCFIF(sql)
{
  var statement = sql.replace(/\n/g, " ")
  statement = statement.replace(/\r/g, " ")
  var found = statement.search(/^(.*)\s*<cfif/i)
  if (found != -1)
  {
    statement = RegExp.$1
  }
  return statement
}

function ConnectionChanged()
{
  TREE.setConnection(CONN_LIST.getValue())
}

  
function updateSQLWithStoredProcedure()
{
  //This method builds the SQL statment when a stored procedure is
  //selected in the tree.

  var treeData = TREE.getData()

  //If it's not a stored procedure, don't do anything.
  if (!treeData.IsProcedure())
  {
    return
  }

  var curText = SQL_BOX.value

  var returnValue = ""
  var outParams = ""

  var procName = treeData.procedure 
  var paramArray = treeData.paramArray
  var paramBoxContents = new Array()

  //Build the Param array
  for (var i = 0; i < paramArray.length; i++)
  {
    //Remove all '@' chars from the param name.
    var paramName = StripChars("@", paramArray[i].name)
    var stype = dwscripts.getDBColumnTypeAsString(paramArray[i].type)
    bString = dwscripts.isStringDBColumnType(paramArray[i].type);
    bBinary = dwscripts.isBinaryDBColumnType(paramArray[i].type);
  
    if (paramName != "RETURN_VALUE")
    {
      if (outParams != "")
        outParams += ","

      if (bString)
        outParams = outParams + "'" + paramName + "'"
      else
      {
        if ((stype == "REF CURSOR")||(bBinary))
        {
          outParams += "?";
        }
        else
        {
          outParams += paramName;
        }
      }

      if (stype != "REF CURSOR" && !bBinary)
      {
        // We don't want to list the param if it is REF CURSOR or binary
        var aParam = new Array()
        aParam[0] = paramName
        aParam[1] = ""
        aParam[2] = ""
        paramBoxContents.push(aParam)
      }
    }
  }

  PARAM_LIST.delAll();

  if (outParams == ""){
    SQL_BOX.value = "{call " + procName +"}"
    outParams = ""
  }
  else{
    SQL_BOX.value = "{call " + procName + "(" + outParams + ")}"
    PARAM_LIST.setContents(paramBoxContents)
  }
}


//This method is called after the SQL has been 'parsed'. This updates
//the SQL box with formatted SQL statment.
function updateSQL_Box()
{
  var sqlstr = "";
  
  if (StripChars(" \r\n\t", var_select) == "")
  {
    var_select = "*";
  }
  sqlstr = CONST_SELECT + " " + var_select + "\n" + CONST_FROM;
  if (var_from != "")
  {
    sqlstr += " ";
    sqlstr += var_from;
  }
  if( var_where != "")
  {
    //sqlstr += " ";
    sqlstr += "\n";
    sqlstr += CONST_WHERE;
    sqlstr += " ";  
    sqlstr += var_where;
  }
  if( var_orderby != "")
  {
    //sqlstr += " ";
    sqlstr += "\n";
    sqlstr += CONST_ORDERBY;
    sqlstr += " ";
    sqlstr += var_orderby;
  }

  if (sqlstr != "")
  {
    SQL_BOX.value = sqlstr;
  }
}

//Update the global vars from the RegularExpression result.
function updateSQLVars(index)
{
  switch(index)
  {
  case 1: 
    var_select = Trim(StripChars("\r\n\t", RegExp.$3));
    var_from = Trim(StripChars("\r\n\t", RegExp.$5));
    var_where = Trim(StripChars("\r\n\t", RegExp.$7));
    var_orderby = Trim(StripChars("\r\n\t", RegExp.$9));
    break;
  case 2:
    var_select = Trim(StripChars("\r\n\t", RegExp.$3));
    var_from = Trim(StripChars("\r\n\t", RegExp.$5));
    var_where = "";
    var_orderby = Trim(StripChars("\r\n\t", RegExp.$7));
    break;
  case 3:
    var_select = Trim(StripChars("\r\n\t", RegExp.$3));
    var_from = "";
    var_where = Trim(StripChars("\r\n\t", RegExp.$5));
    var_orderby = Trim(StripChars("\r\n\t", RegExp.$7));
    break;
  case 4:
    var_select = Trim(StripChars("\r\n\t", RegExp.$3));
    var_from = "";
    var_where = "";
    var_orderby = Trim(StripChars("\r\n\t", RegExp.$5));
    break;
  case 5:
    var_select = Trim(StripChars("\r\n\t", RegExp.$1));
    var_from = Trim(StripChars("\r\n\t", RegExp.$3));
    var_where = Trim(StripChars("\r\n\t", RegExp.$5));
    var_orderby = Trim(StripChars("\r\n\t", RegExp.$7));
    break;
  case 6:
    var_select = Trim(StripChars("\r\n\t", RegExp.$1));
    var_from = "";
    var_where = Trim(StripChars("\r\n\t", RegExp.$3));
    var_orderby = Trim(StripChars("\r\n\t", RegExp.$7));
    break;
  case 7:
    var_select = Trim(StripChars("\r\n\t", RegExp.$1));
    var_from = "";
    var_where = "";
    var_orderby = Trim(StripChars("\r\n\t", RegExp.$3));
    break;


  }
}

//Parse the sql statement in the SQL Box.
function parseSQLString(SQLString)
{
  
  var updateStyle = 1
  var standardUpdate = true;

  //Check if it's in "StoredProc" mode. If it is don't do anything.
  
  if(!SP_Mode)
  {

  SQLString = SQLString.replace(/\n/g,"");

  SQLString = SQLString.replace(/\r/g," ");

  
  //Why do we need this exec check? If the user has a stored proc in the sql 
  //edit, and then clicks on a table/view column, it would mean that he/she 
  //wants to change the sql from a stored proc to a select statement. 
  //So we first check to see the exec string is found in the sql. If it is, 
  //we just set it to empty, as the updateSQLBox function will take care of it. 
  //2-15-00 Made a slight modification to the reg exp params below. I removed the
  //\b before the exec/ call statements. This is because the { does not count as
  //as word boundry.

  var re_1 = /(exec)\b/g;
  var re_2 = /(call)\b/g;
  if((SQLString.search(re_1) != -1) || (SQLString.search(re_2) != -1))
  {
    SQLString = "";
    PARAM_LIST.delAll();
    return true
  }

  //type = 1
  var re1 = /(\s*|.*)(\bselect\b)(\s*|.*)(\bfrom\b)(\s*|.*)(\bwhere\b)(\s*|.*)(order by)(\s*|.*)$/i;
  var re2 = /(\s*|.*)(\bselect\b)(\s*|.*)(\bfrom\b)(\s*|.*)(\bwhere\b)(\s*|.*)(order by)\s*$/i;
  var re3 = /(\s*|.*)(\bselect\b)(\s*|.*)(\bfrom\b)(\s*|.*)(\bwhere\b)(\s*|.*)$/i;
  var re4 = /(\s*|.*)(\bselect\b)(\s*|.*)(\bfrom\b)(\s*|.*)(\bwhere\b)\s*$/i;
  //type = 2
  var re5 = /(\s*|.*)(\bselect\b)(\s*|.*)(\bfrom\b)(\s*|.*)(\border\sby\b)(\s*|.*)$/i;
  var re6 = /(\s*|.*)(\bselect\b)(\s*|.*)(\bfrom\b)(\s*|.*)(\border\sby\b)\s*$/i;
  var re7 = /(\s*|.*)(\bselect\b)(\s*|.*)(\bfrom\b)(\s*|.*)$/i;
  var re8 = /(\s*|.*)(\bselect\b)(\s*|.*)(\bfrom\b)\s*$/i;
  //type = 3
  var re9 = /(\s*|.*)(\bselect\b)(\s*|.*)(\bwhere\b)(\s*|.*)(\border by\b)(\s*|.*)$/i;
  var re10= /(\s*|.*)(\bselect\b)(\s*|.*)(\bwhere\b)(\s*|.*)(\border by\b)\s*$/i;
  var re11= /(\s*|.*)(\bselect\b)(\s*|.*)(\bwhere\b)(\s*|.*)$/i;
  var re12= /(\s*|.*)(\bselect\b)(\s*|.*)(\bwhere\b)\s*$/i;
  //type = 4
  var re13= /(\s*|.*)(\bselect\b)(\s*|.*)(\border by\b)(\s*|.*)$/i;
  var re14= /(\s*|.*)(\bselect\b)(\s*|.*)(\border by\b)\s*$/i;
  var re15= /(\s*|.*)(\bselect\b)(\s*|.*)$/i;
  var re16= /(\s*|.*)(\bselect\b)\s*$/i;
  //type = 5
  var re17= /(\s*|.*)(\bfrom\b)(\s*|.*)(\bwhere\b)(\s*|.*)(\border by\b)(\s*|.*)$/i;
  var re18= /(\s*|.*)(\bfrom\b)(\s*|.*)(\bwhere\b)(\s*|.*)(\border by\b)\s*$/i;
  var re19= /(\s*|.*)(\bfrom\b)(\s*|.*)(\bwhere\b)(\s*|.*)$/i;
  var re20= /(\s*|.*)(\bfrom\b)(\s*|.*)(\bwhere\b)\s*$/i;
  var re21= /(\s*|.*)(\bfrom\b)(\s*|.*)$/i;
  var re22= /(\s*|.*)(\bfrom\b)\s*$/i;
  //type = 6
  var re23= /(\s*|.*)(\bwhere\b)(\s*|.*)(\border by\b)(\s*|.*)$/i;
  var re24= /(\s*|.*)(\bwhere\b)(\s*|.*)(\border by\b)\s*$/i;
  var re25= /(\s*|.*)(\bwhere\b)(\s*|.*)$/i;
  var re26= /(\s*|.*)(\bwhere\b)\s*$/i;
  //type = 7
  var re27= /(\s*|.*)(\border by\b)(\s*|.*)$/i;
  var re28= /(\s*|.*)(\border by\b)\s*$/i;

  var re_empty = /\s?/i;

  if(StripChars(" \r\n\t", SQLString) == "")
  {
    SQLString.search(re_empty);
    updateSQLVars(1)
    return true
  }

  if((SQLString.search(re1) != -1) || (SQLString.search(re2) != -1) || (SQLString.search(re3) != -1) || (SQLString.search(re4) != -1))
  {
    updateSQLVars(1)
    return true
  }

  if((SQLString.search(re5) != -1) || (SQLString.search(re6) != -1) || (SQLString.search(re7) != -1) || (SQLString.search(re8) != -1))
  {
    updateSQLVars(2)
    return true
  }

  if((SQLString.search(re9) != -1) || (SQLString.search(re10) != -1) || (SQLString.search(re11) != -1) || (SQLString.search(re12) != -1))
  {
    updateSQLVars(3)
    return true
  }

  if((SQLString.search(re13) != -1) || (SQLString.search(re14) != -1) || (SQLString.search(re15) != -1) || (SQLString.search(re16) != -1))
  {
    updateSQLVars(4)
    return true
  }

  if((SQLString.search(re17) != -1) || (SQLString.search(re18) != -1) || (SQLString.search(re19) != -1) || (SQLString.search(re20) != -1) || (SQLString.search(re21) != -1) || (SQLString.search(re22) != -1))
  {
    updateSQLVars(5)
    return true
  }

  if((SQLString.search(re23) != -1) || (SQLString.search(re24) != -1) || (SQLString.search(re25) != -1) || (SQLString.search(re26) != -1))
  {
    updateSQLVars(6)
    return true
  }

  if((SQLString.search(re27) != -1) || (SQLString.search(re28) != -1))
  {
    updateSQLVars(7)
    return true
  }
  
  return false

 }
 return true;
}


function IsSelectStatement()
{
  if (Trim(SQL_BOX.value) == "")
  {
    return true
  }

  var sql = String(SQL_BOX.value)
  return (sql.search(/^\s*select\s+/i) != -1)
}


//On Click handler for the Add to Select button
function AddToSelect()
{
  if (!SP_Mode && !IsSelectStatement())
  {
    alert(MM.MSG_CanOnlyUseButtonsOnSelectStatements)
    return
  }

  var selectstr = "";
  var tablename = "";

  var curText = SQL_BOX.value
  var treeData = TREE.getData();

  var matchLoc;
  var result;
  var exactMatch = 0;

  if(!IsConnectionSelected())
  {
   return;
  }

  //Proceed if selection is not a stored procedure
  if (!treeData.IsProcedure())  
  {
    //Check if selection is a column.
  if(treeData.IsColumn())
  { 
    SP_Mode = false;
    if (parseSQLString(curText))
      {
      if( (StripChars(" \r\n\t", var_select) == "*") || (StripChars(" \r\n\t", var_select) == ""))
      {
        var_select = treeData.column;
      } else {
        theStr = treeData.column;
        escStr = quoteMeta(theStr);
        var re = new RegExp(escStr, "gi");
        exactMatch = 0; 
        while((result = re.exec(var_select)) != null) {
          matchLoc = result.index;
          if (( matchLoc == 0 || var_select[matchLoc-1] == ' ' || var_select[matchLoc-1] == ',' ) && ( var_select[matchLoc + theStr.length] == ',' || var_select[matchLoc + theStr.length] == null ))
          {
            exactMatch = 1;
          }
        }
      
        if(exactMatch == 0)
        {
          var tempStr = Trim(var_select)
          if(tempStr.lastIndexOf(",") == (tempStr.length -1))
          {
            selectstr = Trim(var_select)  
            selectstr += " " + treeData.column
            var_select = selectstr;
          } else {
          selectstr = Trim(var_select) + ", ";
          selectstr += treeData.column
          var_select = selectstr;
          }
        } else {
          alert(errMsg(MM.MSG_DupeColumnWarning, treeData.column));
          var tempStr = Trim(var_select)
          if(tempStr.lastIndexOf(",") == (tempStr.length -1))
          {
            selectstr = Trim(var_select)  
            selectstr += " " + treeData.table + "." + treeData.column
            var_select = selectstr;
          } else {
            selectstr = Trim(var_select) + ", ";
            selectstr += treeData.table + "." + treeData.column
            var_select = selectstr;
          }
        }
      }

      tablename = treeData.table;
      if (StripChars(" \r\n\t", var_from) == "")
      {
        var_from = tablename;
      } else {
        theStr = treeData.table;
        escStr = quoteMeta(theStr);
        var re = new RegExp(escStr, "gi");
        exactMatch = 0; 
        while((result = re.exec(var_from)) != null) {
          matchLoc = result.index;
          if (( matchLoc == 0 || var_from[matchLoc-1] == ' ' || var_from[matchLoc-1] == ',') && ( var_from[matchLoc + theStr.length] == ',' || var_from[matchLoc + theStr.length] == null ))
          {
            exactMatch = 1;
          }
        }
      
        if (exactMatch == 0)
        {
          //var_from += ", " + tablename;
          var tempStr = Trim(var_from)
          if(tempStr.lastIndexOf(",") == (tempStr.length -1))
          {
            tablename = Trim(var_from)  
            tablename += " " + treeData.table
            var_from = tablename;
          } else {
            tablename = Trim(var_from) + ", ";
            tablename += treeData.table
            var_from = tablename;
          }
        }

      }
      updateSQL_Box();
    } else
    {
      alert(MM.MSG_InvalidSQL);
    }
  } else {
    if((treeData.IsTable()) && (treeData.table != "undefined"))
    {
      //A table is selected.
      SP_Mode = false;
      if(parseSQLString(curText))
      {
        var tablename = treeData.table;
        if(StripChars(" \r\n\t", var_from)  == "")
        {
          var_from = tablename;
          updateSQL_Box();
        } else {
          theStr = treeData.table;
          escStr = quoteMeta(theStr);
          var re = new RegExp(escStr, "gi");
          exactMatch = 0; 
          while((result = re.exec(var_from)) != null) {
            matchLoc = result.index;
            if (( matchLoc == 0 || var_from[matchLoc-1] == ' ' || var_from[matchLoc-1] == ',') && ( var_from[matchLoc + theStr.length] == ',' || var_from[matchLoc + theStr.length] == null ))
            {
              exactMatch = 1;
            }
          }
        
          if(exactMatch == 0)
          {
            var tempStr = Trim(var_from)
            if(tempStr.lastIndexOf(",") == (tempStr.length -1))
            {
              tablename = Trim(var_from)  
              tablename += " " + treeData.table
              var_from = tablename;
            } else {
              tablename = Trim(var_from) + ", ";
              tablename += treeData.table
              var_from = tablename;
            }
            updateSQL_Box();
          }
        }
      } else
      {
        alert(MM.MSG_InvalidSQL);
      }
    } else {
      alert(MM.MSG_InvalidSelection);
    }
  }
  } else {
    //it's a stored procedure. Update accordingly.
    SP_Mode = true;
  updateSQLWithStoredProcedure();
  }

}

//onclick event handler for the "Add to where" button associated with the tree.
function ColumnAddToWhere()
{

  if (!IsSelectStatement())
  {
    alert(MM.MSG_CanOnlyUseButtonsOnSelectStatements)
    return
  }

  if(!IsConnectionSelected())
  {
  return;
  }

  var selectstr = "";
  var curText = SQL_BOX.value
  var treeData = TREE.getData();

  //Check if the selection is not a stored procedure
  if (!treeData.IsProcedure())  
  {
  //Proceed only if selection is a column
  if(treeData.IsColumn())
  {
    SP_Mode = false;
    if(parseSQLString(curText))
    {
      if(Trim(var_from) == "")
      {
        var_from = treeData.table;
      }

      if(Trim(var_where) == "")
      {
        var_where = treeData.column;
        updateSQL_Box();
      } else {
          //Do a check here to see if " AND" is not the last word.
        var trimWhereStr = Trim(var_where);
        if(addAndIsOkay(trimWhereStr))
          selectstr = Trim(var_where) + " AND ";
        else 
          selectstr = Trim(var_where) + " ";

        selectstr += treeData.column;
        var_where = selectstr;
        updateSQL_Box();
      }
    } 
  } else {
    alert(MM.MSG_SelectColumn);
  }
  } else {
    SP_Mode = true;
  updateSQLWithStoredProcedure();
  }
}


//onclick event handler for the "Add to where" button associated with the param grid.
function VarAddToWhere()
{
  if (!IsSelectStatement())
  {
    alert(MM.MSG_CanOnlyUseButtonsOnSelectStatements)
    return
  }

  if(!IsConnectionSelected())
  {
  return;
  }

  var paramlist = PARAM_LIST.getContents();
  if(paramlist.length == 0)
  {
  alert(MM.MSG_EmptyParamList);
  return;
  }


  if(!SP_Mode)
  {
    var selectstr = "";
    var selItem = PARAM_LIST.getIndex();
    var curText = SQL_BOX.value

    //Proceed only if a row in the grid is selected. 
  if(selItem != -1)
  {
    if(parseSQLString(curText) > -1)
    {
      var pa = PARAM_LIST.getContents();

      if (pa.length > 0)
      {
        var paramName = pa[selItem][0];
        var_where = Trim(var_where) + " = " + paramName;
        updateSQL_Box();
      }
    } else {
      alert(MM.MSG_InvalidSQL);
    }
  }
  } 
}


//adds the name of the selected param to the SQL statement.
function VarAddToEnd()
{
  if (!IsSelectStatement())
  {
    alert(MM.MSG_CanOnlyUseButtonsOnSelectStatements)
    return
  }

  if(!IsConnectionSelected())
  {
    return;
  }

  var paramlist = PARAM_LIST.getContents();
  if(paramlist.length == 0)
  {
  alert(MM.MSG_EmptyParamList);
  return;
  }


  //Check that the code in the SQL box is not an exec statement.  
  if (!SP_Mode)
  {
  var selItem = PARAM_LIST.getIndex();
  var curText = SQL_BOX.value
  
  if(selItem != -1)
  {
    var pa = PARAM_LIST.getContents();
    if (pa.length > 0)
    {
      var paramName = pa[selItem][0];
      curText = curText + " " + paramName;
      SQL_BOX.value = curText;
    }
  }
  }
}


//onclick event handler for the Add to Order by button.
function AddToOrderBy()
{
  if (!IsSelectStatement())
  {
    alert(MM.MSG_CanOnlyUseButtonsOnSelectStatements)
    return
  }

  if(!IsConnectionSelected())
  {
    return;
  }

  var selectstr = "";
  var curText = SQL_BOX.value
  var treeData = TREE.getData();
  
  //Proceed only if not a Stored procedure.
  if (!treeData.IsProcedure())  
  {
    //Check if selection is a column 
  if(treeData.IsColumn())
  {
    SP_Mode = false;
    if(parseSQLString(curText))
    {
      if(Trim(var_from) == "")
      {
        var_from = treeData.table;
      }
      if(Trim(var_orderby) == "")
      {
        var_orderby = treeData.column;
        updateSQL_Box();
      } else {
        var re = new RegExp("\\b" + treeData.column + "\\b", "gi");       
        if(var_orderby.search(re) == -1)
        {
          var tempStr = Trim(var_orderby)
          if(tempStr.lastIndexOf(",") == (tempStr.length -1))
        {
            selectstr = Trim(var_orderby)
            selectstr += " " + treeData.column
            var_orderby = selectstr;
          } else {
          selectstr = Trim(var_orderby) + ", ";
          selectstr += treeData.column;
          var_orderby = selectstr;
          }
          updateSQL_Box();
        }
      }
    } else {
      alert(MM.MSG_InvalidSQL);
    }
  } else {
    alert(MM.MSG_SelectColumn);
  }
  } else {
  //Update SQL with selected stored procedure syntax  
    SP_Mode = true;
  updateSQLWithStoredProcedure();
  }
}


function UpdateTreeSelection()
{
  //TREE_SEL_BOX.value = TREE.selectedItem
  var treeData = TREE.getData();
  if(treeData.IsProcedure())
  {
    //Enable/disable suitable buttons for the stored
    //proc selection
    StoredProcButtons()
  } else {
    //A table/view/column is selected. Do the needful.
    NotStoredProcButtons()
  }
}



function LaunchConnectionManager()
{
  var oldList = String(CONN_LIST.valueList).split(",")
  MMDB.showConnectionMgrDialog()
  PopulateConnectionList()
  var newConnectionIndex = getNewConnection(oldList, CONN_LIST.valueList)
  if (newConnectionIndex != -1)
  {
    CONN_LIST.setIndex(newConnectionIndex)
    ConnectionChanged()
  }
}


function IsConnectionSelected()
{
  
  var conn = CONN_LIST.getValue();
  if((conn == MM.LABEL_None) || (Trim(conn) == "") || (conn == MM.LABEL_EmptyOption))
  {
    alert(MM.MSG_NoConnection);
    return false;
  }
  return true;
}


function StoredProcButtons()
{
  disableTheButton(WHERE_BUTTON)
  disableTheButton(ORDERBY_BUTTON)
  SELECT_BUTTON.value = MM.LABEL_AddProc;
}


function NotStoredProcButtons()
{
  enableTheButton(WHERE_BUTTON)
  enableTheButton(ORDERBY_BUTTON)
  SELECT_BUTTON.value = MM.LABEL_AddSelect;
}


function enableTheButton(obj)
{
  var re1 = /(\s*|.*)(DISABLED="true" )(\s|.*)/
  var source = obj.outerHTML;

  if(source.search(re1) != -1)
  {
    source = RegExp.$1 + RegExp.$3
  }

  obj.outerHTML = source;
}


function disableTheButton(obj)
{
  var str = "DISABLED=\"true\" "
  var re1 = /(\s*|.*)(DISABLED="true" )(\s|.*)/i
  var re2 = /(\s*|.*)(NAME)(\s|.*)/i
  var source = obj.outerHTML;

  if(source.search(re1) == -1)
  {
    if(source.search(re2) != -1)
    {
      source = RegExp.$1 + str + RegExp.$2 + RegExp.$3
    }
  }

  obj.outerHTML = source;
}


function PopulateConnectionList()
{
  var oldConn = CONN_LIST.getValue()

  var connList = MMDB.getConnectionList()

  var wholeList = new Array()

  wholeList.push(MM.LABEL_None)
  for (var i = 0; i < connList.length; i++)
  {
    wholeList.push(connList[i])
  }

  CONN_LIST.setAll(wholeList, wholeList)
  CONN_LIST.setValue(MM.LABEL_None, 0)

  var index = CONN_LIST.getIndex(oldConn)

  if (!CONN_LIST.pickValue(oldConn)) 
  {
    if (CONN_LIST.getLen() == 2) 
    { 
      CONN_LIST.setIndex(1)
      ConnectionChanged()
    }
    else
    {
      CONN_LIST.setIndex(0)
    }
  } else { 

    //the database tree ctrl could be populated
    //already... so, it needs to be refreshed. The tree control will not 
    //refresh itself if the connection passed in is the same, so set it 
    //to a dummy value and then re-set the original connection. This will
    //force it to update the meta-data.
    TREE.setConnection("");
    TREE.setConnection(oldConn);
  }
}


function PlusMouseDown()
{
  PLUS_BUTTON.src = "../Shared/UltraDev/Images/PlusButtonDepressed.gif";
}


function PlusMouseUp()
{
  PLUS_BUTTON.src="../Shared/UltraDev/Images/PlusButton.gif";
  AddParam();
}


function MinusMouseDown()
{
  if(PARAM_LIST.getIndex() >= 0) {
  MINUS_BUTTON.src = "../Shared/UltraDev/Images/MinusButtonDepressed.gif";
  }
}


function MinusMouseUp()
{
  if(PARAM_LIST.getIndex() >= 0) {
  MINUS_BUTTON.src="../Shared/UltraDev/Images/MinusButtonEnabled.gif";
    DeleteParam();
  }
}


function receiveArguments(errorMsg) {
  ERROR_MESSAGE = errorMsg;
}


function addAndIsOkay(str)
{
  var tempStr = str.toUpperCase();
  var lt = str.length;
  
  var reIN = /\bis/gi;
  var reIS = /\bin/gi;
  var reNOT = /\bnot/gi;
  var reLIKE = /\blike/gi;

    if(tempStr.lastIndexOf(CONST_AND) == (tempStr.length - 4))
    return false;
  
  var substr2 = str.substr(str.length - 2, 2);
  var substr1 = str.substr(str.length - 1, 1);

    //Check for the mathematical operators <=, <> and >=
  if((substr2 == "<=") || (substr2 == ">=") || (substr2 == "<>"))
    return false;

  //Check for the mathematical operators =, <, and >
    if((substr1 == "=") || (substr1 == "<") || (substr1 == ">"))
    return false;

  if((str.search(reIS) == lt-2) || (str.search(reIN) == lt-2) || (str.search(reNOT) == lt-3) || (str.search(reLIKE) == lt-4))
    return false;  

  return true;
}
