K.Page.Default_Index_Index = {
	
	statusSubmitted: false,
	
	initialize: function(object) {
	
		Object.extend(this, object);
			
		if (this.togglerElement) {
			Event.observe(this.togglerElement, 'click', this.toggle.bindAsEventListener(this));
		}
		
		if (this.tickerElement) {
			
			this.tickerDivElement = K.Element('div');
			
			this.initializingTicker = true;
			
			this.updateTicker();
			
		}
		
		if (this.userStatusElement) {
			K.Filter.filter(this.userStatusElement, 'smiley', 'profanity', 'hyperlink', 'wrap');
		}
		
		if (this.eventElements.length > 0) {
			for (var i = 0; i < this.eventElements.length; i++) {
				K.Filter.filter(this.eventElements[i], 'smiley', 'profanity', 'hyperlink', 'wrap');
			}
		}
		
		if (this.statusFormElement) {
			
			K.Smiliezer.initialize({
				textElement: this.statusTextareaElement,
				smiliesElement: this.smiliesElement,
				onUpdate: this.update.bind(this)	
			});
			
			this.textareaExtender = new K.Form.TextareaExtender({
				element: this.statusTextareaElement,
				containerElement: this.statusTextareaElement.parentNode,
				onSubmit: this.statusSubmit.bind(this)
			});
			
			this.textareaCounter = new K.TextareaCounter({
				limit: 250,
				hideBefore: 100,
				element: this.statusTextareaElement,
				counterElement: this.statusCounterElement
			});
		
			Event.observe(this.statusFormElement, 'submit', this.onStatusSubmit.bindAsEventListener(this));
			
			this.statusTextareaElement.focus();
			
		}
		
	},
	
	toggle: function(event) {
		
		Event.stop(event);	
		
		K.Effect.toggle(this.togglableElement);
		
	},
	
	updateTicker: function() {
		new Ajax.Request(
			'/index/event-ticker',
			{
				method: 'post',
				onComplete: this.handleTickerResponse.bind(this)
			}
		);
	},
	
	handleTickerResponse: function(response) {
		
		var 
			update = parseInt(response.getHeader('update')),
			regulatedOffset;
		
		if (update > -65) {
			this.updateTicker.bind(this).delay(65 + update);
		}
		
		this.tickerDivElement.innerHTML = response.responseText;
		
		Element.cleanWhitespace(this.tickerDivElement);
		
		for (var i = 0; i < this.tickerDivElement.childNodes.length; i++) {
			
			var 
				element = this.tickerDivElement.childNodes[i],
				offsetElement = Element.down(element, 'span.offset'),
				offset = parseInt(offsetElement.firstChild.nodeValue);
				
			element.removeChild(offsetElement);
				
			if (offset < -60 && this.initializingTicker) {
				this.insertTickerElement(element);
			}
			else {
				
				if (regulatedOffset) {
					regulatedOffset = Math.max(offset, regulatedOffset + 1);	
				}
				else {
					regulatedOffset = Math.max(offset, -60);	
				}
				
				this.tick.bind(this, element, true).delay(regulatedOffset + 60);
				
			}
			
		}
		
		this.initializingTicker = false;
		
	},
	
	tick: function(element) {
		
		Element.setOpacity(element, 0);
		
		this.insertTickerElement(element);
		
		new Effect.Appear(element);
		
	},
	
	insertTickerElement: function(element) {
		
		if (this.tickerElement.firstChild) {
			
			this.tickerElement.insertBefore(element, this.tickerElement.firstChild);
			
			while (this.tickerElement.childNodes.length > 100) {
				this.tickerElement.removeChild(this.tickerElement.lastChild);	
			}
			
		}
		else {
			this.tickerElement.appendChild(element);	
		}
		
	},
	
	update: function() {
		
		this.textareaExtender.update();
		this.textareaCounter.update();
		
	},
	
	isStatusSubmittable: function() {
		
		if (this.textareaCounter.isError()) {
			
			(new K.ConfirmWindow(
				'Liikaa tekstiä',
				{
					description: 'Tilan maksimipituus on 250 merkkiä. Poista tekstiä, kunnes punainen reunus katoaa.',
					onClose: (function() {
						this.statusTextareaElement.focus();
					}).bind(this)
				}
			)).enable();
			
		}
		
		return !this.statusSubmitted && !Element.hasClassName(this.statusTextareaElement, 'blur') && this.statusTextareaElement.value.length > 0 && !this.textareaCounter.isError();
		
	},
	
	onStatusSubmit: function(event) {
		
		if (!this.isStatusSubmittable()) {
			Event.stop(event);
			return;
		}
		
		this.statusSubmitElement.disabled = true;
		this.statusSubmitted = true;
		
	},
	
	statusSubmit: function() {
		
		if (!this.isStatusSubmittable()) {
			return;
		}
		
		this.statusSubmitElement.disabled = true;
		this.statusSubmitted = true;
		
		this.statusFormElement.submit();
		
	}
	
};





Event.observe(document, 'kavereita:load', function() {
	
	K.Page.Default_Index_Index.initialize({
		togglerElement: $('toggler'),
		togglableElement: $('togglable'),
		tickerElement: $('event_ticker_content'),
		statusFormElement: $('status'),
		userStatusElement: $('user_status'),
		statusTextareaElement: $('textarea_status'),
		statusCounterElement: $('textarea_status_counter'),
		statusSubmitElement: $('submit_status'),
		smiliesElement: $('smilies'),
		eventElements: $$('div#events .event_125')
	});	
	
});
