var Bluora = {
	Version: '0.2.1',
	HasRun: false,
	ExtensionSource: WEBROOT+'_core/script/Frameworks/BluoraFramework/Extensions/',
	ElementSource: WEBROOT+'_core/script/Frameworks/BluoraFramework/Elements/',
	BehaviourSource: WEBROOT+'_core/script/Frameworks/BluoraFramework/Behaviours/', 
	Startup: function() {
		Bluora.logInfo('Bluora.Startup()');
		Bluora.Browser();
		Bluora.Behaviour.start();
		Bluora.LoadExtArray(BLUORA_EXTENSIONS);
		Bluora.LoadElementsArray(BLUORA_ELEMENTS);
		Bluora.LoadBehaviourArray(BLUORA_BEHAVIOURS);
		Bluora.LoadExt('Run');
	},
	Run: function() {
		Bluora.logInfo('Bluora.Run()');
		window.onresize = Bluora.DocumentOnResize;
		window.onresize();
		Bluora.Behaviour.apply();
		Bluora.HasRun = true;
	},
	Behaviour: {
		list: new Array,
		register : function(sheet){ 
			Bluora.Behaviour.list.push(sheet);
		},
		start: function(){ 
			Bluora.logInfo('Bluora.Behaviour()');	
			Bluora.addLoadEvent(Bluora.Behaviour.apply);
		},
		apply: function(){ 
			for (h=0;sheet=Bluora.Behaviour.list[h];h++){ 
				for (selector in sheet) {
					list = $$(selector);
					if (!list) { 
						continue;
					} 
					for (i=0;element=list[i];i++){ 
						if (!element.BehavioursApplied) {
							element.BehavioursApplied = [];
						}
						if (!element.BehavioursApplied[selector]) {
							//Bluora.log('Behaviour('+selector+') applying...');	
							sheet[selector](element); 
							element.BehavioursApplied[selector] = true;
						} else {
							//Bluora.log('Behaviour('+selector+') already applied');	
						}
					}
				}
			}
		}
	},
	LoadExtArray: function (List) {
		List.each(Bluora.LoadExt);
	},
	LoadElementsArray: function (List) {
		List.each(Bluora.LoadElements);
	},
	LoadExt: function(Extension) {
		Bluora.logInfo('Bluora.LoadExt('+Extension+')');
		Bluora.LoadDocument('script', Bluora.ExtensionSource+Extension+'.js', true);
	},
	LoadElements: function(Extension) {
		Bluora.logInfo('Bluora.LoadElements('+Extension+')');
		Bluora.LoadDocument('script', Bluora.ElementSource+Extension+'.js', true);
	},
	LoadBehaviourArray: function (List) {
		List.each(Bluora.LoadBehaviour);
	},
	LoadBehaviour: function(Behaviour) {
		Bluora.logInfo('Bluora.LoadBehaviour('+Behaviour+')');
		Bluora.LoadDocument('script', Bluora.BehaviourSource+Behaviour+'.js', true);
	},
	Browser: function() {
		var ua, s, i;
		this.isIE    = false;  // Internet Explorer
		this.isNS    = false;  // Netscape
		this.version = null;
		ua = navigator.userAgent;
		s = "MSIE";
		if ((i = ua.indexOf(s)) >= 0) {
			this.isIE = true;
			this.version = parseFloat(ua.substr(i + s.length));
			Bluora.logInfo('Bluora.Browser() = IE.v'+this.version+'');
			return;
		}
		s = "Netscape6/";
		if ((i = ua.indexOf(s)) >= 0) {
			this.isNS = true;
			this.version = parseFloat(ua.substr(i + s.length));
			Bluora.logInfo('Bluora.Browser() = NS.v'+this.version+'');
			return;
		}
		// Treat any other "Gecko" browser as NS 6.1.
		s = "Gecko";
		if ((i = ua.indexOf(s)) >= 0) {
			this.isNS = true;
			this.version = 6.1;
			Bluora.logInfo('Bluora.Browser() = Gecko.v'+this.version+'');
			return;
		}
	},
	docWidth: 0,
	docHeight: 0,
	DocumentOnResize: function() {
		/*if (typeof window.innerWidth == 'number') {
			Bluora.docWidth = window.innerWidth-18;
			Bluora.docHeight = window.innerHeight;
		} else if (document.documentElement &&
			(document.documentElement.clientWidth || document.documentElement.clientHeight)) {
			Bluora.docWidth = document.documentElement.clientWidth;
			Bluora.docHeight = document.documentElement.clientHeight;
		} else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
			Bluora.docWidth = document.body.clientWidth;
			Bluora.docHeight = document.body.clientHeight;
		}*/
		Bluora.docWidth = document.viewport.getWidth()
		Bluora.docHeight = document.viewport.getHeight();
		if (typeof window.onresizeevent == 'function') { 
			window.onresizeevent();
		}
	},
	DocumentsLoaded: Array(),
	LoadDocument: function(Type, Document, NoLogLoad) {
		if (Bluora.DocumentsLoaded[Document] == null) {
			if (NoLogLoad == false) {
			Bluora.logInfo('LoadDocument('+Type+'):'+Document);
			}
			Bluora.DocumentsLoaded[Document] = true;
			switch(Type) {
				case 'script':
					var scriptElem = document.createElement('script');
					scriptElem.setAttribute('src',Document);
					scriptElem.setAttribute('type','text/javascript');
					document.getElementsByTagName('head')[0].appendChild(scriptElem);
				break;
				case 'css':
					var scriptElem = document.createElement('link');
					scriptElem.setAttribute('href',Document);
					scriptElem.setAttribute('type','text/css');
					scriptElem.setAttribute('rel','stylesheet');
					document.getElementsByTagName('head')[0].appendChild(scriptElem);
				break;
			}
		}
	},
	addLoadEvent: function(func){var oldonload=window.onload;if(typeof(window.onload)!='function'){window.onload=func;}else{window.onload = function() {if(oldonload){oldonload();}func();}}},
	addUnloadEvent: function(func){var oldonunload=window.onunload;if (typeof(window.onunload)!='function'){window.onunload=func;}else{window.onunload=function(){if(oldonunload){oldonunload();}func();}}},
	addOnResizeEvent: function(func){var onresizeevent=window.onresizeevent;if(typeof(window.onresizeevent)!='function'){window.onresizeevent=func;}else{window.onresizeevent=function(){if(onresizeevent){onresizeevent();}func();}}},
	extendAction: function(obj, script_action, add_function) {
		if (obj[script_action] == null) {
			obj[script_action] = add_function;
		} else {
			var current_function = obj[script_action];
			obj[script_action] = function() {
				current_function();
				add_function();
			}
		}
	},
	Cache: {
		store: {},
		Add: function(name, data) {
			Bluora.Cache.store[name] = data;
		},
		Get: function(name) {
			return Bluora.Cache.store[name];
		},
		Has: function(name) {
			if (typeof Bluora.Cache.store[name] != 'undefined') {
				return true;
			} else {
				return false;	
			}
		},
		Remove: function(name) {
			Bluora.Cache.store[name] = null;	
		}
	},
	log: function (message) {
		if (window.console != null) {
			console.log(message);
		}
	},
	logInfo: function(message) {
		if (typeof BLUORA_INFO_MESSAGES_ON == 'undefined') {
			BLUORA_INFO_MESSAGES_ON = false;
		}
		
		if (window.console != null && BLUORA_INFO_MESSAGES_ON) {
			console.info(message);
		}
	},
	logError: function (message) {
		if (window.console != null) {
			console.error(message);
		}
	},
	typeOf: function(value) {
		var s = typeof value;
		if (s === 'object') {
			if (value) {
				if (typeof value.length === 'number' &&
						!(value.propertyIsEnumerable('length')) &&
						typeof value.splice === 'function') {
					s = 'array';
				}
			} else {
				s = 'null';
			}
		}
		return s;
	},
	EvaluateAttributesArray: function(attributes) {
		var html_attribute = '';
		if (attributes[0] != null) { html_attribute = ' style="'+attributes[0]+'"'; }
		if (attributes[1] != null) { html_attribute += ' class="'+attributes[1]+'"'; }
		if (attributes[2] != null) { html_attribute += ' id="'+attributes[2]+'"'; }
		if (attributes[3] != null) { html_attribute += ' colspan="'+attributes[3]+'"'; }
		if (attributes[4] != null) { html_attribute += ' height="'+attributes[4]+'"'; }
		return html_attribute;
	},
	urlEncode: function(sStr) {return encodeURIComponent(sStr);},
	EvaluateAjaxReturn: function(result) {
		var result_current = Array();
		result_type = typeof(result)
		if (result_type == 'string') {
			result_current[0] = 1;
			result_current[1] = result;
			caption_title = 'Server Side Error has occured';
		} else {
			result_current = result;
			caption_title = 'Server Side Debugging';
		}
		
		switch (result_current[0]) {
			case true:
			case 1:
				Bluora.log('You are not logged in.');
				document.location.href=document.location.href;
			break;
			case 99: 
				Bluora.log('An error occured server-side: '+result_current[1]);
				break;
			default:
		}
		
		result_current.shift();
		result_current.shift();
		return result_current;
	}
};

var gui_rules = {};

function HTML_AJAX_Dispatcher(className, callback, serverUrl) 
{
	Bluora.log('ajax ['+className+'] loaded'); 
	this.className = className;
	this.callback = callback;
	this.serverUrl = serverUrl;
}

HTML_AJAX_Dispatcher.prototype = {
	doCall: function(callName, args) 
    {
		args = $A(args);
		request = args.toJSON();
		var callback = this.callback;
		requestURL = 'c='+this.className+'&m='+callName+'&r='+Bluora.urlEncode(request);
		var ajax_options = {
			parameters:requestURL,
			onSuccess: function(request) { 
				var json = request.responseText.evalJSON();
				json = Bluora.EvaluateAjaxReturn(json);
				callback[callName](json);
			},
			onFailure: function(request) {
				Bluora.logError('AJAX call failed '+callName+'');
				if (callback['ajaxfailure']) {
					callback['ajaxfailure']('Unable to retrieve data from server. This has been logged.');
				}
			},
			onException: function(request, e) {
				Bluora.logError('AJAX call ['+callName+'] threw exception: '+e);
				if (callback['ajaxfailure']) {
					callback['ajaxfailure']('A serious error has occured. This has been logged.');
				}
			}
		}
		new Ajax.Request(this.serverUrl, ajax_options);
	}
};

// Bluora functionality
Bluora.Startup();