/**********************************************
 Blackbaud Design Custom JavaScript
***********************************************
 Site: 		Russ Reid
 Author: 	Steve Brush
 Created: 	September 7, 2011
 SPHERE:	--
 
*********** CHANGE LOG ************************

**********************************************/

BBI = {};

BBI.Core = 
{
	SPHERE:
	{
		_updated: 'dd/mm/yyyy 12:00 PM',
	}
};

BBI.RussReid =
{	

	URL: String(document.location.href),
	
	initTracking: function(trackerID,setDomain) {
		// create sessvars...
		if (sessvars.BBI == null) {
			sessvars.BBI = {};
			sessvars.BBI.RussReid = {};
			sessvars.BBI.RussReid.donation = {};
			sessvars.BBI.RussReid.donation.amount = {};
			sessvars.BBI.RussReid.donation.name = {};
		}
		console.log("initTracking() ...");
		// run analytics...
		BBI.RussReid.analyticsTracking(trackerID,setDomain);
	},
	
	analyticsTracking: function(trackerID,setDomain) {

		BBI.RussReid.trackPage(trackerID,setDomain);
	  	  
		// Save donation information to sessvars:
		if (BBI.RussReid.URL.indexOf('DonorReview') > -1) {
	
			var name = $('.CT:Contains("Donation Level")').closest('tr').next().find('td:eq(0) font').html();
				name = String(name.replace('<br>','').replace('<strong>','').replace('</strong>',''));
	
			sessvars.BBI.RussReid.donation.name = name;
			console.log("sessvars.BBI.RussReid.donation.name = "+sessvars.BBI.RussReid.donation.name);
	
			var amount = $('.CT:contains("Donation Amount")').closest('tr').next().find('td:eq(1) font').html();
				amount = String(amount.replace('$',''));
	
			sessvars.BBI.RussReid.donation.amount = amount;
			console.log("sessvars.BBI.RussReid.donation.amount = "+sessvars.BBI.RussReid.donation.amount);
		}
	  
		// if on confirmation page...
		if (BBI.RussReid.URL.indexOf('donateok') > -1) {
		
			// generate order ID...
			var d = new Date();
			var unixTime = d.getTime();
			var orderID = unixTime;	
			
			// Get donation amount...
			var GiftAmount = '1';
			if (sessvars.BBI.RussReid.donation.amount != null) {
				if (sessvars.BBI.RussReid.donation.amount > 0)
					GiftAmount = sessvars.BBI.RussReid.donation.amount;
			}
		
			// submit overall transaction details...
			BBI.RussReid.trackConfirmation(orderID,GiftAmount);
		
			var thisSKU = "Donation";
			var thisName = (sessvars.BBI.RussReid.donation.name == null) ? "General Donation" : sessvars.BBI.RussReid.donation.name;
			var thisVal = GiftAmount;
	
			console.log("trackItems(" + orderID,thisSKU,thisName,'Online',thisVal,1+")");
			
			// track donation as item...
			BBI.RussReid.trackItems(orderID,thisSKU,thisName,'Online',thisVal,1);
		}
		
		// finish
		BBI.RussReid.trackComplete();
	},
	
	trackPage: function(trackerID,setDomain) {
		_gaq.push(['_setAccount', trackerID]);
		_gaq.push(['_trackPageview', URL]);
		
		if (setDomain != null) 
			_gaq.push(['_setDomainName', setDomain]);
	},
	
	trackConfirmation: function(orderID,total) {
		// runs on transaction confirmation pages
		// Google eCommerce
		_gaq.push([
			'_addTrans',
			orderID,    // order ID - required
			'',  		// affiliation or store name
			total,      // total - required
			'',         // tax
			'',         // shipping
			'',       	// city
			'',     	// state or province
			''          // country
		]); 	
	},
	
	trackItems: function(orderID,sku,productName,category,price,qty) {
		// returns each item on a confirmation page
		_gaq.push(['_addItem',
			orderID,    	// order ID - required
			sku,        	// SKU/code - required
			productName,	// product name
			category,   	// category or variation
			price,      	// unit price - required
			qty         	// quantity - required
		]);
	},
	
	trackComplete: function() {
		// Google eCommerce
		_gaq.push(['_trackTrans']); //submits transaction to the Analytics servers
	}
	
};


/*--------------------------- */
/*--- PLUGINS & LIBRARIES --- */
/*--------------------------- */

// jQuery :Contains plugin
jQuery.expr[':'].Contains = function(a, i, m) { 
return jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase()) >= 0; 
};

// Google Analytics
var _gaq = _gaq || [];
(function() {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();


// Sessvars ver 1.01 - JavaScript based session object (c) 2008 Thomas Frank

sessvars=function(){

	var x={};
	
	x.$={
		prefs:{
			memLimit:2000,
			autoFlush:true,
			crossDomain:false,
			includeProtos:false,
			includeFunctions:false
		},
		parent:x,
		clearMem:function(){
			for(var i in this.parent){if(i!="$"){this.parent[i]=undefined}};
			this.flush();
		},
		usedMem:function(){
			x={};
			return Math.round(this.flush(x)/1024);
		},
		usedMemPercent:function(){
			return Math.round(this.usedMem()/this.prefs.memLimit);
		},
		flush:function(x){
			var y,o={},j=this.$$;
			x=x||top;
			for(var i in this.parent){o[i]=this.parent[i]};
			o.$=this.prefs;
			j.includeProtos=this.prefs.includeProtos;
			j.includeFunctions=this.prefs.includeFunctions;
			y=this.$$.make(o);
			if(x!=top){return y.length};
			if(y.length/1024>this.prefs.memLimit){return false}
			x.name=y;
			return true;
		},
		getDomain:function(){
				var l=location.href
				l=l.split("///").join("//");
				l=l.substring(l.indexOf("://")+3).split("/")[0];
				while(l.split(".").length>2){l=l.substring(l.indexOf(".")+1)};
				return l
		},
		debug:function(t){
			var t=t||this,a=arguments.callee;
			if(!document.body){setTimeout(function(){a(t)},200);return};
			t.flush();
			var d=document.getElementById("sessvarsDebugDiv");
			if(!d){d=document.createElement("div");document.body.insertBefore(d,document.body.firstChild)};
			d.id="sessvarsDebugDiv";
			d.innerHTML='<div style="line-height:20px;padding:5px;font-size:11px;font-family:Verdana,Arial,Helvetica;'+
						'z-index:10000;background:#FFFFCC;border: 1px solid #333;margin-bottom:12px">'+
						'<b style="font-family:Trebuchet MS;font-size:20px">sessvars.js - debug info:</b><br/><br/>'+
						'Memory usage: '+t.usedMem()+' Kb ('+t.usedMemPercent()+'%)&nbsp;&nbsp;&nbsp;'+
						'<span style="cursor:pointer"><b>[Clear memory]</b></span><br/>'+
						top.name.split('\n').join('<br/>')+'</div>';
			d.getElementsByTagName('span')[0].onclick=function(){t.clearMem();location.reload()}
		},
		init:function(){
			var o={}, t=this;
			try {o=this.$$.toObject(top.name)} catch(e){o={}};
			this.prefs=o.$||t.prefs;
			if(this.prefs.crossDomain || this.prefs.currentDomain==this.getDomain()){
				for(var i in o){this.parent[i]=o[i]};
			}
			else {
				this.prefs.currentDomain=this.getDomain();
			};
			this.parent.$=t;
			t.flush();
			var f=function(){if(t.prefs.autoFlush){t.flush()}};
			if(window["addEventListener"]){addEventListener("unload",f,false)}
			else if(window["attachEvent"]){window.attachEvent("onunload",f)}
			else {this.prefs.autoFlush=false};
		}
	};
	
	x.$.$$={
		compactOutput:false, 		
		includeProtos:false, 	
		includeFunctions: false,
		detectCirculars:true,
		restoreCirculars:true,
		make:function(arg,restore) {
			this.restore=restore;
			this.mem=[];this.pathMem=[];
			return this.toJsonStringArray(arg).join('');
		},
		toObject:function(x){
			if(!this.cleaner){
				try{this.cleaner=new RegExp('^("(\\\\.|[^"\\\\\\n\\r])*?"|[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t])+?$')}
				catch(a){this.cleaner=/^(true|false|null|\[.*\]|\{.*\}|".*"|\d+|\d+\.\d+)$/}
			};
			if(!this.cleaner.test(x)){return {}};
			eval("this.myObj="+x);
			if(!this.restoreCirculars || !alert){return this.myObj};
			if(this.includeFunctions){
				var x=this.myObj;
				for(var i in x){if(typeof x[i]=="string" && !x[i].indexOf("JSONincludedFunc:")){
					x[i]=x[i].substring(17);
					eval("x[i]="+x[i])
				}}
			};
			this.restoreCode=[];
			this.make(this.myObj,true);
			var r=this.restoreCode.join(";")+";";
			eval('r=r.replace(/\\W([0-9]{1,})(\\W)/g,"[$1]$2").replace(/\\.\\;/g,";")');
			eval(r);
			return this.myObj
		},
		toJsonStringArray:function(arg, out) {
			if(!out){this.path=[]};
			out = out || [];
			var u; // undefined
			switch (typeof arg) {
			case 'object':
				this.lastObj=arg;
				if(this.detectCirculars){
					var m=this.mem; var n=this.pathMem;
					for(var i=0;i<m.length;i++){
						if(arg===m[i]){
							out.push('"JSONcircRef:'+n[i]+'"');return out
						}
					};
					m.push(arg); n.push(this.path.join("."));
				};
				if (arg) {
					if (arg.constructor == Array) {
						out.push('[');
						for (var i = 0; i < arg.length; ++i) {
							this.path.push(i);
							if (i > 0)
								out.push(',\n');
							this.toJsonStringArray(arg[i], out);
							this.path.pop();
						}
						out.push(']');
						return out;
					} else if (typeof arg.toString != 'undefined') {
						out.push('{');
						var first = true;
						for (var i in arg) {
							if(!this.includeProtos && arg[i]===arg.constructor.prototype[i]){continue};
							this.path.push(i);
							var curr = out.length; 
							if (!first)
								out.push(this.compactOutput?',':',\n');
							this.toJsonStringArray(i, out);
							out.push(':');                    
							this.toJsonStringArray(arg[i], out);
							if (out[out.length - 1] == u)
								out.splice(curr, out.length - curr);
							else
								first = false;
							this.path.pop();
						}
						out.push('}');
						return out;
					}
					return out;
				}
				out.push('null');
				return out;
			case 'unknown':
			case 'undefined':
			case 'function':
				if(!this.includeFunctions){out.push(u);return out};
				arg="JSONincludedFunc:"+arg;
				out.push('"');
				var a=['\n','\\n','\r','\\r','"','\\"'];
				arg+=""; for(var i=0;i<6;i+=2){arg=arg.split(a[i]).join(a[i+1])};
				out.push(arg);
				out.push('"');
				return out;
			case 'string':
				if(this.restore && arg.indexOf("JSONcircRef:")==0){
					this.restoreCode.push('this.myObj.'+this.path.join(".")+"="+arg.split("JSONcircRef:").join("this.myObj."));
				};
				out.push('"');
				var a=['\n','\\n','\r','\\r','"','\\"'];
				arg+=""; for(var i=0;i<6;i+=2){arg=arg.split(a[i]).join(a[i+1])};
				out.push(arg);
				out.push('"');
				return out;
			default:
				out.push(String(arg));
				return out;
			}
		}
	};
	
	x.$.init();
	return x;
}();
