var bufferClass = function() {
	/*
	 * Buffer-Class
	 * v1.0.6 0031
	 * 
	 * Copyright by OSwebstyle.de
	 * If you want to use this class pleas contact us at info@oswebstyle.de for further information.
	 * 
	 * Description
	 * - handles asyncronous and syncronous request
	 * - saves requestet sites
	 * - possibility to force requests
	 * - possibility to forc return-types (plaint text / xml)
	 * - possibility to include pre-loaded content and integrate it into the internal buffer
	 * - integrated debug-functions (writes logs to "console.log(error_string)")
	 * 
	 * Important public-functions
	 * - addData(file_url [string], data [string (txt/xml)], xml [boolean])
	 * 		Saves loaded pages to the internal buffer. You can use this function for pre-loaded content as well.
	 * 
	 * - getData(file_url [string], force_request [boolean], xml [boolean], async [boolean], callback [function (as string)])
	 * 		Requests pages either from the internal buffer (weather it was already loaded) or creats a new http-request. 
	 */
	
	var cache = Array(null);
	var debug = false;
	
	var getAjaxRequest = function(xml) {
		var xmlHttpRequest = false;
		if(window.XMLHttpRequest) {
			try {
				xmlHttpRequest = new XMLHttpRequest();
			}
			catch(e) {
				xmlHttpRequest = false;
			}
		}
		else if(window.ActiveXObject) {
			try {
				xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch(e) {
				try {
					xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch(e) {
					xmlHttpRequest = false;
				}
			}
		}
	
		if(xmlHttpRequest.overrideMimeType) {
			xml == true ? xmlHttpRequest.overrideMimeType("text/xml") : xmlHttpRequest.overrideMimeType("text/html");
		}
		
		return xmlHttpRequest;
	};
	
	this.addData = function(file, data, xml) {
		if(debug == true) console.log("buffer.addData('"+file+"','"+unescape(data)+"','"+xml+"');");
		
		cache[file]	= Array(data, (typeof(xml) == true ? true : false));
	};
	
	this.getData = function(file, force_request, xml, async, callback, xml_cb) {
		if(debug == true) {
			console.log(
					"buffer.getData('"+file+"','"+force_request+"','"+xml+"','"+async+"','"+callback+"');"+
					"\n\tCache: '"+cache[file]+"' ("+typeof cache[file]+")"
			);
		}
		
		
		if(typeof(cache[file]) != "undefined" && cache[file][1] == (typeof(xml) == "undefined" ? false : xml) && (typeof(force_request) == "undefined" || force_request == false ? false : true) == false) {
			if(xml == true) {
				eval(xml_cb+" = cache[file][0]");
				return "XML-Loaded";
			}
			else {
				return cache[file][0];
			}
		}
		else if((typeof(async) == "undefined" || async == false ? false : true) == false) {
			return this.reqData(file, (typeof(xml) == "undefined" || xml == false ? false : true), false, callback, xml_cb);
		}
		else {
			this.reqData(file, (typeof(xml) == "undefined" || xml == false ? false : true), (typeof(async) == "undefined" || async == false ? false : true), callback, xml_cb);
			return true;
		}
	};
	
	this.reqData = function(file, xml, async, callback, xml_cb) {
		var ajaxRequest = getAjaxRequest(xml);
		var domain		= document.location.protocol + "//" + document.location.host;
		
		//open request
		ajaxRequest.open("GET", domain+"/ajax/"+file, ((typeof(async) == "undefined" || async == true) ? true : false));
		ajaxRequest.setRequestHeader("Method", "POST /ajax/"+file+" HTTP/1.1");
		ajaxRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		
		ajaxRequest.send(null);
		
		if(typeof(async) == "undefined" || async == true) {
			ajaxRequest.onreadystatechange = function() {
				if (ajaxRequest.readyState == 4) {
					cache[file] = Array((xml == true ? ajaxRequest.responseXML : escape(ajaxRequest.responseText)), xml);
					try { 
						if(xml == true) {
							eval(xml_cb+" = cache[file][0]");
							eval(callback+"()");
						}
						else { eval(callback+"('"+cache[file][0]+"')"); }
					}
					catch(e) {	if(debug == true) console.log(e); }
				}
			};
		}
		else {
			//receving request
			cache[file] = Array((xml == true ? ajaxRequest.responseXML : ajaxRequest.responseText), xml);
			return cache[file][0];
		}

		return true;
	};
	
	this.flush = function(key) {
		if(key == "")	cache = Array(null);
		else			cache[key] = null;
	};
};