/**
 * Object kkjs
 * @super Object
 * @author Korbinian Kapsner
 * @version 1.0
 */
var kkjs = {
	window: window,
	url: {
		addParameter: function addParameter(url, params, noEncoding){
			var parts = url.split("?");
			switch (parts.length){
				case 1:
					parts[1] = "";
					break;
				case 2:
					break;
				default:
					parts = [parts[0], parts.slice(1).join("?")];
			}
			parts[1] = parts[1].replace(/#.*$/, "").split("&");
			for (var i = 0; i < parts[1].length; i++){
				if (parts[1][i].length == 0){
					parts[1].splice(i, 1);
					i--;
				}
			}
			var encode = noEncoding? function(r){return r;}: encodeURIComponent;
			for (var i in params){
				parts[1].push(encode(i) + "=" + encode(params[i]));
			}
			return parts[0] + "?" + parts[1].join("&");
		},
		getParameter: function getParameter(url){
			var pos = url.indexOf("?") + 1;
			if (pos == 0) return {};
			var search = url.substr(pos);
			if ((pos = search.indexOf("#")) >= 0) search = url.substr(0, pos);
			var param = search.split("&"), ret = {};
			for (var i = 0; i < param.length; i++){
				var par = param[i].split("=");
				switch (par.length){
					case 1:
						par[1] = "";
						break;
					case 2:
						break;
					default:
						par = [par[0], par.slice(1).join("=")];
				}
				ret[decodeURIComponent(par[0])] = decodeURIComponent(par[1]);
			}
			return ret;
		}
	}
};

/**
 * Object kkjs.load
 * @super Object
 * @author Korbinian Kapsner
 * @version 1.0
 */
kkjs.load = {
	perPHP: false,
	node: false,
	module: function(module, notWrite){
		if (!kkjs[module]){
			return kkjs.load.script(kkjs.url.load + "kkjs." + module + ".js", !notWrite);
		}
		return false;
	},
	script: function(url, write){
		if (write && !document.body){
			document.write('<script type="text/javascript" src="' + url + '"></script>');
			return false;
		}
		
		kkjs.load.toLoad++;
		var sc = document.createElement("script");
		sc.type = "text/javascript";
		sc.onload = sc.onreadystatechange = function(){
			if (sc.readyState && sc.readyState != "loaded"){
				return;
			}
			kkjs.load.toLoad--;
			if (kkjs.load.toLoad <= 0){
				for (var i = 0; i < kkjs.load.onReadyFunction.length; i++){
					kkjs.load.onReadyFunction[i]();
				}
				kkjs.load.onReadyFunction = [];
			}
		};
		sc.src = url;
		var head = document.getElementsByTagName('head')[0];
		head.appendChild(sc);
		return sc;
	},
	toLoad: 0,
	onReadyFunction: [],
	onReady: function(func){
		kkjs.load.onReadyFunction.push(func);
	}
};

(function(){
	var sc = document.getElementsByTagName("script");
	for (var i = 0; i < sc.length; i++){
		if (/^(.*)kkjs.load.js/.test(sc[i].src)){
			kkjs.url.load = /^(.*)kkjs.load.js/.exec(sc[i].src)[1];
			kkjs.load.node = sc[i];
			break;
		}
		if (/^(.*)kkjs.php/.test(sc[i].src)){
			kkjs.url.load = /^(.*)kkjs.php/.exec(sc[i].src)[1];
			kkjs.load.node = sc[i];
			kkjs.load.perPHP = true;
			break;
		}
	}
	kkjs.load.$_GET = kkjs.url.getParameter(kkjs.load.node.src);
	kkjs.url.images = kkjs.url.load + "images/";
	kkjs.url.htc = kkjs.url.load + "htc/";
}).apply();

if (!kkjs.load.perPHP){
	kkjs.load.module("basic");
	kkjs.load.module("oo");
	kkjs.load.module("Debug");
	kkjs.load.module("event");
	kkjs.load.module("ajax");
	kkjs.load.module("css");
	kkjs.load.module("node");
	kkjs.load.module("selection");
	
	if (kkjs.load.$_GET.modules){
		var load = kkjs.load.$_GET.modules.split(/\s*,\*s/);
		for (var i = 0; i < load.length; i++){
			kkjs.load.module(load[i]);
		}
	}
	if (kkjs.load.$_GET.scipts){
		var load = kkjs.load.$_GET.scripts.split(/\s*,\*s/);
		for (var i = 0; i < load.length; i++){
			kkjs.load.script(load[i]);
		}
	}
}