/*
	require_once /lib/mootools/core.js
	require_once /lib/mootools/more.js
*/

tweenerOptions = {
	duration: 500,
	transition: Fx.Transitions.Quad.easeOut
};

// so far, only default html templates are supported.
function renderTemplate (templateName, markers) {
	var template;
	var searchRegEx;
	var templateRequest = new XMLHttpRequest();
	//need workaround for the double slash (our very own comment removal regular expression)
	templateRequest.open ("GET", "http:/"+"/"+self.location.hostname+"/templates/default/"+templateName+".html", false);
	templateRequest.setRequestHeader("User-Agent",navigator.userAgent);
	templateRequest.send(null);

	if (templateRequest.status==200) template = templateRequest.responseText;
	else return;

	for(var key in markers) {
		// here also working around the triple-hash-removal in the templates with #{3}
		searchRegEx = new RegExp("#{3}"+key.toUpperCase()+"#{3}", 'g');
		template = template.replace(searchRegEx, markers[key]);
	}
	
	// remove empty markers - not quite sure why the backslash is needed in "\$2", but it is.
	template = template.replace(/#{3}([^#\:]+)\:?([^#]*?)#{3}/g, "\$2");
	return template;
}

function wrapTemplate (templateName, markers) {
	var result = new Element('div');
	result.set('html', renderTemplate(templateName, markers));
	return result;
}

function replaceDiv (div, newDiv) {
	var oldHeight = div.getSize().y;

	var divTweener = new Fx.Tween(div, tweenerOptions);
	divTweener.chain(
		function () {
			this.start('opacity', 1, 0);
		},
		function () {
			div.removeProperties('class', 'id');
			div.setStyle('height', oldHeight);
			div.set('html', '');
			newDiv.inject(div);
			this.callChain();
		},
		function () {
			divTweener.start('height', oldHeight, newDiv.getSize().y);
		},
		function () {
			divTweener.start('opacity', 0, 1);
		}
	);
	divTweener.callChain();
}

function vanishDiv (div) {
	var divTweener = new Fx.Tween(div, tweenerOptions);
	var oldHeight = div.getSize().y;
	
	divTweener.chain(
		function () {
			this.start('opacity', 1, 0);
		},
		function () {
			div.setStyle('height', oldHeight);
			div.set('html', '');
			this.callChain();
		},
		function () {
			divTweener.start('height', oldHeight, 0);
		}
	);
	divTweener.callChain();
}

function nl2br (str, is_xhtml) {
    // Converts newlines to HTML line breaks  
    // 
    // version: 911.1619
    // discuss at: http://phpjs.org/functions/nl2br    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Philip Peterson
    // +   improved by: Onno Marsman
    // +   improved by: Atli Þór
    // +   bugfixed by: Onno Marsman    // +      input by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +   improved by: Maximusya
    // *     example 1: nl2br('Kevin\nvan\nZonneveld');    // *     returns 1: 'Kevin\nvan\nZonneveld'
    // *     example 2: nl2br("\nOne\nTwo\n\nThree\n", false);
    // *     returns 2: '<br>\nOne<br>\nTwo<br>\n<br>\nThree<br>\n'
    // *     example 3: nl2br("\nOne\nTwo\n\nThree\n", true);
    // *     returns 3: '\nOne\nTwo\n\nThree\n'    
	var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '' : '<br>';
 
    return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1'+ breakTag +'$2');
}


// seems unneeded for the moment
function measureHeight (div) {
	// TODO Dirty hack: somehow get the target size of div without displaying it
	div.setStyle('visibility', 'hidden');
	div.inject('fusszeile', 'bottom');
	var height = div.getSize().y;
	div.dispose();
	div.setStyle('visibility', '');
	return height;
}

