
  function myDBErrorHandler(tx, err) {
    alert("an execute sql statement failed: " + err.toString());
  }
  
  function initDB() {
    db.transaction(function(tx) {
      //here we simply try to run a simple sql statement on our table...if it fails, means the table doesn't exist
      tx.executeSql("SELECT COUNT(*) FROM nicknames", [], function(result) {  }, function(tx, error) {
        tx.executeSql("CREATE TABLE nicknames (id INTEGER PRIMARY KEY AUTOINCREMENT, item_name TEXT, nickname TEXT)", [], function(result) { /* success */ }, myDBErrorHandler);
        
        tx.executeSql("CREATE TABLE categories (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, budget REAL)", [], function(result) { /* success */ }, myDBErrorHandler);
        
        tx.executeSql("CREATE TABLE items (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, amount REAL, category_id INTEGER, transaction_type TEXT, item_date REAL)", [], function(result) { /* success */ }, myDBErrorHandler);
      });
    });
  }
  
  function handle_statement_upload() {
    
    jQuery("#statement-view tbody").html("");
    
    jQuery('#wpf-status').html('Status Hello');
    
    //jQuery('#statement-upload-form').submit();
    
    return true;
    
  }
  
  function statement_item_onclick(eventobj) {
    
    jQuery(this).unbind('click', statement_item_onclick);
    
    var curitemval = jQuery(this).html();
    var newhtml = '<input id="oldtext" type="hidden" name="oldtext" value="'+curitemval+'" />';
    newhtml += '<input type="text" id="renamebox" name="renameitem" value="' + curitemval + '" onblur="statement_rename_item(\'' + eventobj.target.parentNode.id + '\');" />';
    jQuery(this).html(newhtml);
    
    jQuery("#renamebox").focus();
  }
  
  function statement_rename_item(rowid) {
    var oldvalue = jQuery("#" + rowid + " #oldtext").val();
    var newvalue = jQuery("#" + rowid + " #renamebox").val();
    
    if(oldvalue != newvalue) {
      
      jQuery("#" + rowid + " .sitem").html(newvalue);
      
      //rename all items that match this
      jQuery(".sitem").map(function() {
        if(jQuery(this).html() == oldvalue) {
          jQuery(this).html(newvalue);
        }
      });
      
    } else {
      //return the cell to its original value
      jQuery("#" + rowid + " .sitem").html(oldvalue);
    }
    
    jQuery("#" + rowid + " .sitem").bind("click", statement_item_onclick);
  }
  
  function onStatementUploaded() {
    
    jQuery("#wpf-status").html("dude...i'm done");
    
    jQuery.getJSON("/wp-content/plugins/finance/wpf_ajax.php?wpf_action=statement-json", function(data) {
      
      //alert(data.toString());
      
      jQuery.each(data.items, function(i,item){
        
        var newrow = '<tr id="row' + i + '">';
        newrow += "<td class=\"sdate\">" + item.sdate + "</td>";
        newrow += "<td class=\"sitem\">" + item.sitem + "</td>";
        newrow += "<td class=\"stype\">" + item.stype + "</td>";
        newrow += "<td class=\"samount\">" + item.samount + "</td>";
        newrow += "<td></td>";
        newrow += "</tr>";
        
        jQuery("#statement-view tbody").append(newrow);
        
      });
      
      //apply table sorting module
      jQuery("#statement-view").tablesorter({sortList:[[0,0]], widgets: ['zebra'], headers: { 4:{sorter: false}, 5:{sorter: false}}});
      
      //enable clicking the item name to change it
      jQuery("#statement-view tbody .sitem").bind("click", statement_item_onclick);
      
      //get the subtotal for all amounts
      var amtelms = jQuery(".samount");
      
      var amtsum = 0;
      for(var z=0; z < amtelms.length; z++) {
        amtsum += parseFloat(jQuery(amtelms[z]).html().trim());
      }
      
      jQuery("#subtotal").html(amtsum);
      
    });
    
    jQuery("#statement-upload-form").css("display","none");
  }

  function statement_rename(rowid) {
    var item = jQuery("#" + rowid + " .sitem ").html();
    alert(item);
  }
  
