(function($) {
	$.fn.ShowQuiz = function(p_options) {
	
		m_currentQuestion = 0;
		m_totalQuestions = 0;
		m_savedAnswers = new Array();
	
		m_totalQuestions = (document.getElementById("questionsList").getElementsByTagName("div").length - 1);
		
		document.getElementById("ofNumber").innerHTML = "of " + (m_totalQuestions + 1)

		document.getElementById("previousBtn").onclick = function(){
			prevQuestion();
		}
		
		document.getElementById("previousBtn").onclick = function(){
			prevQuestion();
		}

		showQuestion(m_currentQuestion);
	}
	  
	function showQuestion(p_quesID){

		var questionList = document.getElementById("questionsList").getElementsByTagName("div")[p_quesID];

		document.getElementById("questionNumber").innerHTML = (p_quesID + 1);

		// ****************** Create Question Text ******************
		var questionBody = document.getElementById("questionBody");

		// Check For Children
		if(questionBody.firstChild){
			while(questionBody.firstChild){
				questionBody.removeChild(questionBody.firstChild);
			}
		}

		var questionTxt = document.createElement("div");
			questionTxt.id = "questionTxt";
			questionTxt.appendChild(document.createTextNode(questionList.getElementsByTagName("h3")[0].innerHTML));

		document.getElementById("questionBody").appendChild(questionTxt);
		$("#questionTxt").hide();

		// ****************** Create Answers ******************
		var answerContainer = document.getElementById("answerContainer");

		// Check For Children
		if(answerContainer.firstChild){
			while(answerContainer.firstChild){
				answerContainer.removeChild(answerContainer.firstChild);
			}
		}

		var ansList = questionList.getElementsByTagName("p");
		var ansHTML = "";
		var questionAnswer;
		var answerWrapper;
		var answerTxt;
		var answerList;

		answerList = document.createElement("div");
		answerList.id = "answersList";	

		for(var i = 0; i < ansList.length; i++){

			questionAnswer = document.createElement("div");
			questionAnswer.className = "questionAnswer";
			questionAnswer.id = i;

			questionAnswer.onmouseover = function(p_evt){
				// Propogates through all child nodes.				
				var objTarget = getTarget(p_evt);

				// Find Overall Parent Node
				while(!hasClass(objTarget, "questionAnswer")){	
					objTarget = objTarget.parentNode;	
				}			

				if(!hasClass(objTarget, "questionAnswerOver")){
					addClass(objTarget, "questionAnswerOver");
					addClass(objTarget.childNodes[0], "questionWrapperOver");
					addClass(objTarget.childNodes[0].childNodes[0], "over");
				}
			}

			questionAnswer.onmousedown = function(p_evt){
				// Propogates through all child nodes.				
				var objTarget = getTarget(p_evt);

				// Find Overall Parent Node
				while(!hasClass(objTarget, "questionAnswer")){	
					objTarget = objTarget.parentNode;	
				}			

				if(!hasClass(objTarget, "questionAnswerDown")){
					addClass(objTarget, "questionAnswerDown");
					addClass(objTarget.childNodes[0], "questionWrapperDown");
					addClass(objTarget.childNodes[0].childNodes[0], "down");
				}
			}

			questionAnswer.onmouseout = function(p_evt){
				// Propogates through all child nodes.				
				var objTarget = getTarget(p_evt);

				// Find Overall Parent Node
				while(!hasClass(objTarget, "questionAnswer")){	
					objTarget = objTarget.parentNode;	
				}

				objTarget.className = "questionAnswer";
				objTarget.childNodes[0].className = "questionWrapper";
				objTarget.childNodes[0].childNodes[0].className = "";
			}

			questionAnswer.onclick = function(p_evt){
				var objTarget = getTarget(p_evt);
				$("#previousBtn").css("display", "none");

				while(isNaN(parseInt(objTarget.id))){
					objTarget = objTarget.parentNode;
				}
				
				saveAnswer(objTarget.id);
			}

			answerWrapper = document.createElement("div");
			answerWrapper.className = "questionWrapper";

			answerTxt = document.createElement("div");		
			answerTxt.appendChild(document.createTextNode(ansList[i].innerHTML));

			answerWrapper.appendChild(answerTxt);
			questionAnswer.appendChild(answerWrapper);

			answerList.appendChild(questionAnswer);
		}

		document.getElementById("answerContainer").appendChild(answerList);
		
		// Animate Open
		$("#answersList").hide().slideDown();
		$("#questionTxt").slideDown("normal", showQuestionsComplete);
	}
	
	function showQuestionsComplete(){
		var prevBtn = document.getElementById("previousBtn");
		// Check For Previous Button ***************************************************
		if(m_currentQuestion > 0 && prevBtn.style.display == "none"){
			prevBtn.style.display = "block";

		}else if(m_currentQuestion == 0){
			prevBtn.style.display = "none";
		}
	}
	
	function showResult(){

		var ansCalc = 0;
		var questionTotal = ((m_totalQuestions + 1) * 2);

		for(var i = 0; i < m_savedAnswers.length; i++){	
			switch(parseInt(m_savedAnswers[i])){
				case 0:
					ansCalc += 2;
					break;
				case 1:
					ansCalc += 1;
					break;
				case 2:
					ansCalc -= 1;
					break;
				case 3:
					ansCalc -= 2;
					break;
			}
		}	

		var a = (questionTotal * .5);
		var c = ((questionTotal * -1) * .5);

		var results = document.getElementById("responseList").getElementsByTagName("div");
		var resultTxt;	

		if(ansCalc > a){
			resultTxt = results[0].innerHTML;
		}
		else if( ansCalc > 0){
			resultTxt = results[1].innerHTML;
		}
		else if(ansCalc >= c){
			resultTxt = results[2].innerHTML;
		}
		else{
			resultTxt = results[3].innerHTML;
		}

		document.getElementById("resultTxt").innerHTML = resultTxt;
		
		$('#resultContainer').slideDown('slow');		
	}
	
	function slideOutComplete(p_id){
		if(m_currentQuestion < m_totalQuestions){
			showQuestion(++m_currentQuestion);
		}else{
			hideQuiz();
		}
	}
	
	function saveAnswer(p_id){
		m_savedAnswers[m_currentQuestion] = p_id;
		
		$("#answersList").slideUp("fast", slideOutComplete);
		$("#questionTxt").slideUp("fast");
	}

	function prevQuestion(){

		m_currentQuestion = Math.max(0, --m_currentQuestion);
		showQuestion(m_currentQuestion);
	}
	
	function hideQuiz(){
		$("#previousBtn").css("display", "none");
		$("#quizBody").slideUp("slow", showResult);
	}

	function removeClass(objElement, strClass){
		// if there is a class
		if (objElement.className){
			if ( objElement.className.indexOf(strClass) != -1 ){
				// the classes are just a space separated list, so first get the list
				var arrList = objElement.className.split(' ');

				// get uppercase class for comparison purposes
				var strClassUpper = strClass.toUpperCase();

				// find all instances and remove them
				for ( var i = 0; i < arrList.length; i++ ){

					// if class found
					if ( arrList[i].toUpperCase() == strClassUpper ){

						// remove array item
						arrList.splice(i, 1);

						// decrement loop counter as we have adjusted the array's contents
						i--;
					}
				}

				// assign modified class name attribute
				objElement.className = arrList.join(' ');
			}
		}
	}

	function hasClass(objElement, strClass){

		if ( objElement.className ){
			if(objElement.className.indexOf(strClass) != -1) return true;	
		}
		return false; // No Class Found
	}

	function addClass(element, value) {

		if(!element.className) {
			element.className = value;
		} else {
			if(!hasClass(element, value)){
				newClassName = element.className;
				newClassName+= " ";
				newClassName+= value;
				element.className = newClassName;
			}
		}
	}
	
	function getTarget(p_evt){
		var targ;
		if (!p_evt) var p_evt = window.event;
		
		if (p_evt.target){
			targ = p_evt.target;
		}
		else if (p_evt.srcElement){
			targ = p_evt.srcElement;
		}
		
		if (targ.nodeType == 3){
			// defeat Safari bug
			targ = targ.parentNode;
		}
		
		return targ;
	}

})(jQuery);