/*

 SqlPanel object provides handlers for the SQL Command page.
 call init_handlers from main.html, after creating the object.

 */

function SqlPanel(rdbAdmin, sqlEngine) {
  if (!rdbAdmin) {
    alert('bad rdbAdmin');
  }
  this.panelId = 'sql-panel';
  var sqlResults = null,
      formId = 'sql-panel-form',
      queryHandoff = undefined,
      receditPanel = undefined,
      that = this;

  // function to handle error result of query submit
  function errback(err, msg) {
    var err2;
    if ( typeo(err) === 'object' ) {
      err2 = Array.apply(null,err2);
    }
    var arg2 = Array.apply(null,arguments);
    //alert(arg2.join(', '));
    rdbAdmin.showErrorMessage('<pre>' + arg2.join(', ') + '</pre>');
  }

  this.init_handlers = function(rePanel) {
    receditPanel = rePanel;
    $('#sqlcommand').click(function() {
      rdbAdmin.loadNewPage('#/sqlcommand');
    });
    var $form = $('#' + formId);
    $form.find('#query-execute-button').click(function(ev) {
      consoleLog('query-execute-button clicked');
      ev.stopImmediatePropagation();
      rdbAdmin.resetMessages();
      that.executeQuery();
    });
    $form.find('table button').click(function (ev) {
      ev.stopPropagation();
      $(this).parent().children(':input').toggle();
    });
    $('#query-text-area').change(function (ev) {
      ev.stopPropagation();
      if ($(this).val() !== '') {
        $('.lookup-create-link',$form).removeClass('disabledLink');
      }
      else {
        $('.lookup-create-link',$form).addClass('disabledLink');
      }
    });
    $('.lookup-create-link',$form).click(function (ev) {
      ev.stopPropagation();
      var query =  $form.find('#query-text-area').val();
      if ( ! query ) {
        alert('enter a query first!');
      }
      else {
        var fieldTransfer = { 'query' : query };
        receditPanel.useRecordLater(fieldTransfer);
        rdbAdmin.loadNewPage('#/browser/insert/'+encodeURIComponent('lookup.queries'));
      }
    });
  };

  this.showQuery = function(query) {
    rdbAdmin.resetMessages();
    var $form = $('#' + formId),
        $that;
    if (!rdbAdmin.isLoggedIn()) {
      alert('You must login first!');
      return false;
    }
    this.clearPanel();
    rdbAdmin.setHeading("Perform SQL Query");
    $form.find('table :input').each(function () {
      var typ = $(this).attr('type'),
          lbl;
      if (typ === 'file') {
        $(this).hide();
      }
      else if (typ === 'text') {
        $(this).show();
      }
      else if (typ === 'button') {
        $that = $(this);
        lbl = $that.html();
        $that.removeAttr('name');
        if (lbl === 'file') {
          $that.show();
        }
        else {
          $that.hide();
        }
      }
    });
    if (query) {
      $form.find('#query-text-area').val(query);
    } else if (queryHandoff) {
      $form.find('#query-text-area').val(queryHandoff.query);
      queryHandoff = undefined;
    }
    $('#query-text-area').change();
    return true;
  };

  this.showQueryLater = function(query) {
    queryHandoff = query;
  };

  this.clearPanel = function() {
    $("#query-results-table").empty().hide();
    $("#query-text-area").empty().val('');
  };

  this.executeQuery = function() {
    var $panel = $('#sql-panel'),
        $qta = $panel.find('#query-text-area'),
        query;
    $panel.find('#query-results-table').empty();
    query = $qta.val();
    // prep arg### fields
    $panel.find(':input[id^=arg0]:visible').each( function () {
      var $argid = $(this).attr('id');
      $(this).attr('name', $argid.substr(0, 6));
    });
    // functions to handle results of query submit
    function errback(err, msg) {
      rdbAdmin.onStopQueryExecution();
      rdbAdmin.showErrorMessage('<pre>' + err.toString() + ': ' + msg + '</pre>');
    }

    function callback(data) {
      rdbAdmin.onStopQueryExecution();
      if (data.status[0] !== 'error') {
        sqlResults = data;
        if ( sqlResults.result_sets ) {
          for ( var rs in sqlResults.result_sets ) {
            var rset = sqlResults.result_sets[rs];
            if ( rset.row_count && rset.row_count[0] >= 0 ) {
              sqlResults = rset;
              break;
            }
          }
        }
        if ( sqlResults.row_count[0] === 0 ) {
          rdbAdmin.showWorkingMessage('Result is empty, 0 rows.');
        }
        else {
          rdbAdmin.showWorkingMessage(sqlResults.status[1]);
          that.fillResultsTable();
          $panel.find("#query-results-table").show();
          $panel.find("#query-display").show().append(query);
        }
        rdbAdmin.updateSidePanel('tvsf');
      }
      else {
        alert('error wrongly passed to success callback ' + str(data.error[1]));
      }
    }
    // querying
    rdbAdmin.onStartQueryExecution();
    rdbAdmin.resetMessages();
    sqlEngine.queryByForm({ 'formId' : formId,
                            'callback' : callback,
                            'errback' : errback  });
    return false;
  };

  this.fillResultsTable = function() {
    var tab = document.getElementById("query-results-table"),
        tabHeader = document.createElement("thead"),
        tabBody = document.createElement("tbody"),
        cell;
    if (sqlResults && sqlResults.records && sqlResults.records.header) {  
      for (var i in sqlResults.records.header) {
        var col = sqlResults.records.header[i][1];
        cell = document.createElement("th");
        cell.appendChild(document.createTextNode(col));
        tabHeader.appendChild(cell);
      }
      var tabRow, row;
      for (i in sqlResults.records.rows) {
        row = sqlResults.records.rows[i];
        tabRow = document.createElement("tr");
        for (var j in row) {
          if (row.hasOwnProperty(j)) {
            cell = document.createElement("td");
            cell.appendChild(document.createTextNode(row[j]));
            tabRow.appendChild(cell);
          }
        }
        tabBody.appendChild(tabRow);
      }
      tab.appendChild(tabHeader);
      tab.appendChild(tabBody);
    }
  };
}
