jQuery.quizUtils = {
	debug: function( msg ) {
		if ( window.console ) console.debug(msg);
		else alert(msg);
	},
	initLanding: function( domain ) {
		var d = '';
		if ( domain )
			d = domain;
		jQuery.cookie('sniIQCookie', 'var sniIQCookie={ga:[],at:[],clearAnswers:false,domain:"' + d + '"};', { expires: 1, domain: d, path: '/' });
		eval(jQuery.quizUtils.getCookie());
		if ( typeof sniIQCookie != 'object' )
			alert("There was a problem with setting a cookie on your computer and this quiz requires them to function.\n\n Please enable cookies in the settings of your browser.");
	},
	getCookie: function() {
		var str = jQuery.cookie('sniIQCookie');
		return str;
	},
	checkQuiz: function( url ) {
		eval(jQuery.quizUtils.getCookie());
		if ( typeof sniIQCookie != 'object' ) {
			alert("It appears you've entered this quiz from a page other than the start page, or your browser is not set to accept cookies. You will be redirected to the beginning of the quiz.");
			document.location.href = url;
		}
	},
	backToLastQuestion: function() {
		alert('It appears the last question was not properlly recorded.  You will now be redirected to the last question.  Please submit your last answer again.');
		history.go(-1);
		eval(jQuery.quizUtils.getCookie());
		var ga = sniIQCookie.ga != '' ? sniIQCookie.ga : [];
		var at = sniIQCookie.at != '' ? sniIQCookie.at : [];
		var d = sniIQCookie.domain;
		jQuery.cookie('sniIQCookie', 'var sniIQCookie={ga:[' + ga + '],at:[' + at + '],clearAnswers:true,domain:"' + d + '"};', { expires: 1, domain: d, path: '/' });
	},
	setQuestionPage: function( options ) {
		var defaults = {
			landingURL		: '',
			num				: 0,
			form			: null,
			labelPrependID	: '',
			progressBar		: null
		};
		var options = jQuery.extend(defaults, options);
		/* stop here if no options.landingURL, options.form OR options.num was supplied */
		if ( !options.landingURL ) { jQuery.quizUtils.debug('landing url was not set.  Use option [landingURL]'); return; }
		if ( !jQuery(options.form).get(0) ) { jQuery.quizUtils.debug('Form was not set properly.  Use option [form]'); return; }
		if ( !options.num ) { jQuery.quizUtils.debug('Page number was not set.  Use option [num]'); return; }
		/* check to see if the user just landed on some question page or should be here */
		jQuery.quizUtils.checkQuiz(options.landingURL);
		if ( eval(jQuery.cookie('clearQuizAnswers')) ) {
			var allRadios = jQuery(options.form).find('[type=radio]');
			jQuery.each(allRadios, function(i) {
				this.checked = false;
			});
		}
		eval(jQuery.quizUtils.getCookie());
		var ga = sniIQCookie.ga.join('","');
		var at = sniIQCookie.at.join('","');
		var d = sniIQCookie.domain;
		str = 'var sniIQCookie = {ga:["' + ga + '"],at:["' + at + '"],clearAnswers:false,domain:"' + d + '"};';
		jQuery.cookie('sniIQCookie', str, { expires: 1, domain: d, path: '/' });
		/* let's see if the last answer was recorded */
		if ( options.num > 1 )
			if ( sniIQCookie.ga.length < (options.num - 1) )
				jQuery.quizUtils.backToLastQuestion();
		/* set the onsubmit for options.form to validateRadioGroup */
		jQuery(options.form).submit(function() {
			return jQuery.quizUtils.validateRadioGroup(options.form, options.num, options.labelPrependID);
		});
		/* if options.progressBar is being used then set it up */
		if ( options.progressBar != null )
			if ( jQuery(options.progressBar).get(0) )
				jQuery(options.progressBar).progressBar( options.num );
	},
	setupTiePage: function( options ) {
		var defaults = {
			landingURL				: '',
			num						: 0,
			form					: null,
			labelPrependID			: '',
			questionWrapPrependID	: ''
		};
		var options = jQuery.extend(defaults, options);
		if ( !options.landingURL ) { jQuery.quizUtils.debug('landing url was not set.  Use option [landingURL]'); return; }
		if ( !options.form ) { jQuery.quizUtils.debug('Form was not set properly.  Use option [form]'); return; }
		if ( !options.num ) { jQuery.quizUtils.debug('Page number was not set.  Use option [num]'); return; }
		if ( !options.labelPrependID ) { jQuery.quizUtils.debug('Label prepend id was not set.  Use option [labelPrependID]'); return; }
		jQuery.quizUtils.checkQuiz(options.landingURL);
		var aryTie = jQuery.cookie('tiedAnswers').toString().split(',');
		for ( var i=0; i<aryTie.length; i++ )
			if ( jQuery('#' + options.questionWrapPrependID + (parseInt(aryTie[i]) + 1)).get(0) )
				jQuery('#' + options.questionWrapPrependID + (parseInt(aryTie[i]) + 1)).show();
		jQuery(options.form).submit(function() {
			return jQuery.quizUtils.validateRadioGroup(options.form, options.num, options.labelPrependID);
		});
	},
	popupWindow: function( url ) {
		jQuery.quizUtils.popupWin(url, {
			width: 800,
			height: 600,
			resize: 1,
			scrolls: 1,
			status: 1,
			toolbar: 0,
			location: 0,
			menu: 0
		});
	},
	popupWin: function( url, options ) {
		var defaults = {
			width: 800,
			height: 600,
			resize: 0,
			scrolls: 0,
			status: 0,
			toolbar: 0,
			location: 0,
			menu: 0
		};
		var options = jQuery.extend(defaults, options);
		var popupWin = window.open(url, 'popWin', 'width=' + options.width + ', height=' + options.height + ', resizable=' + options.resize + ', scrollbars=' + options.scrolls + ', status=' + options.status + ', toolbar=' + options.toolbar + ', location=' + options.location + ', menubar=' + options.menu);
	},
	validateRadioGroup: function( form, num, labelID ) {
		var chosen = false;
		var allRadios = jQuery(form).find('[type=radio]');
		jQuery.each(allRadios, function(i) {
			if ( jQuery(this).get(0).checked ) {
				eval(jQuery.quizUtils.getCookie());
				sniIQCookie.ga[num - 1] = jQuery(this).val().toUpperCase();
				if ( labelID )
					sniIQCookie.at[num - 1] = escape(jQuery('#' + labelID + (i + 1)).html());
				var ga = sniIQCookie.ga.join('","');
				var at = sniIQCookie.at.join('","');
				var d = sniIQCookie.domain;
				str = 'var sniIQCookie = {ga:["' + ga + '"],at:["' + at + '"],clearAnswers:false,domain:"' + d + '"};';
				jQuery.cookie('sniIQCookie', str, { expires: 1, domain: d, path: '/' });
				chosen = true;
			}
		});
		if ( !chosen ) {
			alert("Please choose an answer to continue.");
			return false;
		}
	},
	getNumCorrect: function( options ) {
		var defaults = {
			correctAnswers: [],
			beratementSplit: [4, 7, 10],
			numCorrectObj: '',
			beraterHeaderObj: '',
			beraterDescriptionObj: '',
			beraterHeaders: [],
			beraterDescriptions: []
		};
		var options = jQuery.extend(defaults, options);
		var str = jQuery.cookie('sniIQCookie');
		eval(str);
		var numCorrect = 0;
		for ( var i=0; i<options.correctAnswers.length; i++ ) {
			if ( sniIQCookie.ga[i].toLowerCase() == options.correctAnswers[i].toLowerCase() )
				numCorrect++;
		}
		/* loop through options.beratementSplit and see what range we're in */
		for ( var i=0; i<options.beratementSplit.length; i++ ) {
			if ( numCorrect < options.beratementSplit[i] ) {
				jQuery(options.beraterHeaderObj).html(options.beraterHeaders[i]);
				jQuery(options.beraterDescriptionObj).html(options.beraterDescriptions[i]);
				break;
			}
		}
		jQuery(options.numCorrectObj).html(numCorrect.toString());
	},
	displayGuessedAnswers: function( options ) {
		var defaults = {
			numQuestions: 10,
			userAnswerObj: ''
		};
		var options = jQuery.extend(defaults, options);
		var str = jQuery.cookie('sniIQCookie');
		eval(str);
		if ( sniIQCookie.at ) {
			if ( sniIQCookie.at.length == options.numQuestions ) {
				for ( i=0; i<options.numQuestions; i++ ) {
					jQuery('#' + options.userAnswerObj + (i + 1)).html(unescape(sniIQCookie.at[i]));
				}
			}
		}
	},
	getMaxOfNumberSet: function() {
		var largest = arguments[0];
		var tmp = [];
		var mArrayCounter = 0;
		for ( i=0; i<arguments.length; i++ ) {
			if ( arguments[i] >= largest ) {
				if ( arguments[i] > largest ) {
					tmp = [];
					mArrayCounter = 0;
				}
				tmp[mArrayCounter] = i;
				largest = arguments[i];
				mArrayCounter++;
			}
		}
		return tmp;
	},
	getNumOccurrences: function( lookFor, lookIn ) {
		var numCount = 0;
		for ( var i=0; i<lookIn.length; i++ ) {
			if ( lookIn.charAt(i) == lookFor ) {
				numCount++;
			}
		}
		return parseInt(numCount);
	},
	getPersonality: function( options ) {
		var defaults = {
			numQuestions: 10,
			choices: ['a', 'b', 'c', 'd'],
			tieURL: '',
			beraterHeaderObj: '',
			beraterDescriptionObj: '',
			beraterHeaders: [],
			beraterDescriptions: []
		};
		var options = jQuery.extend(defaults, options);
		var tieQuiz = jQuery.cookie('tieQuiz');
		var cookieValue = paramStr = '';
		eval(jQuery.quizUtils.getCookie());
		for ( var i=0; i<(options.numQuestions + 1); i++ ) {
			if ( sniIQCookie.ga[i] != null )
				cookieValue += sniIQCookie.ga[i] + ',';
		}
		for ( i=0; i<options.choices.length; i++ ) {
			eval('var num' + options.choices[i] + ' = jQuery.quizUtils.getNumOccurrences(\'' + options.choices[i].toLowerCase() + '\', cookieValue.toLowerCase());');
			paramStr += 'num' + options.choices[i] + ', ';
		}
		eval('var theHighest = jQuery.quizUtils.getMaxOfNumberSet(' + paramStr.substring(0, paramStr.length - 2) + ');');
		if (theHighest.length > 1) {
			jQuery.cookie('tiedAnswers', theHighest, { expires: 1 });
			if ( options.tieURL ) window.location.href = options.tieURL;
		}
		jQuery(options.beraterHeaderObj).html(options.beraterHeaders[parseInt(theHighest)]);
		jQuery(options.beraterDescriptionObj).html(options.beraterDescriptions[parseInt(theHighest)]);
	},
	createSendToFriend: function( options ) {
		var defaults = {
			serverPath: '',
			url: 'send_to_friend.htm',
			subject: '',
			body: '',
			width: 300,
			height: 350
		};
		var options = jQuery.extend(defaults, options);
		jQuery('#btnSendToFriend').attr('href', 'javascript: jQuery.quizUtils.popupWin("' + options.serverPath + options.url + '?serverpath=' + options.serverPath + '&subject=' + options.subject + '&body=' + options.body + '", { width: ' + options.width + ', height: ' + options.height + '});');
	}
};

(function($) {
	$.fn.progressBar = function( num ) {
		return this.each(function(i) {
			var clip = document.createElement('div');
			$(clip).css({
				position	: 'relative',
				width		: ($(this).attr('width') / 2) + 'px',
				height		: $(this).attr('height'),
				overflow	: 'hidden'
			});
			$(this)
				.wrap(clip)
				.css({
					display		: 'inline',
					position	: 'absolute',
					left		: '-' + ( ($(this).attr('width') / 2) - (num * $(this).attr('height')) ) + 'px'
				});
		});
	};
})(jQuery);

