/*
 * Moonstone Interactive Javascript Library
 *
 * Copyright (c) 2010 Moonstone Interactive

 * Date: 2010-01-11
 * Note: All Moonstone code goes here
 */
 
 
 //Global variables
 iSessionTTL = 0; //Time to live in seconds
 
 
 
 /*
  *	Common functions
  *
  *
 */
 
 
//Default Error handler for Ajax messages
//ALWAYS use this.  It will be enhanced in the future to log all errors to the server.
function msiErrorReport(message) {
	alert('ERROR: ' + message);
}
function errorReport(message) {		//DEPRECATED: use msiErrorReport instead
	msiErrorReport(message);
}

//Alert array of values
function msiArrayAlert(o) {
	var sMsg = "";
	if (typeof(o) == "string") {
		sMsg = 0;
	} else {
		for (f in o) {
			sMsg = sMsg + f + "=" + o[f] + "\n";
		}
	}
	alert(sMsg);
}

 /*
  *	Common Classes
  *
  *
 */
 
 //Form helper functions
function msiIsValidString(s) {
	return (typeof(s) == 'string' && s != null && s.length > 0);
}
function msiIsValidNumber(n,min,max) {
	var r = true;
	if (isNaN(n)) {
		r = false;
	} else if (n == null) {
		r = false;
	} else if (typeof(min) != 'undefined' && n < min) {
		r = false;
	} else if (typeof(max) != 'undefined' && n > max) {
		r = false;
	}
	return r;	
}
 
 
  // Cookie Functions
  function Cookie(name){
 	 var sCookie = $.cookie(name);
 	 if (!sCookie){
 		return false;
 	 }
 	 
 	this.name = name;
 	 var sCookieValues = sCookie.split('&');
 	
 	 for (var i=0; i < sCookieValues.length; i++){
 		sCookieValues[i] = sCookieValues[i].split('=');
 	 }
 	 for (var i = 0; i < sCookieValues.length; i++){
 		this[sCookieValues[i][0]] = sCookieValues[i][1];
 	 }
 	 
 }
 
 /*
 *
 *  JqGrid Functions
 *
 */
 
 //Used as callback function to add JSON data to grid
function msiJqGridAddJson(oData,sTextStatus,sGrid) {
	
	try {
		var oResponse = JSON.parse(oData);
		if (oResponse != null && oResponse.result != null) {
			var oResults = JSON.parse(oResponse.result);
			
			if (oResults != null) {
				var grid =$(sGrid)[0];
				grid.addJSONData(oResults);
				/*Display Balance If Available */
				if (oResults.balance != undefined)
				{
					
					var sBalnceGrid = sGrid;
					sBalnceGrid = sBalnceGrid.replace("Grid", "Balance");
					var e = $(sBalnceGrid);
					e.html("");					
					if (oResults.balance != null) {
						if (sBalnceGrid.indexOf("donationBalance") >=0) 
						{
						  e.html("<B>Total Donation: $</B>");
						}
						else
						{
						   e.html("<B>Balance: $</B>");
						}
						var sBalance = oResults.balance
						if (sBalnceGrid.indexOf("donationBalance") >=0) 
						{
							e.append("<b> " + numberFormat(Math.abs(sBalance)) + "</b>" );
						}
						else
						{
							if (sBalance > 0) 
							{
								e.append("<b> <font color='red'> (" + numberFormat(Math.abs(sBalance)) + ")</font></b>" );
								
							}
							else
							{
								e.append("<b> " + numberFormat(Math.abs(sBalance)) + "</b>" );
							}
						}
					}
				}
				/*Display Balance If Available end  */
			}
		} else {
			msiErrorReport(oData);
		}		
	} catch(ex) {
		msiErrorReport(oData);
	}
}

/**
* Used to get data object for Json-RPC Server call
*
* @param	object	oData	Postdata object passed from jqGrid
* @param	string	sMethod	Name of method to call
* @return	string	JSON encoded string with data object
*/
function msiJqGridGetData(oData,sMethod) {
	var oResults = new Object();
	oResults.method = sMethod;
	oResults.id = 1234;
	
	//Convert JSON postdata into array of values
	i = 0;
	oResults.params = new Array();
	//alert(JSON.stringify(oData));
	for(f in oData) {
		//alert(oData[f]);
		oResults.params[i] = oData[f];		
		i++;
	}
	oResults.id = oResults.params[1];
	
	return JSON.stringify(oResults);
}

function msiJqGridDataType(oData,sUrl,sMethod,sGridDiv) {

	msiJqBeginGridRequest(sGridDiv);
	
	//Always search, if nothing specified, return no rows
	oData._search = true;
	if (typeof(oData.filters) === "undefined") {
		var o = new Object;
		var rule = new Object;
		o.rules = new Array();
		rule.field = "0";
		rule.op = "eq";
		rule.data = "1";
		o.groupOp = "And";
		o.rules[0] = rule;
		oData.filters = JSON.stringify(o);
	}
	$.ajax({
		type: 'POST',
		datatype: 'JSON',
		data: msiJqGridGetData(oData,sMethod),
		url: sUrl,
		success: function (data,textStatus) { msiJqGridAddJson(data,textStatus,sGridDiv);msiJqEndGridRequest(sGridDiv); },
		failure: function (xhr,textStatus,errorThrown) { msiErrorReport(errorThrown);msiJqEndGridRequest(sGridDiv); }
	});
	
}

//Return formated search rule
function msiJqGridSearchRule (field,op,data) {
	rule = new Object();
	rule.field = field;
	rule.op = op;
	rule.data = data;
	return rule;
}

//borrowed code to try and enable loadtext
function msiJqBeginGridRequest(gridName) {
	var ts = $(gridName + ".ui-jqgrid-btable")[0];
	ts.grid.hDiv.loading = true;
	if (ts.p.hiddengrid) { return; }
	switch (ts.p.loadui) {
		case "disable":
			break;
		case "enable":
			$("#load_" + ts.p.id).show();
			break;
		case "block":
			$("#lui_" + ts.p.id).show();
			$("#load_" + ts.p.id).show();
			break;
	}
}

function msiJqEndGridRequest(gridName) {
	var ts = $(gridName + ".ui-jqgrid-btable")[0];
	ts.grid.hDiv.loading = false;
	if (ts.p.hiddengrid) { return; }
	switch (ts.p.loadui) {
		case "disable":
			break;
		case "enable":
			$("#load_" + ts.p.id).hide();
			break;
		case "block":
			$("#lui_" + ts.p.id).hide();
			$("#load_" + ts.p.id).hide();
			break;
	}
}

//Encode/decode Json strings in safe, error free way
function msiJsonEncode(oJson) {
	var sJson ;
	try {
		sJson = JSON.stringify(oJson);
	} catch (ex) {
		msiErrorReport('Unable to encode JSON object. (' + ex.message + ')');
	}
	return sJson;
}
function msiJsonDecode(sJson) {
	var oJson = new Object();
	try {
		oJson = JSON.parse(sJson);
	} catch (ex) {
		msiErrorReport('Unable to decode JSON object. (' + ex.message + ')\n\nData: ' + sJson);
	}
	return oJson;
}

//Simple way to get results from JSONRPC and pass to a given function
function msiPostJson(oMsg,sUrl,sFunction) {
	$.ajax({
		type: 'POST',
		datatype: 'JSON',
		data: JSON.stringify(oMsg),
		url: sUrl,
		success: function (data,textStatus) { msiGetAjaxResults(data,textStatus,sFunction); },
		failure: function(xhr,textStatus,errorThrown) { msiErrorReport(errorThrown); }
		
	});
}
function msiGetAjaxResults(oData,sStatus,sFunction) {
	var oResults = new Object();
	try {
		oResponse = msiJsonDecode(oData);
		if (oResponse.error != null) {
			msiErrorReport(oResponse.error.message);
			oResults.error = oResponse.error;
		} else {
			oResults = msiJsonDecode(oResponse.result);
			oResults.error = null;
			oResults.status = sStatus;
			eval(sFunction+"(oResults)");
		}
	} catch (ex) {
		msiErrorReport(ex.message);
	}

	return false;
}
/*
*
*	Login Routines
*
*/

 //checks to see if the user is logged in or not
 var setIsLoggedInTimeout = 0;
 function msiIsLoggedIn(pageLoad){
		clearInterval(setIsLoggedInTimeout);
		var oMsg = new Object();
		oMsg.method='CheckSession';
		oMsg.id = 1234;
		$.ajax({
			type: 'POST',
			datatype: 'JSON',
			data: JSON.stringify(oMsg),
			url: 'json/Accounts.php',
			success: function (data,textStatus) { 
				var oResults = new Object();
				try
				{
					var oResults = JSON.parse(data);
					if ( oResults.error != null ) {
						errorReport('JSON Server (' + oResults.error.message + ')');
					} else {
						var oUser = JSON.parse(oResults.result);
						if (oUser.TimeToLive <= 0){
							if (pageLoad){
								msiForceLogin(1);
							}
							else{
							
								msiForceLogin();
							}
						}
						else{
							if (pageLoad){
								loadPage();
							}
						}
					}
				} catch (ex){
					errorReport('Unable to parse JSON object. (' + ex.message + ')\n\nData: ' + oData);
				}
						
					},
			failure: function (xhr,textStatus,errorThrown) { errorReport(errorThrown); }
		});
		//var setIsLoggedInTimeout = setInterval('isLoggedIn()', 10000);
 }

//Checks for valid session and forces login if necessary
function msiForceLogin(sPageLoad) {
	iSessionTTL = 0;
	msiIsSessionValid();
	if (iSessionTTL <=0) {
		promptLogin(sPageLoad);
	} else {
		eval(sPageLoad);
	}
}

//Checks to see if valid session exists
//NOTE: This is synchronous routine
function msiIsSessionValid() {
	var oMsg = new Object();
	oMsg.method='CheckSession';
	oMsg.id = 1234;
	$.ajax({
		type: 'POST',
		datatype: 'JSON',
		data: JSON.stringify(oMsg),
		async: false,
		url: 'json/Accounts.php',
		success: function (data,textStatus) { msiSetSessionTTL(data,textStatus); },
		failure: function (xhr,textStatus,errorThrown) { msiErrorReport(errorThrown); }
	});
}

function msiSetSessionTTL(data,textstatus) {
	iSessionTTL = 0;
	try {
		var oResults = JSON.parse(data);
		if ( oResults.error != null ) {
			msiErrorReport('JSON Server (' + oResults.error.message + ')');
		} else {
			var oUser = JSON.parse(oResults.result);
			iSessionTTL = oUser.TimeToLive;
		}
	} catch(ex) {
		msiErrorReport(ex.message);
	}
	return false;
}

 // show login box and return success/failure
 function promptLogin(sPageLoad){
	$('#loginBox').jqmShow(); 
	$('#submitLogin').bind('click', function(){
	
		var oMsg = new Object();
		oMsg.method='Login';
		oMsg.id = 1234;
		oMsg.params = [$('#loginEmail').val(),$('#loginPassword').val()];
		//alert(JSON.stringify(oMsg));
		$.ajax({
			type: 'POST',
			datatype: 'JSON',
			data: JSON.stringify(oMsg),
			url: 'json/Accounts.php',
			success: function (data,textStatus) { 
				var oResults = new Object();
				try
				{
				
					var oResults = JSON.parse(data);
					
					if ( oResults.error != null ) {
						msiErrorReport('JSON Server (' + oResults.error.message + ')');
					} else {
						var oUser = JSON.parse(oResults.result);
						if (oUser.Ok){
							$('#loginBox').jqmHide();
							//alert("eval: " + sPageLoad);
							eval(sPageLoad);
							
						}
						else{
							$('#loginStatus').html('Your username/password combination is invalid');
							return;
						}
					}
				} catch (ex){
					msiErrorReport('Unable to parse JSON object. (' + ex.message + ')\n\nData: ' + data);
				}
						
					},
			failure: function (xhr,textStatus,errorThrown) { msiErrorReport(errorThrown); }
		});
		
		return false;
		
	});
	
	
				
 }
