
rb_DB = {
	mydb: undefined,
	debugMode: false,
initDB: function()
{
	try {
		if ( !window.openDatabase)
		{
			alert('This system relies on the use of safari for database handling')			
		} else {
			var shortName = 'iphoneRedBox';
			var version = '2.0';
			var displayName = 'IPhone interface to RedBox';
			var maxSize = 100000;
			this.mydb = openDatabase(shortName, version, displayName, maxSize);
			
			this.mydb.transaction ( function(transaction) {
				transaction.executeSql('CREATE TABLE tblMoviesExtended ( id INTEGER NOT NULL PRIMARY KEY,name TEXT NOT NULL,	img TEXT NOT NULL,	Release INTEGER NOT NULL, RATING TEXT NOT NULL );', [], rb_DB.nullDataHandler.bindAsEventListener(rb_DB), rb_DB.nullDataHandler.bindAsEventListener(rb_DB));
				transaction.executeSql('CREATE TABLE tblSettings (	lkup TEXT NOT NULL PRIMARY KEY,	  lValue TEXT );', [], rb_DB.nullDataHandler.bindAsEventListener(rb_DB), rb_DB.nullDataHandler.bindAsEventListener(rb_DB));
				transaction.executeSql('CREATE TABLE tblKiosks(	id INTEGER NOT NULL PRIMARY KEY,	name TEXT NOT NULL,	addr TEXT NOT NULL,	city TEXT NOT NULL,	state TEXT NOT NULL,	zip TEXT NOT NULL,	def INTEGER not null default 0 );', [], rb_DB.nullDataHandler.bindAsEventListener(rb_DB), rb_DB.nullDataHandler.bindAsEventListener(rb_DB));
				
			});
			this.mydb.transaction( function(transaction) {
				transaction.executeSql('CREATE TABLE tblInventory(	id INTEGER NOT NULL PRIMARY KEY);', [], rb_DB.nullDataHandler.bindAsEventListener(rb_DB), rb_DB.nullDataHandler.bindAsEventListener(rb_DB));
			}); 
		}
	} catch (e) {
		if (e == 2) {
        // Version number mismatch.
        	alert("Invalid database version.");	
	    } else {
	
	        alert("Unknown error "+e+".");	
	    }
    	return;
	}
	
	this.loadZipCode();
	this.loadRatings();
	this.loadGeoLocation();
	this.loadTitles();
	
	this.debugMode = (document.getElementById("debugmode").value == "1");
},

 errfn: function(transaction, error)
{
	//if ( error.code == 1)
		//return false;
		
	alert('Oops. Error was '+error.message+' (Code '+error.code+')');
		// Handle errors here
		var we_think_this_error_is_fatal = true;
		if (we_think_this_error_is_fatal) return true;
		return false;

},

nullDataHandler: function (transaction, results) { }, 

dateUpdatedCheck: function(tx, data) {
	exitEarly = true;
	if ( data.rows.length == 0)
	{
		rb_DB.loadTitles(true);
	} else {
		if (this.lastUpdated != data.rows.item(0)["lValue"]) {
			
			rb_DB.loadTitles(true);
			exitEarly = true;
		} 	 	
		if ( !exitEarly )
			$("dtRetrieved").value = this.lastUpdated;
	}
},
titleCount: function ( tx, data) {
	if (data.rows.item(0)["cnt"] == 0) {
		rb_DB.loadTitles(true);
	} else {
		tx.executeSql('SELECT lValue FROM tblSettings where lkup = ?', ['dateLastUpdated'], rb_DB.dateUpdatedCheck.bind(rb_DB), rb_DB.errfn.bind(rb_DB) ); 
				
	}
	
	
	
},

loadRatings: function()
{
	this.mydb.transaction( function(transaction) {		
		transaction.executeSql('SELECT lValue FROM tblSettings where lkup = ?', ['ratingFilter'], rb_DB.getRatings.bind(rb_DB), rb_DB.errfn.bind(rb_DB) );
		}
		) 
	Event.observe($("ratingG"), "change", this.onRatingChange.bindAsEventListener(this) );
	Event.observe($("ratingPG"), "change", this.onRatingChange.bindAsEventListener(this) );
	Event.observe($("ratingPG13"), "change", this.onRatingChange.bindAsEventListener(this) );
	Event.observe($("ratingR"), "change", this.onRatingChange.bindAsEventListener(this) );
	Event.observe($("ratingNR"), "change", this.onRatingChange.bindAsEventListener(this) );
	
},

loadGeoLocation: function()
{
	this.mydb.transaction( function(transaction) {		
		transaction.executeSql('SELECT lValue FROM tblSettings where lkup = ?', ['useGeoLocation'], rb_DB.getGeoLocation.bind(rb_DB), rb_DB.errfn.bind(rb_DB) );
		}
		) 
	//Event.observe($("zipCode"), "change", this.onZipCodeChange.bindAsEventListener(this) );
},

loadZipCode: function()
{	
	this.mydb.transaction( function(transaction) {		
		transaction.executeSql('SELECT lValue FROM tblSettings where lkup = ?', ['zipCode'], rb_DB.getZipCode.bind(rb_DB), rb_DB.errfn.bind(rb_DB) );
		}
		) 
	Event.observe($("zipCode"), "change", this.onZipCodeChange.bindAsEventListener(this) );
},
loadTitles: function(forceRefresh) 
{
	var results = "";
	this.getLastUpdated();
	if ( ! forceRefresh )
	{
		this.mydb.transaction( function(transaction) {
			transaction.executeSql('SELECT count(*) as cnt FROM tblMoviesExtended', [], rb_DB.titleCount.bind(rb_DB), rb_DB.errfn.bind(rb_DB)	);
			} )
		
	} else 	{
		if (forceRefresh) {
			 new Ajax.Request("webService.php?method=getAllTitles", { method: 'get', onSuccess: this.onAjaxGetTitles.bindAsEventListener(this), asynchronous:false });
		
		}
	}
	
},
getLastUpdated: function(transport)
{
	var lastUpdated = "";
	var req = "";
	new Ajax.Request("webService.php?method=getLastUpdated", { method:"get", asynchronous:false, onSuccess:function(transport) {req=transport}});
	
	this.lastUpdated = req.responseJSON[0].updated;
	$("dtRetrieved").value = rb_DB.lastUpdated;
	
},
onAjaxGetTitles: function(transport)
{	
		RedBox.loadAd(transport.responseJSON.ad);
		this.mydb.transaction( function(transaction) {
			transaction.executeSql('DELETE FROM tblMoviesExtended', [],  this.nullDataHandler, this.errfn)
			for (var i = 0; i < transport.responseJSON.d.DATA.length; i++) {
				tmp = transport.responseJSON.d.DATA[i];
				
				if (tmp["Def"] == "1") {
					transaction.executeSql('INSERT INTO tblMoviesExtended (id, name, img, Release, Rating) values (?, ?, ?, ?, ?) ', [tmp["ID"], tmp["Name"], tmp["Img"], tmp["ReleaseDt"], tmp["Rating"]], this.nullDataHandler, this.errfn)
				}
			}
			transaction.executeSql('DELETE FROM tblSettings where lkup = ?', ['dateLastUpdated'], this.nullDataHandler, this.errfn);		
			transaction.executeSql('INSERT INTO tblSettings (lkup, lValue) values ( ?, ?)', ['dateLastUpdated', rb_DB.lastUpdated],this.nullDataHandler, this.errfn);
			$("dtRetrieved").value = rb_DB.lastUpdated; 		

		})  
	
},
getRatings: function(tx, data)
{
	if (data.rows.length == 0) {
		this.ratingArr = [];
	} else {
		var arrRatings = data.rows.item(0)["lValue"].split(",");
		this.ratingArr = arrRatings;
		for ( var i =0; i < arrRatings.length; i++)
		{
			$("rating" + arrRatings[i].replace("-", "")).checked = true;
		}
		
	}
},
ratingArr : [],
getZipCode: function(tx, data)
{
	if (data.rows.length == 0) {
		$("zipCode").value = '99301';
	} else {
		$("zipCode").value = data.rows.item(0)["lValue"];
	}
	
},
lat: undefined,
lng: undefined,
useGeoLocation: false,
getGeoLocation: function(tx, data)
{
	if (data.rows.length == 0) {
		$("geoLocation").setAttribute("toggled", true);
		$("zipCode").readOnly = true;
	} else {
		if (  data.rows.item(0)["lValue"] == "YES" )
		{
			$("zipCode").readOnly = true;
			$("geoLocation").setAttribute("toggled", true);			
		} else {
			$("geoLocation").setAttribute("toggled", false);
		}
		
	}
	this.toggleGeolocation();
},

retrieveGeoLocation: function()
{
	if (navigator.geolocation && navigator.geolocation.getCurrentPosition) 
		navigator.geolocation.getCurrentPosition(this.onRetGeoLocation.bind(this), this.onGeoFailure.bind(this));
	else {
		this.onGeoFailure();
	}
},
onGeoFailure: function()
{
	$("geoLocation").setAttribute("toggled", false);
	this.toggleGeolocation();
},
onRetGeoLocation: function(position)
{
	this.lat = position.coords.latitude;
	this.lng = position.coords.longitude;
	var params =  {
		lat: this.lat,
		lng: this.lng
	};
	 new Ajax.Request("webService.php?method=getZipCode", { method: 'get',parameters:params, onSuccess: this.onAjaxGetZipCode.bindAsEventListener(this), asynchronous:false });
		
			
},
onAjaxGetZipCode: function(transport)
{
	if (transport.responseJSON["zipCode"] != "") {
		$("zipCode").value = transport.responseJSON["zipCode"];
		this.onZipCodeChange();
	}
},
onRatingChange: function()
{
		this.mydb.transaction( function(transaction){
		transaction.executeSql('DELETE FROM tblSettings where lkup = ?', ['ratingFilter'], this.nullDataHandler, this.errfn);
		var ratElems = document.getElementsByName("rating");
		var str = [];
		for (var i=0; i < ratElems.length; i++ )
		{
			if ( ratElems[i].checked )
				str.push(ratElems[i].value);
		}
		rb_DB.ratingArr = str;
		transaction.executeSql('INSERT INTO tblSettings (lkup, lValue) values ( ?, ?)', ['ratingFilter', str.join(',')], this.nullDataHandler, this.errfn);
		
	}
	)
},
onGetLimiter: function()
{
	
	if ( this.ratingArr.length == 0 || this.ratingArr[0] == "")
	{
		return '(1 = 1)'
	} else
	{
		var retStr = 'Rating in (';
		for ( var i = 0; i < this.ratingArr.length; i++)
		{
			retStr += "'" + this.ratingArr[i] + "',";
		}
		retStr += '\'xyz\')';
		return retStr;
	}
},
onZipCodeChange: function()
{

	this.mydb.transaction( function(transaction){
		transaction.executeSql('DELETE FROM tblSettings where lkup = ?', ['zipCode'], this.nullDataHandler, this.errfn);
		transaction.executeSql('INSERT INTO tblSettings (lkup, lValue) values ( ?, ?)', ['zipCode', $F("zipCode")], this.nullDataHandler, this.errfn);
		
	}
	)
	
},

toggleGeolocation: function()
{
	
	this.useGeoLocation = $("geoLocation").getAttribute("toggled") == "true"; 
	if ( this.useGeoLocation) {
		this.mydb.transaction(function(transaction){
			transaction.executeSql('DELETE FROM tblSettings where lkup = ?', ['useGeoLocation'], this.nullDataHandler, this.errfn);
			transaction.executeSql('INSERT INTO tblSettings (lkup, lValue) values ( ?, ?)', ['useGeoLocation', "YES"], this.nullDataHandler, this.errfn);
			
		})
		$("zipCode").readOnly = true;
		this.retrieveGeoLocation();
	} else {
		this.mydb.transaction(function(transaction){
			transaction.executeSql('DELETE FROM tblSettings where lkup = ?', ['useGeoLocation'], this.nullDataHandler, this.errfn);
			transaction.executeSql('INSERT INTO tblSettings (lkup, lValue) values ( ?, ?)', ['useGeoLocation', "NO"], this.nullDataHandler, this.errfn);			
		})
		$("zipCode").readOnly = false;
	}
}

};
Event.observe(window, "load", rb_DB.initDB.bind(rb_DB));
