var skelaxCore = new Class({

	Implements: [Events, Options],
	options: {
	},

	_console: $empty,
	_applications: $empty,
	_components: $empty,
	debug: false,
	table: $empty,
	appUrl: $empty,
	_vars: {},

	initialize: function(options) {
		this.setOptions(options);
		// Enable debug ?
		this.debug = (document.location.hash.match('#debug')) ? true : false;
		this.user = new Hash({name: $empty, hash: $empty});
		this._applications=new Hash;
		this._components=new Hash;
		this._vars = new Hash();
		if (skelax.history != 'object') {
			this.initHistory();
		}
		if (this.debug) this.getConsole();
		// Set default language
		this.setLang('en_US');
	},
	login: function (formElements) {
		if ((formElements.get('login') == '') || (formElements.get('passwd') == '')) return false;
		var params = {};
		params.action = 'auth';
		params.login = formElements.get('login'); 
		params.password = formElements.get('passwd');
		var sl = new jsonQuery({remoteUrl: 'remoting.php', onComplete: function(authRequest) { 
			if ((authRequest.error) && ($type($('errorDiv') == 'element'))) {
				$('errorDiv').set('html',authRequest.error);
			} else {
				var a = Cookie.write('userKey', authRequest.userKey);
				this.manageElements(authRequest.elementsToManage);
				this.processJs();
				placeFooter();
			}
		}});
		sl.doRequest(params);
	},
	logout: function() {
		var params = {};
		params.action = 'logout';
		var sl = new jsonQuery({remoteUrl: 'remoting.php', onComplete: function(req) { 
			var a = Cookie.write('userKey', '');
			this.manageElements(req.elementsToManage);
			this.processJs();
			placeFooter();
		}});
		sl.doRequest(params);
	},
	getUserKey: function() {
		return Cookie.read("userKey");
	},
	manageElements: function(elements) {
		if ($type(elements) != 'array') return false;
		elements.each(function(elInfos) {
			// Create element
			if (elInfos.action == 'create') {
				var container = $(elInfos.container);
				if ($type(container) == 'element') {
					if (elInfos.clear == true) container.set('html', '');
					var os = new Element(elInfos.type).set('id',elInfos.id).set('html',elInfos.content).injectInside(container);
				}
			}
			// Update element
			if (elInfos.action == 'update') {
				var container = $(elInfos.id);
				if ($type(container) == 'element') {
					if (elInfos.clear == true) container.set('html', '');
					container.set('html',elInfos.content);
				}
			}
		}, this);
	},
	setLang: function(lang) {
		//if (top.window.location.href.test("lang")) {
			this.registerVar('lang', lang);
		//	top.window.location.href = top.window.location.hash.replace(/[a-z]{2}_+[A-Z]{2}/,lang);
		//} else {
		//	top.window.location.href = top.window.location.hash+';lang='+lang;
		//}
	},
	getLang: function() {
		return this.getVar('lang');
	},
	callApplication: function(appName, funcName, appArgs) { 
		if (!$type(appName)) {skelax.getConsole().log("Trying to load an undefined application","",true); return false }
		if (($type(this._applications) && (!this._applications.get(appName)))) {
			new skelaxJsCssLoader({
					files: ['applications/'+appName+'/'+appName+'_main.js'],
					onComplete: function () {
							var oneshot = eval('var os = new '+appName+'_main();');
							skelax._getAllApplications().set(appName, os);
							if ($type(funcName)) {
								eval('var so = os.'+funcName+'(appArgs);');
							}
					}
			},this);
		} else if ($type(funcName)) {
			eval('var os = this._getAllApplications().get(appName).'+funcName+'(appArgs)');
		}
		return true;
	},
	callComponent: function(compName, funcName, appArgs) { 
		if (!$type(compName)) {skelax.getConsole().log("Trying to load an undefined component","",true); return false }
		if (($type(this._components) && (!this._components.get(compName)))) {
			new skelaxJsCssLoader({
					files: ['components/'+compName+'/'+compName+'_main.js'],
					onComplete: function () {
							var oneshot = eval('var os = new '+compName+'_main();');
							skelax._getAllComponents().set(compName, os);
							if ($type(funcName)) {
								eval('var so = os.'+funcName+'(appArgs);');
							}
					}
			},this);
		} else if ($type(funcName)) {
			eval('var os = this._getAllComponents().get(compName).'+funcName+'(appArgs)');
		}
		return true;
	},
	_getAllComponents: function() {
		return this._components;
	},
	getComponentByName: function(compName) {
		return this._components.get(compName);
	},
	_getAllApplications: function() {
		return this._applications;
	},
	getApplicationByName: function(appName) {
		return this._applications.get(appName);
	},
	callLink: function(url, systemName, label) {
		var oldMenu = skelax.getVar('currentMenu');
		if (systemName) skelax.registerVar('currentMenu', systemName);
		var sl = new jsonQuery({remoteUrl: 'remoting.php', registerInHistory: true, onComplete: function(jsonResult) { 
			if ( (!$type(jsonResult)) || (SK_Exception.isError(jsonResult)) ) return false;
			$('content').set('html', jsonResult.content);
			SK_Preloader.hide('content');
			this.processJs();
			if ((systemName != false) && (oldMenu != systemName)) {
				var os = skelax.callApplication('menu', 'displayVerticalMenu', systemName);
			}
		}});
		SK_Preloader.show('content');
		var p = url.href2object();
		var pageName = p.funcParams.system_name;
		var pagesSystemNames = skelax.getVar('pagesSystemNames') || new Hash();
		pagesSystemNames.set(pageName, systemName); 
		var os = skelax.registerVar('pagesSystemNames', pagesSystemNames);
		sl.doRequest(url);
	},
	getUi: function() {
		return this._UI;
	},
	getConsole: function() {
		if ($type(this._console) != 'object') { 
			this._console = new SK_Console({active: true});
		}
		return this._console;
	},
	createSlide: function(opt) {
		new skelaxSlide(opt,this);
	},
	addSlide: function (id,obj) {
		if ($type(this._slides) != 'hash')  { this._slides = new Hash() };
		this._slides.set(id, obj);
	},
	runSlide: function(id) {
		if ($type(this._slides)) this._slides.get('id').toggle();
	},
	getTab: function() {
		return skelax.tab;	
	},
	getTable: function() {
		return skelax.table;	
	},
	registerVar: function(name, value) {
		if (!name.test(/[A-Za-z0-9_-]/)) return false;
		this._vars.set(name, value);
		return true;
	},
	getVar: function(name) {
		if (!name.test(/[A-Za-z0-9_-]/)) return false;
		return this._vars.get(name) || null;
	},
	deleteVar: function(name) {
		if (!name.test(/[A-Za-z0-9_-]/)) return false;
		if ($defined(this._vars.get(name))) {
			this._vars.erase(name);
			return true;
		}
		return false;
	},
	initHistory: function() {
		this.historyKey = 'sk;';
		this.history = new History.Route({
			defaults: ['sk;'],
			pattern: '('+this.historyKey+'.*)',
			generate: function(values) {
				return [this.historyKey, , values[0]].join('')
			}.bind(this),
			onMatch: function(values, defaults) {
				var params = SK_Url.parse(values[0]);
				if (document.location.hash == '') {
					params = new Hash();
					params.tpl = 'home_content';
				}
				var sl = new jsonQuery({remoteUrl: 'remoting.php', update: 'content', onComplete: function(jsonResult) { 
					var sytemName = false;
					if ( (!$type(jsonResult)) || (SK_Exception.isError(jsonResult)) ) return false;
					this.processJs();
					var systemName = ($type(jsonResult.req.funcParams)) ? jsonResult.req.funcParams.system_name : null;
					var oPagesSystemNames = skelax.getVar('pagesSystemNames');
					if ($type(oPagesSystemNames)) {
						var sn = oPagesSystemNames.get(systemName) || null;
					} else {
						var sn = null;
					}
					if ((sn != null) && (sn != skelax.getVar('currentMenu'))) {
						skelax.registerVar('currentMenu', sn);
						var os = skelax.callApplication('menu', 'displayVerticalMenu', sn);
					}
					if (jsonResult.req.tpl == 'home_content') {
						onReloadHome();
					}
				}});
				sl.doRequest(params);
			}.bind(this)
		});
		History.start();
		this.addEvent('onChanged', function(){
			//console.log('changed');
		}.bind(this));
	}
});

var jsonQuery = new Class({
	Extends: skelaxCore,
	Implements: [Events, Options],

	jsCode: '',

	options: {
		remoteUrl: 'remoting.php',
		update: '',
		onComplete: $empty,
		registerInHistory: false,
		disablePreloader: false,
		beforePreload: false

	},

	initialize: function(options) {
		this.setOptions(options);
	},

	doRequest: function(params) {
		if ($type(params) == 'string') {
			if (params.contains('?')) params = params.split('?')[1];
			params = new Hash(params.href2object());
		} 
		params.userKey = this.getUserKey();
		var memoryzedParams = [];
		// Write url
		if ((this.options.registerInHistory == true) || (params.registerInHistory == true)) {
			var str = SK_Url.write(params);
			skelax.history.setValue(0,str);
		}
		// Show loader
		if ((!this.options.disablePreloader) && (this.options.update)) SK_Preloader.show(this.options.update, this.options.beforePreload);
		// Lang
		if (!$type(params.lang)) {
			var lang = skelax.getVar('lang');

			if ($type(lang)) {
				if (!$type(params.funcParams)) params.funcParams = {};
				if ($type(params.funcParams) == 'string') {
					var value = params.funcParams;
					params.funcParams = {};
					params.funcParams['firstArg'] = value;
				}
				params.funcParams['lang'] = lang;
			}
		}
		var jsonRequest = new Request.JSON({
			url: this.options.remoteUrl, 
			update: this.options.update, 
			onSuccess: this.processRequest.bind(this)	
		}).send(JSON.encode(params));	
	},
	processRequest: function(result) {
		if (!$type(result))
			result = SK_Exception.raiseError("JSON request error: No result from PHP ?!", '',  true);
		if (($type(result)) && ($type(result.errorMsg)))
			result = SK_Exception.raiseError("JSON request error: "+result.errorMsg, result.errorCode, true);
		if ($type(result.js)) this.jsCode = result.js;
		if ($type($("meminfo")) == 'element') $("meminfo").set("html",result.meminfo);
		if ($type($("timeinfo")) == 'element') $("timeinfo").set("html",result.timeinfo);
		// Update content
		if (($type($(this.options.update)) == 'element') && (result.content)) {
			$(this.options.update).set('html',result.content);
		}
		// Hide loader
		if (!this.options.disablePreloader) SK_Preloader.hide(this.options.update);
		this.fireEvent("onComplete",result);
	},
	processJs: function() {
		if (this.jsCode == '') return SK_Exception.raiseError("jsonQuery::processJs -- No js to evaluate", '');
		eval(this.jsCode);
	}
});

String.implement({
	href2object: function() {
		var txt = this.toString();
		s = txt.split('&');
		var funcParams = {};
		var res = {};
		var rgxp = /funcParams\[(.*)\]/
		for (i = 0; i < s.length; i++) {
			var f = s[i].split('=');
			var fup = rgxp.exec(f[0]);
			if ($type(fup)) {
				funcParams[fup[1]] = f[1];
				var process = true;
			} else {
				res[f[0]]=f[1];
			}
		}
		if (process) res['funcParams'] = funcParams;
		return res;
	}
});

var SK_Json = new Hash;
SK_Json.extend({

	params: {},
	initialize: function() {
		return this;
	},
	addParam: function(name, value) {
		this.params[name] = value;
	},
	getParam: function(name) {
		return this.params[name];
	},
	addObjParam: function(obj) {
		if ($type(obj) == "object") {
			var os = new Hash;
			os.extend(obj);
			os.each(function(id,val) {
				this.addParam(val,id);
			}.bind(this));
		}
	},
	send: function(obj) {
		if ($type(obj) == "object") {
			this.addObjParam(obj);
		}
		var sl = new jsonQuery({remoteUrl: "remoting.php",  onComplete: function(jsonResult) { 
			if ($type(this.getParam("update"))) {
				if ($type(this.getParam("clear"))) this.getParam("update").set("html","").setProperty("disabled", false);
				SK_HTML.update(this.getParam("update"),jsonResult);
			}
			this.reset();
		}.bind(this)});
		sl.doRequest(this.params);
	},
	reset: function() {
		this.params = {};
	}
});

var SK_HTML = new Hash;
SK_HTML.extend({
	update: function(el,args) {
		el = ($type($(el)) == "element") ? $(el) : false;
		if ($type(el) != 'element') return false;
		var tag = el.get('tag');
		if (tag == 'select') {
			var os = new Hash;
			os.extend(args.funcResult);
			os.each(function(a,b) {
				el.adopt(new Element('option').setProperties({'value': b, 'id': el.getProperty("id")+b, 'html': a}));
			}.bind(this));
		} else if (tag == 'div') {
			el.set("html", args.content);
			if (args.js) eval(args.js);
		}
	}
});

var SK_Console = new Class({

	Extends: skelaxCore,
	Implements: [Events, Options],

	options: {
		active: false,
		height: 200
	},

	_displayed: false,
	_builded: false,
	_body: $empty,
	_container: $empty,

	initialize: function(options) {
		this.setOptions(options);
		if (this.options.active == true) {
			this.activate();
		}
	},

	activate: function() {
		if (this.options.active == false) this.options.active = true;
	},

	_build: function() {
		var header = new Element("div").setStyles({ backgroundColor: "#dbd6d6", borderBottomWidth: 1, borderTopWidth: 1, borderStyle: "solid", borderColor: "#b9acac #000 #eee", height: 23, width: "100%"});
		var headerContent = new Element("div").setStyles({ paddingLeft: 0, borderBottomWidth: 1, borderTopWidth: 1, borderStyle: "solid", borderColor: "#f3f1f1 #000 #b9acac", height: "100%", width: "100%", marginTop: 0, fontSize: 16, fontWeight: "bold", color: "#9a9393" }).injectInside(header);
		var title = new Element("div").setStyles({float: "left", width: window.getWidth().toInt()-140, marginLeft: 3, marginTop: 1}).set("html","Skelax console").injectInside(headerContent);
		/*
		this._hideButton = new Element("div").setStyles({float: "left",width: 90, marginLeft: 3, marginTop: 1, textAlign: "right", cursor: "pointer"}).set("html","[X]").injectInside(headerContent).addEvent("click", function() {
			if (this._displayed) {
				this._hideButton.empty().set("html","[X]");
				this.hide();	
			} else {
				this._hideButton.empty().set("html","[X]");
				this.show();	
			};
		}.bind(this));
		*/
		var reset = new Element("div").setStyle("clear","both").injectInside(headerContent);
		this._container = new Element("div").set("id", "skelaxConsole").setStyles({position: "absolute", visibility: 'hidden', zIndex: 50, backgroundColor: "#fff", height: this.options.height, width: window.getWidth(), top: window.getHeight().toInt()-this.options.height }).adopt(header);
		this._body = new Element("div").setStyles({overflow: "auto", height: 174, width: "100%"});
		this._container.adopt(this._body).injectInside($("body"));
		this._builded=true;
		this._active=true;
		this._displayed=true;
	},

	show: function () {
		if (this._displayed) return false;
		if (!this._builded) this._build();
		this._displayed = true;
		this._body.setStyles({display: "block"});
		this._container.setStyles({width: window.getWidth(), height: this.options.height, top: window.getHeight() - this.options.height});
	},

	hide: function() {
		if (!this._displayed) return false;
		this._displayed = false;
		this._body.setStyles({display: "none"});
		this._container.setStyles({width: window.getWidth(), height: 12, top: window.getHeight()-25});
		return true;
	},
	place: function() {
		var num = (skelax._displayed) ? this.options.height : 25;
		this._container.setStyles({ width: window.getWidth(), top: window.getHeight() - num })	
	},

	log: function(txt, code) {
		if (!skelax.debug) return false;
		if (!this._builded) this._build();
		this._write(txt, code);	
	},

	clear: function() {
		this._body.removeClass("filled");
		this._body.empty();
	},
	
	_write: function(txt, code) {
		var d = new Date();
		var prefix = "";
		var dateStr = "["+d.getFullYear()+"/"+Math.round(d.getMonth()+1)+"/"+d.getDate()+" "+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()+"]";
		var bgColor = "#fffec4";
		var bdbtmColor = "#ccc";
		var color = "#000";
		var line = new Element("div").setStyles({height: 17, borderBottomWidth: 1});
		switch(code) {
			case 0:
				prefix = "Warning PHP -- "
				bgColor = "#ffb8b8";
				bdbtmColor = "red";
				color = "red";

			break;
			case 1:
				prefix = "Error PHP -- "
				bgColor = "#ff9999";
				bdbtmColor = "red";
				color = "red";
			break;
			case 2:
				prefix = "Fatal PHP -- "
				bgColor = "#ff4646";
				bdbtmColor = "red";
				color = "red";
			break;
			default:
				prefix = "JS -- "
		}
		line.setStyles({ paddingTop: 2, paddingLeft:3, backgroundColor: bgColor, borderStyle: "solid",  borderBottomWidth: 1, borderBottomColor: bdbtmColor, color: color}).set("html",dateStr+' -- '+prefix+txt);
		if (this._body.hasClass("filled")) {
			line.injectBefore(this._body.getFirst());
		} else {
			this._body.adopt(line);
			this._body.addClass("filled");
		}
		return line;
	}

});
var skelaxGrid = new Class({
	Implements: [Events],
	Options: {
		'onComplete': $empty
	},
	initialize: function(opt,skelaxObj) {
		this.skelax = skelaxObj;
		new skelaxJsCssLoader({
			files: ['skelax/data-grid/porkfunctions.js', 'skelax/data-grid/pork.js'],
			throwEvent: "onReady"
		},this);
	}
});
var skelaxCalendar = new Class({
        Implements: [Events, Options],
	Options: {
		'onComplete': $empty
	},
        initialize: function(options, skelaxObj) {
                this.skelax = skelaxObj;
		this.setOptions(options);
                new skelaxJsCssLoader({
                        files: ['skelax/calendar/calendar.compat.js'],
                        throwEvent: "onReady"
                },this);
        }
});
var skelaxSlide = new Class({
	Implements: [Events],
	initialize: function(opt,skelaxObj) {
		this.skelax = skelaxObj;
		this.addEvent("onReady", this.createSlide.pass([opt]));
		new skelaxJsCssLoader({
			files: ['skelax/mooSlide/mooSlide2-moo12.js'],
			throwEvent: "onReady"
		},this);
	},

	createSlide: function(opt) {
		var slide = new mooSlide2(opt);
		this.skelax.addSlide(opt.toggler,slide);
		slide.run();
	}
});

var skelaxJsCssLoader= new Class({
	Extends: skelaxCore,

	Implements: [Events, Options],
	fileLoaded: 0,
	onComplete: $empty,
	options: {
		files: [],
		throwEvent: ""
	},

	initialize: function(options,ref) {
		this.referer = ref;
		this.setOptions(options);
		this.addEvent("onFileLoaded", function(num) {
			this.fileLoaded+=1;
			if (this.fileLoaded == this.options.files.length) {
				if (this.options.throwEvent) {
					this.fireEvent.bind(this.referer,this.options.throwEvent).delay(200);
				} else {
					this.fireEvent.bind(this,"onComplete").delay(200);
				}
			}
		});
		for(var i=0;i<this.options.files.length;i++) {
			this.load(this.options.files[i],i);
		}
	},
	load: function(file,num) {
		var filename = file.split('/').pop();
		var fileExt = file.split('.').pop();
		var os = filename.split('.');
		os.pop();
		var fileId=os.join('_');
		var url='remoting.php?mode=proxy&asset='+fileExt+'&file=';
		if (!$(fileId)) {
			if (fileExt == 'js') {
				var os = new Asset.javascript(url + file, { 
					id: fileId, 
					onload: this.fireEvent.pass(["onFileLoaded",num],this)
				});
			} else {
				var os = new Asset.css(url + file, {
					id: fileId, 
					title: fileId,
					onload: this.fireEvent.pass(["onFileLoaded",num],this)
				});
			}
		} else {
			this.fireEvent("onFileLoaded",num);
		}
	}
});

var skelaxForm = new Class({
	Extends: skelaxCore,
	Implements: [Events, Options],
	options: {
		type: $empty,
		formName: $empty,
		func: $empty,
		callbackFunction: $empty,
		callbackFunctionParams: $empty,
		validatorOptions: {
			styleNeutral: {"backgroundColor": "#f2f0ec", "borderColor": "#a38d82"},
			required: {type: "required", re: /[^.*]/, msg: "REQUIRED"},
			throwSubmitEvent: false
		},
		maskOptions: {
			onValid: function(event, obj) {obj.setStyles({"background-color":"#cfc", "border":"1px solid #0c0"})},
			onInvalid: function(event, obj) {obj.setStyles({"background-color":"#fcc", "border":"1px solid #c00"})}
		},
		onReady: function() {
			/*
			if ($type($(this.options.formName))) {
				new iMask(this.options.maskOptions);
			}
			*/
			if (this.options.callbackFunction) this.options.validatorOptions["callbackFunction"] = this.options.callbackFunction;
			if (this.options.callbackFunctionParams) this.options.validatorOptions["callbackFunctionParams"] = this.options.callbackFunctionParams;
			this.fVal = new fValidator(this.options.formName, this.options.validatorOptions);
			this.fireEvent("onComplete");
		},
		onComplete: $empty
	},
	initialize: function(options) {
		this.setOptions(options);
		new skelaxJsCssLoader({
			/* files: ['skelax/fValidator/iMask.js','skelax/fValidator/fValidator.js'], */
			files: ['skelax/fValidator/fValidator.js'],
			throwEvent: "onReady"
		},this);
	},
	getFormObj: function() {
		return this.fVal;
	}
});
var browseList= new Class({
	Extends: skelaxCore,
        Implements: [Events, Options],
	options: {
                update: $empty,
                offset: $empty,
		sortM: true,
		browseM: true,
		onComplete: $empty,
		onReady: function() {
			this.fireEvent("onComplete");
		}
	},
	initialize: function(options) {
		this.setOptions(options);
		this.sortMenu(options);
		this.browseMenu(options);
	},
	sortMenu: function(options) {
		this.setOptions(options);
		var update= this.options.update;
		var sM= $$(".b_sort ul li a");	
		sM.each(function(element) {
			element.addEvent('click', function(e){
					e = e.stop();
					var url=element.get('href');
					var params =url.substr(1);
					var t =element.get('class');
					var sl = new jsonQuery({remoteUrl: 'remoting.php',update: update, onComplete: function(a) {
						
						$(update).set('html', a.content);
						this.processJs(); 
					}}).doRequest(params);

			});
		});
	},
	browseMenu: function(options) {
		this.setOptions(options);
		var update= this.options.update;
		var sM= $$(".browse-nav ul li a");	
		sM.each(function(element) {
			element.addEvent('click', function(e){
					e = e.stop();
					var url=element.get('href');
					var params =url.substr(1);
					var t =element.get('class');
					var sl = new jsonQuery({remoteUrl: 'remoting.php',update: update, onComplete: function(a) {
						
						$(update).set('html', a.content);
						this.processJs(); 
					}}).doRequest(params);
			});
		});
	}
});
var slideShow= new Class({
	Extends: skelaxCore,
        Implements: [Events, Options],
	options: {
                object: $empty,
                update: $empty,
                type: $empty,
                content: $empty,
                url: $empty,
                onComplete: $empty,
		onReady: function(options) {
			var mg= new gallery($(this.options.update), {
					timed: true,
					showArrows: false,
					showCarousel: false,
					embedLinks: true,
					delay: 4000,
					defaultTransition: "fadeslideleft"
			});	
			this.fireEvent("onComplete");
		}
	},
	initialize: function(options) {
		this.setOptions(options);
		new skelaxJsCssLoader({
			files: ['skelax/SmoothGallery/jd_gallery.js','skelax/SmoothGallery/jd_gallery_transitions.js', 'skelax/SmoothGallery/jd_gallery.css'],
			throwEvent: "onReady"
		},this);
	}		
});
var adminList = new Class({
	Extends: skelaxCore,
	Implements: [Chain, Events, Options],
	options: {
		object: $empty,
		update: $empty,
		type: $empty,
		content: $empty,
		url: $empty,
		onComplete: $empty
	},
	initialize: function(options) {
		this.setOptions(options);
		this.addEvent("onReady", this.onReady.bind(this));
		var update= this.options.update;
		var content= this.options.content;
		new skelaxJsCssLoader({
			files: ['skelax/Browse/Browse.js', 'skelax/Browse/Browse.css'],
			throwEvent: "onReady"
		},this);
	},
	onReady: function() {
		$(update).empty().set('html', content);
		var st = new List($('list-nav'),{
				entrySelector: 'li a',
				onSelect: function(toggle, container) {
					alert('toggle');
					toggle.addClass('obj-selected');
				}
		});	
	}
});

var adminBrowse = new Class({
	Extends: skelaxCore,
	Implements: [Chain, Events, Options],
	options: {
		object: $empty,
		update: $empty,
		type: $empty,
		content: $empty,
		url: $empty,
		onComplete: $empty
	},
	initialize: function(options) {
		this.setOptions(options);
		var update= this.options.update;
		var content= this.options.content;
		var cb = new Chain();
		cb.chain(
			function(){ if (!$('SBrowser')) var myBCSS = new Asset.css('js/skelax/Browse/Browse.css', 
					{id: 'SBrowser', 
					title: 'myBrowser'}); },
			function(){ $(update).empty().set('html', content); },
			function(){ if (!$('jsBrowse')) {
				var libb= new Asset.javascript('js/skelax/Browse/Browse.js', {
				'id': 'jsBrowse', 
				'onload': function() {
					var st = new Browse($('browse-nav'),{
					entrySelector: 'li a',
					onSelect: function(toggle, container) {
							toggle.addClass('obj-selected');
						}
					});	
				}
				});
			   } else {
				var bt = new Browse($('browse-nav'),{
					entrySelector: 'li a',
					onSelect: function(toggle, container) {
							toggle.addClass('obj-selected');
					}
				});
			   }
			   var cont=$('obj-container');

			}

		);
		cb.callChain(); 
		cb.callChain(); 
		cb.callChain(); 
		cb.callChain(); 
	}
});

var skelaxTab = new Class({
	Extends: skelaxCore,
	Implements: [Events, Options],
	options: {
		update: '',
		content: $empty,
		containerName: $empty,
		simpleTabsOptions: {},
		onComplete: $empty,
		onReady: function() {
			if ($type($(this.options.update))) $(this.options.update).set('html', this.options.content);
			if ((!$defined($('da-tabs')) && (this.options.update != ''))) {
				var os = new Element('div').set('id','da-tabs').injectInside(this.options.update);
			}
			skelax.tab = new SimpleTabs(this.options.containerName, this.options.simpleTabsOptions);
			this.fireEvent("onComplete");
		}
	},
	initialize: function(options) {
		this.setOptions(options);
		new skelaxJsCssLoader({
			files: ['skelax/SimpleTabs/SimpleTabs.css','skelax/SimpleTabs/SimpleTabs_json.js'],
			throwEvent: "onReady"
		},this);
	}
});

var skelaxUI = new Class({
	Implements: [Events, Options],

	options: {
		onReady: $empty
	},

	initialize: function(options) {
		this.setOptions(options);
		var os = new skelaxJsCssLoader({
			files: ['skelax/mocha-ui/scripts/source/Core/Core.js','skelax/mocha-ui/scripts/source/Window/Modal.js','skelax/mocha-ui/scripts/source/Window/Window.js','skelax/mocha-ui/scripts/mocha.js'],
			throwEvent: "onReady"
		},this);
	},
	buildDesktopWrapper: function(container) {
		if (!$type(container)) return SK_Exception.raiseError("skelaxUI::buildDesktopWrapper -- container does not exist", '', true);
		if (!$type($("dockWrapper"))) {
			new Element("div").set("id","dockWrapper").adopt(
				new Element("div").set("id","dock")
			).adopt(
				new Element("div").set("id","dockPlacement")
			).adopt(
				new Element("div").set("id","dockAutoHide")
			).adopt(
				new Element("div").set("id","dockSort").adopt(
					new Element("div").set("id","dockClear").addClass("clear")
				)
			).injectInside(container);
		}
		MochaUI.Desktop = new MochaUI.Desktop();
		MochaUI.Dock = new MochaUI.Dock();
	},
	newWindow: function(params) {
	}
	
});

var skFlow = new Class({
	Extends: skelaxCore,
 	Implements: [Events, Options],
 	options: {
 		remoteUrl: 'remoting.php',
 		items: $empty,
 		app: $empty,
 		func: $empty,
 		funcParams: $empty,
 		tpl: $empty,
		update: $empty,
 		onComplete: $empty
 	},
	initialize: function(options) {
		this.setOptions(options);
		new skelaxJsCssLoader({
			files: ['skelax/MooFlow/MooFlow.js', 'skelax/MooFlow/MooFlow.css'],
			throwEvent: "onReady"
		},this);
		this.onReady();
		
	},
	onReady: function() {
		var mf = new MooFlow($(this.options.update), {
			startIndex: 3,
			offsetY: 5,
			useMouseWheel: true,
			useCaption: true,
			useWindowResize: true,
			useSlider: true,
			useKeyInput: true,
			useResize: true,
			useViewer: true,
			onEmptyinit: function(){
				this.loadJSON('remoting.php?app=article&func=listArticles&funcParams[maxResults]=10&funcParams[sort]=art_created_desc');
			},
			onClickView: function(obj){
				alert('click');	
			}
		});
	}
});
var skelaxNicEdit = new Class({
	Extends: skelaxCore,
	Implements: [Events, Options],
	options: {
		'field': $empty,
		'fields': $empty,
		'editable': $empty,
		onComplete: $empty,
		makeEditable: $empty,
		instanceId: '',
		panelId: '',
		parentCont: '',
		saveFunc: $empty,
		onReady: $empty
	},
	initialize: function(options) {
		this.setOptions(options);
		new skelaxJsCssLoader({
			files: ['skelax/NicEdit/nicEdit.js', 'skelax/NicEdit/nicEdit.css'],
			throwEvent: "onReady"
		},this);
		this.onReady();
	},
	onReady: function(options) {
		this.setOptions(options);
		var field = this.options.field;
	},
	makeEditable: function(options) {
		this.setOptions(options);
		if (this.options.editable) {
			var fields = this.options.editable;
			for (var t in fields) {
				
				var mf= $(t);
				var fi= [];

				mf.setStyles({'background': 'transparent',  'border': '1px dashed #ccc','display': 'block'});
				$(t).addEvents({
				    'mouseover': function(fi){
				        	this.setStyles({'background': '#ccc', 'cursor': 'text', 'opacity': 0.3});
					},
				    'mouseout': function(fi){
				        	this.setStyles({'background': 'transparent', 'cursor': 'normal', 'opacity': 1});
				 	}
				});
				$(t).addEvent('dblclick', function() {
				        	$(t).setStyles({'background': 'transparent', 'cursor': 'normal', 'opacity': 1});
				              	this.createEditable(t);
				}.bind(this));
			}
		}
	},

	init: function(instanceId) {
		this.parentCont = $(instanceId).getParent();
		$(instanceId).setStyle("display", "none");
		var myDiv = new Element('div').setStyle('border: 1 px solid black');
		var cond = ($type($(instanceId)) == "element") ? true : false;
		var myCont = $(instanceId);
		while (cond) {
			if ($type(myCont.getParent()) == "element")	{
				myCont = myCont.getParent();
				if (myCont.get("tag") == "form") {
					var os = new Element('div').set("id",instanceId+"_cont").setStyle("display","none").injectInside(myCont);
				}
			} else {
				cond = false;
			}
		}
		myDiv.set('id', instanceId+'_div');
		myDiv.addClass($(instanceId).get('class'));
		myDiv.setStyles($(instanceId).getStyles('width', 'height', 'min-height', 'border'));
		myDiv.set("html", $(instanceId).get("html").replace(/&lt;/g,'<').replace(/&gt;/g, '>'));
		myDiv.injectAfter($(instanceId));
		myDiv.addEvent('click', function() {
			this.createEditor(instanceId);
		}.bind(this));
	},

	createEditor: function(instanceId) {
		if ($type(this.parentCont == "element")) $(instanceId).injectInside(this.parentCont);
		var myNicEditor = new nicEditor({
			fullPanel : true, 
			uploadURI : 'upload.php?singleFile=1',
			iconsPath: 'images/applications/page/nicEditorIcons.gif'
		}).panelInstance(instanceId);
  		myNicEditor.addEvent('blur', this.addBlurEvent.bind(this, [instanceId]));
		$(instanceId+'_div').setStyle('display', 'none');
	},
	createEditable: function(instanceId) {
		var myNicEditor = new nicEditor({
			fullPanel : false, 
			uploadURI : 'upload.php?singleFile=1',
			iconsPath: 'images/applications/page/nicEditorIcons.gif',
			onSave: function() {
				alert('save');
			}
		}).addInstance(instanceId);
		myNicEditor.floatingPanel();
	},
	addBlurEvent: function(instanceId) {
		var myInstance = nicEditors.findEditor(instanceId);
		var myNicEditor = this.findInstance(instanceId);
		if ($type(myInstance)) {
			$(instanceId).set('html',myInstance.getContent());
			myNicEditor.removeInstance(instanceId);
			myNicEditor = null;
			$(instanceId+'_div').set("html", $(instanceId).get("html").replace(/&lt;/g,'<').replace(/&gt;/g, '>'));
			$(instanceId+'_div').setStyle('display', 'block');
			this.parentCont = $(instanceId).getParent();
			$(instanceId).injectInside($(instanceId+"_cont"));
		}
	},

	findInstance: function(e) {
                var editors = nicEditors.editors;
                for(var i=0;i<editors.length;i++) {
                        if(editors[i].instanceById(e)) {
                                return editors[i];
                        }
                }
	}
});

var skelaxTable = new Class({
	Implements: [Events],
	Extends: skelaxCore,
	
	table: $empty,

	initialize: function(el,table,tableOptions,options) {
		this.addEvent("onReady",this.initTable.pass([el,table,tableOptions]));
		new skelaxJsCssLoader({
			files: ['skelax/mootable/mootable.css','skelax/mootable/mootable-1.2_beta2.js'],
			throwEvent: "onReady"
		},this);
	},
	initTable: function(el,table,tableOptions) {
		var opts = $merge(tableOptions, {headers: table.headers});
		skelax.table = new MooTable(el, opts);
		el.fireEvent('onReady', skelax.table);
	}
});

var skelaxMif = new Class({

	Implements: [Events, Options],
	Extends: skelaxCore,

	options: {
		onReady: $empty
	},

	initialize: function(options) {
		this.setOptions(options);
		new skelaxJsCssLoader({
			files: ['skelax/mifTree/mif_tree.js','skelax/mifTree/mif_addons.js'],
			throwEvent: "onReady"
		},this);
	}
});

var skelaxMifMenu = new Class({

	Implements: [Events, Options],
	Extends: skelaxCore,

	options: {
		onReady: $empty
	},

	initialize: function(options) {
		this.setOptions(options);
		new skelaxJsCssLoader({
			files: ['applications/menu/mifMenu/mif.menu-trunk.js'],
			throwEvent: "onReady"
		},this);
	}
});

var skelaxVerticalMenu = new Class({

	Implements: [Events, Options],
	Extends: skelaxCore,

	options: 
	{
	},

	initialize: function(args, options) {
		this.setOptions(options);
		this.root = args.json[0];
		this.container = args.container;
		this.build();
	},

	build: function() {
		this.currentContainer = this.container;
		this.processNode(this.root);
	},

	processNode: function(node) {
		if (node.children) { 
			this.getParentContainer(node);
			var container = new Element('div').addClass('main-menu-folder'+node.data.level);
			var titleContainer = new Element('div').injectInside(container).addClass('menu-title-container');
			var title = new Element('span').addClass('spanLevel'+node.data.level).set('html', node.property.name);
			var menuTitle = node.property.name;
			if (node.data.level > 1) {
				titleContainer.adopt(new Element('div').addClass('main-menu-arrow'));
				titleContainer.addEvent('click', function() {
					this.toggleChilds(container);
				}.bind(this));
			}
			titleContainer.adopt(title);
			titleContainer.adopt(new Element('div').addClass('clearfix'));
			container.adopt(titleContainer);
			container.injectInside(this.currentContainer);
			this.currentContainer = container;
			node.children.each(function(n) {
				if (n.children) {
					this.processNode(n);
				} else {
					this.getParentContainer(n);
					var el = new Element('div').addClass('main-menu-item'+n.data.level).set('html', n.property.name);
					if ((n.data.level > 1) && (n.data.custom.mi_url) ) {
						el.addEvent('click', function() {
							document.title = menuTitle+' - '+el.get('html');
							el.setStyle('cursor', 'pointer');
							this.callLink(n.data.custom.mi_url, false);
						}.bind(this));
						el.addEvent('mouseover', function() {
							el.addClass('main-menu-item-over');
						});
						el.addEvent('mouseout', function() {
							el.removeClass('main-menu-item-over');
						});
					}
					this.currentContainer.adopt(el);
				}
			},this);
		}	
	},

	getParentContainer: function(node) {
		if (this.currentContainer.get('id') == this.container.get('id')) {
			this.currentContainer = this.container;
			return false;
		}
		var id = node.data.level-1;
		var possibleParents = this.container.getElements('.main-menu-folder'+id);
		var nid = possibleParents.length-1;
		this.currentContainer = possibleParents[nid];
	},

	toggleChilds: function(element) {
		var changeArrow = false;
		element.getElements('div[class^=main-menu-item]').each(function(el) {
			if (el.getStyle('display') == 'none') {
				el.setStyle('display', 'block');
				changeArrow = false ;
			} else {
				el.setStyle('display', 'none');
				changeArrow = true;
			}
		});
		if (changeArrow) {
			var el = element.getElement('div[class=main-menu-arrow]');
			el.removeClass('main-menu-arrow');
			el.addClass('main-menu-arrow-on');
		} else {
			var el = element.getElement('div[class=main-menu-arrow-on]');
			el.removeClass('main-menu-arrow-on');
			el.addClass('main-menu-arrow');
		}
	}
});

var skelaxMenu = new Class({
	Extends: skelaxCore,
	Implements: [Events, Options],
	options: {
		obj: $empty,
		update: $empty,
		onComplete: $empty
	},
	
	initialize: function(options) {
		this.setOptions(options);
		var update= this.options.update;
		var myobject=this.options.obj;
		var list = $$(myobject);
		list.each(function(element) {
			 if (!element.hasClass('ignore')) {
				 element.addEvent('click', function(e){
					e = e.stop();
					var url=element.get('href');
					var params =url.substr(1);
					var t =element.get('class');
					if (t == 'iFrame') {
						var myIFrame = new IFrame('pp',{
							'src': url,
							styles: {
								width: 755,
								height: 500
							}
						});
						$(update).set('html', '');
						myIFrame.inject($(update));
					} else {
					var sl = new jsonQuery({remoteUrl: 'remoting.php', registerInHistory: true, onComplete: function(jsonResult) { 
						// call an application 
						if ( (!$type(jsonResult)) || (SK_Exception.isError(jsonResult)) ) return false;
						if ($type(jsonResult.loadApplication)) skelax.callApplication(jsonResult.loadApplication, jsonResult);
						if (jsonResult.tabs) {
							skelax.tab = new skelaxTab({ 
								content: jsonResult.content,
								update: update,
								containerName: 'da-tabs',
								simpleTabsOptions: {
									entrySelector: 'ul a',
									onShow: function(toggle, container) {
										toggle.addClass('tab-selected');
										var myEffect = new Fx.Morph(container, {duration: 600, transition: Fx.Transitions.Sine.easeOut}); 
										myEffect.start({
										     'opacity': [0, 1]
										});
										container.setStyle('display', '');
									}
								}
							});
							this.processJs();
						} else {
							$(update).set('html', jsonResult.content);
							this.processJs();
						}
					}});
					sl.doRequest(params);
					}
				});
			}
		});
	}
});

var SK_Url = new Hash;
SK_Url.extend({

	hash: top.document.location.hash,
	host: top.document.location.host,

	parse: function(str) {
		var args = str.split(';');
		var obj = {};
		var other = {};
		other.funcParams = {};
		var type = '';
		var name = '';
		
		args.each(function(val) {
			var ar = val.split('=');
			if (ar[0] == 'tp') type = ar[1];
			if (ar[0] == 'n') name = ar[1];
			if (ar[0] == 'f') other.func = ar[1];
			if (ar[0] == 'd') other.dir = ar[1];
			if (ar[0] == 't') other.tpl = ar[1];
			if (ar[0] == 'lang') other.lang = ar[1];
			if (ar[0] == 'm') other.menu = ar[1];
			if (ar[0] == 'fp') {
				var so = ar[1].split(',');
				so.each(function(v) {
					var o = v.split(':');
					other.funcParams[o[0]] = o[1];
				}, this);
			}
		}, this);
		if (type == 'app') {
			obj.app = name;
		} else {
			obj.comp = name;
		}
		obj = $extend(obj, other);
		return obj;
	},

	write: function(params) {
		var type = '';
		var name = '';
		var hash = '';
		if ($defined(params.app)) {
			type = 'app';
			name = params.app;
			hash += 'tp='+type+';n='+name+';';
		} else if ($defined(params.comp)) {
			type = 'comp';
			name = params.comp;
			hash += 'tp='+type+';n='+name+';';
		}
		if (params.func) hash+='f='+params.func+';';
		if (params.tpl) hash+='t='+params.tpl+';';
		if (params.dir) hash+='d='+params.tpl+';';
		if ($type(params.funcParams) == 'object') {
			var funcParams = new Hash(params.funcParams);
			var fp = 'fp=';
			funcParams.each(function(v,k) {
				fp += k+':'+v+',';	
			});
			fp = fp.substring(0,fp.length-1);
			if (fp.length > 0) {
				hash += fp;
			}
		}
		// Lang
		var lang = skelax.getVar('lang');
		if ($type(lang)) hash+=';lang='+lang;
		// Menu
		var menu = skelax.getVar('currentMenu');
		if ($type(menu)) hash+=';m='+menu;
		return hash;
	}
});

var skelaxAutocompleter = new Class({

	Implements: [Events, Options],
	Extends: skelaxCore,

	options: {
		onReady: $empty
	},

	initialize: function(options) {
		this.setOptions(options);
		new skelaxJsCssLoader({
			files: ['skelax/AutoCompleter/Autocompleter.js', 'skelax/AutoCompleter/Autocompleter.Request.js', 'skelax/AutoCompleter/Autocompleter.Local.js', 'skelax/AutoCompleter/Observer.js', 'skelax/AutoCompleter/Autocompleter.Request.Skelax.js'],
			throwEvent: "onReady"
		},this);
	}
});

var SK_Exception = new Hash;
SK_Exception.extend({
	raiseError: function(msg, code, log) {
		if ($type(log)) skelax.getConsole().log(msg, code);
		return new SK_Error(msg, code);
	},
	isError: function(obj) {
		if (!$chk(obj)) return false;
		if ($chk(obj.getError)) return true;
	}
});

var SK_Error = new Class({
	error: {},

	initialize: function(msg, c) {
		this.error.msg = msg;
		if ($type(c) == 'string') this.error.code = c;
	},
	getMessage: function() {
		return this.error.msg;
	},
	getCode: function() {
		return this.error.code;
	},
	getError: function() {
		return this.error;
	}
});

var SK_Preloader = new Hash;
SK_Preloader.extend({
	show: function(elId, options) {
		if (elId != '') {
			if ($type($(elId)) != 'element') return false;
			var element = $(elId);
			if ($type(options) == 'array') {
					options.each(function(opts) {
					var mFx = new Fx.Tween(opts.element, {
						property: opts.property,
						duration: opts.duration || 500,
						transition: Fx.Transitions.Sine.easeInOut
					})
					mFx.start(opts.from,opts.to);
				});
			}
			element.set('html', '');
			var posY = element.getStyle('height').toInt();
			var el = new Element('div').set('id', 'spinner-'+elId).addClass('ajax-spinner').injectInside(element);
			if (posY > 32) el.setStyle('marginTop', (posY/2)-8)
		}
	},
	hide: function(elId) {
		if (elId != '') {
			if ($type($('spinner-'+elId))) $('spinner-'+elId).dispose();
			if ($type($(elId)) != 'element') return false;
			$(elId).setStyle('opacity', 0);
			var mFx = new Fx.Tween(elId, {
				property: 'opacity',
				duration: 500,
				transition: Fx.Transitions.Sine.easeInOut
			})
			mFx.start(0,1);
		}
	}
});

function toggleFullScreen() {
	if ($('adminMenu').getStyle('display') != 'none') {
		$('content').setStyle('width',$('content').getStyle('width').toInt()+$('adminMenu').getStyle('width').toInt());
		$('adminMenu').setStyle('display','none');
	} else {
		$('content').setStyle('width',$('content').getStyle('width').toInt()-$('adminMenu').getStyle('width').toInt());
		$('adminMenu').setStyle('display','block');
	}
}
	
var skelax = {};

window.addEvent("domready", function() {
	skelax = new skelaxCore();
	if ($type(skelax == "object")) skelax.getConsole().log("Skelax loaded","", true);
	if (top.document.location.hash != '') {
		var params = SK_Url.parse(top.document.location.hash);
		var sl = new jsonQuery({remoteUrl: 'remoting.php', update: 'content', onComplete: function(jsonResult) { 
			if ( (!$type(jsonResult)) || (SK_Exception.isError(jsonResult)) ) return false;
			if ($type(jsonResult.loadApplication)) this.callApplication(jsonResult.loadApplication, jsonResult);
			this.processJs();
			var systemName = params.menu;
			if ($type(systemName)) {
				skelax.registerVar('currentMenu', systemName);
				var os = skelax.callApplication('menu', 'displayVerticalMenu', systemName);
			}
		}});
		sl.doRequest(params);
	}
});

window.addEvent("resize", function() {
	if ($type($("skelaxConsole"))) skelax.getConsole().place();
});

function placeFooter() {
	if ($type($("footer")) == "element") {
		if (window.getHeight().toInt() > $("page").getSize().y + $("footer").getSize().y + $("header").getSize().y + 20) {
			$("footer").setStyle("marginTop",window.getHeight().toInt() - $("page").getSize().y - $("header").getSize().y - $("footer").getSize().y - 20);
		}

	}
}
