/**
 * NS Vertrektijden
 *
 * @version   1.00.090602
 * @author    LBI Lost Boys
 */
NS(function($){

	var CLASS_DETAILS = 'stationdetails';

	function Vertrektijden() {
		this.form = $('#form-actuele-vertrektijden');
		this.postURL = NS.getProperty('POST_AVT_DETAILS');
		this.pulsers = [];

		NS.relateLink(/continue-/i, this.nextFormStep.bind(this));
		NS.subscribe('submit', this.handleSubmit.bind(this));
	}

	Vertrektijden.prototype = {
		Defaults: {
			validateRequired: true,
			validateServer: false,
			replaceInputs: false,
			simulateClick: false
		},

		owns: function(form) {
			return this.form[0] == form;
		},

		prefers: function(setting) {
			return this.Defaults[setting];
		},
		
		handleSubmit:function(e) {
			var form = e.target;
			if(this.form[0] == form) {
				e.preventDefault();
				this.nextFormStep();
			}
		},

		nextFormStep:function(link, rel) {
			if(link && /more/i.test(link.className)) {
				this.refresh();
			} else {
				NS.XHR.sendForm(this.form[0], this.postURL, this.handleResponse.bind(this));
				this.metaRefresh = NS.getFormValues(this.form[0]);
			}
			return true;
		},

		handleResponse:function(xml) {
			this.form.addClass(CLASS_DETAILS);
			var details = $(xml).find("vertrektijdendetails").text();
			var target = $("#departure-times");
			NS.DOM.write(target, details);

			for(var i=0;i<this.pulsers.length; i++) {
				this.pulsers[i].destroy();
			}

			this.pulsers = [];
			var delayed = $('td.delay', target);
			for(var j=0; j<delayed.length; j++) {
				this.pulsers[j] = new CellPulser(delayed[j]);
			}
		},

		refresh:function() {
			if(this.metaRefresh) {
				NS.XHR.sendAndLoad(this.metaRefresh, this.postURL, this.handleResponse.bind(this));
			} else {
				this.nextFormStep();
			}	
		}
	};


	/**
	 * Cell pulsers
	 */
	function CellPulser(cell) {
		var opacity, time = $(cell).find("span"), i = 0;
		var msie = /msie/i.test(navigator.userAgent);
		var step = msie? Math.PI : 0.3; // for ie6, blink, otherwise fade
		var interval = msie? 1000 : 100; // appropriate interval for both
		
		function pulse() {			
			opacity = 0.5 + Math.cos(i += step) / 2;
			time.css({opacity: opacity});
		}

		this.timer = setInterval(pulse, interval);
		this.destroy = function() {
			clearInterval(this.timer);
		};
	}

	/**
	 * Bind to NS.initialize
	 */
	NS.subscribe('initialize', function(){
		NS.addApplication('vertrektijden', new Vertrektijden());
	});
});