/**
 *	Vraag en antwoord
 *	--------------------------
 */

function VraagEnAntwoord() {
	this.form = document.getElementById("search");
	this.container = document.getElementById("vraag-en-antwoord");
	if(!this.container) {
		return;
	}

	this.virtualAgent = document.getElementById("virtual-agent");
	this.answers = this.container.getElementsByTagName("div")[0];
	
	this.results = getElementsByAttributeValue("class", "search-results", this.container)[0];
	this.assistance = getElementsByAttributeValue("class", "search-assistance", this.container)[0];

	this.isOpen = /vraag-en-antwoord/i.test(document.body.className)? 1:0;
	this.hasFeedback = /antwoord-feedback/i.test(document.body.className)? 1:0;

	if(/msie (5|6)/i.test(navigator.userAgent)) {
		this.ieFrame = document.createElement("iframe");
		this.ieFrame.className = "cover-frm";
		this.ieFrame.frameBorder = 0;
		document.getElementById("canvas").appendChild(this.ieFrame);
	}
	
	EventListener.addEvent(this.form, 'submit', this.handleSearch, this);
	EventListener.addEvent(document, 'click', this.handleClick, this);

	if (document.getElementById("zva-zipfields") && document.getElementById("zva-city") && document.getElementById("zva-street")) {
		this.requestApplication();
		this.zipDigits = document.getElementById("zva-zipfields").getElementsByTagName("input")[0];
		this.zipCharacters = document.getElementById("zva-zipfields").getElementsByTagName("input")[1];
		this.streetField = document.getElementById("zva-street");
		this.cityField = document.getElementById("zva-city");
	//	EventListener.addEvent(this.zipDigits, 'blur', this.handleZip, this);
	//	EventListener.addEvent(this.zipCharacters, 'blur', this.handleZip, this);
	}

}

VraagEnAntwoord.prototype = {
	
	POST_DETAILS:	Globals.POST_VEA_DETAILS,
	POST_ZIP:		Globals.POST_VEA_ZIP,
	URL_AGENT:		Globals.GET_VEA_AGENT,
	URL_BASE:		Globals.GET_VEA_BASE,

	CLASS_ACTIVE:	'vraag-en-antwoord',
	CLASS_FLOATING:	'vraag-en-antwoord-float',
	CLASS_FEEDBACK: 'vraag-en-antwoord-feedback',
	CLASS_LOADING:	'vea-loading',

	OFFSET_TOP:		/webkit/i.test(navigator.userAgent)? 30:31,
	OFFSET_RIGHT:	-3,
	
	
	initVirtualAgent:function(expression) {
		var agent = this.assistance.getElementsByTagName("form")[0];
		if(agent) {
			this.agentEvent = EventListener.addEvent(agent, 'submit', this.handleSearch, this);
		}

		if(!this.agent) {
			this.agent = new SWFObject(this.URL_AGENT, "virtualagent", "175", "130", "8");
			this.agent.addParam("wmode", "transparent");
			this.agent.addParam("base", this.URL_BASE);
			this.agent.addParam("quality", "high");
			this.agent.addParam("scale", "noscale");
			this.agent.write("virtual-agent");
		}

		try {
			var swf = /msie/i.test(navigator.userAgent)? 
				window.virtualagent : document.virtualagent;
			swf.showExpression(expression);
		} catch (e) {}
	},

	handleSearch:function(e) {
		var form = EventListener.getTarget(e, 'form') || this.form;
		var post = this.getFormValues(form);

		if(this.agentEvent)
			EventListener.removeEvent(this.agentEvent);

		if(form == this.form)
			this.setFloatingMode(false);

		this.setWaitingMode(true);

		var self = this;
	//	setTimeout(function(){
		
			XMLHttp.sendAndLoad(post, self.POST_DETAILS, self.scope(self.handlePost));

	//	}, 2000);
		
		this.toggle(true);
		EventListener.cancelEvent(e);
	},

	setWaitingMode:function() {
		var element = document.getElementById('agent-response'),
			query = document.getElementById("query"),
			zquery = document.getElementById("zva-query");

		element.innerHTML = '<p>' + Globals.MSG_LOADING + '</p><p class="loading"><img src="' + Globals.GET_VEA_LOADER + '" alt="" /></p>';
		if(query && zquery && query.value && !zquery.value) {
			zquery.value = query.value;
			query.value = '';
		}
		ClassName.add(this.container, this.CLASS_LOADING);
		
		var self = this;
		setTimeout(function(){
			// IE won't directly show agent after feedback click
			self.initVirtualAgent('neutraal');
			self.focusSearchField();
		}, 100);
	},

	handlePost:function(xml) {
		ClassName.remove(this.container, this.CLASS_LOADING);
		var pagepush = xml.getElementsByTagName("pagepush")[0].firstChild.nodeValue;
		if(/http/i.test(pagepush)) {
			window.location = pagepush;
			return;
		}

		var results = xml.getElementsByTagName("results")[0].firstChild.nodeValue;
		this.results.innerHTML = results;
		var escalation = xml.getElementsByTagName("escalation")[0].firstChild.nodeValue;

		if (escalation === "0") {
			var assistance = xml.getElementsByTagName("assistance")[0].firstChild.nodeValue;
			var questions = xml.getElementsByTagName("questions")[0].firstChild.nodeValue;
	
			this.assistance.innerHTML = assistance + questions;

		} else {
			var assistance = xml.getElementsByTagName("assistance")[0].firstChild.nodeValue;
			var form = xml.getElementsByTagName("form")[0].firstChild.nodeValue;
			var questions = xml.getElementsByTagName("questions")[0].firstChild.nodeValue;

			this.assistance.innerHTML = assistance + form + questions;
			this.requestApplication();
			
			if (document.getElementById("zva-zipfields") && document.getElementById("zva-city") && document.getElementById("zva-street")) {
				this.zipDigits = document.getElementById("zva-zipfields").getElementsByTagName("input")[0];
				this.zipCharacters = document.getElementById("zva-zipfields").getElementsByTagName("input")[1];
				this.streetField = document.getElementById("zva-street");
				this.cityField = document.getElementById("zva-city");
			//	EventListener.addEvent(this.zipDigits, 'blur', this.handleZip, this);
			//	EventListener.addEvent(this.zipCharacters, 'blur', this.handleZip, this);
			}
		}
		
		new RoundedBoxes(this.assistance);
		this.toggle(true); // open if not already opened
		
		var expression = xml.getElementsByTagName("expression")[0].firstChild.nodeValue;
		var self = this;
		setTimeout(function(){
			// IE won't directly show agent after feedback click
			self.initVirtualAgent(expression);
			self.focusSearchField();
		}, 100);
		
		if(window.Pointer) {
			new Pointer(this.answers);
		}
	},

	getProperty:function(name, form) {
		return (form && form[name])? 
			(form[name].value || Globals[name]) : Globals[name];
	},

	handleZip:function () {
		var zip = escape(this.zipDigits.value + this.zipCharacters.value);
		
		if (/^[1-9][0-9]{3}[A-Za-z]{2}$/i.test(zip)) {
			XMLHttp.sendAndLoad(zip, this.POST_ZIP, this.scope(this.handleZipPost), this, "get");
		}
	},

	handleZipPost:function(xml) {
		this.streetField.value = xml.getElementsByTagName("street")[0].firstChild.nodeValue;
		this.cityField.value = xml.getElementsByTagName("city")[0].firstChild.nodeValue;
	},
	
	toggle:function(toggle, closeFeedback) {
		if(toggle == false && this.hasFeedback && !closeFeedback) {
			return;
		}

		if(toggle) {
			ClassName.remove(document.body, this.CLASS_FEEDBACK);
			ClassName.add(document.body, this.CLASS_ACTIVE);
			this.toggleIEFrame(true);
			this.animateStart();
			this.focusSearchField();
		} else {
			ClassName.remove(document.body, this.CLASS_FEEDBACK);
			ClassName.remove(document.body, this.CLASS_ACTIVE);
			this.toggleIEFrame(false);
		}

		this.hasFeedback = false;
		this.isOpen = toggle;
	},

	focusSearchField:function() {
		var input = document.getElementById("zva-query");
		if(input) {
			try { 
				input.focus(); 
			} catch (e) {}
		}
	},

	animateStart:function() {
		if(this.isOpen) return;
		this.animate(0);
		var animator = new Animator(6, 10, this.scope(this.animate));
		animator.setType(animator.EASEINOUT);
		animator.start();
	},
	
	animate:function(step) {
		this.answers.style.paddingTop = step + 'px';
		this.virtualAgent.style.paddingTop = step + 'px';
	},

	toggleIEFrame:function(toggle) {
		if(this.ieFrame){
			var frm = this.ieFrame.style;
			if(toggle) {
				frm.left = calculateLeft(this.answers) + "px";
				frm.top = calculateTop(this.answers) + "px";
				frm.width = this.answers.offsetWidth + "px";
				frm.height = this.answers.offsetHeight + "px";
				frm.display = "block";
			} else {
				frm.display = "none";
			}
		}
	},

	tryClose:function(e) {
		if(!this.isOpen) return;
		var node = EventListener.getTarget(e);
		while(node) {
			if(node == this.container || (node.id && node.id.indexOf("dialog") != -1)) return;
			node = node.parentNode;
		}

		this.toggle(false);
	},

	handleClick:function(e) {
		var link = EventListener.getTarget(e, 'a');
		var rel = link? link.getAttribute('rel') : null;

		if(rel) {
			switch (rel) {
				case 'search-close':
					this.toggle(false, true);
				break;
				case 'search-previous':
					this.searchByLink(link, this.floating);
				break;
				case 'search-assist':
					this.searchByLink(link, true);
				break;
				case 'search-success':
					this.toggle(false, true);
				break;
				case 'search-failure':
					this.toggle(false, true);
					this.searchByLink(link, false);
				break;
				case 'form-submit':
					this.validateAndSubmit(link);
				break;
				case 'readspeaker':
					this.doReadspeaker(link);
				break;
				default:
					this.tryClose(e);
				break;
			}
			
			if(/(search-)|(readspeaker)|(form-)/.test(rel)) {
				EventListener.cancelEvent(e);
			}
			
		} else {
			this.tryClose(e);
		}
	},

	searchByLink:function(link, floating) {
		var post = /\?(.*)$/.exec(link.getAttribute("href"))[1];
		XMLHttp.sendAndLoad(post, this.POST_DETAILS, this.scope(this.handlePost));

		this.setFloatingMode(floating);
	},

	setFloatingMode:function(toggle) {
		var css = this.answers.style;
		var offset = (window.pageYOffset || document.documentElement.scrollTop) -60;
		if(toggle && offset > this.OFFSET_TOP) {
			this.floating = true;
			ClassName.add(document.body, this.CLASS_FLOATING);
			css.top = offset + 'px';
			css.right = '50px';
		} else {
			this.floating = false;
			ClassName.remove(document.body, this.CLASS_FLOATING);
			css.top = this.OFFSET_TOP + 'px';
			css.right = this.OFFSET_RIGHT + 'px';
		}
	},

	calculateTop:function(node) {
		var top = 0;
		while(node) {
			top += node.offsetTop;
			node = node.offsetParent;
		}	return top;
	},

	doReadspeaker:function(link) {
		// ReadSpeaker.read('content');
	},

	getFormValues:function(form) {
		var element, type, post = '';
		var input = /(text|select)/i;
		var hidden = /hidden/i;
		for (var i=0; i<form.elements.length; i++) {
			element = form.elements[i];
			type = element.type;
			if((input.test(type) && element.offsetHeight) || hidden.test(type) || element.checked) {
				post += element.name + '=' + element.value + '&';
			}
		}
		return post;
	},

	validateAndSubmit:function(origin) {
		var form = getParentByTagName(origin, 'form');
		if(window.Validator && !this.validator) {
			this.validator = new Validator(this);
		}

		if(this.validator) {
			this.validator.submit(form, true);
		} else {
			form.submit();
		}
	},

	requestApplication:function() {
		if(!window.runningApplication && window.Application) {
			new Application();
		}

		FormButtons.replace();
	},

	scope:function(method) {
		var scope = this;
		return function() {
			return method.apply(scope, arguments);
		}
	},
	
	displayError:function(input, toggle) {
		var form = input.form;
		var error = this.getErrorElement(form);
		ClassName[toggle? 'add':'remove'](input.parentNode, 'error');
		if(toggle) {
			error.style.display = 'block';
			error.innerHTML = Globals.MSG_REQUIRED;
		}
	},

	displayErrorMessage:function(form, message) {
		var error = this.getErrorElement(form);
		if(message) {
			error.innerHTML = Globals.MSG_ILLEGAL + message;
		} else {
			error.style.display = 'none';
		}
	},

	getErrorElement:function(form) {
		var nodes = form.getElementsByTagName("p");
		var errorReg = /(^|\s)error(\s|$)/i;
		for(var i=0; i<nodes.length; i++) {
			if(errorReg.test(nodes[i].className)) return nodes[i];
		}	return nodes[0];
	}
}

/**
 *	Onload
 *	--------------------------
 */

EventListener.addEvent(window, 'load', function() {
	new VraagEnAntwoord();
});