
Element.implement({
	
	getClassStoredValue: function(varName) {
		var c = this.get('class').split(' ');
		for(var i = 0; i < c.length; i++) {
			c[i] = c[i].split('-');
			if(c[i][0] == varName) {
				return c[i][1];
			}
		}
		return null;
	}
	
});



var Madara_Poll = new Class({
	
	sIFR_SerifaFont: null,
	pollType: 'poll',
	
	initialize: function() {
		this.pollType = window.POLL_TYPE ? window.POLL_TYPE : this.pollType;
		
		window.addEvent('domready', this.onDOMReady.bindWithEvent(this));
		window.addEvent('load', this.onLoad.bindWithEvent(this));
		this.sIFR_init();
	},
	
	onDOMReady: function() {
		
		/*$(document.body).setStyle('overflow', 'hidden');*/
		(function() {
			$(document.body).removeClass('init');
		}).delay(2000);
		
		// repair SIFR problem & set tweening parameters for all questions
		$('pagesContainer').getElements('.question').forEach(function(question) {
			(function() {
				if(!this.hasClass('intro')) this.setStyle('display', 'none');
				/*if(this.getElement('object')) {
					alert(this.getElement('object').tagName);
					alert(this.getElement('object').style.display);
					this.getElement('object').setStyle('display', 'block');
				}*/
			}).delay(50, question);
			question.set('tween', { 'duration' : 300 });
		}.bind(this));
		
		// repair SIFR problem for answers
		$('pagesContainer').getElements('.results .result').forEach(function(result) {
			(function() {
				this.setStyle('display', 'none');
				//if(this.getElement('object')) this.getElement('object').setStyle('display', 'block');
			}).delay(50, result);
		});
		
		$('pagesContainer').getElements('.results .dryResult').forEach(function(result) {
			(function() {
				this.setStyle('display', 'none');
				//if(this.getElement('object')) this.getElement('object').setStyle('display', 'block');
			}).delay(50, result);
		});
		
		// links in results page should always open in the top window
		$('pagesContainer').getElements('.results a').forEach(function(el) {
			el.set('target', '_top');
		});
		

		// add event for "start test" link
		if($('startTestLink')) $('startTestLink').addEvent('click', function() {
			this.startTest();
		}.bind(this));
		
		// add "change" events for all radio- and check-buttons
		$('pagesContainer').getElements('input.choiceCheck')
							   .set('checked', false).set('disabled', false)
							   .addEvent(Browser.Engine.trident ? 'click' : 'change', this.questionChoiceOnClick.bindWithEvent(this));
		
		// add  events for user input fields...
		$$('#pagesContainer input.choiceUserInput')
		//$('pagesContainer').getElements('input.choiceUserInput')
							   .set('disabled', false).addEvents({
			'click': this.questionChoiceOnClick.bindWithEvent(this, true),
			'keypress': function(event) {
				if(event.key == 'enter') {
					event.stop();
					var question = $(event.target).getParent('.question');
					var qValidateInfo = this.questionValidate(question);
					if(qValidateInfo.validated) {
						question.getElement('.nextQuestion').setStyle('display', 'block');
						this.questionProceedToNext(question);
					} else {
						question.getElement('.nextQuestion').setStyle('display', 'none');
					}
				}
			}.bindWithEvent(this)
		})
		
		var fTest = function(event) {
			var question = $(event.target).getParent('.question');
			var qValidateInfo = this.questionValidate(question);
			//console.debug(qValidateInfo);
			if(qValidateInfo.validated) {
				question.getElement('.nextQuestion').setStyle('display', 'block');
			} else {
				question.getElement('.nextQuestion').setStyle('display', 'none');
			}
		}.bindWithEvent(this);
		$$('#pagesContainer .question-input-area textarea').set('disabled', false).addEvents({
			'keyup': fTest,
			'change': fTest,
			'blur': fTest
		})
		
		// add events for all "next question" links...
		$('pagesContainer').getElements('.question .nextQuestion').forEach(function(el) {
			el.addEvent('click', function(event, el) {
				var question = el.getParent('.question');
				var nextQ = question.getNext();
				if(nextQ) 
					this.transit(question, 'next');
				else {
					this.endTest();
				}
			}.bindWithEvent(this, el));
		}.bind(this));
		
		// add events for all "previous question" links...
		$('pagesContainer').getElements('.question .prevQuestion').forEach(function(el) {
			el.addEvent('click', function(event, el) {
				var question = el.getParent('.question');
				var prevQ = question.getPrevious();
				if(prevQ) this.transit(question, 'prev');
			}.bindWithEvent(this, el));
		}.bind(this));
	},
	
	onLoad: function() {
		//alert($('pagesContainer').getStyle('width'));
		//alert($('pagesContainer').getSize().x);
	},

	
	
	
	
	
	
	
	startTest: function() {
		var introElement = $('pagesContainer').getElement('.intro');
		new Fx.Tween(introElement, { duration: 300,
			onStart: function(el) {
				el.setStyle('display', 'block');
			},
			onComplete: function(el) {
				el.setStyle('display', 'none');
				var nextQ = el.getNext();
				if(nextQ) {
					//nextQ.set('tween', { duration: 300 });
					nextQ.setStyle('display', 'block');
					nextQ.fade('hide').fade('in');
				}
			}
		}).start('opacity', 0);
	},
	endTest: function() {
		if(this.pollType == 'skintest') {
			this.showSkinTestResult();
		} else {
			$('pagesContainer').setStyle('visibility', 'hidden');
			$('pollForm').submit();
		}
	},
	
	
	
	
	
	
	questionChoiceOnClick: function(event, isFromUserInputField) {
		//console.debug($(event.target));
		
		var question = $(event.target).getParent('.question');
		var choice = $(event.target).getParent('.choice');
		var checkElement = choice.getElement('input.choiceCheck');
		
		// if clicked on the user input field, then check the choice if it's not checked
		// if it is already checked, then nothing to do here => quit.
		if(isFromUserInputField) {
			if(!checkElement.checked)
			 	checkElement.checked = true;
			else
				return;
		}
		
		this.questionChoiceProcessClick(question, choice, checkElement);
		var qValidateInfo = this.questionValidate(question);
		if(qValidateInfo.validated) {
			question.getElement('.nextQuestion').setStyle('display', 'block');
			if(qValidateInfo.canProceed) this.questionProceedToNext(question);
		} else {
			question.getElement('.nextQuestion').setStyle('display', 'none');
		}
	},
	
	questionChoiceProcessClick: function(questionElement, choiceElement, checkElement) {
		var isMultiple = questionElement.hasClass('multiple');
		var numSimultAnsers = isMultiple ? questionElement.getClassStoredValue('simultCount') : 1;
		
		if(numSimultAnsers == 1) {
			questionElement.getElements('.choice').forEach(function(el) {
				(el == choiceElement) ? el.addClass('selected') : el.removeClass('selected');
			});
		
		} else {
			var numAlreadyChecked = questionElement.getElements('.choice.selected').length;
			//console.debug('num checked:', numAlreadyChecked, ' numAllowed: ', numSimultAnsers);
			if(!checkElement.checked) {
				choiceElement.removeClass('selected');
				
				if(numSimultAnsers - numAlreadyChecked == 0) {	// if the maximum amount of choices were chosen, unhide the rest as one becomes available.
					questionElement.getElements('.choice').forEach(function(el) {
						el.setOpacity(1);
						el.getElement('input').disabled = false;
					});
				}
			
			} else if(numAlreadyChecked < numSimultAnsers) {
				choiceElement.addClass('selected');
				
				if(numSimultAnsers - numAlreadyChecked == 1) {	// hide the rest of the choices as maximum amount of simultanious choices has been reached.
					questionElement.getElements('.choice').forEach(function(el) {
						if(!el.hasClass('selected')) {
							el.setOpacity(0.5);
							el.getElement('input').disabled = true;
						}
					});
				}
				
				var uIEl = choiceElement.getElement('.choiceUserInput');
				if(uIEl) uIEl.focus();
			}
		}
	},
	
	questionSetAnswered: function(questionElement, bWithDelay) {
		if(bWithDelay) {
			(function() { 
				this.addClass('answered'); 	// this shows the "next question" link in the question container
			}).delay(400, questionElement);
		} else
			questionElement.addClass('answered');
	},
	
	
	questionValidate: function(questionElement) {
		var returnObj = {};
		
		if(questionElement.hasClass('question-input-area')) {
			var tA = questionElement.getElement('textarea');
			var required = questionElement.hasClass('required');
			returnObj.validated = required ? tA.get('value') !== '' : true;
			returnObj.canProceed = returnObj.validated;
			
		} else {		
			var isMultiple = questionElement.hasClass('multiple');
			var numSimultAnsers = isMultiple ? parseInt(questionElement.getClassStoredValue('simultCount')) : 1;
			
		
			var numChecked = 0;
			var someAnswerHasUI = false;
			questionElement.getElements('.choice').forEach(function(choiceEl) {
				var el = choiceEl.getElement('input.choiceCheck');
			
				if(numSimultAnsers > 0 && numChecked >= numSimultAnsers) {
					el.checked = false;
				} else {
					if(el.checked) numChecked++;
					if(el.checked && choiceEl.getElement('input.choiceUserInput')) someAnswerHasUI = true;
				}
			});
		
			returnObj.validated = (numChecked == numSimultAnsers) || (numChecked > 0) && !numSimultAnsers;
			returnObj.canProceed = !questionElement.hasClass('answered') && (numSimultAnsers > 0) && !someAnswerHasUI;
		}
		
		return returnObj;
	},
	
	
	questionProceedToNext: function(fromQuestionElement) {
		this.transit(fromQuestionElement, 'next');
		this.questionSetAnswered(fromQuestionElement, true);
	},
	
	
	
	
	
	
	
	
	
	
	
	transitIsGoingOn:false,
	
	transit: function(curQuestionDIV, changeType) {
		if(!this.transitIsGoingOn) {
			var choicesDIV = curQuestionDIV.getElement('.choices');
			var fadeDIV = choicesDIV ? choicesDIV : curQuestionDIV;
			
			new Fx.Tween(fadeDIV, { duration: 300,
				onStart: function(el) {
					this.transitIsGoingOn = true;
					fadeDIV.fade('show'); //el.setStyle('display', 'block');
					
					var nav = curQuestionDIV.getElement('.nav');
					if(nav) nav.setStyle('display', 'none');
				}.bindWithEvent(this),
				
				onComplete: function(el) {
					this.transitIsGoingOn = false;
					var question = el.hasClass('choices') ? el.getParent('.question') : el;
					var nextQuestion = changeType == 'next' ? question.getNext() : question.getPrevious();
					
					if(nextQuestion) {
						var nextChoices = nextQuestion.getElement('.choices');
					
						question.setStyle('display', 'none');	// hide current question
						nextQuestion.setStyle('display', 'block').setStyle('visibility', 'visible');
						(nextChoices ? nextChoices : nextQuestion).fade('hide').fade('in');
					
						var nav = nextQuestion.getElement('.nav')
						if(nav) nav.setStyle('display', 'block');
						if(!nextQuestion.hasClass('required')) nav.getElement('.nextQuestion').setStyle('display', 'block');
					} else {
						this.endTest();	// ends the test)
					}
				}.bindWithEvent(this)
			}).start('opacity', 0);
		}
	},
	
	
	

	
	showSkinTestResult: function() {
		
		// normal questions
		var answers = new Array();
		$('pagesContainer').getElements('.normalQuestion input[type="radio"]').forEach(function(el) {
			//console.debug(el);
			if(el.get('checked')) {
				if(!answers[el.get('value')]) answers[el.get('value')] = 0;
				answers[el.get('value')]++;
			}
		});
		
		var maxValue = 0;
		var resultIdx = 0;
		answers.forEach(function(value, idx) {
			if(value > maxValue) {
				maxValue = value;
				resultIdx = idx;
			}
		});
		
		// extra question
		var xAnswers = $('pagesContainer').getElements('.extraQuestion input[checked]');

		
		if(resultIdx > 0) {
			var resultContainer, dryResultContainer;
			
			$('pagesContainer').getElements('.results .result').forEach(function(el) {
				if(el.hasClass('result-' + resultIdx)) {
					el.setStyles({ 'display': 'block', 'visibility' : 'visible' });	
					resultContainer = el;
				} else {
					el.setStyles({ 'display': 'none', 'visibility' : 'visible' });
				}
			});
			
			if(xAnswers.length > 0) {
				
				dryResultContainer = $('pagesContainer').getElement('.results .dryResult');
				if(dryResultContainer) {
					dryResultContainer.setStyles({ 'display': 'block', 'visibility' : 'visible' });	
					dryResultContainer.fade('hide');
				}
			}
			
			
			resultContainer.fade('hide');
			
			new Fx.Tween($('pagesContainer').getElement('.questions'), { duration: 300,
				onStart: function(el) {
					el.setStyle('display', 'block');
				},
				onComplete: function(el) {
					el.setStyle('display', 'none');
					resultContainer.fade('hide').fade('in');
					if(dryResultContainer) {
						if(parent.SqueezeBox) parent.SqueezeBox.resize({x:900, y:450}, true);
						dryResultContainer.fade('hide').fade('in');
					}
				}
			}).start('opacity', 0);
			
			
			
		}
	}, 
	
	
	
	
	
	sIFR_init: function() {
		
		sIFR.useStyleCheck = true;
		sIFR.useDomLoaded = true;
		
		var fontScript = window.FONT_SCRIPT;
		this.sIFR_SerifaFont = { src: '/_content/sifr/fonts/serifa-' + fontScript + '.swf' };
		sIFR.activate(this.sIFR_SerifaFont);

		// heading 1
		sIFR.replace(this.sIFR_SerifaFont, {
			selector: 'h1',
			css: [
				'.sIFR-root { color: #373A3B; leading: -7; }',
				'em { font-style: normal; color: #819814; }'
			],
			wmode: 'transparent'
		});

		// heading 1 - sub
		sIFR.replace(this.sIFR_SerifaFont, {
			selector: 'h1 small',
			css: '.sIFR-root { color: #667966; }'
		});
		
		sIFR.replace(this.sIFR_SerifaFont, {
			selector: 'h2',
			css: '.sIFR-root { color: #819814; }'
		});
		
	}
	
	
});


var madaraPoll = new Madara_Poll();