var editor = false;
var core = {
	mouseposx:0,
	mouseposy:0,
	target:'ajx/chat.php',
	changeid:false,
	smileys:[ 'sbiggrin.gif', 'sconfused.gif', 'scool.gif', 'scry.gif', 'sdrool.gif', 'shappy.gif', 'smad.gif', 'ssad.gif', 'ssleepy.gif', 'ssmile.gif', 'ssuprised.gif', 'stongue.gif' ],
    isFirefox: navigator.userAgent.indexOf( 'Firefox' ) != -1,
	onload:function(){},
	loadapp:function()
	{
		core.calendar = new calendar();
		document.onmousemove = core.mouse;
		if( typeof CKEDITOR != 'undefined' )
		{
			if( document.getElementById('html_editor') )
			{
				var smileymirror = document.createElement("div");  
				smileymirror.id = 'smileymirror';
				for( var x = 0; x < core.smileys.length; x++ )
				{
					smileymirror.innerHTML += '<img src="smiley/'+core.smileys[x]+'" onclick="core.insertsmiley( this );" />';
				}
				document.body.appendChild( smileymirror );

				if( document.getElementById('html_editor').getAttribute('height') )
				{
					CKEDITOR.config.height = document.getElementById('html_editor').getAttribute('height')+'px';
				}
				if( document.getElementById('html_editor').getAttribute('change') )
				{
					core.changeid = document.getElementById('html_editor').getAttribute('change');
				}
				if( document.getElementById('html_editor').getAttribute('resize_enabled') == 0 )
				{
					CKEDITOR.config.resize_enabled = false;
				}
				
				editor = CKEDITOR.replace( 'html_editor',
					{
						toolbar : [ [ 'Bold', 'Italic', 'Underline', 'Strike', '-', 'smilebtn', '-', 'savebtn' ] ]
					});

				if( document.getElementById('html_editor').getAttribute('entersave') == 1 )
				{
					editor.on( 'key', function( e ){
						if( e.data.keyCode == 13 )
						{
							core.saveEdit();
							return false;
						}
					});
				}
					
				editor.on( 'pluginsLoaded', function( ev )
					{
						editor.ui.addButton( 'savebtn',
							{
								label : 'Senden',
								className: 'snapin',
								click: function(){ core.saveEdit(); }
							} );
						editor.ui.addButton( 'smilebtn',
							{
								label : 'Smilies',
								className: 'snapin',
								click: function(){ core.openSmileyHolder(); }
							} );
					});
			}
		}
		this.onload();
	},

	mn:function( number )
	{
		number += '';
		number = number.replace(',','.');
		number = Math.round( parseFloat(number) * 100 ) / 100;
		number = number+'';
		number = number.replace('.',',');
		test = number.split( ',' );
		if( !test[1] )
			return test[0]+',00';
		if( test[1].length == 1 )
			return test[0]+','+test[1]+'0';
		return number+'';
	},
	
	showcalendar:function(el)
	{
		core.calendar.closecalendar();		
		var chooser=document.createElement('div');
		chooser.innerHTML=core.calendar.createcalendargrid(el);
		chooser.className='calendar';
		chooser.id='cal';
		el.parentNode.appendChild(chooser);
		core.calendar.createcalendar();
	},
	
	saveEdit:function()
	{
		new core.ajax( core.target, {
			postBody:'&content='+Base64.encode( editor.getData() ),
			onComplete:function( result ){ if(core.changeid){document.getElementById( core.changeid ).innerHTML = result;} }
		});
		editor.setData('');
	},
	
	updateChat:function()
	{
		new core.ajax( core.target, {
			postBody:'',
			onComplete:function( result ){ document.getElementById( 'chatbox0' ).innerHTML = result; }
		});
	},
	
	openSmileyHolder:function()
	{
		core.showhide( 'smileymirror' );
		document.getElementById( 'smileymirror' ).style.left = core.mouseposx+'px';
		document.getElementById( 'smileymirror' ).style.top = (core.mouseposy+10)+'px';
	},
	
	insertsmiley:function( el )
	{
		editor.insertHtml( '<img src="'+el.src+'" />' );
		core.showhide( 'smileymirror' );
	},
	
	showhide:function( id )
	{
		if( document.getElementById( id ).style.display == 'block' )
			document.getElementById( id ).style.display = 'none'
		else
			document.getElementById( id ).style.display = 'block'
	},

	showvisible:function( id )
	{
		if( document.getElementById( id ).style.visibility == 'visible' )
		{
			document.getElementById( id ).style.visibility = 'hidden';
			document.getElementById( id ).style.height = '0px';
		}
		else
		{
			document.getElementById( id ).style.visibility = 'visible';
			document.getElementById( id ).style.height = 'auto';
		}
	},
	
	mouse:function (e)
	{
		var x = (document.all) ? window.event.x + document.body.scrollLeft : e.pageX;
		var y = (document.all) ? window.event.y + document.body.scrollTop : e.pageY;
		if( core.x == x && core.y == y )
			return true;
		core.mouseposx = x;
		core.mouseposy = y;

	},

	var_dump:function(arr,level){
		var dumped_text = "";
		if(!level) level = 0;
		var level_padding = "";
		for(var j=0;j<level+1;j++) level_padding += "    ";
		if(typeof(arr) == 'object') 
		{
			for(var item in arr) 
			{
				var value = arr[item];
				if(typeof(value) == 'object') 
				{
					dumped_text += level_padding + "'" + item + "' ...\n";
					dumped_text += core.dump(value,level+1);
				} 
				else 
				{
					dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
				}
			}
		} 
		else 
		{ 
			dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
		}
		alert(dumped_text);
	},

	dump:function( value, level )
	{
		var string = "";
		for( var x = 0; x <= level; x++ )
		{
			string = string + " ";
		}
		return string + value;
	},
	ajax:function( url, obj )
	{
	    
		if (window.XMLHttpRequest) { // Mozilla, Safari,...
			var http_request = new XMLHttpRequest();
			if (http_request.overrideMimeType) {
				http_request.overrideMimeType('text/xml');
			}
		} 
		else if (window.ActiveXObject) 
		{ // IE
			try 
			{
				var http_request = new ActiveXObject("Msxml2.XMLHTTP");
			} 
			catch (e) 
			{
				try {
					var http_request = new ActiveXObject("Microsoft.XMLHTTP");
				} catch (e) {}
			}
		}
		if (!http_request) 
		{
			alert('Cannot create XMLHTTP instance');
			return false;
		}

		var ajaxComplete = function()
		{
			if (http_request.readyState == 4) 
			{
				if (http_request.status == 200) 
				{
					result = http_request.responseText;
					if( obj.onComplete )
						obj.onComplete( result );
				} 
				else 
				{
					alert('There was a problem with the request.');
				}
			}
		
		}
		http_request.onreadystatechange = ajaxComplete;
		http_request.open( (obj.method?obj.method:'POST') , url, true);
		http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
		http_request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
		http_request.setRequestHeader("Accept", "text/javascript, text/html, application/xml, text/xml, */*");
		if( obj && obj.postBody )
		    http_request.setRequestHeader("Content-length", obj.postBody.length);
	    else
		    http_request.setRequestHeader("Content-length", 0);
		http_request.setRequestHeader("Connection", "close");
        if( obj )
		    http_request.send( obj.postBody );
		else
		    http_request.send( null );
	}
	
}
var Base64 = {
 
	// private property
	_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
 
	// public method for encoding
	encode : function (input) {
		var output = "";
		var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
		var i = 0;
 
		input = Base64._utf8_encode(input);
 
		while (i < input.length) {
 
			chr1 = input.charCodeAt(i++);
			chr2 = input.charCodeAt(i++);
			chr3 = input.charCodeAt(i++);
 
			enc1 = chr1 >> 2;
			enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
			enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
			enc4 = chr3 & 63;
 
			if (isNaN(chr2)) {
				enc3 = enc4 = 64;
			} else if (isNaN(chr3)) {
				enc4 = 64;
			}
 
			output = output +
			this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
			this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);
 
		}
 
		return output;
	},
 
	// public method for decoding
	decode : function (input) {
		var output = "";
		var chr1, chr2, chr3;
		var enc1, enc2, enc3, enc4;
		var i = 0;
 
		input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
 
		while (i < input.length) {
 
			enc1 = this._keyStr.indexOf(input.charAt(i++));
			enc2 = this._keyStr.indexOf(input.charAt(i++));
			enc3 = this._keyStr.indexOf(input.charAt(i++));
			enc4 = this._keyStr.indexOf(input.charAt(i++));
 
			chr1 = (enc1 << 2) | (enc2 >> 4);
			chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
			chr3 = ((enc3 & 3) << 6) | enc4;
 
			output = output + String.fromCharCode(chr1);
 
			if (enc3 != 64) {
				output = output + String.fromCharCode(chr2);
			}
			if (enc4 != 64) {
				output = output + String.fromCharCode(chr3);
			}
 
		}
 
		output = Base64._utf8_decode(output);
 
		return output;
 
	},
 
	// private method for UTF-8 encoding
	_utf8_encode : function (string) {
		string = string.replace(/\r\n/g,"\n");
		var utftext = "";
 
		for (var n = 0; n < string.length; n++) {
 
			var c = string.charCodeAt(n);
 
			if (c < 128) {
				utftext += String.fromCharCode(c);
			}
			else if((c > 127) && (c < 2048)) {
				utftext += String.fromCharCode((c >> 6) | 192);
				utftext += String.fromCharCode((c & 63) | 128);
			}
			else {
				utftext += String.fromCharCode((c >> 12) | 224);
				utftext += String.fromCharCode(((c >> 6) & 63) | 128);
				utftext += String.fromCharCode((c & 63) | 128);
			}
 
		}
 
		return utftext;
	},
 
	// private method for UTF-8 decoding
	_utf8_decode : function (utftext) {
		var string = "";
		var i = 0;
		var c = c1 = c2 = 0;
 
		while ( i < utftext.length ) {
 
			c = utftext.charCodeAt(i);
 
			if (c < 128) {
				string += String.fromCharCode(c);
				i++;
			}
			else if((c > 191) && (c < 224)) {
				c2 = utftext.charCodeAt(i+1);
				string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
				i += 2;
			}
			else {
				c2 = utftext.charCodeAt(i+1);
				c3 = utftext.charCodeAt(i+2);
				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
				i += 3;
			}
 
		}
 
		return string;
	}
 
}
function calendar()
{
	this.DatumAktuell=new Date();
	this.JahrAktuell=this.DatumAktuell.getFullYear();
	this.MonatAktuell=this.DatumAktuell.getMonth();
	this.Wochentage=new Array("So","Mo","Di","Mi","Do","Fr","Sa");
	this.Monatsnamen=new Array("Jan.", "Feb.", "M&auml;rz", "April", "Mai", "Jun.","Jul.", "Aug.", "Sep.", "Okt.", "Nov.", "Dez.");
	this.firstday=new Date(this.JahrAktuell, this.MonatAktuell, 1);
	this.dayspermonth = [31,28,31,30,31,30,31,31,30,31,30,31];
	this.createcalendar=function()
	{
		start=0;
		while(start<42)
		{
			document.getElementById('day_'+start).innerHTML='';
			start++;
		}
		momtag=this.firstday.getDay();
		tag=1;
		if(momtag==0){start=7;}
		if(momtag==1){start=1;}
		if(momtag==2){start=2;}
		if(momtag==3){start=3;}
		if(momtag==4){start=4;}
		if(momtag==5){start=5;}
		if(momtag==6){start=6;}
		jahr=new Date(this.firstday.getFullYear(), 0, 1);
		woche = Math.ceil((this.firstday.getTime() - jahr) / (7 * 24 * 60 * 60 * 1000));
		maxtage=this.dayspermonth[this.MonatAktuell]+1;
		weeks=1;
		while(tag<maxtage)
		{
			if(tag/7==Math.round(tag/7)){weeks++;}
			document.getElementById('day_'+start).innerHTML=tag;
			tag++;
			start++;
		}
		document.getElementById('currentmonth').innerHTML=this.Monatsnamen[this.MonatAktuell]+" "+this.JahrAktuell;
	}
	
	this.nextMonth=function()
	{
		this.MonatAktuell++;
		if(this.MonatAktuell>11)
		{
			this.MonatAktuell=0;
			this.JahrAktuell++;
		}
		this.firstday=new Date(this.JahrAktuell, this.MonatAktuell, 1);
		this.createcalendar();
	}
	this.nextYear=function()
	{
		this.JahrAktuell++;
		this.firstday=new Date(this.JahrAktuell, this.MonatAktuell, 1);
		this.createcalendar();
	}
	this.lastMonth=function()
	{
		this.MonatAktuell--;
		if(this.MonatAktuell<0)
		{
			this.MonatAktuell=11;
			this.JahrAktuell--;
		}
		this.firstday=new Date(this.JahrAktuell, this.MonatAktuell, 1);
		this.createcalendar();
	}
	this.lastYear=function()
	{
		this.JahrAktuell--;
		this.firstday=new Date(this.JahrAktuell, this.MonatAktuell, 1);
		this.createcalendar();
	}
	
	this.daychosen=function(value,target)
	{
		if(value != "")
		{
			value=value+"."+(this.MonatAktuell+1)+"."+this.JahrAktuell;
			document.getElementById(target).value = value;
		}
		var cal = document.getElementById('cal');
		document.getElementById('cal').parentNode.removeChild(cal);
	}
	this.closecalendar=function()
	{
		var cal = document.getElementById('cal');
		if(!cal){return false;}
		document.getElementById('cal').parentNode.removeChild(cal);
	}
	
	this.createcalendargrid=function(el)
	{
		var id = el.id;
		grid="";
		grid+='<table width="100%"><tr>';
		grid+='<th onclick="core.calendar.lastYear();" class="cal_headline">&lt;&lt;</th>';
		grid+='<th onclick="core.calendar.lastMonth();" class="cal_headline">&lt;</th>';
		grid+='<th id="currentmonth" colspan="3" class="cal_weekday"></th>';
		grid+='<th onclick="core.calendar.nextMonth();" class="cal_headline">&gt;</th>';
		grid+='<th onclick="core.calendar.nextYear();" class="cal_headline">&gt;&gt;</th></tr><tr>';
		for(var x = 0;x<this.Wochentage.length;x++)
		{
			grid+='<th class="cal_weekday">'+this.Wochentage[x]+'</th>';
		}
		grid+='</tr>';
		var z=0;
		for(var x = 0;x<7;x++)
		{
			grid+='<tr>';
			for(var y = 0;y<7;y++)
			{
				grid+='<td onclick="core.calendar.daychosen(this.innerHTML,\''+id+'\');" id="day_'+z+'" class="'+(y==7?'cal_sunday':'cal_day')+'"></td>'
				z++;
			}
			grid+='</tr>';
		}
		grid+='</table>';
		return grid;
	}	
}
