/*
            _/    _/_/    _/_/_/_/_/                              _/       
               _/    _/      _/      _/_/    _/    _/    _/_/_/  _/_/_/    
          _/  _/  _/_/      _/    _/    _/  _/    _/  _/        _/    _/   
         _/  _/    _/      _/    _/    _/  _/    _/  _/        _/    _/    
        _/    _/_/  _/    _/      _/_/      _/_/_/    _/_/_/  _/    _/     
       _/                                                                  
    _/

    Created by David Kaneda <http://www.davidkaneda.com>
    HTML5 database extension by Cedric Dugas <http://www.position-absolute.com>
    Documentation and issue tracking on Google Code <http://code.google.com/p/jqtouch/>
    
    Special thanks to Jonathan Stark <http://jonathanstark.com/>
    and pinch/zoom <http://www.pinchzoom.com/>
    
    (c) 2009 by jQTouch project members.
    See LICENSE.txt for license.
*/

(function($) {
    if ($.jQTouch)
    {
        $.jQTouch.addExtension(function Counter(jQTouch){
            var db,dbName
            var debugging = false;    // Debugging Window
            
            function dbOpen(name,version,desc,size) {    // Open database
                dbName = name
                   if (window.openDatabase) {
                      db = openDatabase(name, version, desc, size);
                        if (!db){
                            debugTxt= ("Failed to open the database on disk.  This is probably because the version was bad or there is not enough space left in this domain's quota");
                            if(debugging){ debug(debugTxt)}
                        }    
                 } else{
                      debugTxt= ("Couldn't open the database.  Please try with a WebKit nightly with this feature enabled");
                      if(debugging){ debug(debugTxt)}
                }
            }
            function dbCreateTables(tbJson) {
                
                for(x=0;x<tbJson.createTables.length;x++){    // Loop in the json for every table
                    createQuery(tbJson.createTables[x]);
                }     
                    function createQuery(tbNode){            // Create the SQL that will create the tables
                        debugTxt = "create table "+ tbNode.table;
                        var stringQuery = "CREATE TABLE " + tbNode.table + " (";
                        nodeSize = tbNode.property.length -1;
                        for(y=0;y<=nodeSize;y++){
                            stringQuery += tbNode.property[y].name +" "+ tbNode.property[y].type;
                            if(y != nodeSize) {stringQuery +=", "}
                        }
                        stringQuery +=")";
                        dbExecuteQuery(stringQuery,debugTxt);
                    }
            }
               function dbDeleteRow(table,key,value) {        // Simple Delete row
                 stringQuery = "DELETE FROM " + table + " WHERE " + key +" = " + value;
                   debugTxt = "delete row" + key + " " + value;
                   dbExecuteQuery(stringQuery,debugTxt);
            }
            function dbSelectAll(table,fn) {
                 stringQuery = "SELECT * FROM " + table;
                  debugTxt = "selecting everything in table " + table;
                   dbExecuteQuery(stringQuery,debugTxt,fn);
            }
            function dbDropTable(table) {
                 stringQuery = "DROP TABLE " + table;
                 debugTxt = "delete table " + table;
                   dbExecuteQuery(stringQuery,debugTxt);
            }
            function dbInsertRows(tbJson) {        // Insert Row
                for(x=0;x<tbJson.addRow.length;x++){         // loop in every row from JSON
                    createQueryRow(tbJson.addRow[x]);
                }
                function createQueryRow(tbNode){        // Create every row SQL
                    debugTxt = "create row " + tbNode.table;
                    
                     stringQuery = "INSERT INTO " + tbNode.table + " ("
                     nodeSize = tbNode.property.length -1;
                    for(y=0;y<=nodeSize;y++){
                        stringQuery += tbNode.property[y].name;
                        if(y != nodeSize) {stringQuery +=", "}
                    }
                    stringQuery +=") VALUES (";
                    var vals = new Array();
                    for(y=0;y<=nodeSize;y++){
                        vals[y] = tbNode.property[y].value;
                        stringQuery += '?';
                        if(y != nodeSize) {stringQuery +=", "}
                    }
                    stringQuery +=")";
                    db.transaction(function(tx) {            
                        tx.executeSql(stringQuery, vals, null, function(tx, e) {  alert('Something unexpected happened: --' +stringQuery+'--'+ e.message ); });
                   });
                }
            }
            
            function dbExecuteQuery(stringQuery,debugTxtRaw,fn ) {        // Execute all query, can be called in website script
                 debugTxtRaw += "<br> SQL: " + stringQuery;
                callback = fn;                                            // Callback
                db.transaction(function(tx) {            
                    tx.executeSql(stringQuery, [], function(tx,result) {     // Execute SQL
                        if (callback) {callback(result);}                    // Execute callback
                           if(debugging){
                             debugTxtRaw += "<br><span style='color:green'>success</span> ";
                             debug(debugTxtRaw);    
                         }
                    }, function(tx, error) {
                        debugTxtRaw += "<br><span style='color:red'>"+error.message+"</span> "; 
                        if(debugging){
                            debug(debugTxtRaw);    
                         }
                    });
                });
            }
            function debug(error) {                                            // Create debug mode window
                if(!$("#debugMode")[0]){
                    $("body").append("<div style='position:abolute;top:0 !important;left:0 !important;width:100% !important;min-height:100px !important; height:300px; overflow:scroll;z-index:1000; display:block; opacity:0.8; background:#000;-webkit-backface-visibility:visible ' id='debugMode'></div>");
                }
                $("#debugMode").append("<div class='debugerror'>"+error+"</div>");
            }            
            return {
                dbOpen: dbOpen,
                dbDeleteRow: dbDeleteRow,
                dbDropTable: dbDropTable,
                dbInsertRows: dbInsertRows,
                dbSelectAll: dbSelectAll,
                dbExecuteQuery: dbExecuteQuery,
                dbCreateTables: dbCreateTables
            }
        });
    }
})(jQuery);

