<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,4 +1,4 @@
-//JazzRecord Version 0.7 build 1245258412
+//JazzRecord Version 0.7 build 1246942372
 //Copyright (c) 2009 Nick Carter &lt;thynctank@thynctank.com&gt;
 //
 //Permission is hereby granted, free of charge, to any person
@@ -21,4 +21,4 @@
 //WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 //FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 //OTHER DEALINGS IN THE SOFTWARE.
-var JazzRecord={each:function(E,C,F){switch(JazzRecord.getType(E)){case&quot;array&quot;:for(var B=0,A=E.length;B&lt;A;B++){C.call(F,E[B],B)}break;case&quot;object&quot;:for(var D in E){if(E.hasOwnProperty(D)){C.call(F,E[D],D)}}break}},isDefined:function(A){return !(typeof A===&quot;undefined&quot;||A===null)},getType:function(A){if(typeof A===&quot;undefined&quot;||A===null||(typeof A===&quot;number&quot;&amp;&amp;isNaN(A))){return false}else{if(A.constructor===Array){return&quot;array&quot;}else{return typeof A}}},debug:false,puts:function(A){if(JazzRecord.debug===false){return }if(typeof console!==&quot;undefined&quot;&amp;&amp;console.log){switch(JazzRecord.getType(A)){case&quot;object&quot;:if(console.dir){console.dir(A);break}default:console.log(A)}}if(typeof air!==&quot;undefined&quot;){if(air.Introspector&amp;&amp;air.Introspector.Console){switch(JazzRecord.getType(A)){case&quot;string&quot;:air.Introspector.Console.log(A);break;case&quot;object&quot;:air.Introspector.Console.dump(A);break}}else{air.trace(A)}}},merge:function(){var F={};for(var C=0,A=arguments.length;C&lt;A;C++){var B=arguments[C];if(JazzRecord.getType(B)!==&quot;object&quot;){continue}for(var G in B){var E=B[G],D=F[G];if(D&amp;&amp;JazzRecord.getType(E)===&quot;object&quot;&amp;&amp;JazzRecord.getType(D)===&quot;object&quot;){F[G]=JazzRecord.merge(D,E)}else{F[G]=E}}}return F},shallowMerge:function(C,A){for(var B in A){C[B]=A[B]}return C},setOptions:function(A,C){if(!A){A={}}if(!this.options){this.options={}}mergedOptions=JazzRecord.merge(C,A);for(var B in C){this.options[B]=mergedOptions[B]}},replaceAndClean:function(B,A){for(opt in A){B=B.replace(&quot;{&quot;+opt+&quot;}&quot;,A[opt])}B=B.replace(/{\w+}/g,&quot;&quot;);return B.replace(/\s+/g,&quot; &quot;).replace(/^\s+|\s+$/g,&quot;&quot;)},extend:function(C,A){if(!this.options){this.options={}}this.parent=new C(A);for(var D in this.parent){this[D]=this[D]||this.parent[D]}for(var B in this.parent.options){this.options[B]=this.options[B]||this.parent.options[B]}},indexOf:function(A,E){var C=-1;if(A.indexOf){C=A.indexOf(E)}else{for(var D=0,B=A.length;D&lt;B;D++){if(A[D]===E){C=D;break}}}return C},arrayContainsVal:function(A,B){if(JazzRecord.indexOf(A,B)&gt;-1){return true}else{return false}},removeFromArray:function(A,C){var B=JazzRecord.indexOf(A,C);A.splice(B,1)}};JazzRecord.Hash=function(A){this.data=A||{}};JazzRecord.Hash.toQueryString=function(B){var A=[];JazzRecord.each(this.data,function(E,D){if(B){D=B+&quot;[&quot;+D+&quot;]&quot;}var C;switch(JazzRecord.getType(E)){case&quot;object&quot;:C=JazzRecord.Hash.toQueryString(E,D);break;case&quot;array&quot;:var F={};JazzRecord.each(E,function(G,H){F[H]=G});C=JazzRecord.Hash.toQueryString(F,D);break;default:C=D+&quot;=&quot;+encodeURIComponent(E)}if(E){A.push(C)}});return A.join(&quot;&amp;&quot;)};JazzRecord.Hash.prototype={has:function(A){if(this.data.hasOwnProperty(A)){return true}else{return false}},set:function(A,B){this.data[A]=B},get:function(A){return this.data[A]},getLength:function(){var B=0;for(var A in this.data){if(this.data.hasOwnProperty(A)){B++}}return B},each:function(A,B){JazzRecord.each(this.data,A,B)},toQueryString:JazzRecord.Hash.toQueryString,getValues:function(){var A=[];this.each(function(B){A.push(B)});return A},getKeys:function(){var A=[];this.each(function(C,B){A.push(B)});return A}};JazzRecord.models=new JazzRecord.Hash();JazzRecord.depth=1;JazzRecord.run=function(C,B,A){return JazzRecord.adapter.run(C,B,A)};JazzRecord.count=function(C,B,A){return JazzRecord.adapter.count(C,B,A)};JazzRecord.save=function(C,B,A){return JazzRecord.adapter.save(C,B,A)};JazzRecord.runTransaction=function(A,C){JazzRecord.run(&quot;BEGIN&quot;);try{A.apply(C||this)}catch(B){JazzRecord.run(&quot;ROLLBACK&quot;);throw (B)}JazzRecord.run(&quot;END&quot;)};JazzRecord.Adapter=function(){this.run=this.count=this.save=function(A){JazzRecord.puts(A)}};JazzRecord.AirAdapter=function(A){var B={dbFile:&quot;jazz_record.db&quot;};JazzRecord.setOptions.call(this,A,B);JazzRecord.extend.call(this,JazzRecord.Adapter);this.connection=new air.SQLConnection();this.dbFile=air.File.applicationDirectory.resolvePath(this.options.dbFile);this.connection.open(this.dbFile,air.SQLMode.CREATE);this.statement=new air.SQLStatement();this.statement.sqlConnection=this.connection};JazzRecord.AirAdapter.prototype={run:function(B){this.parent.run(B);this.statement.text=B;this.statement.execute();var A=this.statement.getResult();return A.data},count:function(A){this.parent.count(A);A=A.toUpperCase();return this.run(A)[0][&quot;COUNT(*)&quot;]},save:function(A){this.parent.save(A);this.statement.text=A;this.statement.execute();return this.statement.getResult().lastInsertRowID}};JazzRecord.GearsAdapter=function(A){var B={dbFile:&quot;jazz_record.db&quot;};JazzRecord.setOptions.call(this,A,B);JazzRecord.extend.call(this,JazzRecord.Adapter);this.db=google.gears.factory.create(&quot;beta.database&quot;);this.db.open(this.options.dbFile);this.result=null};JazzRecord.GearsAdapter.prototype={run:function(D){this.parent.run(D);this.result=this.db.execute(D);var C=[];while(this.result.isValidRow()){var F={};for(var B=0,A=this.result.fieldCount();B&lt;A;B++){var E=this.result.fieldName(B);F[E]=this.result.field(B)}C.push(F);this.result.next()}this.result.close();return C},count:function(B){this.parent.count(B);this.result=this.db.execute(B);var A=this.result.field(0);this.result.close();return A},save:function(A){this.parent.save(A);this.db.execute(A);return this.db.lastInsertRowId}};JazzRecord.TitaniumAdapter=function(A){JazzRecord.extend.call(this,JazzRecord.GearsAdapter,A);this.db=Titanium.Database.open(this.options.dbFile);this.result=null};JazzRecord.HTML5Adapter=function(A){var B={dbFile:&quot;jazz_record.db&quot;};JazzRecord.setOptions.call(this,A,B);JazzRecord.extend.call(this,JazzRecord.Adapter,A);this.db=openDatabase(this.options.dbFile)};JazzRecord.HTML5Adapter.prototype={run:function(B,C,A){this.parent.run(B);this.db.transaction(function(D){D.executeSql(B,[],function(E,H){var I=[];for(var G=0,F=H.rows.length;G&lt;F;G++){I.push(H.rows.item(G))}if(C){C(I)}},function(E,F){if(A){A(F.message)}else{JazzRecord.puts(&quot;There was an error: &quot;+F.message)}})})},count:function(B,C,A){this.parent.count(B);this.db.transaction(function(D){D.executeSql(B,[],function(E,F){if(C){C(F.rows.item(0)[&quot;COUNT(*)&quot;])}},function(E,F){if(A){A(F.message)}else{JazzRecord.puts(&quot;There was an error: &quot;+F.message)}})})},save:function(B,C,A){this.parent.save(B);this.db.transaction(function(D){D.executeSql(B,[],function(E,F){if(C){C(F.insertId)}},function(E,F){if(A){A(F.message)}else{JazzRecord.puts(&quot;There was an error: &quot;+F.message)}})})}};JazzRecord.Record=function(A){var B={model:null,columns:{},data:{},onCreate:function(){},onUpdate:function(){},onSave:function(){},onDestroy:function(){}};this.id=null;JazzRecord.setOptions.call(this,A,B);this.errors={};this.onCreate=this.options.onCreate;this.onUpdate=this.options.onUpdate;this.onSave=this.options.onSave;this.onDestroy=this.options.onDestroy;if(this.options.data.id){this.id=this.options.data.id;this.originalData={};this.isNew=function(){return false}}else{this.isNew=function(){return true}}JazzRecord.each(this.options.columns,function(D,C){this[C]=null;this[C]=this.options.data[C];if(this.originalData){this.originalData[C]=this.options.data[C]}if(D===&quot;bool&quot;){var E=(this[C]?true:false);if(this.originalData){this.originalData[C]=E}this[C]=E}},this);JazzRecord.each(this.options.model.options.recordMethods,function(D,C){this[C]=D},this)};JazzRecord.Record.prototype={destroy:function(){if(!this.id){throw (&quot;Unsaved record cannot be destroyed&quot;)}else{this.options.model.destroy(this.id);JazzRecord.each(this.options.model.options.hasMany,function(B,A){this.load(A);JazzRecord.each(this[A],function(C){C.updateAttribute(this.options.model.options.foreignKey,null)},this);this[A+&quot;OriginalRecordIDs&quot;]=[]},this);JazzRecord.each(this.options.model.options.hasAndBelongsToMany,function(C,B){var A=[this.options.model.table,C].sort().join(&quot;_&quot;);sql=&quot;DELETE FROM &quot;+A+&quot; WHERE &quot;+this.options.model.options.foreignKey+&quot;=&quot;+this.id+&quot;;&quot;;JazzRecord.adapter.run(sql)},this);JazzRecord.each(this.options.model.options.hasOne,function(B,A){this.load(A);if(!this[A]){return }this[A].updateAttribute(this.options.model.options.foreignKey,null);this[A+&quot;OriginalRecordID&quot;]=null},this);this.onDestroy();this.id=null;this.originalData=null;this.isNew=function(){return true}}},getData:function(){var A={};JazzRecord.each(this.options.columns,function(C,B){A[B]=this[B]},this);return A},revert:function(){JazzRecord.each(this.options.columns,function(B,A){this[A]=this.originalData[A]},this);JazzRecord.each(this.options.model.options.belongsTo,function(D,C){var B=JazzRecord.models.get(D);var A=B.options.foreignKey;if(this[C]&amp;&amp;!this[C].unloaded&amp;&amp;this[C].id!==this[A]){this[C]=B.find({id:this[A],depth:0})}},this)},reload:function(){if(!this.id){throw (&quot;Unsaved record cannot be reloaded&quot;)}else{var A=this.options.model.find(this.id);JazzRecord.shallowMerge(this,A)}},load:function(A,C){if(!C){C=0}if(this[A]&amp;&amp;this[A].unloaded){this[A]=this[A].loader(C);if(JazzRecord.getType(this[A])===&quot;array&quot;){var B=[];JazzRecord.each(this[A],function(D){B.push(D.id)});this[A+&quot;OriginalRecordIDs&quot;]=B}else{if(this[A]&amp;&amp;this[A].id){this[A+&quot;OriginalRecordID&quot;]=this[A].id}}}return this[A]},updateAttribute:function(A,B){this[A]=B;this.save()}};JazzRecord.Record.prototype.isChanged=function(){if(this.isNew()){return false}JazzRecord.each(this.options.model.options.belongsTo,function(F,E){var D=JazzRecord.models.get(F);var C=D.options.foreignKey;if(!this.originalData){return false}if(this[E]){if(this[E].unloaded){if(this[C]!==this.originalData[C]){return true}}else{if(this[E].isNew()){this[E].save()}if(this[E].id!==this.originalData[C]){this[C]=this[E].id;return true}if(this[C]!==this.originalData[C]){return true}}}else{if(this.originalData[C]){this[C]=null;return true}}},this);var B=new JazzRecord.Hash(this.getData());var A=new JazzRecord.Hash(this.originalData);if(this.id&amp;&amp;B.toQueryString()===A.toQueryString()){return false}else{return true}};JazzRecord.Record.prototype.save=function(){var A=this.options.model.options.foreignKey;if(!this.originalData){JazzRecord.each(this.options.model.options.belongsTo,function(F,E){var C=JazzRecord.models.get(F);var D=C.options.foreignKey;if(this[E]){if(this[E].unloaded){this.load(E)}}if(this[E]&amp;&amp;this[E].id){this[D]=this[E].id}},this)}JazzRecord.each(this.options.model.options.hasOne,function(F,E){if(this[E]){if(this[E].unloaded){this.load(E);if(!this[E]){return }}if(!JazzRecord.isDefined(this[E+&quot;OriginalRecordID&quot;])){this[E].updateAttribute(A,this.id)}else{if(this[E+&quot;OriginalRecordID&quot;]!==this[E].id){var D=JazzRecord.models.get(F);var C=D.first({id:this[E+&quot;OriginalRecordID&quot;],depth:0});C.updateAttribute(A,null)}}this[E].updateAttribute(A,this.id);this[E+&quot;OriginalRecordID&quot;]=this[E].id}else{if(this[E+&quot;OriginalRecordID&quot;]){var D=JazzRecord.models.get(F);var C=D.first({id:this[E+&quot;OriginalRecordID&quot;],depth:0});C.updateAttribute(A,null)}}},this);JazzRecord.each(this.options.model.options.hasMany,function(G,F){if(this[F]){if(this[F].length){var D=JazzRecord.models.get(G);var C=this[F+&quot;OriginalRecordIDs&quot;];JazzRecord.each(this[F],function(H,I){if(H){H[A]=this.id;H.save();if(JazzRecord.arrayContainsVal(C,H.id)){JazzRecord.removeFromArray(C,H.id)}}},this);JazzRecord.each(this[F],function(H,I){if(!JazzRecord.isDefined(H)){this[F].splice(I,1)}},this);JazzRecord.each(C,function(I){var H=D.find(I);if(H){H.updateAttribute(A,null)}});var E=[];JazzRecord.each(this[F],function(H){if(H){E.push(H.id)}});this[F+&quot;OriginalRecordIDs&quot;]=E}}else{this[F]=[];this[F+&quot;OriginalRecordIDs&quot;]=[]}},this);JazzRecord.each(this.options.model.options.hasAndBelongsToMany,function(I,H){if(this[H]){if(this[H].length){var C=[this.options.model.table,I].sort().join(&quot;_&quot;);var G=JazzRecord.models.get(I).options.foreignKey;var F=&quot;&quot;;var D=this[H+&quot;OriginalRecordIDs&quot;];JazzRecord.each(this[H],function(J){J.save();if(JazzRecord.arrayContainsVal(D,J.id)){JazzRecord.removeFromArray(D,J.id)}else{F=&quot;INSERT INTO &quot;+C+&quot; (&quot;+A+&quot;, &quot;+G+&quot;) VALUES(&quot;+this.id+&quot;, &quot;+J.id+&quot;)&quot;;JazzRecord.adapter.run(F)}},this);JazzRecord.each(D,function(J){F=&quot;DELETE FROM &quot;+C+&quot; WHERE &quot;+A+&quot;=&quot;+this.id+&quot; AND &quot;+G+&quot;=&quot;+J+&quot;;&quot;;JazzRecord.adapter.run(F)},this);var E=[];JazzRecord.each(this[H],function(J){E.push(J.id)});this[H+&quot;OriginalRecordIDs&quot;]=E}}else{this[H]=[];this[H+&quot;OriginalRecordIDs&quot;]=[]}},this);this.errors={};if(this.isNew()){if(this.isValid(&quot;create&quot;)){this.onCreate()}}else{if(this.isValid(&quot;update&quot;)&amp;&amp;this.isChanged()){this.onUpdate()}}if(this.isValid(&quot;save&quot;)){var B=this.getData();if(this.isChanged()){this.onSave();B.originalData=this.originalData?this.originalData:{id:this.id};this.options.model.save(B);this.reload()}else{if(this.isNew()){this.onSave();this.id=this.options.model.save(B)}}this.originalData={};JazzRecord.each(this.options.model.options.columns,function(D,C){this.originalData[C]=this[C]},this);this.isNew=function(){return false};return true}return false};JazzRecord.Model=function(A){var B={table:&quot;&quot;,columns:{},foreignKey:&quot;&quot;,hasOne:{},belongsTo:{},hasMany:{},hasAndBelongsToMany:{},events:{},modelMethods:{},recordMethods:{},validate:{atCreate:function(){},atUpdate:function(){},atSave:function(){}}};JazzRecord.setOptions.call(this,A,B);this.table=this.options.table;this.sql=&quot;&quot;;JazzRecord.each(this.options.modelMethods,function(D,C){this[C]=D},this);if(!JazzRecord.models.has(this.table)){JazzRecord.models.set(this.table,this)}};JazzRecord.Model.prototype={newRecord:function(C){if(!C){C={}}var D={};JazzRecord.each(this.options.columns,function(F,E){D[E]=C[E]||null});var B={model:this,columns:this.options.columns,data:D};JazzRecord.each(this.options.events,function(F,E){B[E]=F});var A=new JazzRecord.Record(B);A.isNew=function(){return true};return A},create:function(B){var A=this.newRecord(B);A.save();return A}};JazzRecord.AssociationLoader=function(A){this.loader=A;this.unloaded=true};JazzRecord.AssociationLoader.prototype={toString:function(){return&quot;Not yet loaded&quot;}};JazzRecord.columnNames=function(B){var A=&quot;(&quot;;JazzRecord.each(B,function(D,C){A+=C+&quot;, &quot;});A=A.substr(0,A.length-2);return A+&quot;)&quot;};JazzRecord.columnValues=function(C,B){var A=&quot; VALUES(&quot;;JazzRecord.each(C,function(E,D){A+=JazzRecord.typeValue(C,D,B[D])+&quot;, &quot;},this);A=A.substr(0,A.length-2);return A+&quot;)&quot;};JazzRecord.typeValue=function(B,A,C){if(C===null){return&quot;NULL&quot;}else{switch(B[A]){case&quot;string&quot;:case&quot;text&quot;:if(JazzRecord.getType(C)===&quot;string&quot;){C=C.replace(/'/g,&quot;''&quot;)}return&quot;'&quot;+C+&quot;'&quot;;case&quot;int&quot;:C=parseInt(C,10);return JazzRecord.getType(C)===&quot;number&quot;?C:0;case&quot;number&quot;:case&quot;float&quot;:C=parseFloat(C);return JazzRecord.getType(C)===&quot;number&quot;?C:0;case&quot;bool&quot;:if(C){return 1}else{return 0}}}};JazzRecord.Record.prototype.validatesAtCreate=function(){this.options.model.options.validate.atCreate.apply(this)};JazzRecord.Record.prototype.validatesAtUpdate=function(){this.options.model.options.validate.atUpdate.apply(this)};JazzRecord.Record.prototype.validatesAtSave=function(){this.options.model.options.validate.atSave.apply(this)};JazzRecord.Record.prototype.isValid=function(A){switch(A){case&quot;create&quot;:this.validatesAtCreate();break;case&quot;update&quot;:this.validatesAtUpdate();break;case&quot;save&quot;:this.validatesAtSave();break;default:this.errors={};if(this.id){this.validatesAtUpdate();this.validatesAtSave()}else{this.validatesAtCreate();this.validatesAtSave()}}var B=0;for(var C in this.errors){B++}if(B===0){return true}else{return false}};JazzRecord.Record.prototype.pushError=function(A,B){if(!this.errors[A]){this.errors[A]=[]}this.errors[A].push(B)};JazzRecord.Record.prototype.validatesAcceptanceOf=function(A,B){var C=this[A];if(C&amp;&amp;JazzRecord.isDefined(C)&amp;&amp;JazzRecord.getType(C)===&quot;boolean&quot;){return }B=JazzRecord.isDefined(B)?B:(A+&quot; must be accepted&quot;);this.pushError(A,B)};JazzRecord.Record.prototype.validatesConfirmationOf=function(A,B){var C=this[A];var D=this[A+&quot;_confirmation&quot;];if(C!==D||!JazzRecord.isDefined(D)||D==&quot;&quot;){B=JazzRecord.isDefined(B)?B:A+&quot; doesn't match confirmation&quot;;this.pushError(A,B)}};JazzRecord.Record.prototype.validatesExclusionOf=function(A,C,B){if(this[A]&amp;&amp;JazzRecord.indexOf(C,this[A])&gt;-1){B=JazzRecord.isDefined(B)?B:(A+&quot; is reserved&quot;);this.pushError(A,B)}};JazzRecord.Record.prototype.validatesInclusionOf=function(A,C,B){if(this[A]&amp;&amp;!(JazzRecord.indexOf(C,this[A])&gt;-1)){B=JazzRecord.isDefined(B)?B:(A+&quot; is not included in the list&quot;);this.pushError(A,B)}};JazzRecord.Record.prototype.validatesFormatOf=function(A,C,B){val=this[A];if(val&amp;&amp;!val.match(C)){B=JazzRecord.isDefined(B)?B:(A+&quot; does not match expected format: &quot;+C.toString());this.pushError(A,B)}};JazzRecord.Record.prototype.validatesLengthOf=function(C,B,D){var A={minimum:0,maximum:Infinity,allowEmpty:true,tooShort:C+&quot; is too short&quot;,tooLong:C+&quot; is too long&quot;,wrongLength:C+&quot; is not the correct length&quot;};B=JazzRecord.shallowMerge(A,B);if(!JazzRecord.isDefined(this[C])||this[C]&amp;&amp;this[C].length&amp;&amp;this[C].length&gt;=B.minimum&amp;&amp;this[C].length&lt;=B.maximum){if(!JazzRecord.isDefined(B.is)||(B.is&amp;&amp;this[C].length===B.is)){return }}if(this[C].length&lt;B.minimum){this.pushError(C,B.tooShort)}if(this[C].length&gt;B.maximum){this.pushError(C,B.tooLong)}if(B.is&amp;&amp;this[C].length!==B.is){this.pushError(C,B.wrongLength)}};JazzRecord.Record.prototype.validatesNumericalityOf=function(A,B){var C=this[A];if(C&amp;&amp;JazzRecord.isDefined(C)&amp;&amp;JazzRecord.getType(C)!==&quot;number&quot;){B=JazzRecord.isDefined(B)?B:(A+&quot; is not a number&quot;);this.pushError(A,B)}};JazzRecord.Record.prototype.validatesPresenceOf=function(A,B){var C=this[A];if(!JazzRecord.isDefined(C)||C===&quot;&quot;){B=JazzRecord.isDefined(B)?B:(A+&quot; can't be empty, null or blank&quot;);this.pushError(A,B)}};JazzRecord.Record.prototype.validatesUniquenessOf=function(A,B){var D=this[A];var C=this.options.model.findBy(A,D,0);if(C&amp;&amp;C.id!=this.id){B=JazzRecord.isDefined(B)?B:(A+&quot; is not unique&quot;);this.pushError(A,B)}};JazzRecord.Record.prototype.validatesAssociated=function(C,B){if(!JazzRecord.isDefined(this[C])||(this[C]&amp;&amp;this[C].unloaded)){return }var A=[];if(JazzRecord.getType(this[C])===&quot;array&quot;){A=this[C]}else{A=[this[C]]}JazzRecord.each(A,function(D){if(D&amp;&amp;!D.isValid()){B=JazzRecord.isDefined(B)?B:C+&quot; is not valid&quot;;this.pushError(C,B);return }},this)};JazzRecord.Record.prototype.validatesIsString=function(A,B){var C=this[A];if(JazzRecord.getType(C)&amp;&amp;JazzRecord.getType(C)!==&quot;string&quot;){B=JazzRecord.isDefined(B)?B:(A+&quot; is not a string&quot;);this.pushError(A,B)}};JazzRecord.Record.prototype.validatesIsBool=function(A,B){var C=this[A];if(JazzRecord.getType(C)&amp;&amp;JazzRecord.getType(C)!==&quot;boolean&quot;){B=JazzRecord.isDefined(B)?B:(A+&quot; is not a bool&quot;);this.pushError(A,B)}};JazzRecord.Record.prototype.validatesIsInt=function(A,B){var C=this[A];if(JazzRecord.getType(C)){if(JazzRecord.getType(C)!==&quot;number&quot;||parseInt(C,10)!==C){B=JazzRecord.isDefined(B)?B:(A+&quot; is not an integer&quot;);this.pushError(A,B)}}};JazzRecord.Record.prototype.validatesIsFloat=function(A,B){var C=this[A];if(JazzRecord.getType(C)){if(JazzRecord.getType(C)!==&quot;number&quot;||parseFloat(C)!==C){B=JazzRecord.isDefined(B)?B:(A+&quot; is not an float&quot;);this.pushError(A,B)}}};JazzRecord.Model.prototype.query=function(C){if(!JazzRecord.isDefined(C)){C={}}if(!JazzRecord.isDefined(C.depth)){C.depth=JazzRecord.depth}var E=C.depth-1;if(E&lt;0){E=0}var A=this.sql;var D=JazzRecord.adapter.run(A);if(!D||D.length===0){if(this.sql.indexOf(&quot;LIMIT&quot;)&gt;-1){return null}else{return[]}}var B=[];JazzRecord.each(D,function(H){var G={model:this,columns:this.options.columns,data:H};JazzRecord.each(this.options.events,function(J,I){G[I]=J});var F=new JazzRecord.Record(G);JazzRecord.each(this.options.hasOne,function(M,L){var K=JazzRecord.models.get(M);var I=this.options.foreignKey;var J=function(N){return K.findBy(I,H.id,N)};if(C.depth&lt;1){F[L]=new JazzRecord.AssociationLoader(J)}else{F[L]=J(E);if(F[L]){F[L+&quot;OriginalRecordID&quot;]=F[L].id}}},this);JazzRecord.each(this.options.hasMany,function(N,M){var J=JazzRecord.models.get(N);var I=this.options.foreignKey;var L=function(O){return J.findAllBy(I,H.id,O)};if(C.depth&lt;1){F[M]=new JazzRecord.AssociationLoader(L)}else{F[M]=L(E);var K=[];JazzRecord.each(F[M],function(O){K.push(O.id)});F[M+&quot;OriginalRecordIDs&quot;]=K}},this);JazzRecord.each(this.options.belongsTo,function(L,K){var J=JazzRecord.models.get(L);var I=J.options.foreignKey;if(F[I]){var M=function(N){return J.first({id:F[I],depth:N})};if(C.depth&lt;1){F[K]=new JazzRecord.AssociationLoader(M)}else{F[K]=M(E)}}else{F[K]=null}});JazzRecord.each(this.options.hasAndBelongsToMany,function(P,O){var K=this;var I=[this.table,P].sort().toString().replace(&quot;,&quot;,&quot;_&quot;);var L=JazzRecord.models.get(P);var J=L.options.foreignKey;if(J){var N=function(T){var S=&quot;SELECT &quot;+P+&quot;.* FROM &quot;+I+&quot; INNER JOIN &quot;+P+&quot; ON &quot;+I+&quot;.&quot;+J+&quot;=&quot;+P+&quot;.id WHERE &quot;+I+&quot;.&quot;+K.options.foreignKey+&quot;=&quot;+F.id;var Q=JazzRecord.adapter.run(S);var R=[];JazzRecord.each(Q,function(W){var U={model:L,columns:L.options.columns,data:W};JazzRecord.each(L.options.events,function(Y,X){U[X]=Y});var V=new JazzRecord.Record(U);R.push(V)});return R};if(C.depth&lt;1){F[O]=new JazzRecord.AssociationLoader(N)}else{F[O]=N(E);var M=[];JazzRecord.each(F[O],function(Q){M.push(Q.id)});F[O+&quot;OriginalRecordIDs&quot;]=M}}},this);B.push(F)},this);if(A.indexOf(&quot;LIMIT 1&quot;)&gt;-1){return B[0]}else{return B}};JazzRecord.save=function(D,E,B){this.sql=&quot;{saveMode} {table} {set} {data} {conditions}&quot;;var A={saveMode:&quot;INSERT INTO&quot;,table:D,data:JazzRecord.columnNames(E)+JazzRecord.columnValues(E,B)};var C={};if(B.originalData){C.saveMode=&quot;UPDATE&quot;;C.set=&quot;SET&quot;;C.conditions=&quot;WHERE id=&quot;+B.originalData.id;C.data=&quot;&quot;;JazzRecord.each(E,function(G,F){C.data+=F+&quot;=&quot;+JazzRecord.typeValue(E,F,B[F])+&quot;, &quot;},this);C.data=C.data.slice(0,-2)}C=JazzRecord.shallowMerge(A,C);this.sql=JazzRecord.replaceAndClean(this.sql,C);return JazzRecord.adapter.save(this.sql)};JazzRecord.Model.prototype.save=function(A){return JazzRecord.save(this.table,this.options.columns,A)};JazzRecord.Model.prototype.destroy=function(B){var A=&quot;&quot;;if(JazzRecord.getType(B)===&quot;number&quot;){A=&quot;WHERE id=&quot;+B}else{if(JazzRecord.getType(B)===&quot;array&quot;){A=&quot;WHERE id IN (&quot;+B+&quot;)&quot;}}this.sql=&quot;DELETE FROM &quot;+this.table+&quot; &quot;+A;this.query()};JazzRecord.Model.prototype.destroyAll=function(){this.sql=&quot;DELETE FROM &quot;+this.table;this.query()};JazzRecord.Model.prototype.dropTable=function(){this.sql=&quot;DROP TABLE IF EXISTS &quot;+this.table;this.query()};JazzRecord.Model.prototype.find=function(A){if(!JazzRecord.isDefined(A)){throw (&quot;Missing ID or Options&quot;)}else{switch(JazzRecord.getType(A)){case&quot;array&quot;:A={id:A};break;case&quot;number&quot;:A={id:A,limit:1};break;case&quot;object&quot;:break;default:throw (&quot;Type Error. Model.find() expects Number, Array or Object&quot;)}}return this.select(A)};JazzRecord.Model.prototype.findBy=function(B,A,C){if(!this.options.columns[B]){throw (&quot;Column &quot;+B+&quot; Does Not Exist in Table &quot;+this.table)}else{return this.select({conditions:B+&quot;=&quot;+JazzRecord.typeValue(this.options.columns,B,A),limit:1,depth:C})}};JazzRecord.Model.prototype.findAllBy=function(B,A,C){if(!this.options.columns[B]){throw (&quot;Column &quot;+B+&quot; Does Not Exist in Table &quot;+this.table)}else{return this.select({conditions:B+&quot;=&quot;+JazzRecord.typeValue(this.options.columns,B,A),depth:C})}};JazzRecord.Model.prototype.all=function(A){return this.select(A)};JazzRecord.Model.prototype.first=function(A){A=JazzRecord.shallowMerge({limit:1},A);return this.select(A)};JazzRecord.Model.prototype.last=function(A){A=JazzRecord.shallowMerge({limit:1,order:&quot;id&quot;},A);A.order+=&quot; DESC&quot;;return this.select(A)};JazzRecord.Model.prototype.count=function(A){this.sql=&quot;SELECT COUNT(*) FROM &quot;+this.table;if(A){this.sql+=&quot; WHERE &quot;+A}return JazzRecord.adapter.count(this.sql)};JazzRecord.Model.prototype.select=function(B){if(!B){B={}}this.sql=&quot;SELECT {select} FROM &quot;+this.table+&quot; {conditions} {group} {order} {limit} {offset}&quot;;var A={select:&quot;*&quot;};B=JazzRecord.shallowMerge(A,B);if(B.select.indexOf(&quot;id&quot;)===-1&amp;&amp;B.select.indexOf(&quot;*&quot;)===-1){B.select=&quot;id, &quot;+B.select}if(B.order){B.order=&quot;ORDER BY &quot;+B.order}if(JazzRecord.getType(B.limit)==&quot;number&quot;){B.limit=&quot;LIMIT &quot;+B.limit}if(JazzRecord.getType(B.offset)==&quot;number&quot;){B.offset=&quot;OFFSET &quot;+B.offset}if(B.group){B.group=&quot;GROUP BY &quot;+B.group}if(B.conditions){B.conditions=&quot;WHERE &quot;+B.conditions;if(B.id){B.conditions+=&quot; AND id=&quot;+B.id}}else{if(B.id){if(JazzRecord.getType(B.id)==&quot;number&quot;){B.conditions=&quot;WHERE id=&quot;+B.id;B.limit=&quot;LIMIT 1&quot;}else{if(JazzRecord.getType(B.id)==&quot;array&quot;){B.conditions=&quot;WHERE id IN (&quot;+B.id+&quot;)&quot;}}}}this.sql=JazzRecord.replaceAndClean(this.sql,B);return this.query(B)};JazzRecord.schema=new JazzRecord.Model({table:&quot;schema_definitions&quot;,columns:{id:&quot;number&quot;,table_name:&quot;text&quot;,column_names:&quot;text&quot;,column_types:&quot;text&quot;}});JazzRecord.setupSchema=function(A){JazzRecord.createTable(&quot;schema_migrations&quot;,{version:&quot;text&quot;});if(JazzRecord.count(&quot;SELECT COUNT(*) FROM schema_migrations&quot;)===0){var B=&quot;INSERT INTO schema_migrations (version) VALUES(0)&quot;;JazzRecord.run(B)}if(A&amp;&amp;JazzRecord.count(&quot;SELECT COUNT(*) FROM schema_migrations&quot;)===1){var B=&quot;UPDATE schema_migrations set version = 0&quot;;JazzRecord.run(B)}JazzRecord.createTable(&quot;schema_definitions&quot;,{id:&quot;number&quot;,table_name:&quot;text&quot;,column_names:&quot;text&quot;,column_types:&quot;text&quot;})};JazzRecord.writeSchema=function(A,G){if(A===&quot;schema_definitions&quot;||A===&quot;schema_migrations&quot;){return }var H=&quot;&quot;;var E=new JazzRecord.Hash(G);var F=E.getKeys().join();var C=E.getValues().join();var D=JazzRecord.schema.findBy(&quot;table_name&quot;,A);if(D){D.column_names=F;D.column_types=C;D.save()}else{JazzRecord.schema.create({table_name:A,column_names:F,column_types:C})}var B=JazzRecord.models.get(A);if(B){B.options.columns={};JazzRecord.each(G,function(J,I){B.options.columns[I]=J})}};JazzRecord.readSchema=function(B){if(B===&quot;schema_definitions&quot;||B===&quot;schema_migrations&quot;){return }var C=JazzRecord.schema.findBy(&quot;table_name&quot;,B);var A=C.column_names.split(&quot;,&quot;);var E=C.column_types.split(&quot;,&quot;);var D={};JazzRecord.each(A,function(F,G){D[F]=E[G]});return D};JazzRecord.currentSchemaVersion=function(){var A=&quot;SELECT version FROM schema_migrations LIMIT 1&quot;;return parseInt(JazzRecord.run(A)[0].version,10)};JazzRecord.updateSchemaVersion=function(A){var B=&quot;UPDATE schema_migrations SET version = &quot;+A;JazzRecord.run(B)};JazzRecord.modifyColumn=function(B,A,C){if(!C){throw (&quot;MIGRATION_EXCEPTION: Not a valid column modification&quot;)}var E=JazzRecord.readSchema(B);var D={};JazzRecord.each(E,function(G,F){switch(C.modification){case&quot;remove&quot;:if(F!==A){D[F]=G}break;case&quot;rename&quot;:if(F!==A){D[F]=G}else{D[C.newName]=G}break;case&quot;change&quot;:if(F!==A){D[F]=G}else{D[F]=C.newType}break;default:throw (&quot;MIGRATION_EXCEPTION: Not a valid column modification&quot;)}});JazzRecord.runTransaction(function(){var F=JazzRecord.run(&quot;SELECT * FROM &quot;+B);JazzRecord.dropTable(B);JazzRecord.createTable(B,D);JazzRecord.each(F,function(G){switch(C.modification){case&quot;remove&quot;:delete G[A];JazzRecord.save(B,D,G);break;case&quot;rename&quot;:G[C.newName]=G[A];delete G[A];JazzRecord.save(B,D,G);break;case&quot;change&quot;:JazzRecord.save(B,D,G);break;default:throw (&quot;MIGRATION_EXCEPTION: Not a valid column modification&quot;)}})})};JazzRecord.createTable=function(A,B){if(!(JazzRecord.isDefined(A)&amp;&amp;JazzRecord.isDefined(B))){return }var C=&quot;CREATE TABLE IF NOT EXISTS &quot;+A;if(B){C+=&quot;(&quot;;JazzRecord.each(B,function(E,D){if(D===&quot;id&quot;){C+=&quot;id INTEGER PRIMARY KEY AUTOINCREMENT, &quot;}else{C+=(D+&quot; &quot;+E.toString().toUpperCase()+&quot;, &quot;)}});C=C.substr(0,C.length-2);C+=&quot;)&quot;;JazzRecord.run(C)}JazzRecord.writeSchema(A,B)};JazzRecord.dropTable=function(A){var C=&quot;DROP TABLE &quot;+A;JazzRecord.run(C);var B=JazzRecord.schema.findBy(&quot;table_name&quot;,A);B.destroy()};JazzRecord.renameTable=function(B,A){var D=&quot;ALTER TABLE &quot;+B+&quot; RENAME TO &quot;+A;JazzRecord.run(D);var C=JazzRecord.schema.findBy(&quot;table_name&quot;,B);C.updateAttribute(&quot;table_name&quot;,A)};JazzRecord.addColumn=function(C,B,A){var E=&quot;ALTER TABLE &quot;+C+&quot; ADD COLUMN &quot;+B+&quot; &quot;+A.toUpperCase();JazzRecord.run(E);var D=JazzRecord.readSchema(C);D[B]=A;JazzRecord.writeSchema(C,D)};JazzRecord.removeColumn=function(B,A){JazzRecord.modifyColumn(B,A,{modification:&quot;remove&quot;})};JazzRecord.renameColumn=function(B,A,D){var C={modification:&quot;rename&quot;,newName:D};JazzRecord.modifyColumn(B,A,C)};JazzRecord.changeColumn=function(B,A,D){var C={modification:&quot;change&quot;,newType:D};JazzRecord.modifyColumn(B,A,C)};JazzRecord.migrate=function(C){JazzRecord.setupSchema();if(JazzRecord.getType(C)===&quot;object&quot;){if(C.refresh){this.models.each(function(F){F.dropTable();JazzRecord.each(F.options.hasAndBelongsToMany,function(I){var G=[F.table,I].sort().toString().replace(&quot;,&quot;,&quot;_&quot;);var H=&quot;DROP TABLE IF EXISTS &quot;+G;JazzRecord.run(H)})});JazzRecord.setupSchema(true)}}var E={};if(JazzRecord.migrations){E=JazzRecord.migrations}if(E[1]&amp;&amp;JazzRecord.getType(E[1])===&quot;object&quot;){var B=JazzRecord.currentSchemaVersion();var A=Infinity;if(JazzRecord.getType(C)===&quot;object&quot;&amp;&amp;JazzRecord.isDefined(C.number)){A=C.number}else{if(JazzRecord.getType(C)===&quot;number&quot;){A=C}}var D=B;do{if(D===A){JazzRecord.puts(&quot;Up to date&quot;);return }else{if(D&lt;A){D+=1;if(JazzRecord.isDefined(E[D])){E[D].up()}else{break}}else{E[D].down();D-=1}}JazzRecord.updateSchemaVersion(D)}while(E[D])}else{JazzRecord.models.each(function(F){var G=&quot;CREATE TABLE IF NOT EXISTS &quot;+F.table+&quot;(id INTEGER PRIMARY KEY AUTOINCREMENT&quot;;JazzRecord.each(F.options.columns,function(I,H){if(H!==&quot;id&quot;){G+=(&quot;, &quot;+H+&quot; &quot;+I.toUpperCase())}});G+=&quot;)&quot;;JazzRecord.run(G);JazzRecord.each(F.options.hasAndBelongsToMany,function(N,I){var H=[F.table,N].sort().toString().replace(&quot;,&quot;,&quot;_&quot;);var J=F.options.foreignKey;var K=JazzRecord.models.get(N).options.foreignKey;var L=[J,K].sort();var M=&quot;CREATE TABLE IF NOT EXISTS &quot;+H+&quot;(&quot;+L[0]+&quot; INTEGER, &quot;+L[1]+&quot; INTEGER)&quot;;JazzRecord.run(M)});F.options.columns.id=&quot;int&quot;})}if(C&amp;&amp;C.refresh&amp;&amp;JazzRecord.fixtures){JazzRecord.loadFixtures()}};JazzRecord.loadFixtures=function(){var A=JazzRecord.fixtures;JazzRecord.each(A.tables,function(C,B){JazzRecord.each(C,function(D){JazzRecord.models.get(B).create(D)})});if(!A.mappingTables){return }JazzRecord.each(A.mappingTables,function(C,B){JazzRecord.each(C,function(F){var D=new JazzRecord.Hash(F);var E=&quot;INSERT INTO &quot;+B+&quot; (&quot;+D.getKeys().toString()+&quot;) VALUES(&quot;+D.getValues().toString()+&quot;)&quot;;JazzRecord.run(E)})})};
\ No newline at end of file
+var JazzRecord={each:function(E,C,F){switch(JazzRecord.getType(E)){case&quot;array&quot;:for(var B=0,A=E.length;B&lt;A;B++){C.call(F,E[B],B)}break;case&quot;object&quot;:for(var D in E){if(E.hasOwnProperty(D)){C.call(F,E[D],D)}}break}},isDefined:function(A){return !(typeof A===&quot;undefined&quot;||A===null)},getType:function(A){if(typeof A===&quot;undefined&quot;||A===null||(typeof A===&quot;number&quot;&amp;&amp;isNaN(A))){return false}else{if(A.constructor===Array){return&quot;array&quot;}else{return typeof A}}},debug:false,puts:function(A){if(JazzRecord.debug===false){return }if(typeof Titanium!==&quot;undefined&quot;){JazzRecord.puts=function(B){console.debug(B)}}else{if(typeof console!==&quot;undefined&quot;&amp;&amp;console.log){JazzRecord.puts=function(B){if(JazzRecord.debug===false){return }switch(JazzRecord.getType(B)){case&quot;object&quot;:if(console.dir){console.dir(B);break}default:console.log(B)}}}else{if(typeof air!==&quot;undefined&quot;){if(air.Introspector&amp;&amp;air.Introspector.Console){JazzRecord.puts=function(B){if(JazzRecord.debug===false){return }switch(JazzRecord.getType(B)){case&quot;string&quot;:air.Introspector.Console.log(B);break;case&quot;object&quot;:air.Introspector.Console.dump(B);break}}}else{JazzRecord.puts=function(B){if(JazzRecord.debug===false){return }air.trace(B)}}}else{JazzRecord.puts=function(B){}}}}JazzRecord.puts(A)},merge:function(){var F={};for(var C=0,A=arguments.length;C&lt;A;C++){var B=arguments[C];if(JazzRecord.getType(B)!==&quot;object&quot;){continue}for(var G in B){var E=B[G],D=F[G];if(D&amp;&amp;JazzRecord.getType(E)===&quot;object&quot;&amp;&amp;JazzRecord.getType(D)===&quot;object&quot;){F[G]=JazzRecord.merge(D,E)}else{F[G]=E}}}return F},shallowMerge:function(C,A){for(var B in A){C[B]=A[B]}return C},setOptions:function(A,C){if(!A){A={}}if(!this.options){this.options={}}mergedOptions=JazzRecord.merge(C,A);for(var B in C){this.options[B]=mergedOptions[B]}},replaceAndClean:function(B,A){for(opt in A){B=B.replace(&quot;{&quot;+opt+&quot;}&quot;,A[opt])}B=B.replace(/{\w+}/g,&quot;&quot;);return B.replace(/\s+/g,&quot; &quot;).replace(/^\s+|\s+$/g,&quot;&quot;)},extend:function(C,A){if(!this.options){this.options={}}this.parent=new C(A);for(var D in this.parent){this[D]=this[D]||this.parent[D]}for(var B in this.parent.options){this.options[B]=this.options[B]||this.parent.options[B]}},indexOf:function(A,E){var C=-1;if(A.indexOf){C=A.indexOf(E)}else{for(var D=0,B=A.length;D&lt;B;D++){if(A[D]===E){C=D;break}}}return C},arrayContainsVal:function(A,B){if(JazzRecord.indexOf(A,B)&gt;-1){return true}else{return false}},removeFromArray:function(A,C){var B=JazzRecord.indexOf(A,C);A.splice(B,1)}};JazzRecord.Hash=function(A){this.data=A||{}};JazzRecord.Hash.toQueryString=function(B){var A=[];JazzRecord.each(this.data,function(E,D){if(B){D=B+&quot;[&quot;+D+&quot;]&quot;}var C;switch(JazzRecord.getType(E)){case&quot;object&quot;:C=JazzRecord.Hash.toQueryString(E,D);break;case&quot;array&quot;:var F={};JazzRecord.each(E,function(G,H){F[H]=G});C=JazzRecord.Hash.toQueryString(F,D);break;default:C=D+&quot;=&quot;+encodeURIComponent(E)}if(E){A.push(C)}});return A.join(&quot;&amp;&quot;)};JazzRecord.Hash.prototype={has:function(A){if(this.data.hasOwnProperty(A)){return true}else{return false}},set:function(A,B){this.data[A]=B},get:function(A){return this.data[A]},getLength:function(){var B=0;for(var A in this.data){if(this.data.hasOwnProperty(A)){B++}}return B},each:function(A,B){JazzRecord.each(this.data,A,B)},toQueryString:JazzRecord.Hash.toQueryString,getValues:function(){var A=[];this.each(function(B){A.push(B)});return A},getKeys:function(){var A=[];this.each(function(C,B){A.push(B)});return A}};JazzRecord.models=new JazzRecord.Hash();JazzRecord.depth=1;JazzRecord.run=function(C,B,A){return JazzRecord.adapter.run(C,B,A)};JazzRecord.count=function(C,B,A){return JazzRecord.adapter.count(C,B,A)};JazzRecord.save=function(C,B,A){return JazzRecord.adapter.save(C,B,A)};JazzRecord.runTransaction=function(A,C){JazzRecord.run(&quot;BEGIN&quot;);try{A.apply(C||this)}catch(B){JazzRecord.run(&quot;ROLLBACK&quot;);throw (B)}JazzRecord.run(&quot;END&quot;)};JazzRecord.Adapter=function(){this.run=this.count=this.save=function(A){JazzRecord.puts(A)}};JazzRecord.AirAdapter=function(A){JazzRecord.setOptions.call(this,A,{dbFile:&quot;jazz_record.db&quot;});JazzRecord.extend.call(this,JazzRecord.Adapter);this.connection=new air.SQLConnection();this.dbFile=air.File.applicationDirectory.resolvePath(this.options.dbFile);this.connection.open(this.dbFile,air.SQLMode.CREATE);this.statement=new air.SQLStatement();this.statement.sqlConnection=this.connection};JazzRecord.AirAdapter.prototype={run:function(B){this.parent.run(B);this.statement.text=B;this.statement.execute();var A=this.statement.getResult();return A.data},count:function(A){this.parent.count(A);A=A.toUpperCase();return this.run(A)[0][&quot;COUNT(*)&quot;]},save:function(A){this.parent.save(A);this.statement.text=A;this.statement.execute();return this.statement.getResult().lastInsertRowID}};JazzRecord.GearsAdapter=function(A){JazzRecord.setOptions.call(this,A,{dbFile:&quot;jazz_record.db&quot;});JazzRecord.extend.call(this,JazzRecord.Adapter);this.db=google.gears.factory.create(&quot;beta.database&quot;);this.db.open(this.options.dbFile);this.result=null};JazzRecord.GearsAdapter.prototype={run:function(D){this.parent.run(D);this.result=this.db.execute(D);var C=[];while(this.result.isValidRow()){var F={};for(var B=0,A=this.result.fieldCount();B&lt;A;B++){var E=this.result.fieldName(B);F[E]=this.result.field(B)}C.push(F);this.result.next()}this.result.close();return C},count:function(B){this.parent.count(B);this.result=this.db.execute(B);var A=this.result.field(0);this.result.close();return A},save:function(A){this.parent.save(A);this.db.execute(A);return this.db.lastInsertRowId}};JazzRecord.TitaniumAdapter=function(A){JazzRecord.setOptions.call(this,A,{dbFile:&quot;jazz_record.db&quot;});JazzRecord.extend.call(this,JazzRecord.Adapter);this.db=Titanium.Database.open(this.options.dbFile);this.result=null};JazzRecord.TitaniumAdapter.prototype=JazzRecord.GearsAdapter.prototype;JazzRecord.HTML5Adapter=function(A){JazzRecord.setOptions.call(this,A,{dbFile:&quot;jazz_record.db&quot;});JazzRecord.extend.call(this,JazzRecord.Adapter,A);this.db=openDatabase(this.options.dbFile)};JazzRecord.HTML5Adapter.prototype={run:function(B,C,A){this.parent.run(B);this.db.transaction(function(D){D.executeSql(B,[],function(E,H){var I=[];for(var G=0,F=H.rows.length;G&lt;F;G++){I.push(H.rows.item(G))}if(C){C(I)}},function(E,F){if(A){A(F.message)}else{JazzRecord.puts(&quot;There was an error: &quot;+F.message)}})})},count:function(B,C,A){this.parent.count(B);this.db.transaction(function(D){D.executeSql(B,[],function(E,F){if(C){C(F.rows.item(0)[&quot;COUNT(*)&quot;])}},function(E,F){if(A){A(F.message)}else{JazzRecord.puts(&quot;There was an error: &quot;+F.message)}})})},save:function(B,C,A){this.parent.save(B);this.db.transaction(function(D){D.executeSql(B,[],function(E,F){if(C){C(F.insertId)}},function(E,F){if(A){A(F.message)}else{JazzRecord.puts(&quot;There was an error: &quot;+F.message)}})})}};JazzRecord.Record=function(A){var B={model:null,columns:{},data:{},onCreate:function(){},onUpdate:function(){},onSave:function(){},onDestroy:function(){}};this.id=null;JazzRecord.setOptions.call(this,A,B);this.errors={};this.onCreate=this.options.onCreate;this.onUpdate=this.options.onUpdate;this.onSave=this.options.onSave;this.onDestroy=this.options.onDestroy;if(this.options.data.id){this.id=this.options.data.id;this.originalData={};this.isNew=function(){return false}}else{this.isNew=function(){return true}}JazzRecord.each(this.options.columns,function(D,C){this[C]=null;this[C]=this.options.data[C];if(this.originalData){this.originalData[C]=this.options.data[C]}if(D===&quot;bool&quot;){var E=(this[C]?true:false);if(this.originalData){this.originalData[C]=E}this[C]=E}},this);JazzRecord.each(this.options.model.options.recordMethods,function(D,C){this[C]=D},this)};JazzRecord.Record.prototype={destroy:function(){if(!this.id){throw (&quot;Unsaved record cannot be destroyed&quot;)}else{this.options.model.destroy(this.id);JazzRecord.each(this.options.model.options.hasMany,function(B,A){this.load(A);JazzRecord.each(this[A],function(C){C.updateAttribute(this.options.model.options.foreignKey,null)},this);this[A+&quot;OriginalRecordIDs&quot;]=[]},this);JazzRecord.each(this.options.model.options.hasAndBelongsToMany,function(C,B){var A=[this.options.model.table,C].sort().join(&quot;_&quot;);sql=&quot;DELETE FROM &quot;+A+&quot; WHERE &quot;+this.options.model.options.foreignKey+&quot;=&quot;+this.id+&quot;;&quot;;JazzRecord.adapter.run(sql)},this);JazzRecord.each(this.options.model.options.hasOne,function(B,A){this.load(A);if(!this[A]){return }this[A].updateAttribute(this.options.model.options.foreignKey,null);this[A+&quot;OriginalRecordID&quot;]=null},this);this.onDestroy();this.id=null;this.originalData=null;this.isNew=function(){return true}}},getData:function(){var A={};JazzRecord.each(this.options.columns,function(C,B){A[B]=this[B]},this);return A},revert:function(){JazzRecord.each(this.options.columns,function(B,A){this[A]=this.originalData[A]},this);JazzRecord.each(this.options.model.options.belongsTo,function(D,C){var B=JazzRecord.models.get(D);var A=B.options.foreignKey;if(this[C]&amp;&amp;!this[C].unloaded&amp;&amp;this[C].id!==this[A]){this[C]=B.find({id:this[A],depth:0})}},this)},reload:function(){if(!this.id){throw (&quot;Unsaved record cannot be reloaded&quot;)}else{var A=this.options.model.find(this.id);JazzRecord.shallowMerge(this,A)}},load:function(A,C){if(!C){C=0}if(this[A]&amp;&amp;this[A].unloaded){this[A]=this[A].loader(C);if(JazzRecord.getType(this[A])===&quot;array&quot;){var B=[];JazzRecord.each(this[A],function(D){B.push(D.id)});this[A+&quot;OriginalRecordIDs&quot;]=B}else{if(this[A]&amp;&amp;this[A].id){this[A+&quot;OriginalRecordID&quot;]=this[A].id}}}return this[A]},updateAttribute:function(A,B){this[A]=B;this.save()}};JazzRecord.Record.prototype.isChanged=function(){if(this.isNew()){return false}JazzRecord.each(this.options.model.options.belongsTo,function(F,E){var D=JazzRecord.models.get(F);var C=D.options.foreignKey;if(!this.originalData){return false}if(this[E]){if(this[E].unloaded){if(this[C]!==this.originalData[C]){return true}}else{if(this[E].isNew()){this[E].save()}if(this[E].id!==this.originalData[C]){this[C]=this[E].id;return true}if(this[C]!==this.originalData[C]){return true}}}else{if(this.originalData[C]){this[C]=null;return true}}},this);var B=new JazzRecord.Hash(this.getData());var A=new JazzRecord.Hash(this.originalData);if(this.id&amp;&amp;B.toQueryString()===A.toQueryString()){return false}else{return true}};JazzRecord.Record.prototype.save=function(){var A=this.options.model.options.foreignKey;if(!this.originalData){JazzRecord.each(this.options.model.options.belongsTo,function(F,E){var C=JazzRecord.models.get(F);var D=C.options.foreignKey;if(this[E]){if(this[E].unloaded){this.load(E)}}if(this[E]&amp;&amp;this[E].id){this[D]=this[E].id}},this)}JazzRecord.each(this.options.model.options.hasOne,function(F,E){if(this[E]){if(this[E].unloaded){this.load(E);if(!this[E]){return }}if(!JazzRecord.isDefined(this[E+&quot;OriginalRecordID&quot;])){this[E].updateAttribute(A,this.id)}else{if(this[E+&quot;OriginalRecordID&quot;]!==this[E].id){var D=JazzRecord.models.get(F);var C=D.first({id:this[E+&quot;OriginalRecordID&quot;],depth:0});C.updateAttribute(A,null)}}this[E].updateAttribute(A,this.id);this[E+&quot;OriginalRecordID&quot;]=this[E].id}else{if(this[E+&quot;OriginalRecordID&quot;]){var D=JazzRecord.models.get(F);var C=D.first({id:this[E+&quot;OriginalRecordID&quot;],depth:0});C.updateAttribute(A,null)}}},this);JazzRecord.each(this.options.model.options.hasMany,function(G,F){if(this[F]){if(this[F].length){var D=JazzRecord.models.get(G);var C=this[F+&quot;OriginalRecordIDs&quot;];JazzRecord.each(this[F],function(H,I){if(H){H[A]=this.id;H.save();if(JazzRecord.arrayContainsVal(C,H.id)){JazzRecord.removeFromArray(C,H.id)}}},this);JazzRecord.each(this[F],function(H,I){if(!JazzRecord.isDefined(H)){this[F].splice(I,1)}},this);JazzRecord.each(C,function(I){var H=D.find(I);if(H){H.updateAttribute(A,null)}});var E=[];JazzRecord.each(this[F],function(H){if(H){E.push(H.id)}});this[F+&quot;OriginalRecordIDs&quot;]=E}}else{this[F]=[];this[F+&quot;OriginalRecordIDs&quot;]=[]}},this);JazzRecord.each(this.options.model.options.hasAndBelongsToMany,function(I,H){if(this[H]){if(this[H].length){var C=[this.options.model.table,I].sort().join(&quot;_&quot;);var G=JazzRecord.models.get(I).options.foreignKey;var F=&quot;&quot;;var D=this[H+&quot;OriginalRecordIDs&quot;];JazzRecord.each(this[H],function(J){J.save();if(JazzRecord.arrayContainsVal(D,J.id)){JazzRecord.removeFromArray(D,J.id)}else{F=&quot;INSERT INTO &quot;+C+&quot; (&quot;+A+&quot;, &quot;+G+&quot;) VALUES(&quot;+this.id+&quot;, &quot;+J.id+&quot;)&quot;;JazzRecord.adapter.run(F)}},this);JazzRecord.each(D,function(J){F=&quot;DELETE FROM &quot;+C+&quot; WHERE &quot;+A+&quot;=&quot;+this.id+&quot; AND &quot;+G+&quot;=&quot;+J+&quot;;&quot;;JazzRecord.adapter.run(F)},this);var E=[];JazzRecord.each(this[H],function(J){E.push(J.id)});this[H+&quot;OriginalRecordIDs&quot;]=E}}else{this[H]=[];this[H+&quot;OriginalRecordIDs&quot;]=[]}},this);this.errors={};if(this.isNew()){if(this.isValid(&quot;create&quot;)){this.onCreate()}}else{if(this.isValid(&quot;update&quot;)&amp;&amp;this.isChanged()){this.onUpdate()}}if(this.isValid(&quot;save&quot;)){var B=this.getData();if(this.isChanged()){this.onSave();B.originalData=this.originalData?this.originalData:{id:this.id};this.options.model.save(B);this.reload()}else{if(this.isNew()){this.onSave();this.id=this.options.model.save(B)}}this.originalData={};JazzRecord.each(this.options.model.options.columns,function(D,C){this.originalData[C]=this[C]},this);this.isNew=function(){return false};return true}return false};JazzRecord.Model=function(A){var B={table:&quot;&quot;,columns:{},foreignKey:&quot;&quot;,hasOne:{},belongsTo:{},hasMany:{},hasAndBelongsToMany:{},events:{},modelMethods:{},recordMethods:{},validate:{atCreate:function(){},atUpdate:function(){},atSave:function(){}}};JazzRecord.setOptions.call(this,A,B);this.table=this.options.table;this.sql=&quot;&quot;;JazzRecord.each(this.options.modelMethods,function(D,C){this[C]=D},this);if(!JazzRecord.models.has(this.table)){JazzRecord.models.set(this.table,this)}};JazzRecord.Model.prototype={newRecord:function(C){if(!C){C={}}var D={};JazzRecord.each(this.options.columns,function(F,E){D[E]=C[E]||null});var B={model:this,columns:this.options.columns,data:D};JazzRecord.each(this.options.events,function(F,E){B[E]=F});var A=new JazzRecord.Record(B);A.isNew=function(){return true};return A},create:function(B){var A=this.newRecord(B);A.save();return A}};JazzRecord.AssociationLoader=function(A){this.loader=A;this.unloaded=true};JazzRecord.AssociationLoader.prototype={toString:function(){return&quot;Not yet loaded&quot;}};JazzRecord.columnNames=function(B){var A=&quot;(&quot;;JazzRecord.each(B,function(D,C){A+=C+&quot;, &quot;});A=A.substr(0,A.length-2);return A+&quot;)&quot;};JazzRecord.columnValues=function(C,B){var A=&quot; VALUES(&quot;;JazzRecord.each(C,function(E,D){A+=JazzRecord.typeValue(C,D,B[D])+&quot;, &quot;},this);A=A.substr(0,A.length-2);return A+&quot;)&quot;};JazzRecord.typeValue=function(B,A,C){if(C===null){return&quot;NULL&quot;}else{switch(B[A]){case&quot;string&quot;:case&quot;text&quot;:if(JazzRecord.getType(C)===&quot;string&quot;){C=C.replace(/'/g,&quot;''&quot;)}return&quot;'&quot;+C+&quot;'&quot;;case&quot;int&quot;:C=parseInt(C,10);return JazzRecord.getType(C)===&quot;number&quot;?C:0;case&quot;number&quot;:case&quot;float&quot;:C=parseFloat(C);return JazzRecord.getType(C)===&quot;number&quot;?C:0;case&quot;bool&quot;:if(C){return 1}else{return 0}}}};JazzRecord.Record.prototype.validatesAtCreate=function(){this.options.model.options.validate.atCreate.apply(this)};JazzRecord.Record.prototype.validatesAtUpdate=function(){this.options.model.options.validate.atUpdate.apply(this)};JazzRecord.Record.prototype.validatesAtSave=function(){this.options.model.options.validate.atSave.apply(this)};JazzRecord.Record.prototype.isValid=function(A){switch(A){case&quot;create&quot;:this.validatesAtCreate();break;case&quot;update&quot;:this.validatesAtUpdate();break;case&quot;save&quot;:this.validatesAtSave();break;default:this.errors={};if(this.id){this.validatesAtUpdate();this.validatesAtSave()}else{this.validatesAtCreate();this.validatesAtSave()}}var B=0;for(var C in this.errors){B++}if(B===0){return true}else{return false}};JazzRecord.Record.prototype.pushError=function(A,B){if(!this.errors[A]){this.errors[A]=[]}this.errors[A].push(B)};JazzRecord.Record.prototype.validatesAcceptanceOf=function(A,B){var C=this[A];if(C&amp;&amp;JazzRecord.isDefined(C)&amp;&amp;JazzRecord.getType(C)===&quot;boolean&quot;){return }B=JazzRecord.isDefined(B)?B:(A+&quot; must be accepted&quot;);this.pushError(A,B)};JazzRecord.Record.prototype.validatesConfirmationOf=function(A,B){var C=this[A];var D=this[A+&quot;_confirmation&quot;];if(C!==D||!JazzRecord.isDefined(D)||D==&quot;&quot;){B=JazzRecord.isDefined(B)?B:A+&quot; doesn't match confirmation&quot;;this.pushError(A,B)}};JazzRecord.Record.prototype.validatesExclusionOf=function(A,C,B){if(this[A]&amp;&amp;JazzRecord.indexOf(C,this[A])&gt;-1){B=JazzRecord.isDefined(B)?B:(A+&quot; is reserved&quot;);this.pushError(A,B)}};JazzRecord.Record.prototype.validatesInclusionOf=function(A,C,B){if(this[A]&amp;&amp;!(JazzRecord.indexOf(C,this[A])&gt;-1)){B=JazzRecord.isDefined(B)?B:(A+&quot; is not included in the list&quot;);this.pushError(A,B)}};JazzRecord.Record.prototype.validatesFormatOf=function(A,C,B){val=this[A];if(val&amp;&amp;!val.match(C)){B=JazzRecord.isDefined(B)?B:(A+&quot; does not match expected format: &quot;+C.toString());this.pushError(A,B)}};JazzRecord.Record.prototype.validatesLengthOf=function(C,B,D){var A={minimum:0,maximum:Infinity,allowEmpty:true,tooShort:C+&quot; is too short&quot;,tooLong:C+&quot; is too long&quot;,wrongLength:C+&quot; is not the correct length&quot;};B=JazzRecord.shallowMerge(A,B);if(!JazzRecord.isDefined(this[C])||this[C]&amp;&amp;this[C].length&amp;&amp;this[C].length&gt;=B.minimum&amp;&amp;this[C].length&lt;=B.maximum){if(!JazzRecord.isDefined(B.is)||(B.is&amp;&amp;this[C].length===B.is)){return }}if(this[C].length&lt;B.minimum){this.pushError(C,B.tooShort)}if(this[C].length&gt;B.maximum){this.pushError(C,B.tooLong)}if(B.is&amp;&amp;this[C].length!==B.is){this.pushError(C,B.wrongLength)}};JazzRecord.Record.prototype.validatesNumericalityOf=function(A,B){var C=this[A];if(C&amp;&amp;JazzRecord.isDefined(C)&amp;&amp;JazzRecord.getType(C)!==&quot;number&quot;){B=JazzRecord.isDefined(B)?B:(A+&quot; is not a number&quot;);this.pushError(A,B)}};JazzRecord.Record.prototype.validatesPresenceOf=function(A,B){var C=this[A];if(!JazzRecord.isDefined(C)||C===&quot;&quot;){B=JazzRecord.isDefined(B)?B:(A+&quot; can't be empty, null or blank&quot;);this.pushError(A,B)}};JazzRecord.Record.prototype.validatesUniquenessOf=function(A,B){var D=this[A];var C=this.options.model.findBy(A,D,0);if(C&amp;&amp;C.id!=this.id){B=JazzRecord.isDefined(B)?B:(A+&quot; is not unique&quot;);this.pushError(A,B)}};JazzRecord.Record.prototype.validatesAssociated=function(C,B){if(!JazzRecord.isDefined(this[C])||(this[C]&amp;&amp;this[C].unloaded)){return }var A=[];if(JazzRecord.getType(this[C])===&quot;array&quot;){A=this[C]}else{A=[this[C]]}JazzRecord.each(A,function(D){if(D&amp;&amp;!D.isValid()){B=JazzRecord.isDefined(B)?B:C+&quot; is not valid&quot;;this.pushError(C,B);return }},this)};JazzRecord.Record.prototype.validatesIsString=function(A,B){var C=this[A];if(JazzRecord.getType(C)&amp;&amp;JazzRecord.getType(C)!==&quot;string&quot;){B=JazzRecord.isDefined(B)?B:(A+&quot; is not a string&quot;);this.pushError(A,B)}};JazzRecord.Record.prototype.validatesIsBool=function(A,B){var C=this[A];if(JazzRecord.getType(C)&amp;&amp;JazzRecord.getType(C)!==&quot;boolean&quot;){B=JazzRecord.isDefined(B)?B:(A+&quot; is not a bool&quot;);this.pushError(A,B)}};JazzRecord.Record.prototype.validatesIsInt=function(A,B){var C=this[A];if(JazzRecord.getType(C)){if(JazzRecord.getType(C)!==&quot;number&quot;||parseInt(C,10)!==C){B=JazzRecord.isDefined(B)?B:(A+&quot; is not an integer&quot;);this.pushError(A,B)}}};JazzRecord.Record.prototype.validatesIsFloat=function(A,B){var C=this[A];if(JazzRecord.getType(C)){if(JazzRecord.getType(C)!==&quot;number&quot;||parseFloat(C)!==C){B=JazzRecord.isDefined(B)?B:(A+&quot; is not an float&quot;);this.pushError(A,B)}}};JazzRecord.Model.prototype.query=function(C){if(!JazzRecord.isDefined(C)){C={}}if(!JazzRecord.isDefined(C.depth)){C.depth=JazzRecord.depth}var E=C.depth-1;if(E&lt;0){E=0}var A=this.sql;var D=JazzRecord.adapter.run(A);if(!D||D.length===0){if(this.sql.indexOf(&quot;LIMIT&quot;)&gt;-1){return null}else{return[]}}var B=[];JazzRecord.each(D,function(H){var G={model:this,columns:this.options.columns,data:H};JazzRecord.each(this.options.events,function(J,I){G[I]=J});var F=new JazzRecord.Record(G);JazzRecord.each(this.options.hasOne,function(M,L){var K=JazzRecord.models.get(M);var I=this.options.foreignKey;var J=function(N){return K.findBy(I,H.id,N)};if(C.depth&lt;1){F[L]=new JazzRecord.AssociationLoader(J)}else{F[L]=J(E);if(F[L]){F[L+&quot;OriginalRecordID&quot;]=F[L].id}}},this);JazzRecord.each(this.options.hasMany,function(N,M){var J=JazzRecord.models.get(N);var I=this.options.foreignKey;var L=function(O){return J.findAllBy(I,H.id,O)};if(C.depth&lt;1){F[M]=new JazzRecord.AssociationLoader(L)}else{F[M]=L(E);var K=[];JazzRecord.each(F[M],function(O){K.push(O.id)});F[M+&quot;OriginalRecordIDs&quot;]=K}},this);JazzRecord.each(this.options.belongsTo,function(L,K){var J=JazzRecord.models.get(L);var I=J.options.foreignKey;if(F[I]){var M=function(N){return J.first({id:F[I],depth:N})};if(C.depth&lt;1){F[K]=new JazzRecord.AssociationLoader(M)}else{F[K]=M(E)}}else{F[K]=null}});JazzRecord.each(this.options.hasAndBelongsToMany,function(P,O){var K=this;var I=[this.table,P].sort().toString().replace(&quot;,&quot;,&quot;_&quot;);var L=JazzRecord.models.get(P);var J=L.options.foreignKey;if(J){var N=function(T){var S=&quot;SELECT &quot;+P+&quot;.* FROM &quot;+I+&quot; INNER JOIN &quot;+P+&quot; ON &quot;+I+&quot;.&quot;+J+&quot;=&quot;+P+&quot;.id WHERE &quot;+I+&quot;.&quot;+K.options.foreignKey+&quot;=&quot;+F.id;var Q=JazzRecord.adapter.run(S);var R=[];JazzRecord.each(Q,function(W){var U={model:L,columns:L.options.columns,data:W};JazzRecord.each(L.options.events,function(Y,X){U[X]=Y});var V=new JazzRecord.Record(U);R.push(V)});return R};if(C.depth&lt;1){F[O]=new JazzRecord.AssociationLoader(N)}else{F[O]=N(E);var M=[];JazzRecord.each(F[O],function(Q){M.push(Q.id)});F[O+&quot;OriginalRecordIDs&quot;]=M}}},this);B.push(F)},this);if(A.indexOf(&quot;LIMIT 1&quot;)&gt;-1){return B[0]}else{return B}};JazzRecord.save=function(D,E,B){this.sql=&quot;{saveMode} {table} {set} {data} {conditions}&quot;;var A={saveMode:&quot;INSERT INTO&quot;,table:D,data:JazzRecord.columnNames(E)+JazzRecord.columnValues(E,B)};var C={};if(B.originalData){C.saveMode=&quot;UPDATE&quot;;C.set=&quot;SET&quot;;C.conditions=&quot;WHERE id=&quot;+B.originalData.id;C.data=&quot;&quot;;JazzRecord.each(E,function(G,F){C.data+=F+&quot;=&quot;+JazzRecord.typeValue(E,F,B[F])+&quot;, &quot;},this);C.data=C.data.slice(0,-2)}C=JazzRecord.shallowMerge(A,C);this.sql=JazzRecord.replaceAndClean(this.sql,C);return JazzRecord.adapter.save(this.sql)};JazzRecord.Model.prototype.save=function(A){return JazzRecord.save(this.table,this.options.columns,A)};JazzRecord.Model.prototype.destroy=function(B){var A=&quot;&quot;;if(JazzRecord.getType(B)===&quot;number&quot;){A=&quot;WHERE id=&quot;+B}else{if(JazzRecord.getType(B)===&quot;array&quot;){A=&quot;WHERE id IN (&quot;+B+&quot;)&quot;}}this.sql=&quot;DELETE FROM &quot;+this.table+&quot; &quot;+A;this.query()};JazzRecord.Model.prototype.destroyAll=function(){this.sql=&quot;DELETE FROM &quot;+this.table;this.query()};JazzRecord.Model.prototype.dropTable=function(){this.sql=&quot;DROP TABLE IF EXISTS &quot;+this.table;this.query()};JazzRecord.Model.prototype.find=function(A){if(!JazzRecord.isDefined(A)){throw (&quot;Missing ID or Options&quot;)}else{switch(JazzRecord.getType(A)){case&quot;array&quot;:A={id:A};break;case&quot;number&quot;:A={id:A,limit:1};break;case&quot;object&quot;:break;default:throw (&quot;Type Error. Model.find() expects Number, Array or Object&quot;)}}return this.select(A)};JazzRecord.Model.prototype.findBy=function(B,A,C){if(!this.options.columns[B]){throw (&quot;Column &quot;+B+&quot; Does Not Exist in Table &quot;+this.table)}else{return this.select({conditions:B+&quot;=&quot;+JazzRecord.typeValue(this.options.columns,B,A),limit:1,depth:C})}};JazzRecord.Model.prototype.findAllBy=function(B,A,C){if(!this.options.columns[B]){throw (&quot;Column &quot;+B+&quot; Does Not Exist in Table &quot;+this.table)}else{return this.select({conditions:B+&quot;=&quot;+JazzRecord.typeValue(this.options.columns,B,A),depth:C})}};JazzRecord.Model.prototype.all=function(A){return this.select(A)};JazzRecord.Model.prototype.first=function(A){A=JazzRecord.shallowMerge({limit:1},A);return this.select(A)};JazzRecord.Model.prototype.last=function(A){A=JazzRecord.shallowMerge({limit:1,order:&quot;id&quot;},A);A.order+=&quot; DESC&quot;;return this.select(A)};JazzRecord.Model.prototype.count=function(A){this.sql=&quot;SELECT COUNT(*) FROM &quot;+this.table;if(A){this.sql+=&quot; WHERE &quot;+A}return JazzRecord.adapter.count(this.sql)};JazzRecord.Model.prototype.select=function(B){if(!B){B={}}this.sql=&quot;SELECT {select} FROM &quot;+this.table+&quot; {conditions} {group} {order} {limit} {offset}&quot;;var A={select:&quot;*&quot;};B=JazzRecord.shallowMerge(A,B);if(B.select.indexOf(&quot;id&quot;)===-1&amp;&amp;B.select.indexOf(&quot;*&quot;)===-1){B.select=&quot;id, &quot;+B.select}if(B.order){B.order=&quot;ORDER BY &quot;+B.order}if(JazzRecord.getType(B.limit)==&quot;number&quot;){B.limit=&quot;LIMIT &quot;+B.limit}if(JazzRecord.getType(B.offset)==&quot;number&quot;){B.offset=&quot;OFFSET &quot;+B.offset}if(B.group){B.group=&quot;GROUP BY &quot;+B.group}if(B.conditions){B.conditions=&quot;WHERE &quot;+B.conditions;if(B.id){B.conditions+=&quot; AND id=&quot;+B.id}}else{if(B.id){if(JazzRecord.getType(B.id)==&quot;number&quot;){B.conditions=&quot;WHERE id=&quot;+B.id;B.limit=&quot;LIMIT 1&quot;}else{if(JazzRecord.getType(B.id)==&quot;array&quot;){B.conditions=&quot;WHERE id IN (&quot;+B.id+&quot;)&quot;}}}}this.sql=JazzRecord.replaceAndClean(this.sql,B);return this.query(B)};JazzRecord.schema=new JazzRecord.Model({table:&quot;schema_definitions&quot;,columns:{id:&quot;number&quot;,table_name:&quot;text&quot;,column_names:&quot;text&quot;,column_types:&quot;text&quot;}});JazzRecord.setupSchema=function(A){JazzRecord.createTable(&quot;schema_migrations&quot;,{version:&quot;text&quot;});if(JazzRecord.count(&quot;SELECT COUNT(*) FROM schema_migrations&quot;)===0){var B=&quot;INSERT INTO schema_migrations (version) VALUES(0)&quot;;JazzRecord.run(B)}if(A&amp;&amp;JazzRecord.count(&quot;SELECT COUNT(*) FROM schema_migrations&quot;)===1){var B=&quot;UPDATE schema_migrations set version = 0&quot;;JazzRecord.run(B)}JazzRecord.createTable(&quot;schema_definitions&quot;,{id:&quot;number&quot;,table_name:&quot;text&quot;,column_names:&quot;text&quot;,column_types:&quot;text&quot;})};JazzRecord.writeSchema=function(A,G){if(A===&quot;schema_definitions&quot;||A===&quot;schema_migrations&quot;){return }var H=&quot;&quot;;var E=new JazzRecord.Hash(G);var F=E.getKeys().join();var C=E.getValues().join();var D=JazzRecord.schema.findBy(&quot;table_name&quot;,A);if(D){D.column_names=F;D.column_types=C;D.save()}else{JazzRecord.schema.create({table_name:A,column_names:F,column_types:C})}var B=JazzRecord.models.get(A);if(B){B.options.columns={};JazzRecord.each(G,function(J,I){B.options.columns[I]=J})}};JazzRecord.readSchema=function(B){if(B===&quot;schema_definitions&quot;||B===&quot;schema_migrations&quot;){return }var C=JazzRecord.schema.findBy(&quot;table_name&quot;,B);var A=C.column_names.split(&quot;,&quot;);var E=C.column_types.split(&quot;,&quot;);var D={};JazzRecord.each(A,function(F,G){D[F]=E[G]});return D};JazzRecord.currentSchemaVersion=function(){var A=&quot;SELECT version FROM schema_migrations LIMIT 1&quot;;return parseInt(JazzRecord.run(A)[0].version,10)};JazzRecord.updateSchemaVersion=function(A){var B=&quot;UPDATE schema_migrations SET version = &quot;+A;JazzRecord.run(B)};JazzRecord.modifyColumn=function(B,A,C){if(!C){throw (&quot;MIGRATION_EXCEPTION: Not a valid column modification&quot;)}var E=JazzRecord.readSchema(B);var D={};JazzRecord.each(E,function(G,F){switch(C.modification){case&quot;remove&quot;:if(F!==A){D[F]=G}break;case&quot;rename&quot;:if(F!==A){D[F]=G}else{D[C.newName]=G}break;case&quot;change&quot;:if(F!==A){D[F]=G}else{D[F]=C.newType}break;default:throw (&quot;MIGRATION_EXCEPTION: Not a valid column modification&quot;)}});JazzRecord.runTransaction(function(){var F=JazzRecord.run(&quot;SELECT * FROM &quot;+B);JazzRecord.dropTable(B);JazzRecord.createTable(B,D);JazzRecord.each(F,function(G){switch(C.modification){case&quot;remove&quot;:delete G[A];JazzRecord.save(B,D,G);break;case&quot;rename&quot;:G[C.newName]=G[A];delete G[A];JazzRecord.save(B,D,G);break;case&quot;change&quot;:JazzRecord.save(B,D,G);break;default:throw (&quot;MIGRATION_EXCEPTION: Not a valid column modification&quot;)}})})};JazzRecord.createTable=function(A,B){if(!(JazzRecord.isDefined(A)&amp;&amp;JazzRecord.isDefined(B))){return }var C=&quot;CREATE TABLE IF NOT EXISTS &quot;+A;if(B){C+=&quot;(&quot;;JazzRecord.each(B,function(E,D){if(D===&quot;id&quot;){C+=&quot;id INTEGER PRIMARY KEY AUTOINCREMENT, &quot;}else{C+=(D+&quot; &quot;+E.toString().toUpperCase()+&quot;, &quot;)}});C=C.substr(0,C.length-2);C+=&quot;)&quot;;JazzRecord.run(C)}JazzRecord.writeSchema(A,B)};JazzRecord.dropTable=function(A){var C=&quot;DROP TABLE &quot;+A;JazzRecord.run(C);var B=JazzRecord.schema.findBy(&quot;table_name&quot;,A);B.destroy()};JazzRecord.renameTable=function(B,A){var D=&quot;ALTER TABLE &quot;+B+&quot; RENAME TO &quot;+A;JazzRecord.run(D);var C=JazzRecord.schema.findBy(&quot;table_name&quot;,B);C.updateAttribute(&quot;table_name&quot;,A)};JazzRecord.addColumn=function(C,B,A){var E=&quot;ALTER TABLE &quot;+C+&quot; ADD COLUMN &quot;+B+&quot; &quot;+A.toUpperCase();JazzRecord.run(E);var D=JazzRecord.readSchema(C);D[B]=A;JazzRecord.writeSchema(C,D)};JazzRecord.removeColumn=function(B,A){JazzRecord.modifyColumn(B,A,{modification:&quot;remove&quot;})};JazzRecord.renameColumn=function(B,A,D){var C={modification:&quot;rename&quot;,newName:D};JazzRecord.modifyColumn(B,A,C)};JazzRecord.changeColumn=function(B,A,D){var C={modification:&quot;change&quot;,newType:D};JazzRecord.modifyColumn(B,A,C)};JazzRecord.migrate=function(C){JazzRecord.setupSchema();if(JazzRecord.getType(C)===&quot;object&quot;){if(C.refresh){this.models.each(function(F){F.dropTable();JazzRecord.each(F.options.hasAndBelongsToMany,function(I){var G=[F.table,I].sort().toString().replace(&quot;,&quot;,&quot;_&quot;);var H=&quot;DROP TABLE IF EXISTS &quot;+G;JazzRecord.run(H)})});JazzRecord.setupSchema(true)}}var E={};if(JazzRecord.migrations){E=JazzRecord.migrations}if(E[1]&amp;&amp;JazzRecord.getType(E[1])===&quot;object&quot;){var B=JazzRecord.currentSchemaVersion();var A=Infinity;if(JazzRecord.getType(C)===&quot;object&quot;&amp;&amp;JazzRecord.isDefined(C.number)){A=C.number}else{if(JazzRecord.getType(C)===&quot;number&quot;){A=C}}var D=B;do{if(D===A){JazzRecord.puts(&quot;Up to date&quot;);return }else{if(D&lt;A){D+=1;if(JazzRecord.isDefined(E[D])){E[D].up()}else{break}}else{E[D].down();D-=1}}JazzRecord.updateSchemaVersion(D)}while(E[D])}else{JazzRecord.models.each(function(F){var G=&quot;CREATE TABLE IF NOT EXISTS &quot;+F.table+&quot;(id INTEGER PRIMARY KEY AUTOINCREMENT&quot;;JazzRecord.each(F.options.columns,function(I,H){if(H!==&quot;id&quot;){G+=(&quot;, &quot;+H+&quot; &quot;+I.toUpperCase())}});G+=&quot;)&quot;;JazzRecord.run(G);JazzRecord.each(F.options.hasAndBelongsToMany,function(N,I){var H=[F.table,N].sort().toString().replace(&quot;,&quot;,&quot;_&quot;);var J=F.options.foreignKey;var K=JazzRecord.models.get(N).options.foreignKey;var L=[J,K].sort();var M=&quot;CREATE TABLE IF NOT EXISTS &quot;+H+&quot;(&quot;+L[0]+&quot; INTEGER, &quot;+L[1]+&quot; INTEGER)&quot;;JazzRecord.run(M)});F.options.columns.id=&quot;int&quot;})}if(C&amp;&amp;C.refresh&amp;&amp;JazzRecord.fixtures){JazzRecord.loadFixtures()}};JazzRecord.loadFixtures=function(){var A=JazzRecord.fixtures;JazzRecord.each(A.tables,function(C,B){JazzRecord.each(C,function(D){JazzRecord.models.get(B).create(D)})});if(!A.mappingTables){return }JazzRecord.each(A.mappingTables,function(C,B){JazzRecord.each(C,function(F){var D=new JazzRecord.Hash(F);var E=&quot;INSERT INTO &quot;+B+&quot; (&quot;+D.getKeys().toString()+&quot;) VALUES(&quot;+D.getValues().toString()+&quot;)&quot;;JazzRecord.run(E)})})};
\ No newline at end of file</diff>
      <filename>build/jazz_record.js</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>818d18e0bfde2020da567061610ca39ffc58982b</id>
    </parent>
  </parents>
  <author>
    <name>Nick Carter</name>
    <email>thynctank@thynctank.com</email>
  </author>
  <url>http://github.com/thynctank/jazzrecord/commit/c9319edb74b78dec1206378043c2c12060cbf32a</url>
  <id>c9319edb74b78dec1206378043c2c12060cbf32a</id>
  <committed-date>2009-07-06T22:00:39-07:00</committed-date>
  <authored-date>2009-07-06T22:00:39-07:00</authored-date>
  <message>latest build, fixes Titanium</message>
  <tree>3a5f113bf41927981792b017852612776cbbeabd</tree>
  <committer>
    <name>Nick Carter</name>
    <email>thynctank@thynctank.com</email>
  </committer>
</commit>
