/******************************** MESSAGE-OVERLAY-MANAGER ********************************/

//Layer-Manager
var MessageOverlayManager = {};



//Aktueller Layer
MessageOverlayManager.messages = new Array();



//Z-Index
MessageOverlayManager.zIndex = 99900;



//Message mit beliebigen Inhalt anzeigen
MessageOverlayManager.displayMessage = function(content) {
	this.messages.push(new MessageOverlay(content, this.zIndex));
	this.zIndex += 2;
}



//Message mit beliebigen Inhalt anzeigen
MessageOverlayManager.displayConfirm = function(content, callback) {
	this.messages.push(new ConfirmOverlay(content, this.zIndex, callback));
	this.zIndex += 2;
}



//Alle Layer schließen
MessageOverlayManager.closeAll = function() {
	if ( this.layer ) {
		this.layer.close();
	}
	this.layer = null;
}



//Bestimmten Layer schließen
MessageOverlayManager.close = function(message) {
	var start = this.messages.indexOf(message);
	if ( start!=-1 ) {
		for ( var i = this.messages.length-1; i>=start; i-- ) {
			this.messages[i].close();
			this.messages.pop();
		}
	}
}



/******************************** MESSAGE-OVERLAYS ********************************/

//DEFAULT
var DefaultMessageOverlay = function(content, close, zIndex) {
	this.visible = true;
	
	var viewportWidth = yDom.getViewportWidth();
	var viewportHeight = yDom.getViewportHeight();
	var docWidth = yDom.getDocumentWidth();
	var docHeight = yDom.getDocumentHeight();
	var scrollTop = yDom.getDocumentScrollTop();
	
	//Abblende-Layer erzeugen
	this.blacklayer = document.createElement('div');
	this.blacklayer.className = 'messageoverlay_black';
	yDom.setStyle(this.blacklayer, 'width', docWidth+'px');
	yDom.setStyle(this.blacklayer, 'height', docHeight+'px');
	yDom.setStyle(this.blacklayer, 'zIndex', zIndex);
	document.body.appendChild(this.blacklayer);
	
	//Container erzeugen
	var scrollTop = yDom.getDocumentScrollTop();
	this.container = document.createElement('div');
	this.container.className = 'messageoverlay';
	yDom.setStyle(this.container, 'top', scrollTop+'px');
	yDom.setStyle(this.container, 'width', viewportWidth+'px');
	yDom.setStyle(this.container, 'height', viewportHeight+'px');
	yDom.setStyle(this.container, 'zIndex', zIndex+1);
	
	//Message-Box
	this.message = document.createElement('div');
	this.message.className = 'message';
	this.message.innerHTML = content;
	
	//Append
	this.container.appendChild(this.message);
	document.body.appendChild(this.container);
	
	//Scroll-Listener
	yEvent.addListener(window, 'scroll', this.handleScrolling.bind(this));
	
	//Resize-Listener
	yEvent.addListener(window, 'resize', this.handleResize.bind(this));
	
	//Close-Button
	if ( close ) {
		var close = document.createElement('p');
		close.innerHTML = 'X';
		this.message.appendChild(close);
		var self = this;
		yEvent.addListener(close, 'click', function() { MessageOverlayManager.close(self); });
	}
}



//Layer schließen
DefaultMessageOverlay.prototype.close = function() {
	this.visible = false;
	this.blacklayer.parentNode.removeChild(this.blacklayer);
	this.container.parentNode.removeChild(this.container);
}



//Overlay sichtbar?
DefaultMessageOverlay.prototype.isVisible = function() {
	return this.visible;
}



//Scrolling
DefaultMessageOverlay.prototype.handleScrolling = function() {
	var scrollTop = yDom.getDocumentScrollTop();
	yDom.setStyle(this.container, 'top', scrollTop+'px');
}



//Resize
DefaultMessageOverlay.prototype.handleResize = function() {
	var viewportWidth = yDom.getViewportWidth();
	var viewportHeight = yDom.getViewportHeight();
	var docWidth = yDom.getDocumentWidth();
	var docHeight = yDom.getDocumentHeight();
	
	//Blacklayer anpassen
	yDom.setStyle(this.blacklayer, 'width', docWidth+'px');
	yDom.setStyle(this.blacklayer, 'height', docHeight+'px');
	
	//Iframe anpassen
	yDom.setStyle(this.container, 'width', viewportWidth+'px');
	yDom.setStyle(this.container, 'height', viewportHeight+'px');
}



//MESSAGE-OVERLAY
var MessageOverlay = function(content, zIndex) {
	content = '<p class="info">'+content+'</p>';
	MessageOverlay.superclass.constructor.call(this, content, false, zIndex);
	
	//Ok-Button erzeugen
	var p = document.createElement('p');
	p.className = 'buttons';
	var button = document.createElement('input');
	button.type = 'button';
	button.value = 'OK';
	button.className = 'button';
	var self = this;
	yEvent.addListener(button, 'click', function() { MessageOverlayManager.close(self); });
	p.appendChild(button);
	this.message.appendChild(p);
}


YAHOO.lang.extend(MessageOverlay, DefaultMessageOverlay);



//CONFIRM-OVERLAY
var ConfirmOverlay = function(content, zIndex, callback) {
	content = '<p class="info">'+content+'</p>';
	MessageOverlay.superclass.constructor.call(this, content, false, zIndex);
	
	//Buttons erzeugen
	var p = document.createElement('p');
	p.className = 'buttons';
	var self = this;
	var callbackFunction = this.buildCallback(callback);
	
	var buttonYes = document.createElement('input');
	buttonYes.type = 'button';
	buttonYes.value = 'Ja';
	buttonYes.className = 'button';
	yEvent.addListener(buttonYes, 'click', function() { MessageOverlayManager.close(self); callbackFunction(true); });
	
	var buttonCancel = document.createElement('input');
	buttonCancel.type = 'button';
	buttonCancel.value = 'Nein';
	buttonCancel.className = 'button';
	yEvent.addListener(buttonCancel, 'click', function() { MessageOverlayManager.close(self); callbackFunction(false); });
	
	p.appendChild(buttonYes);
	p.appendChild(document.createTextNode(' '));
	p.appendChild(buttonCancel);
	this.message.appendChild(p);
}


YAHOO.lang.extend(ConfirmOverlay, DefaultMessageOverlay);



//Callback-Funktion erzeugen
ConfirmOverlay.prototype.buildCallback = function(callback) {
	var args = (callback && callback.argument) ? callback.argument : null;
	var scope = (callback && callback.scope) ? callback.scope : window;
	return function(state) {
		callback.callback.call(scope, state, args);
	};
}



/******************************** SYSTEM-SELECT ********************************/

var SystemSelect = function(form) {
	for ( var i=0; i<form.elements.length; i++ ) {
		var element = form.elements[i];
		if ( element.type=='checkbox' ) {
			yEvent.addListener(element.parentNode, 'click', this.handleClick, element, this);
		}
	}
}



SystemSelect.prototype.handleClick = function(evt, checkbox) {
	if ( checkbox.checked ) {
		yDom.removeClass(checkbox.parentNode, 'selected');
	}
	else {
		yDom.addClass(checkbox.parentNode, 'selected');
	}
	checkbox.checked = !checkbox.checked;
}



/******************************** KATEGORIEN AUTOCOMPLETE ********************************/

//Konstruktor
var CategoryAutoComplete = function(textField, delay) {
	var container = document.createElement('div');
	textField.parentNode.appendChild(container);
	
	//Datenquelle
	this.ajaxSource = new YAHOO.util.XHRDataSource('/ajax.php');
	this.ajaxSource.responseType = YAHOO.util.XHRDataSource.TYPE_TEXT;
	this.ajaxSource.responseSchema = {
		recordDelim: "\n",
		fieldDelim: "\t"
	};
	
	//Init
	this.autocomplete = new YAHOO.widget.AutoComplete(textField, container, this.ajaxSource);
	this.autocomplete.queryDelay = delay/1000;
	this.autocomplete.animVert = false;
	this.autocomplete.maxResultsDisplayed = 50;
	this.autocomplete.formatResult = this.resultFormater;
	this.autocomplete.generateRequest = function(query) {
		return '?action=category_suggest&query='+query;
	};
}



//Formater-Function
CategoryAutoComplete.prototype.resultFormater = function(resultItem, query) {
	return '<span value="'+resultItem[1]+'">'+CategoryAutoComplete.htmlspecialchars(resultItem[0])+'</span>';
};



//Sonderzeichen ersetzen
CategoryAutoComplete.htmlspecialchars = function(p_string) {
	p_string = p_string.replace(/&/g, '&amp;');
	p_string = p_string.replace(/</g, '&lt;');
	p_string = p_string.replace(/>/g, '&gt;');
	p_string = p_string.replace(/"/g, '&quot;');
	return p_string;
};



/******************************** NAVIGATION ********************************/

var NavigationBar = function(root) {
	var topLevel = yDom.getElementsByClassName('l1', 'li', root);
	for ( var i=0; i<topLevel.length; i++ ) {
		var li = topLevel[i];
		yEvent.addListener(li, 'mouseover', this.handleMouseOver, li, this);
		yEvent.addListener(li, 'mouseout', this.handleMouseOut, li, this);
	}
}



NavigationBar.prototype.timer = null;



NavigationBar.prototype.current = null;



NavigationBar.prototype.handleMouseOver = function(evt, li) {
	
	//Clear Timer
	if ( this.timer ) {
		clearTimeout(this.timer);
	}
	
	//Aktuelle Navi verstecken
	if ( this.current ) {
		yDom.removeClass(this.current, 'hover');
		this.current = null;
	}
	
	//Neue Navi zeigen
	yDom.addClass(li, 'hover');
	this.current = li;
}



NavigationBar.prototype.handleMouseOut = function(evt, li) {
	
	//Clear Timer
	if ( this.timer ) {
		clearTimeout(this.timer);
	}
	
	//Callback + Timer starten
	var callback = function() {
		yDom.removeClass(li, 'hover');
		this.current = null;
	}
	this.timer = setTimeout(callback.bind(this), 2000);	
}