﻿var self = this;
var db;
var highestChartId = 0;
var useVectorGraphics = true;
var currentRaveName = "";
var currentRaveDate = "";
var currentRaveTime = "";
var currentRaveIsGMT = "";
var currentRavePlace = "";
var currentRaveTicks = 0;
var currentUserID = 0;
var currentHash = "";
var bodyGraphObject;
var chartsLoaded = false;
var chartToDelete;

var jQT = new $.jQTouch({
    icon: 'icon.png',
	 addGlossToIcon: true,
    startupScreen: 'img/startup.jpg',
    fixedViewport: false,
    touchSelector: 'a, button, .touch',
	preloadImages: [
	'themes/jovian/img/whiteButton.png',
	'themes/jovian/img/actionButton.png', 
	'themes/jovian/img/extra_icon.png', 
	'themes/jovian/img/chevron.png', 
	'themes/jovian/img/grayButton.png', 
	'themes/jovian/img/darkBlueBackground.jpg'
],
    fullscreen: true
});

$(function () {
	getDatabase();
	initializeAlerts();
	checkLogin();
	initializeActions();
});

this.initializeAlerts = function () {
	$.blockUI.defaults = {	
		message:  $('#popupConnectionRunning'),
		overlayCSS: { backgroundColor: '#000' }
	}
	$().ajaxStart($.blockUI).ajaxStop($.unblockUI);
	$('#popupHelp button.cancelButton, #popupConnectionRunning .CancelButton').click(function(){	
	$.unblockUI();
	return false;
	});
};

this.checkLoggedIn = function() {

		if ($.cookie('jovianUserID') && $.cookie('jovianUser') && $.cookie('jovianHash'))
		{
		return true;
		}
	else
		{
		return false;
		}
}

this.checkLogin = function() {

	if(checkLoggedIn())
		{
		$('#homeLogInOut').unbind('click').click(function(){
			logOutSession();
		});
		$('#homeLogInOut').text('Log out');
		currentUser = $.cookie('jovianUser');
		currentUserID = $.cookie('jovianUserID');
		currentHash = $.cookie('jovianHash');
		return true;
		}
	else
		{
		$('#homeLogInOut').text('Log in');
		$('#homeLogInOut').click(function(){
			jQT.goTo('#loginpage',"slide");
		});
return false;
		}
}

this.logOutSession = function () {
		$.cookie('jovianUser',null);
		$.cookie('jovianUserID',null);
		$.cookie('jovianHash',null);
		$('#savedChartsListing').empty();
		checkLogin();
		localStorage.setItem("charts","null")
		localStorage.setItem("highestChartId","null")
		getDatabase();
         db.transaction(function (tx) 
        {
		     tx.executeSql("DROP TABLE SavedRaveCharts", null);
		});
};

this.initializeActions = function () {

	$('#aboutJmLink').click(function (){
		$.get('about.aspx', function(data) { 
		$('#jqt').append(data);
		jQT.goTo('#about','slide'); });
	});

	$('#newChartLink').click(function (){
        jQT.goTo('#ravecalcvect','slide');
	});

	$('#ravecalcvect .submit').click(function () {
        useVectorGraphics = true;
        currentRaveDate = $("#ravecalcvect #birthDate").val();
        currentRaveTime = $("#ravecalcvect #birthTime").val();
        currentRavePlace = $("#birthPlace").val();
		currentRaveName = "New Rave Chart";

		if (dateTimeChecker(currentRaveDate, currentRaveTime)) //check date proper
			{
			if ($('#birthPlace').val().split(",").length == 2) {
            currentRavePlace = $("#birthPlace").val();
            objectToSend = {
				timeTicks: dateTimeTicker(currentRaveDate, currentRaveTime),
                location: currentRavePlace,
				name: currentRaveName,
                useSvg: useVectorGraphics
            };
            $.ajax({
                type: "POST",
                url: "ConnMgr.asmx/ProvideRaveChart",
                data: JSON.stringify(objectToSend),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (response) {
                    if (response.d.PlaceFound === true) {
						currentRaveTicks = response.d.ticks;
						currentRaveName = 'New Chart';
				        jQT.goTo('#newravegraph','slide');
						updateChartView();
                    } else {
                        alert("The City was not found, please check the name");
                        return false;
                    }
                },
                error: function (response) {
                    alertPopup("error");
                }
            });
            return false;
        } else {
            alertPopup("Please enter both City and Country (or state) separated by a comma");
            return false;
        }

				return false;
			} 
			
		else 
			{
                alertPopup("Please enter both Birth Date and Birth Time correctly");
                return false;
            }
    });

    $('#chartSaveButton').click(function () {
        jQT.goTo('#ravesave','slide');
   });

    $('#homeLogInOut').click(function () {
            return false;
   });

    $('#justNowLink').click(function () {
        currentRaveTicks = 0;
        currentRaveName = 'Just Now';
        currentRavePlace = '';
         jQT.goTo('#newravegraph','slide');
		updateChartView();

            return false;
   });

    $('#loginpage .submit').click(function () {
        currentUserName = $('#username').val();
        currentUserPwd = $('#userpwd').val();
        if (!currentUserName || !currentUserPwd) {
            alertPopup('Please make sure that email and password are correct');
            return false;
        }
        currentHash = hex_md5(currentUserPwd);
        objectToSend = {
            userName: currentUserName,
            userPwd: currentHash
        };
        $.ajax({
            type: "POST",
            url: "ConnMgr.asmx/ProcessUserLogin",
            data: JSON.stringify(objectToSend),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (response) {
                if (response.d.UserID === 0) {
                    alertPopup('User does not exist');
                    return false;
                }
                currentUserID = response.d.UserID;
				$.cookie('jovianUserID',response.d.UserID, { path: '/', expires: 30 });
                currentUser = response.d.UsersName, { path: '/', expires: 30 };
				$.cookie('jovianUser',response.d.UsersName, { path: '/', expires: 30 });
                currentUserHash = response.d.UserHash;
				$.cookie('jovianHash',response.d.UserHash, { path: '/', expires: 30 });
				currentUserPwd = "";
				objectToSend = "";
				checkLogin();
				jQT.goTo('#home');
				getDatabase();
				retrieveUsersCharts();
           },
            error: function (response) {
                alertPopup("Error sending log in information, please try again in a few minutes.");
				return false;
            }
        });
    });

    $('#savedChartsLink').click(function () {
	if(checkLoggedIn())
	{
			retrieveUsersCharts();
			
			jQT.goTo('#savedcharts','slide');
	}
	else
	{
		alertPopup("Please Log in before accessing your Rave Charts");	
	}

    });

	$('#ravesave a.saveButton').click(function () {
		if ($('#raveName').val() !== "") {
		currentRaveName = $('#raveName').val();
		saveRave();
		return false;
    } else {
		alertPopup("Please enter a name for the chart you want to save");
		return false;
        }
	});

	$('#aboutHdLink').click(function() {
	getHdVideos();
	});
	
	};

this.getDatabase = function () {
//database init
if(null == db){
	try {
		if (window.openDatabase) {
			db = openDatabase("JovianMobile", "1.0", "HTML5 Database API example", 200000);
			return db;
		} else {
			console.log("Couldn't open the database.  Please try with a WebKit nightly with this feature enabled");
			}
	} catch(err) { }
}
else {
	return db;
}
}

function initSavedCharts() {
    db.transaction(function(tx) {
        tx.executeSql("SELECT COUNT(*) FROM SavedRaveCharts", [], function(result) {
            loadCharts();
        }, function(tx, error) {
            tx.executeSql("CREATE TABLE SavedRaveCharts (ID REAL UNIQUE, folder REAL, name TEXT, location TEXT, timeInserted TEXT, timeTicks REAL)", [], function(result) { 
             loadCharts(); 
            });
        });
    });
}

function loadCharts() {
   db.transaction(function(tx) {
        tx.executeSql("SELECT ID, name, location, timeInserted, timeTicks FROM SavedRaveCharts", [], function(tx, result) {
			$('#savedChartsListing').empty();
            if (result.rows.length)
				{for (var i = 0; i < result.rows.length; ++i) {
					var row = result.rows.item(i);
					var chart = new Chart();
					chart.ID = row['ID'];
					chart.name = row['name'];
					chart.location = row['location'];
					chart.timeInserted = row['timeInserted'];
					chart.timeTicks = row['timeTicks'];
					if (row['ID'] > highestChartId)
						highestChartId = row['ID'];
						localStorage.setItem("highestChartId",highestChartId);
				}
			}
           else {
			$('#savedChartsListing').empty();
                var chart = new Chart(true);
				chart.name = "No Rave Charts saved yet";
				chart.location = "By clicking here you can create a new chart";
		   } 
        }, function(tx, error) {
            alert('Failed to retrieve charts from database - ' + error.message);
            return;
        });
    });
}

this.retrieveUsersCharts = function() {
        objectToSend = {
            userName: currentUserID,
            userPwd: currentHash,
			folder: 1
        };
        $.ajax({
            type: "POST",
            url: "ConnMgr.asmx/GetUsersRavesInFolder",
            data: JSON.stringify(objectToSend),
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (response) {
				objectToSend = "";
				if( response.d != null ) {
				storeUsersCharts(response.d);
				setTimeout("initSavedCharts();",150);
				}
            },
            error: function (response) {
                alertPopup("Error getting chart list, please try again in a few minutes.");
            }
        });
		}

this.storeUsersCharts = function(charts) {
		getDatabase();
         db.transaction(function (tx) 
        {
		for (i=0 ; i < charts.length ; i++){
           tx.executeSql("INSERT OR IGNORE INTO SavedRaveCharts (ID, folder, name, location, timeInserted, timeTicks) VALUES (?, ?, ?, ?, ?, ?)", [charts[i].ID, charts[i].folder, charts[i].name, charts[i].location, charts[i].timeInserted, charts[i].timeTicks]);
			}
		chartsLoaded = true;
		})
        ; 
}
		
function Chart(noDelete) {
    var self = this;

    var chart = document.createElement('li');
    chart.className = 'chartItem';
	if (noDelete) {
		chart.addEventListener('click', function() { jQT.goTo('#ravecalcvect','slide'); }, false);
    }
	else {
		chart.addEventListener('click', function() { return self.onChartClick() }, false);
    }
	this.chart = chart;

    var chartName = document.createElement('div');
    chartName.className = 'chartName';
    this.chart.appendChild(chartName);
    this.chartName = chartName;

    var chartTime = document.createElement('div');
    chartTime.className = 'chartTime';
     chart.appendChild(chartTime);
    this.chartTime = chartTime;

    var chartLocation = document.createElement('div');
    chartLocation.className = 'chartLocation';
     chart.appendChild(chartLocation);
    this.chartLocation = chartLocation;

    if (!noDelete) {
		var chartDelete = document.createElement('div');
		chartDelete.className = 'deletebutton';
		chartDelete.addEventListener('click', function(event) { event.stopPropagation();return self.deleteChart(event) }, false);
		self.chartDelete = chartDelete;
		this.chart.appendChild(chartDelete);
	}

    document.getElementById("savedChartsListing").appendChild(chart);
    return this;
}

Chart.prototype = {
    get ID() {
        if (!("_ID" in this))
            this._ID = 0;
        return this._ID;
    },

    set ID(x) {
        this._ID = x;
    },

    get name() {
        return this.chartName.innerHTML;
    },

    set name(x) {
        this.chartName.innerHTML = x;
    },

    get location() {
        return this.chartLocation.innerHTML;
    },

    set location(x) {
        this.chartLocation.innerHTML = x;
    },

    get timeInserted() {
        return this.chartTime.innerHTML;
    },

    set timeInserted(x) {
        this.chartTime.innerHTML = x;
     },

    get timeTicks() {
         if (!("_timeTicks" in this))
            this._timeTicks = 0;
        return this._timeTicks;
    },

    set timeTicks(x) {
        if (this._timeTicks == x)
            return;
        this._timeTicks = x;
    },

    onChartClick: function() {

        redirectToRave(this.ID);
    },
	
    deleteChart: function() {
		chartToDelete = this.ID;
		deleteAction = function(){deleteRave(chartToDelete);};
  		alertPopup("Delete Chart for " + this.name +"?",deleteAction);

    }
}

this.dateTimeChecker = function (Date, Time) {
    var datePattern = /(((0[1-9]|[12][0-9]|3[01])([-./])(0[13578]|10|12)([-./])(\d{4}))|(([0][1-9]|[12][0-9]|30)([-./])(0[469]|11)([-./])(\d{4}))|((0[1-9]|1[0-9]|2[0-8])([-./])(02)([-./])(\d{4}))|((29)(\.|-|\/)(02)([-./])([02468][048]00))|((29)([-./])(02)([-./])([13579][26]00))|((29)([-./])(02)([-./])([0-9][0-9][0][48]))|((29)([-./])(02)([-./])([0-9][0-9][2468][048]))|((29)([-./])(02)([-./])([0-9][0-9][13579][26])))/;
    var timePattern = /(^([0-9]|[0-1][0-9]|[2][0-3]):([0-5][0-9])$)|(^([0-9]|[1][0-9]|[2][0-3])$)/;
    return (datePattern.test(Date) && timePattern.test(Time));
};

this.dateTimeTicker = function (date, Time) {
dateSplits = date.split("/");
timeSplits = Time.split(":");
year = parseInt(dateSplits[2]); month = parseInt(dateSplits[1]*1-1); day = parseInt(dateSplits[0]*1); hour = parseInt(timeSplits[0]*1); minute = parseInt(timeSplits[1]*1);
var dt= new Date("");
dt.setUTCFullYear(year, month, day);
dt.setUTCHours(hour);
dt.setUTCMinutes(minute);
dt.setUTCSeconds(0);
dt.setUTCMilliseconds(0); 
return dt.getTime();
};

this.alertPopup = function (message, callback) {
scrollTo(0, 0);
if (callback){
    $('#closeDialog').hide();
    $('#choiceDialog').show();
	$('#AcceptButton').unbind('click').click(callback).click($.unblockUI);
}
else {
    $('#closeDialog').show();
    $('#choiceDialog').hide();
}
    $('#popupHelp div.textAlert span').text(message);
	setTimeout("$.blockUI({message: $('#popupHelp')})", 150);
};

this.redirectToRave = function (raveID) {
    objectToSend = {
        userID: currentUserID,
        userPwdHash: currentHash,
        raveID: raveID
    };
    $.ajax({
        type: "POST",
        url: "ConnMgr.asmx/RedirectToRave",
        data: JSON.stringify(objectToSend),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (response) {
		currentRaveTicks = response.d.raveTime;
		currentRaveName = response.d.raveName;
		currentRavePlace = response.d.birthPlace;
         jQT.goTo('#newravegraph','slide');
		updateChartView();		
		}
    });
};

this.deleteRave = function (raveID) {
    objectToSend = {
        userID: currentUserID,
        userPwdHash: currentHash,
        raveID: raveID
    };
    $.ajax({
        type: "POST",
        url: "ConnMgr.asmx/DeleteRave",
        data: JSON.stringify(objectToSend),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (response) {
		if (response.d.Success == true){
		deleteLocalRave(raveID);
		loadCharts();
        }
		else {
		alertPopup("There was a problem deleting your chart");		
		}
        },
        error: function (response) {
            alertPopup("Connection error, please try again after a few minutes");
		}
    });
};

this.deleteLocalRave = function (raveID) {
         db.transaction(function(tx)
        {
            tx.executeSql("DELETE FROM SavedRaveCharts WHERE ID = ?", [raveID]);
        });
    };

this.updateChartView = function() {
			removeObject("bodygraphSvg");
			var svgObject = document.createElement('object');
			svgObject.setAttribute('type','image/svg+xml');
			svgObject.setAttribute('data','Services/RaveChartGenerator.aspx?chartname=\'' + currentRaveName + '\'&chartplace=\'' + currentRavePlace + '\'&vector=true&Time=' + currentRaveTicks);
			svgObject.setAttribute('height','630px');
			svgObject.setAttribute('width','480px');
			svgObject.setAttribute('id','bodygraphSvg');
			svgObject.setAttribute('name','BodyGraphChart');
			document.getElementById("newravegraph").appendChild(svgObject);
			$('#newravegraph > div.toolbar h1').html(currentRaveName);
			$('#chartSaveButton').hide();
			if(currentRaveName == "New Chart" && checkLoggedIn() ) 
			{
				$('#chartSaveButton').show();
			}
}

this.raveChartDataToggle = function() {
BodyGraphChart.zoomToData();
return false;
}

this.saveRave = function () {
    objectToSend = {
        userID: currentUserID,
        userPwdHash: currentHash,
        raveName: currentRaveName,
		birthDate: currentRaveDate,
		birthTime: currentRaveTime,
		timeTicks: currentRaveTicks,
		Location: currentRavePlace
    };
    $.ajax({
        type: "POST",
        url: "ConnMgr.asmx/SaveRave",
        data: JSON.stringify(objectToSend),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (response) {
		if(response.d.success == true)
		{
			$('#savedChartsLink').click();
		}
		else
		{
		alertPopup("Error communicationg with database, please try again later");
		}
        },
        error: function (response) {
            alertPopup("Error communicationg with server, please try again later");
        }
    });
};

this.isIphone = function() {
	var ua = navigator.userAgent ;
	if (ua.indexOf("iPhone") > 0) return true;
	return false;
}

function removeObject(objID) {
	myObj = document.getElementById(objID);
if(myObj != null){
	myObj.parentNode.removeChild(myObj);
	myObj = null;
}
}
