

/*	EXTENDS STRING	*/
String.prototype.trim			= function()	{return this.replace(/(^\s*)|(\s*$)/g,'');}
String.prototype.fill			= function(i,c)	{var str = this; c = c || ' '; for (; str.length<i; str+=c){}; return str;}
String.prototype.friendlyHTML	        = function()	{return this.replace(/<scrip.*?>|<\/script>|<applet.*?>|<\/applett>|<embe.*?>|<objec.*?>.*?<\/object>/ig, '').replace(/ on.+?=.+?>/ig, '>').replace(/ href=.javascript:.+?.>/ig, '>');}
String.prototype.stripHTML		= function()	{return this.replace(/<.*?>/g, '');}
String.prototype.stripNS		= function()	{return this.replace(/<hbi:.*?>|<\/hbi:.*?>/g, '');}
String.prototype.nl2br          	= function()	{return this.replace(/\n/g, '<br />');}

/*	EXTENDS ARRAY	*/
Array.prototype.sort_int		= function(d) {var d = d || -1;return this.sort(function(a,b) {var a = a || new Number(a);var b = b || new Number(b);if (a>b) return 1*d;if (a<b) return -1*d;if (isNaN(a)) return -1*d;if (isNaN(b)) return 1*d;return 0;});}
Array.prototype.indexOf			= function(e) {for (var i=0; i<this.length; i++) {if (this[i] == e) return i;}return -1;}
Array.prototype.subtract		= function(a) {if (!a) return this;var ra = new Array();for (var i=0; i<this.length; i++) {if (a.indexOf(this[i]) == -1) ra.push(this[i]);}return ra;}
Array.prototype.remove			= function(e) {if (!e) return this;return this.subtract([e]);}

/*	EXTENDS DATE */
Date.prototype.getWeek = function()	{
     var determinedate = new Date();
    determinedate.setFullYear(this.getFullYear(), this.getMonth(), this.getDate());
    var D = determinedate.getDay();
    if(D == 0) D = 7;
    determinedate.setDate(determinedate.getDate() + (4 - D));
    var YN = determinedate.getFullYear();
    var ZBDoCY = Math.floor((determinedate.getTime() - new Date(YN, 0, 1, -6)) / 86400000);
    var WN = 1 + Math.floor(ZBDoCY / 7);
    return WN;
}


/*	ENVIRONMENT	*/
var env = {
	avbl : ['sv', 'tr', 'en'],
	ie : /msie/i.test(navigator.userAgent),		//	Internet Explorer
	ie6 : /msie 6/i.test(navigator.userAgent),		//	Internet Explorer
	gk : /gecko/i.test(navigator.userAgent),	//	Gecko based browsers
	ff : /firefox/i.test(navigator.userAgent),	//	Firefox browsers
	sf : /safari/i.test(navigator.userAgent),	//	Safari
	op : /opera/i.test(navigator.userAgent),	//	Safari
	ax : typeof(ActiveXObject) == 'function',	//	Is ActiveXObject supported
	xhr : typeof(XMLHttpRequest) == 'function'	//	Is XMLHttpRequest supported
}
env.lng = (new RegExp(navigator.userLanguage,'i').test(env.avbl))? navigator.userLanguage : 'en';

/*	CLIPBOARD	*/
var cboard = {}

if( env.ie ) {
    var console = {
        log: function (e) { if( $('console_debug') ) { $('console_debug').value+=e+"\n"; }else{ alert(e); } }
    }
}

/*	EXTENDS GECKO	*/
if (!env.ie && !env.op) {
	if (!env.sf) {
		Window.prototype.attachEvent =	function(e, f)	{if (f && e == 'onload') document.addEventListener("DOMContentLoaded", f, false);}
	}
	
	Node.prototype.setCapture =				function()		{}
	Node.prototype.releaseCapture =			function()		{}
	Node.prototype.fireEvent =				function(eType) {var e = document.createEvent('MouseEvents'); e.initEvent(eType.slice(2), true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); this.dispatchEvent(e);}
	Node.prototype.attachEvent =			function(e, h)	{this.addEventListener(e.slice(2), h, false);};
	Node.prototype.detachEvent =			function(e, h)	{this.removeEventListener(e.slice(2), h, false);};
	Document.prototype.selectNodes =		function(XPath, XNode) {if(!XNode) XNode = this; this.ns = this.createNSResolver(this.documentElement); this.qI = this.evaluate(XPath, XNode, this.ns, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); aResult = []; for(var i=0; i<this.qI.snapshotLength; i++) aResult[i] = this.qI.snapshotItem(i); return aResult;}
	Document.prototype.selectSingleNode =	function(XPath, XNode) {if(!XNode) XNode = this; this.xI = this.selectNodes(XPath, XNode); return (this.xI.length > 0)? this.xI[0] : null ;}
	Element.prototype.selectNodes =			function(XPath) {return this.ownerDocument.selectNodes(XPath, this);}
	Element.prototype.selectSingleNode =	function(XPath) {return this.ownerDocument.selectSingleNode(XPath, this);}
	
	Node.prototype.__defineGetter__('xml',			function()		{return (new XMLSerializer()).serializeToString(this);});
    Node.prototype.__defineGetter__('text',         function()      {return this.textContent;});
	Node.prototype.__defineGetter__('outerHTML',	function()		{return (new XMLSerializer()).serializeToString(this);});
	Node.prototype.__defineSetter__('outerHTML',	function(s)		{var rng = this.ownerDocument.createRange(); rng.setStartBefore(this); cFrag = rng.createContextualFragment(s); this.parentNode.replaceChild(cFrag, this);});
	Node.prototype.__defineGetter__('innerText',	function ()		{return this.textContent;});   
	Node.prototype.__defineSetter__('innerText',	function (s)	{this.textContent = s;});
	Node.prototype.__defineGetter__('currentStyle', function()		{return getComputedStyle(this, null);});
	Node.prototype.__defineSetter__('onreadystatechange', function(b) {this.readyState = 'complete'; this.onload = b;});
	/* Event */
	Event.prototype.__defineGetter__('event',		function()		{return this;});
	Event.prototype.__defineGetter__('clientY',		function()		{return this.pageY;});
	Event.prototype.__defineGetter__('clientX',		function()		{return this.pageX;});
	Event.prototype.__defineGetter__('offsetY',		function()		{return window.pageYOffset + this.pageY - getDim(this.srcElement).t;});
	Event.prototype.__defineGetter__('offsetX',		function()		{return window.pageXOffset + this.pageX - getDim(this.srcElement).l;});
	Event.prototype.__defineGetter__('srcElement',	function()		{var node = this.target; while (node && node.nodeType != 1) node = node.parentNode; return node;});
	Event.prototype.__defineSetter__('cancelBubble',function(b)		{if (b) this.stopPropagation();});
	Event.prototype.__defineSetter__('returnValue',	function(b)		{if (!b) this.preventDefault();});
	
	$e = ['contextmenu', 'click', 'dblclick', 'mouseover', 'mouseout', 'mousedown', 'mouseup', 'mousemove', 'keydown', 'keypress', 'keyup', 'focus', 'blur'];
	for (var i=0; i<$e.length; i++) document.addEventListener($e[i], function(e) {window.event=e;}, true);
}



/*	DOM EXPLORERS	*/
function $(s) {
	return (typeof(s) == 'string')? document.getElementById(s) : s ;
}
function getHTML(s) {
	var span = document.createElement('SPAN');
	span.innerHTML = s;
	return span.innerText;
}
function getScope(el, s) {
	while (el && el.scopeName != s) {
		el = el.parentNode;
	}
	return el;
}
function getSrcIndex($el) {
	var i=0;
	while ($el.previousSibling) {
		$el=$el.previousSibling;
		if ($el.nodeType != 3) i++;
	}
	return i;
}
function getChildren(el, a, v, i) {
	var ar = new Array();
	var ac = $(el).getElementsByTagName('*');
	for (var c=0; c<ac.length; c++) {
		var as = ac[c].getAttribute(a) || '';
		if (i == 1) {
			if (ac[c][a] == v || ac[c][a].indexOf(v) > -1 || as == v || as.indexOf(v) > -1) ar.push(ac[c]);
		} else if (v? (ac[c][a] == v || as == v) : (ac[c][a] || as)) {
			ar.push(ac[c]);
		}
	}
	return ar;
}
function getChild(el, a, v) {
	var ar = new Array();
	if($(el) != null){
	    var ac = $(el).getElementsByTagName('*');
	    for (var c=0; c<ac.length; c++) {
		    if (v? (ac[c][a] == v || ac[c].getAttribute(a) == v) : (ac[c][a] || ac[c].getAttribute(a))) return ac[c];
	    }
	}
	return false;
}
function getParent(el, a, v) {
	var el = $(el);
	
	try {
	    // IE fucks like a duck here, therefore the try-catch !
	    while (v? (el && el[a] != v && el.getAttribute(a) != v) : (el && !el[a] && !el.getAttribute(a))) {
		    if (el == document.body.parentNode) return null;
		    el = el.parentNode;
	    }
	    return el;
	} catch(e){
	    return false;
	}
}
function getSibling(el, a, v) {
	var el = getChildren($(el).parentNode, a, v);
	return el? el[0] : null;
}
/*function getDim(el, a, v) {
	var a = a || 'nodeName';
	var v = v || 'BODY';
	var point = {w:el.offsetWidth, h:el.offsetHeight, t:0, l:0}
	while (el && el[a] != v && el.getAttribute(a) != v) {
		if (el == document.firstChild) return null;
		point.t += el.offsetTop;
		point.l += el.offsetLeft;
		el = el.offsetParent;
	}
	point.obj = el;
	return point;
}*/
function getDim(el, a, v) {
	if (!el) return {w:0, h:0, t:0, l:0, obj:el};
	var a = a || 'nodeName';
	var v = v || 'BODY';
	var p = {w:el.offsetWidth, h:el.offsetHeight, t:0, l:0, obj:el};
	while (el && el[a] != v && el.getAttribute(a) != v) {
		if (el == document.firstChild) return null;
		p.t += el.offsetTop - el.scrollTop;
		p.l += el.offsetLeft - el.scrollLeft;
		if (el.scrollWidth > el.offsetWidth) {
			p.w = Math.min(p.w, p.w-(p.w + p.l - el.offsetWidth - el.scrollLeft));
		}
		el = el.offsetParent;
	}
	return p;
};



var layout = {
	load : function() {
		xdbc.debug = false; // Set this to true for some debug handling.
		xdbc.path = '/?get=xmlapi';
		xdbc.load('/js/xml/ledger.xml', layout.init);
		document.body.parentNode.className = env.browser;
	},
	init : function(resp) {
		if (!resp) return;
		xdbc.ledger = resp;
		
		var span = document.body.appendChild(document.createElement('SPAN'));
		span.innerHTML = '<div id="ghost"><div class="part1">&#160;</div><div class="part2">&#160;</div><div class="part3">&#160;</div><div class="part4">&#160;</div></div>';
		
		/*	INITS CONTEXT MENU	*/
		ctx.init();
	},
	save : function() {
		if ($('doc_layout').getAttribute('edit')) layout.publ.edit();
		var layout_node = $('doc_layout').cloneNode(true);
		var ln_el = getChildren(layout_node, 'layout_id');
		var cEl = getChildren('doc_layout', 'etype', 'corner');
		var rc_markup = cEl[0].outerHTML + cEl[1].outerHTML + cEl[2].outerHTML + cEl[3].outerHTML;
		
		for (var n=0; n<ln_el.length; n++) {
			var layout_id = ln_el[n].getAttribute('layout_id');
			var layout_markup = xdbc.ledger.selectSingleNode('//layout/*[@id="'+ layout_id +'"]/@markup');
			if (layout_markup) ln_el[n].innerHTML = rc_markup + layout_markup.nodeValue;
		}
		$('doc_layout').removeAttribute('edit');
		var html_layout = layout_node.outerHTML;
		
		var css_layout = $('css_layout').outerHTML;
		css_layout = css_layout.replace(/\/\*\*\//, '/*{literal}*/');
		css_layout = css_layout.replace(/\/\*\*\//, '/*{/literal}*/');
		
		var re = new RegExp('html&gt;body', 'ig');
		css_layout = css_layout.replace(re, 'html>body');
		
		var site_template = css_layout + html_layout;
		//site_template = site_template.replace(/\n|\r|\t/g, '');
		var req = xdbc.addQue(xdbc.cmd('01'));
		req.setAttribute('sys:set_site_template', site_template);
		xdbc.exec(true);
	},
	pub : {
		win_close : function(id) {
			$(id).style.display = 'none';
			$(id).onclick = null;
		},
		edit : function() {
			var state = $('doc_layout').getAttribute('edit');
			var mNode = xdbc.ledger.selectSingleNode('//xmenu//*[@menu_id="layout_toggle"]');
			if (state) {
				$('doc_layout').removeAttribute('edit');
				mNode.setAttribute('title', 'Redigera layout');
			} else {
				$('doc_layout').setAttribute('edit', 'true');
				mNode.setAttribute('title', 'Lås layout');
			}
			var drgEl = getChildren('doc_layout', 'dtype');
			var cursor = (!state)? 'move' : 'auto' ;
			for (var d=0; d<drgEl.length; d++) {
				drgEl[d].style.cursor = cursor
			}
		},
		palette : function() {
			if ($('win_color_palette').currentStyle.display == 'none') {
				$('win_color_palette').style.display = 'block';
				$('win_color_palette').onclick = function() {
					var srcEl = event.srcElement;
					var srcTD = getParent(srcEl, 'nodeName', 'TD');
					ctx.origin.style.backgroundColor = srcTD.getAttribute('bgcolor');
				};
			}
		},
		color : function(c) {
			if (!c || !ctx.origin) return;
			ctx.origin.style.backgroundColor = c;
		},
		corners : function(t) {
			var state = (t=='round')? 'block' : 'none' ;
			var moz_state = (t=='round')? '8px' : '0px' ;
			var cEl = getChildren('doc_layout', 'etype', 'corner');
			for (var c=0; c<cEl.length; c++) {
				cEl[c].style.display = state;
				cEl[c].parentNode.style.MozBorderRadius = moz_state ;
			}
		},
		properties : function() {
			
		}
	},
	win : {
		show : function(win_id) {
			// Event can sometimes be empty if called with javascript: blah()
			// Hence the added if-statement // @author Mats
			if(event){
                var srcEl = event.srcElement;
                var winEl = getParent(srcEl, 'otype', 'window');
                if (!$(win_id) || winEl) return;
			}
			
			$(win_id).style.display = 'block';
			layout.win.current = $(win_id);
			//document.attachEvent('onmousedown', layout.win.hide);
			return true;
		},
		hide : function() {
			var srcEl = event.srcElement;
			var winEl = getParent(srcEl, 'otype', 'window');
			if (winEl) return;
			document.detachEvent('onmousedown', layout.win.hide);
			if (!layout.win.current) return;
			layout.win.current.style.display = 'none';
			layout.win.current = null;
		},
        position_visible: function (win_id) { /* Will position element topwise for windows. */
            var win_dim = getDim($(win_id));
            $(win_id).style.top = (document.documentElement.scrollTop+10)+'px';
            $(win_id).style.left = '10px';            
            return true;
        },
		pos_load : function() {
			if (Cookie.Enabled()) {
				var w_pos = Cookie.Get('win_pos');
				if (!w_pos) return;
				var c_arr = w_pos.split('-');
				for (var i=0; i<c_arr.length; i++) {
					var witem = c_arr[i].split(',');
					var winEl = $(witem[0]);
					if (!winEl) continue;
					winEl.style.top = witem[1];
					winEl.style.left = witem[2];
				}
			}
			
			var cmp_menu = $('component_menu');
			if (cmp_menu && (parseInt(cmp_menu.style.top) < 1 || parseInt(cmp_menu.style.left) < 1)) {
				$('component_menu').style.top = '1px';
				$('component_menu').style.right = '1px';
			}
		},
		pos_save : function() {
			var c_arr = [];
			var win = getChildren(document.body, 'otype', 'window');
			for (var i=0; i<win.length; i++) {
				if (!win[i].id || (parseInt(win[i].currentStyle.top) == 0 && parseInt(win[i].currentStyle.left) == 0)) continue;
				c_arr.push(win[i].id +','+ win[i].currentStyle.top +','+ win[i].currentStyle.left);
			}
			Cookie.Set('win_pos', c_arr.join('-'));
		}
	},
	update_toolbar: function (toolbar_string) {
		var toolbar = xdbc.load(toolbar_string);
		if(site.toolbar){
		    site.toolbar.init(toolbar.selectNodes('/toolbar/*'));
		}
	}
}

/*	MOUSE HANDLER	*/
var eMouse = {
	init : function() {
		document.attachEvent('onmouseover', eMouse.handle_event);
		document.attachEvent('onmouseout', eMouse.handle_event);
		document.attachEvent('onmouseup', eMouse.handle_event);
		document.attachEvent('onmousedown', eMouse.handle_event);
		document.attachEvent('onclick', eMouse.handle_event);
		eForm.init();
	},
	handle_event : function() {
		var srcEl = event.srcElement;

        
		if (event.type == 'mousedown') {
			var drgEl = getParent(srcEl, 'etype', 'handle');
			if (drgEl) eMouse.drag.init(drgEl);
			var rszEl = getParent(srcEl, 'etype', 'resize');
			if (rszEl) return eMouse.resize.init(rszEl);
			
			var dvdrEl = getParent(srcEl, 'className', 'dvdr_h');
			if (dvdrEl) return eMouse.divider.init(dvdrEl);
		}
        var guiEl = getParent(srcEl, 'gtype');
        if (!guiEl || guiEl.className.indexOf('disabled') > -1) return;
		var etype = guiEl.getAttribute('etype');
		var eopt = guiEl.getAttribute('eopt');
		switch (event.type) {
			case 'mouseover':
				if (cboard[eopt] != guiEl) eMouse.classname(guiEl, 'over');
				break;
			case 'mouseout':
				if (cboard[eopt] != guiEl) eMouse.classname(guiEl);
				break;
			case 'mousedown': /* XXX: A canceled mousedown and dragout, will down the element. */
			    if (etype == 'radio') {
				    if (cboard[eopt]) eMouse.classname(cboard[eopt]);
				    cboard[eopt] = guiEl;
			    }
			    eMouse.classname(guiEl, 'down');
			    break;
		        /*case 'mouseup': Changed to click instead, since mouseup triggers behind disappearing windows.*/ 
			case 'click':
			    if (etype == 'radio') {
				if (cboard[eopt]) eMouse.classname(cboard[eopt]);
				    cboard[eopt] = guiEl;
			    }
			    eMouse.classname(guiEl, 'down');

			    if (cboard[eopt] != guiEl) 
					eMouse.classname(guiEl, 'up');

			    var act = guiEl.getAttribute('action');
			    if (act) eval(act);
			    break;
		}
	},
	classname : function(el, c) {
		var gtype = el.getAttribute('gtype');
		if (!gtype) return;
		var ca = new Array();
		if (el.className.indexOf(gtype) > -1) {
			var cn = el.className.split(' ');
			for (var i=0; i<cn.length; i++) {
				if (cn[i].indexOf(gtype) > -1) continue;
				ca.push(cn[i]);
			}
		}
		ca.push(gtype);
		if (c || c=='') ca.push(gtype +'_'+ c);
		el.className = ca.join(' ');
	},
	drag : {
		init : function(drgEl) {
			var drgEl = getParent(drgEl, 'otype', 'window');
			if (!drgEl) return;
			eMouse.drag.origo = getParent(drgEl, 'otype', 'drag_origo');
			eMouse.drag.odim = (eMouse.drag.origo)? getDim(eMouse.drag.origo) : {t:0,l:0,w:0,h:0} ;
			
			eMouse.drag.dim = getDim(drgEl);
			eMouse.drag.obj = drgEl;
			eMouse.drag.obj.setCapture();
			
			eMouse.drag.t = event.clientY - eMouse.drag.dim.t;
			eMouse.drag.l = event.clientX - eMouse.drag.dim.l;
			document.attachEvent('onmousemove', eMouse.drag.move);
			document.attachEvent('onmouseup', eMouse.drag.release);
			eMouse.cancelBubble();
		},
		move : function() {
			if (!eMouse.drag.obj) return;
			var _ondragmove = eMouse.drag.obj.getAttribute('_ondragmove');
			if (_ondragmove) eval(_ondragmove);
			
			var snap_y = (eMouse.drag.origo)? eMouse.drag.origo.grid_h : null ;
			var snap_x = (eMouse.drag.origo)? eMouse.drag.origo.grid_w : null ;
			
			var top = (event.clientY - eMouse.drag.odim.t - eMouse.drag.t) ;
			var left = (snap_x)? (event.clientX - eMouse.drag.odim.l) : (event.clientX - eMouse.drag.odim.l - eMouse.drag.l) ;
			
			top = (snap_y)? (top - 1 - top % snap_y) : top ;
			left = (snap_x)? (left + 2 - left % snap_x) : left ;
			
			eMouse.drag.obj.style.top = top +'px';
			eMouse.drag.obj.style.left = left +'px';
		},
		release : function() {
			var _ondragend = eMouse.drag.obj.getAttribute('_ondragend');
			if (_ondragend) eval(_ondragend);
			eMouse.drag.obj.releaseCapture();
			eMouse.drag.dim =
			eMouse.drag.obj = null;
			document.detachEvent('onmouseup', eMouse.drag.release);
			document.detachEvent('onmousemove', eMouse.drag.move);
		}
	},
	resize : {
		init : function(drgEl) {
			var winEl = getParent(drgEl, 'otype', 'window');
			if (!winEl) return;
			eMouse.drag.origo = getParent(drgEl, 'otype', 'drag_origo');
			eMouse.drag.odim = (eMouse.drag.origo)? getDim(eMouse.drag.origo) : {t:0,l:0,w:0,h:0} ;
			
			eMouse.resize.dim = getDim(winEl);
			eMouse.resize.obj = winEl;
			eMouse.resize.obj.setCapture();
			
			eMouse.resize.h = event.clientY - eMouse.resize.dim.h;
			document.attachEvent('onmousemove', eMouse.resize.move);
			document.attachEvent('onmouseup', eMouse.resize.release);
			eMouse.cancelBubble();
		},
		move : function() {
			if (!eMouse.resize.obj) return;
			var snap_y = (eMouse.drag.origo)? eMouse.drag.origo.grid_h : null ;
			var height = event.clientY - eMouse.resize.h;
			height = (snap_y)? (height - 2 - height % snap_y) : height ;
			height = Math.max(height, snap_y);
			eMouse.resize.obj.style.height = height +'px';
		},
		release : function() {
			var _onresizeend = eMouse.resize.obj.getAttribute('_onresizeend');
			if (_onresizeend) eval(_onresizeend);
			eMouse.resize.obj.releaseCapture();
			eMouse.resize.dim =
			eMouse.resize.obj = null;
			document.detachEvent('onmouseup', eMouse.resize.release);
			document.detachEvent('onmousemove', eMouse.resize.move);
		}
	},
	divider : {
		init : function(dvdrEl) {
			if (!dvdrEl && !$('ghost')) return;
			eMouse.divider.obj = dvdrEl.previousSibling;
			eMouse.divider.dim = getDim(eMouse.divider.obj);
			
			var mm = (eMouse.divider.obj.getAttribute('ltype') == 'vert')? 'mmw' : 'mmh'; 
			if (!eMouse.divider.obj.getAttribute(mm)) return;
			eMouse.divider.min = eMouse.divider.obj.getAttribute(mm).split(',')[0];
			eMouse.divider.max = eMouse.divider.obj.getAttribute(mm).split(',')[1];
			
			$('ghost').style.top = eMouse.divider.dim.t +'px';
			$('ghost').style.left = eMouse.divider.dim.l +'px';
			$('ghost').style.height = eMouse.divider.dim.h +'px';
			$('ghost').style.width = eMouse.divider.dim.w +'px';
			
			eMouse.divider.obj.setCapture();
			
			eMouse.divider.h = event.clientY - eMouse.divider.dim.h;
			eMouse.divider.w = event.clientX - eMouse.divider.dim.w;

			document.attachEvent('onmousemove', eMouse.divider.move);
			document.attachEvent('onmouseup', eMouse.divider.release);
			eMouse.cancelBubble();

			/* To avoid misfiring of mouse events, we hide all the iframes. */
			var iframes = getChildren($('workarea_space'), 'nodeName', 'IFRAME');
			for( var i = 0; i<iframes.length; i++ ) {
			    if( iframes[i].style.display=='block' || iframes[i].style.display=='' ){
				iframes[i].style.display = 'none';
				iframes[i].setAttribute('divider_hidden', '1');
			    }
			}

		},
		move : function() {
			if (!eMouse.divider.obj) return;
			var height = event.clientY - eMouse.divider.h + 1;
			var width = Math.max(Math.min(event.clientX - eMouse.divider.w + 1, eMouse.divider.max), eMouse.divider.min);
			
			if (eMouse.divider.obj.getAttribute('ltype') == 'hrzn') $('ghost').style.height = height +'px';
			if (eMouse.divider.obj.getAttribute('ltype') == 'vert') $('ghost').style.width = width +'px';
		},
		release : function() {
			if (eMouse.divider.obj.getAttribute('ltype') == 'hrzn') eMouse.divider.obj.setAttribute('lh', $('ghost').offsetHeight);
			if (eMouse.divider.obj.getAttribute('ltype') == 'vert') eMouse.divider.obj.setAttribute('lw', $('ghost').offsetWidth);
			$('ghost').style.top =
			$('ghost').style.left = '-999px';
			$('ghost').style.height =
			$('ghost').style.width = '1px';
			
			eMouse.divider.obj.releaseCapture();
			eMouse.divider.dim =
			eMouse.divider.obj = null;
			document.detachEvent('onmouseup', eMouse.divider.release);
			document.detachEvent('onmousemove', eMouse.divider.move);

			/* We show all the iframes that we removed before. */
			var iframes = getChildren($('workarea_space'), 'divider_hidden', '1');
			for( var i = 0; i<iframes.length; i++ ) {
			    if( iframes[i].style.display=='none' ){
				iframes[i].style.display = 'block';
				iframes[i].removeAttribute('divider_hidden');
			    }
			}

			if (typeof(site) == 'object' && typeof(site.fix_layout) == 'function') 
			    site.fix_layout('base', 'hrzn', 'vert');
		}
	},
	cancelBubble : function() {
		event.cancelBubble = true;
		event.returnValue = null;
	}
}

/*	FORM HANDLER	*/
var eForm = {
    holding_search: false,
	el : {'input':0, 'select':0, 'button':0},
	reg : {
		'mail' : /^(.+)@(.+)(\..+)$/,
		'time' : /\d{2}:\d{2}$|\d{4}$/,
		'zipcode' : /\d{5}$|\d{3} \d{2}$/,
		'ssnr' : /\d{6}-\d{4}$|\d{8}-\d{4}$/,
		'date' : /\d{4}-\d{2}-\d{2}$/,
		'pw' : {
			'1' : /.{6}/,
			'2' : /.{10}/,
			'3' : /[a-z]/g,
			'4' : /[A-Z]/,
			'5' : /\d/,
			'6' : /\d{2,}/
		}
	},
	init : function(pEl) {
		var fEl = getChildren(pEl || document, 'nodeName', 'INPUT');
		for (var i=0; i<fEl.length; i++) {
			if (fEl[i].type == 'text' || fEl[i].type == 'password') fEl[i].attachEvent('onblur', eForm.do_event);
		}
		document.attachEvent('onkeyup', eForm.do_event);
		document.attachEvent('onclick', eDate.init);
	},
	do_event : function() {
		var srcEl = event.srcElement;
		var frmEl = (srcEl.nodeName.toLowerCase() in eForm.el)? srcEl : null ;
		switch (event.type) {
			case 'keyup':
				if (frmEl) eForm.check(new Array(frmEl));
				break;
			case 'blur':
                if (frmEl) eForm.check(new Array(frmEl));
                if (srcEl.type == 'text') {
                    var ftype = srcEl.getAttribute('ftype');
                    var formattedValue = eForm.formatString(srcEl.value, ftype);
                    if( formattedValue!=srcEl.value )
                        srcEl.value = formattedValue;
                }
				break;
		}
    },
    formatString: function (string, ftype ) {
        var formattedValue = string;
        switch(ftype){
            case 'ucfirst':
                var tmp = string.split(' ');
                var str = '';
                for (var i=0; i<tmp.length; i++) str += tmp[i].slice(0,1).toUpperCase() + tmp[i].slice(1) +' ';
                var formattedValue = str.slice(0,-1);
                break;
            case 'zipcode':
                var str = string.replace(/ /g, '');
                var formattedValue = str.slice(0,3) +' '+ str.slice(3);
                break;
            case 'phone':
                var str = string;
                if( str!="" && str.indexOf(' ')<=0  ) {
                    str = str.replace(/ /g, '');
                    if( str.substring(0, 2)=='00' ) {
                        str = '+'+str.substring(2, str.length);
                    }else if( str.substring(0, 1)!='+' ) {
                        
                        /* Detect mobile phones */
                        if( str.substring(0, 2)=='07' ) {
                            if( str.indexOf('-')==3 ) {
                                var str = (str.substring(0, 3)+str.substr(4, 1)+'-'+str.substr(5, str.length));
                            }else{
                                var str = str.substring(0, 4)+'-'+str.substring(4, str.length);
                            }
                        }
                        
                        if( str.substring(0, 1)=='0' ) {
                            if( str.indexOf('-')>0 ) {
                                var rest = str.substring(1, str.length);
                                str = '+46 (0)'+rest.substr(0, rest.indexOf('-'))+' ';
                                var rest = rest.substr(rest.indexOf('-')+1, rest.length);
                            }else{
                                if( str.substring(0, 2)=='08' ) {
                                    var rest = str.substring(2, str.length);
                                    var str = '+46 (0)'+str.substr(1,1);
                                }else{
                                    var rest = str.substring(3, str.length);
                                    var str = '+46 (0)'+str.substr(1,2);
                                }
                            }

                            /* Uneven rests should be start with a threepair. */
                            var start = 0;
                            if( rest.length%2!=0 ) {
                                str+=rest.substr(0, 3);
                                start = 3;
                            }
                            
                            for( start; start<rest.length; start+=2 ) {
                                str+=' '+rest.substr(start, 2);
                            }
                        }else
                            str = '+'+str;
                    }                        
                    
                    //
                }
                var formattedValue = str;
                break;
        }
        return formattedValue;
    },
	check : function(fEl) {
		var fEl = fEl || getChildren(document.body, 'ftype');
		for (var f=0; f<fEl.length; f++) {
			var ftype = fEl[f].getAttribute('ftype');
            var fVal = fEl[f].value;

            if (ftype=='search' ) {
                if( event.type=='keyup' && !eForm.holding_search ) {
                    eForm.holding_search = true;
                    if( event.keyCode==13 || event.keyCode==38 || event.keyCode==40 )
                        eval('eForm.search_box("'+fEl[f].id+'");');
                    else
                        setTimeout('eForm.search_box("'+fEl[f].id+'");', 500);
                }
                continue;
            }            
            
			if (!fEl[f].nodeName.toLowerCase() in eForm.el || !eForm.reg[ftype])
                continue;
			if (!eForm.reg[ftype].test(fVal)) {
				fEl[f].style.borderColor = '#F00';
			} else if (fEl[f].type == 'text') {
				fEl[f].style.borderColor = '';
			} 
		}
	},
    search_box: function (el) {
        if( event && event.keyCode && $('search_result_'+el) ) {
            var resultRows = getChildren($('search_result_'+el), 'gtype', 'resultRow');
            var activeRow = -1;
            for( var i = 0; i<resultRows.length; i++ ) {
                if( resultRows[i].className.indexOf('resultRow_over')>0 ) {
                    activeRow = i;
                    break;
                }
            }
            if( resultRows.length>0 ) {
                if( event.keyCode==40 ) { /* User presses downkey. */
                    if( activeRow>=0 )
                        resultRows[activeRow].className = 'resultRow';
                    if( resultRows[(activeRow+1)] )
                        resultRows[(activeRow+1)].className = 'resultRow resultRow_over';
                    $('search_result_'+el).scrollTop = (getDim(resultRows[(activeRow+1)]).t-getDim($('search_result_'+el)).t);
                    eForm.holding_search = false;
                    return;
                }else if( event.keyCode==38 && activeRow>0 ) { /* User presses upkey. */
                    resultRows[activeRow].className = 'resultRow';
                    resultRows[(activeRow-1)].className = 'resultRow resultRow_over';
                    eForm.holding_search = false;
                    $('search_result_'+el).scrollTop = (getDim(resultRows[(activeRow-1)]).t-getDim($('search_result_'+el)).t);
                    return;
                }else if( event.keyCode==13 && activeRow>=0 ) {
                    eForm.holding_search = false;
                    resultRows[activeRow].firstChild.fireEvent('onclick');
                    return;
                }
            }
        }
        
        var el = $(el);
        var sf = el.getAttribute('search_function');
        var af = el.getAttribute('select_function');        
        var keyword = el.value;
        if( sf ) { 
            var sf_id = el.getAttribute('id');
            var sf_result_id = 'search_result_'+sf_id;
            if( !$(sf_result_id) ) {
                var res_div = document.createElement('DIV');
                document.body.appendChild(res_div);
            }else{
                var res_div = $(sf_result_id);
            }
        
            var sf_pos = getDim(el);
            
            res_div.id = sf_result_id;
            res_div.className = 'searchResult';
            res_div.style.width = sf_pos.w+'px';
            res_div.style.left = (sf_pos.l)+'px';
            res_div.style.top = (sf_pos.t+20)+'px';
            res_div.style.display = 'block';

            /* 
               search function should returned a two-paired array, 
               first value is oid
               second value is caption
            */
            if( keyword.length>=2 ) {
                var result = eval(sf+'("'+keyword+'");');
                var str = '';
                for( var i = 0; i<result.length; i++ ) {
                    var oid = result[i];
                    var caption = result[i+1];
                    str+='<div gtype="resultRow" oid="'+oid+'" class="resultRow">';
                    str+='<a href="#" onclick="return !('+af+'(\''+oid+'\', \''+caption+'\') || eForm.close_searchbox(\''+sf_result_id+'\'))" class="resultRowLink">'+caption+'</a>';
                    str+='</div>\n';
                    i++;
                }
                el.setAttribute('onBlur', 'eForm.close_searchbox(\''+sf_result_id+'\')');
            }else{
                var str = '';
            }
            res_div.innerHTML = str;
            if( typeof($j) != 'undefined' ){
                $j('#search_userfield').after( res_div );
            }
            
            eForm.holding_search = false;
        }
    },
    close_searchbox: function (id) {
    	window.setTimeout(function(){
	        $(id).style.display = 'none';
    	},200);
    	return false;
    },
    file_upload: function(upload_id) {
        var form_name = 'form_'+upload_id;
        var upload_name = 'upload_'+upload_id;
        var progress_name = 'progress_'+upload_id;
        var iframe_name = 'iframe_'+upload_id;
        $(form_name).submit();
        eForm.file_upload_progress(upload_id);
    }, 
    file_upload_progress: function(upload_id) {

	
        xdbc.load('/?get=gui&action=upload_progress&id='+upload_id, function (response) {
            var progress = response.selectSingleNode('//progress');
            var progress_name = 'progress_'+progress.getAttribute('id');

	    /* Well, IE sucks, we know that, If the user didnt change the value, trigger nothing! */
	    var filename = $('upload_'+progress.getAttribute('id')).value;
	    if( $('upload_'+progress.getAttribute('id')).getAttribute('current_filename') ) {
		if( $('upload_'+progress.getAttribute('id')).getAttribute('current_filename')==filename ) {
		    return;
		}
	    }
	    $('upload_'+progress.getAttribute('id')).setAttribute('current_filename', filename);

	    if( progress.getAttribute('percent_done') && progress.getAttribute('percent_done')<100 ) {
		$('upload_'+progress.getAttribute('id')).setAttribute('image_width', null);
		$('upload_'+progress.getAttribute('id')).setAttribute('image_height', null);
		$('upload_'+progress.getAttribute('id')).setAttribute('mimetype', null);
		$(progress_name).style.display = '';
		if( $('upload_'+progress.getAttribute('id')).getAttribute('mimetype')==null ){
		    setTimeout("eForm.file_upload_progress('"+upload_id+"');", 1500);    
		}
            }else{
                if( $('upload_'+progress.getAttribute('id')).getAttribute('onfinished') ){
		    $('upload_'+progress.getAttribute('id')).setAttribute('image_width', progress.getAttribute('width'));
		    $('upload_'+progress.getAttribute('id')).setAttribute('image_height', progress.getAttribute('height'));
		    $('upload_'+progress.getAttribute('id')).setAttribute('mimetype', progress.getAttribute('mimetype'));
		    eval($('upload_'+progress.getAttribute('id')).getAttribute('onfinished'));
                }
                $(progress_name).style.display = 'none';
            }
        });       
    },
    form2rpc: function (form_id, rpc_node) {
        form_id = $(form_id);
        var rpc_fields = getChildren(form_id, 'rpcname');
        for( var i = 0; i<rpc_fields.length; i++ ){
            
            if( rpc_fields[i].getAttribute('type')=='radio' ) {
                if( rpc_fields[i].checked )
                    rpc_node.setAttribute('sys:'+rpc_fields[i].getAttribute('rpcname'), rpc_fields[i].value);
            }else{ 
                rpc_node.setAttribute('sys:'+rpc_fields[i].getAttribute('rpcname'), rpc_fields[i].value);
            }        
        }
    }
}

var eDate = {
	lng : {},
    date: function(format, unix_timestamp) { /* Mimic phps date function. */
        var d = new Date();
        d.setTime(unix_timestamp*1000);
        format = format.replace(/Y/, d.getFullYear());
        format = format.replace(/m/, eDate.fixInt(d.getMonth()+1));
        format = format.replace(/d/, eDate.fixInt(d.getDate()));
        format = format.replace(/H/, eDate.fixInt(d.getHours()));
        format = format.replace(/i/, eDate.fixInt(d.getMinutes()));
        format = format.replace(/s/, eDate.fixInt(d.getSeconds()));
        return format;
    },
	fixInt : function(i) {
		return (new Number(i) < 10)? '0'+ i : i ;
	},
	step : function(s) {
		var curr = $('eDate_cal').dObj;
		var new_dObj = new Date(curr.getFullYear(), curr.getMonth()+s, curr.getDate());
		eDate.draw(new_dObj);
	},
	draw : function(dObj) {
		var dObj = dObj || new Date();
		var y = dObj.getFullYear();
		var m = dObj.getMonth();
		var d = dObj.getDate();
		var yea_mon = eDate.lng.months[m] +' '+ y;
		
		var now = new Date();
		var sMon = new Date(y, m, 1);
		var fDay = (sMon.getDay() == 0)? 7 : sMon.getDay() ;
		var days = '<table cellpadding="0" cellspacing="0">';
		var ctbl = days;
		for (w=0; w<6; w++) {
			if (w==0) days += '<tr class="tr_weekdays">';
			ctbl += '<tr>';
			for (d=0; d<7; d++) {
				var is_sunday = (d==6)? ' sunday' : '' ;
				if (w==0) days += '<td class="'+ is_sunday +'">'+ eDate.lng.days[d].slice(0,1).toUpperCase() +'</td>';
				var dt = ((w*7)+d)+1;
                var mon_len = eDate.lng.mLen[m];
                // This will not work in the year 2100 :)
                mon_len = (y%4==0 && m == 1)? 29 : mon_len ;
                
				var tdTxt = (dt+1>fDay && dt<mon_len+fDay)? dt-fDay+1 : '&#160;';
				var gtype = (tdTxt != '&#160;')? ' gtype="date"' : '';
				if (y==now.getFullYear() && m==now.getMonth() && tdTxt==now.getDate()) {
					is_sunday = ' today';
				}
				ctbl += '<td etype="radio" eopt="cal_mday" class="date'+ is_sunday +'"'+ gtype +'>'+ tdTxt +'</td>';
			}
			ctbl += '</tr>';
		}
		eDate.hDay.innerHTML = days + '</table>';
		eDate.hCal.innerHTML = ctbl + '</table>';
		eDate.hMon.innerHTML = yea_mon;
		$('eDate_cal').dObj = dObj;
	},
	init : function() {
		var srcEl = event.srcElement;
        if( !srcEl )
            return; 
		if (srcEl.nodeName != 'INPUT' || srcEl.getAttribute('ftype') != 'date') return eDate.doClick();
		
        if ($('eDate_cal')) $('eDate_cal').parentNode.parentNode.removeChild($('eDate_cal').parentNode);
        
		var t = srcEl.value.split('-');
		var dObj = new Date(t[0], (t[1]-1), t[2]);
		if (!dObj.getFullYear()) {
			dObj = new Date();
			srcEl.value = dObj.getFullYear() +'-'+ eDate.fixInt(dObj.getMonth()+1) +'-'+ eDate.fixInt(dObj.getDate());
		}
		
		var htm = '<div class="sys_calendar" id="eDate_cal">'+
				'	<div class="cal_month_year">'+
				'	<span class="cal_arrow_left" gtype="cal_arrow_left" action="eDate.step(-1);">&#171;</span>'+
				'	<span class="cal_arrow_right" gtype="cal_arrow_right" action="eDate.step(1);">&#187;</span>'+
				'	<span class="cal_hMy" otype="hMon">&#160;</span>'+
				'</div>'+
				'<div otype="hDay" class="cal_weekdays">&#160;</div>'+
				'<div otype="hCal" class="cal_dates">&#160;</div>'+
				'</div>';
		
		var span = document.createElement('SPAN');
		span.innerHTML = htm;
		var span = document.body.appendChild(span);
		
		eDate.hMon = getChildren(span, 'otype' ,'hMon')[0];
		eDate.hDay = getChildren(span, 'otype' ,'hDay')[0];
		eDate.hCal = getChildren(span, 'otype' ,'hCal')[0];
		eDate.draw(dObj);
		
		var srcDim = getDim(srcEl);
		var cTop = (document.documentElement.clientHeight < srcDim.t + span.firstChild.offsetHeight)? srcDim.t - span.firstChild.offsetHeight : parseInt(srcDim.t) + parseInt(srcDim.h) ;
		span.style.position = 'absolute';
		span.style.top = cTop +'px';
		span.style.left = srcDim.l +'px';
        span.style.zIndex = 200;
		span.firstChild.origin = srcEl;
	},
	doClick : function() {
		var srcEl = event.srcElement;
		
		var srcTD = getParent(srcEl, 'eopt', 'cal_mday');
		if (srcEl.getAttribute('gtype') == 'cal_arrow_left' || srcEl.getAttribute('gtype') == 'cal_arrow_right') return;
		
		if (srcTD && srcTD.innerHTML != '' && $('eDate_cal')) {
			var dObj = $('eDate_cal').dObj;
			var iObj = $('eDate_cal').origin;
			$('eDate_cal').origin.value = dObj.getFullYear() +'-'+ eDate.fixInt(dObj.getMonth()+1) +'-'+ eDate.fixInt(srcTD.innerHTML);
			if (iObj.getAttribute('select_function')) {eval(iObj.getAttribute('select_function'));}
		}
		if ($('eDate_cal')) $('eDate_cal').parentNode.parentNode.removeChild($('eDate_cal').parentNode);
		if (typeof(iObj) == 'object') iObj.fireEvent('onblur');
	}
}

eDate.lng.days		= ['Måndag', 'Tisdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lördag', 'Söndag'];
eDate.lng.months	= ['Januari', 'Februari', 'Mars', 'April', 'Maj', 'Juni', 'Juli', 'Augusti', 'September', 'Oktober', 'November', 'December'];
eDate.lng.mLen		= [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
eDate.lng.dFormat 	= 'ymd';
eDate.lng.dFirst	= 1;

/*	COCKIE HANDLER	*/
var Cookie = {
	Enabled : function() {
		var cookieEnabled=(navigator.cookieEnabled)? true : false;
		if (typeof(navigator.cookieEnabled=='undefined') && !cookieEnabled) {
			document.cookie = 'testcookie';
			cookieEnabled = (document.cookie.indexOf("testcookie")!=-1)? true : false;
		}
		return cookieEnabled;
	},
	Delete : function(cName) {
		var date = new Date();
		date.setYear(date.getFullYear() - 10);
		document.cookie = cName + '=; expires=' + date.toGMTString();
	},
	Get : function(cName) {
		var aCookie = document.cookie.split('; ')
		for (var j=0; j<aCookie.length; j++) {
			bCookie = aCookie[j].split('=');
			if (bCookie[0] == cName) return unescape(bCookie[1]);
		}
	},
	Set : function(cName, cValue) {
		if (!cValue) Cookie.Delete(cName);
		var date = new Date();
		date.setYear(date.getFullYear() + 1);
		document.cookie = cName + '=' + escape(cValue) + '; expires=' + date.toGMTString();
	}
}

/*	CONTEXTMENU HANDLER	*/
var ctx = {
	init : function() {
		var mDiv = document.body.appendChild(document.createElement('DIV'));
		mDiv.id = 'ctxmenu';
		mDiv.innerHTML = '&#160;';
		
		var mI = xdbc.ledger.selectNodes('//xmenu//*');
		for (var i=0; i<mI.length; i++) {
			mI[i].setAttribute('_mId', (i+1));
		}
		document.attachEvent('onmouseover', ctx.mouse);
		document.attachEvent('onmousedown', ctx.mouse);
		document.oncontextmenu = ctx.show;
	},
	show : function() {
		var srcEl = event.srcElement;
		var ctxEl = getParent(srcEl, 'ctx');
		ctx.origin = ctxEl;
		
		if (!ctxEl) return;
		var xM = xdbc.ledger.selectSingleNode('//xmenu//*[@for="'+ ctxEl.getAttribute('ctx') +'"]');
		if (xM && xM.hasChildNodes()) {
			var rmenu = ctx.render(xM);
			rmenu.style.top = event.clientY +'px';
			rmenu.style.left = event.clientX +'px';
			document.attachEvent('onmouseup', ctx.clear);
		}
		return false;
	},
	render : function(xNode, index) {
		if (typeof(xNode) != 'object') return;
		var str = '<div class="ctx_menu" otype="ctx_menu"><div class="ctx_minner">'+
					'<table cellspacing="0" cellpadding="0" border="0">'+
					'<col class="colicon"/><col class="coltext"/><col class="colarrow"/>';
		var mItems = xNode.selectNodes('./*');
		for (var m=0; m<mItems.length; m++) {
			if (mItems[m].getAttribute('status') == 'hidden') continue;
			var type = mItems[m].getAttribute('type');
			if (type == 'divider') {
				str += '<tr class="chx_mdivider"><td colspan="3"><div>&#160;</div></td></tr>';
				continue;
			}
			var mid = mItems[m].getAttribute('_mId');
			var title = mItems[m].getAttribute('title');
			var icon = mItems[m].getAttribute('icon');
			icon = icon || '&#160;';
			var _hc = mItems[m].hasChildNodes();
			var cmenu = (_hc)? '_cmenu="'+ mid +'"' : '' ;
			str += '<tr mId="'+ mid +'" '+ cmenu +' class="chx_mitem" gtype="chx_mitem">'+
					'<td class="icon"><img src="/images/layout/_.gif"/></td><td class="text">'+ title +'</td>'+
					'<td class="arrow"><div>'+ (_hc? '&#187;' : '&#160;' ) +'</div></td></tr>';
		}
		str += '</table></div></div>';
		if (!index) {
			$('ctxmenu').innerHTML = str;
			return $('ctxmenu').firstChild;
		} else {
			var span = document.createElement('SPAN');
			span.innerHTML = str;
			return $('ctxmenu').appendChild(span);
		}
	},
	clear : function(mEl) {
		if (!mEl || typeof(mEl.outerHTML) == 'undefined') {
			$('ctxmenu').innerHTML = '&#160;';
			document.detachEvent('onmouseup', ctx.clear);
		} else {
			while (mEl.nextSibling) mEl.parentNode.removeChild(mEl.nextSibling);
		}
	},
	mouse : function() {
		var srcEl = event.srcElement;
		var srcTR = getParent(srcEl, 'gtype', 'chx_mitem');
		if (!srcTR) return;
		switch (event.type) {
			case 'mouseover':
				var pEl = getParent(srcTR, 'otype', 'ctx_menu');
				if (srcTR.getAttribute('_cmenu')) {
					var pmId = srcTR.getAttribute('mId');
					var xM = xdbc.ledger.selectSingleNode('//xmenu//*[@_mId="'+ pmId +'"]');
					if (xM) {
						ctx.clear(pEl);
						var smenu = ctx.render(xM, 1).firstChild;
						var mY = pEl.offsetTop + srcTR.offsetTop - 1;
						var mX = pEl.offsetLeft + pEl.offsetWidth - 2;
						smenu.style.top = mY +'px';
						smenu.style.left = mX +'px';
					}
				} else {
					ctx.clear(pEl);
				}
				break;
			case 'mousedown':
				var mId = srcTR.getAttribute('mId');
				var xM = xdbc.ledger.selectSingleNode('//xmenu//*[@_mId="'+ mId +'"]');
				var act = xM.getAttribute('action');
				if (act) eval(act);
				eMouse.cancelBubble();
				break;
		}
	}
}

/*	XDBC	*/
var xdbc = {
	debug		: false,
	escStr		: ['"=$34;', '\'=$39;', '<=$60;', '>=$62;'],
	xslPath		: '',
	xslt		: function($xslId)	{return xdbc.ledger.selectSingleNode('//_doc[@title=\'doctype\']/*[@id='+ $xslId +']').getAttribute('data');},
	createNode	: function(name)	{return !env.xhr? xdbc.que.createNode(1, name, '') : xdbc.que.createElement(name);},
	flushQue	: function()		{while (xdbc.que.documentElement.firstChild) xdbc.que.documentElement.removeChild(xdbc.que.documentElement.firstChild);},
	cmd			: function($cmdId)	{return xdbc.ledger.selectSingleNode('//*[@_cmdId=\''+ $cmdId +'\']').cloneNode(false);},
    activeModule: '',
    moduleArguments: { },
    
    self_init: function () {
        xdbc.path = '/index.php?get=xmlapi';
        xdbc.ledger = xdbc.load('/?get=gui&action=ledger');
        xdbc.debug = false;
    },
	uniqId : function (l) {
		var l = l || 16;
		var a = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-1234567890';
		var s = a.charAt((Math.random()*50));
		var d = new Date().valueOf();
		var k = Math.random().toString().slice(2);
		for (var r=0; r<l; r++) s += a.charAt((Math.random()*256)%a.length);
		return s.slice(0,l);
	},
	init : function() {
		xdbc.prefix();
		xdbc.xslDoc = new Array();
		xdbc.que = xdbc.load('<data xmlns:sys="http://www.easyinteraction.se/sys" xmlns:docs="http://www.easyinteraction.se/docs"/>');
	},
	/**
	 * Started from v4_gui.tpl.html body onload="site.load()"
	 *
	 */
	load : function(xSrc, xCallback) {
		if (xSrc.slice(-3) == '.js') {
			var scrEl = (env.ie)? document.scripts[0].cloneNode(true) : document.createElement('SCRIPT');
			scrEl.src = xSrc+'?'+xdbc.uniqId();
			document.body.appendChild(scrEl);
			return;
		}
		if (xSrc.indexOf('<') > -1) {
			
			if (env.ax) {
				var xDom = new ActiveXObject(xdbc.otype['DomDocument']);
				if (xDom.loadXML(xSrc)) return xDom;
			} else {
				var xDom = new DOMParser().parseFromString(xSrc, 'text/xml');
				if (xDom.firstChild.nodeName != 'parsererror') {
				    return xDom;
				}
			}
		} else {
			if ($('iProgress')) $('iProgress').style.display = 'block';
			
			var xhr = {
				src		 : xSrc,
				callback : (typeof(xCallback) == 'function')? xCallback : null,
				async	 : (typeof(xCallback) != 'undefined'),
				http	 : env.ax? new ActiveXObject(xdbc.otype['XmlHttp']) : new XMLHttpRequest()
			};
			var dlm = (xSrc.indexOf('?') > -1)? '&' : '?' ;
			xhr.http.open('GET', xSrc + dlm  + xdbc.uniqId(), xhr.async);
			xhr.http.send('');
			
			if (xhr.async) {
				if (xhr.http.readyState == 4) {
					if ($('iProgress')) $('iProgress').style.display = 'none';
					xhr.dom = xdbc.ctrlXml(xdbc.load(xhr.http.responseText), xhr.src);
					if (xhr.callback) xhr.callback(xhr.dom);
					return xhr;
				} else {
					xhr.http.onreadystatechange = function() {
						if (xhr.http.readyState != 4) return;
						if ($('iProgress')) $('iProgress').style.display = 'none';
						var resp = (xhr.http.responseXML && xhr.http.responseXML.xml)? xhr.http.responseXML : xhr.http.responseText ;
						xhr.dom = xdbc.ctrlXml(resp, xhr.src);
						if (xhr.callback) xhr.callback(xhr.dom);
					}
					return xhr;
				}
			} else {
				if ($('iProgress')) $('iProgress').style.display = 'none';
				return xdbc.ctrlXml(xdbc.load(xhr.http.responseText), xhr.src);
			}
		}
	},
	ctrlXml : function(xObj, xSrc) {
		var xSrc = xSrc || '';
		if ( !env.ie && xObj == null || (xObj.xml && xObj.xml.indexOf('<parsererror') > 0) ) 
            xObj = false;
		return (typeof(xObj) == 'object' && xObj.xml != '')? xObj : xdbc.doError('Invalid XML structure:\n'+ xSrc);
	},
	prefix : function() {
		xdbc.otype = new Array();
		var t = ['DomDocument', 'XmlHttp'];
		var b = ['Microsoft', 'MSXML', 'MSXML2', 'MSXML3'];
		for (var n=0; n<t.length; n++) {
			for (var p=0; p<b.length; p++) {
				try {

					if( env.ax )
                        new ActiveXObject(b[p] +'.'+ t[0]);
					xdbc.otype[t[n]] = b[p] +'.'+ t[n];
				}
				catch (e) {/* REPORT TO DOERROR? */}
			}
		}
	},
	xml2str : function(xDom) {
		if (xDom.xml) return xDom.xml;
		else return (new XMLSerializer()).serializeToString(xDom);
	},
	xslRam : function($src, $callback) {
        //if (1>2) return xdbc.xslDoc[$src];
		if (xdbc.xslDoc[$src]) 
            return xdbc.xslDoc[$src];
		else {
			var callback = $callback || true;
			var xsl_url = xdbc.xslPath + $src;
			xsl_url = (xsl_url.indexOf('.xsl') > -1)? xsl_url : xsl_url +'.xsl' ;
			xdbc.xslDoc[$src] = xdbc.load(xsl_url, callback);
			return xdbc.xslDoc[$src];
		}
	},
	htmlChar : function(sFrag) {
		sFrag = sFrag.replace(/<\?xml.+?\?>/i, '');
		sFrag = sFrag.replace(/&amp;/ig, '&');
		sFrag = sFrag.replace(/&lt;/ig, '<');
		sFrag = sFrag.replace(/&gt;/ig, '>');
		return sFrag;
	},
	transform : function($xml, $xsl, $el, $callback) {
		if ($('iProgress')) $('iProgress').style.display = 'block';
		if (typeof($xml) == 'string') $xml = xdbc.load($xml, true);
		if (typeof($xsl) == 'string') $xsl = xdbc.xslRam($xsl);
		if (!$xml.dom && $xml.documentElement || $xml.xml) $xml = {dom:$xml}
		if (!$xsl.dom && $xsl.documentElement) $xsl = {dom:$xsl}
		if (!$xml.dom || !$xsl.dom) {
			setTimeout(function() {
				xdbc.transform($xml, $xsl, $el, $callback);
			}, 500);
			return;
		}
		if ($('iProgress')) $('iProgress').style.display = 'none';
		xdbc.transform.recentXML = $xml.dom;
		$el = $($el);
		if (env.ax) {
			var frg = $xml.dom.transformNode($xsl.dom.documentElement);
			if (typeof($el) == 'function') {
                $el(xdbc.htmlChar(frg));
			}else{
                $el.innerHTML = '';
                $el.innerHTML = xdbc.htmlChar(frg);
            }
		} else {
			var xslPrc = new XSLTProcessor();
			xslPrc.importStylesheet($xsl.dom);
			var frg = xdbc.htmlChar(xslPrc.transformToFragment($xml.dom, document).xml);

			if (typeof($el) == 'function') $el(frg);
			else {
				var rng = $el.ownerDocument.createRange();
				rng.setStartBefore($el);
				while ($el.firstChild) $el.removeChild($el.firstChild);
				$el.appendChild(rng.createContextualFragment(frg));
				
				/*	SAFARI FIX	*/
				if (env.sf) {
					var s = getChildren($el, 'nodeName', 'SCRIPT');
					for (var i=0; i<s.length; i++) {
						var c = s[i].innerText.replace(/\n/g, '\n').replace(/\t\/\/.*\n/g, '\t\n');
						var scr = document.createElement('script');
						scr.type = 'text/javascript';
						scr.defer = true;
						scr.innerText = c;
						s[i].parentNode.replaceChild(scr, s[i]);
					}
				}
			}
		}
		if ($callback) {
			var $cb_param = ($callback.indexOf('(') > -1)? '' : '(xdbc.transform.recentXML);';
			try {eval($callback + $cb_param);}
			catch (e) {/* REPORT TO DOERROR? */};
		}
		$xml = $xsl = null;
	},
	escape : function($iStr) {
		for (var $e=0; $e<xdbc.escStr.length; $e++) 
			$iStr = $iStr.replace(new RegExp(xdbc.escStr[$e].slice(0,1), 'g'), xdbc.escStr[$e].slice(2));
		return $iStr;
	},
	unescape : function(xml) {
		var xAll = xml.selectNodes('//*');
		for (var x=0; x<xAll.length; x++) {
			if (!xAll[x].attributes) continue;
			for (var a=0; a<xAll[x].attributes.length; a++) {
				xVal = unescape(xAll[x].attributes.item(a).value);
				xAll[x].attributes.item(a).value = xVal;
			}
		}
	},
	normalize : function(str) {
		str = escape(str);
		str = str.replace(/%20/ig, ' ');
		str = str.replace(/%3A/ig, ':');
		return str;
	},
	prepQue : function() {
		var qAll = xdbc.que.selectNodes('//*');
		for (var x=0; x<qAll.length; x++) {
			for (var a=0; a<qAll[x].attributes.length; a++) {
				var qNodeVal = qAll[x].attributes.item(a).value;
				qAll[x].attributes.item(a).value = (qAll[x].attributes.item(a).name.slice(0,1) == '_')?
													xdbc.escape(qNodeVal) : xdbc.normalize(qNodeVal);
			}
		}
	},
	addQue : function($pNode) {
		if (typeof($pNode) != 'object') return;
		var $pNode = $pNode.cloneNode(false);
		var $nAttr = $pNode.getAttribute('_selby');
		if ($nAttr) {
			for (var $a=1; $a<arguments.length; $a++) $nAttr = $nAttr.replace(new RegExp('\\$prm'+ ($a), 'g'), arguments[$a]);
			$pNode.setAttribute('_selby', $nAttr);
		}
		if (xdbc.token) $pNode.setAttribute('_token', xdbc.token);
		return xdbc.que.documentElement.appendChild($pNode);
	},
	doError : function(xhr) {
		if (typeof(xhr) == 'object') {
			if (xhr.xml) xhr = {dom:xhr}
			with (xhr.dom.firstChild) {
				var code = getAttribute('code');
				var desc = getAttribute('description');
				var text = text;
			}
			xdbc.recentError = 'ERROR ['+ code +']: ';
			xdbc.recentError += desc +'\n-------\n';
			xdbc.recentError += text +'\n-------';
		} else {
			xdbc.recentError = '\n-------\n'+ xhr.replace(/>/g, '>\n') 
			xdbc.recentError +='\n-------';
		}
		if (xdbc.debug) return alert(xdbc.recentError);
		if (typeof(xhr.callback) == 'function') xhr.callback();
	},
	exec : function() {
        if ($('iProgress')) $('iProgress').style.display = 'block';
		if (!xdbc.que.documentElement.childNodes.length)  {
            return (typeof(arguments[0]) == 'function')? arguments[0]() : '';
        }
        //xdbc.prepQue();
		var xhr = {
			src		 : xdbc.path,
			callback : (typeof(arguments[0]) == 'function')? arguments[0] : null,
			async	 : (typeof(arguments[0]) == 'function' || typeof(arguments[0]) == 'boolean'),
			http	 : (env.ax? new ActiveXObject(xdbc.otype['XmlHttp']) : new XMLHttpRequest())
		};
        
		xhr.http.open('POST', xdbc.path, xhr.async);
		xhr.http.send(xdbc.que);
		xdbc.flushQue();
		if (xhr.async) {
			xhr.http.onreadystatechange = function() {
				if (xhr.http.readyState != 4) return;
				if ($('iProgress')) $('iProgress').style.display = 'none';				
				try {
					xhr.dom = xdbc.ctrlXml(xhr.http.responseXML.documentElement, xhr.src);
				} catch (e) {/*return alert('error:'+xhr.http.responseText);*/}
				if (!xhr.dom) return xdbc.doError(xhr.http.responseText);
				else if (xhr.dom.hasChildNodes() && xhr.dom.firstChild.nodeName == 'error') return xdbc.doError(xhr);
				//xdbc.unescape(xhr.dom);
				if (xhr.callback) {
                    if( site && site.check_session_status )
                        site.update_session_status(xhr.dom);
                    xhr.callback(xhr.dom);
				}
			}
			return xhr;
		}
		if ($('iProgress')) $('iProgress').style.display = 'none';
		try {
			xhr.dom = xdbc.ctrlXml(xhr.http.responseXML.documentElement, xhr.src);
		} catch (e) { if (xdbc.debug) return alert(xhr.http.responseText); }
		
		if (!xhr.dom) return xdbc.doError(xhr.http.responseText);
		else if (xhr.dom.hasChildNodes && xhr.dom.firstChild.nodeName == 'error') return xdbc.doError(xhr.dom);
		else {
			//xdbc.unescape(xhr.dom);
            if( typeof(site)=='object' ) {
                if( site.check_session_status ) {
                    site.update_session_status(xhr.dom);
                }
            }else if( typeof(parent.site)=='object' ) {
                if( parent.site.check_session_status ) {
                    parent.site.update_session_status(xhr.dom);
                }
            }
            
			return xhr.dom;
		}
	},
    initModule: function () {

        if( arguments.length<2 ) {
            return false;
        }
        
        var srcEl = event.srcElement;
        var eModule = arguments[0];
        var ePackage = arguments[1];
        if( eModule==ePackage )
            var packageName = ePackage;
        else
            var packageName = eModule+'_'+ePackage;
        var moduleId = 'moduleContainer_'+eModule+'_'+ePackage;
        xdbc.moduleArguments = arguments;
        xdbc.activeModule = eModule;
        xdbc.activePackage = ePackage;

        if( !$(moduleId) ) {        
            var span = document.createElement('SPAN');
            span.setAttribute('id', moduleId);
            getParent(srcEl, 'nodeName', 'BODY').appendChild(span);
    
            var xMod = xdbc.load('<data><'+ packageName +'/></data>');
            xdbc.transform(xMod, '/?get=gui&action=xsl_module&module='+eModule+'&package='+ePackage+'&package.xsl', span, 'xdbc.activateModule');
        }else{
            xdbc.activateModule();
        }
    },
    activateModule: function () {
        var eModule = xdbc.activeModule;
        var ePackage = xdbc.activePackage;        
        var  arguments = xdbc.moduleArguments;
        
        try {
            eval(ePackage+'.init();');
        }catch(e) {

        }
        
        for( var i = 2; i<arguments.length; i++ ) {
            eval(arguments[i]);
        }
    
    
    }
}

function emailLink(el) {
    var email = el.getAttribute('href').replace('mailto:', '');
    if( parent.site && email!="" ) {
        parent.site.switch_tab('email',true);
        parent.site.open_url('/?get=webmail&target=compose&to='+escape(email), 'email', 2);        
        return false;
    }
    return true;
}

xdbc.init();

/**/
if (!env.sf) {
	window.attachEvent('onload', eMouse.init);
	if (typeof(layout.win.pos_load) == 'function') {
		window.attachEvent('onload', layout.win.pos_load);
		window.attachEvent('onunload', layout.win.pos_save);
	}
}

function EasyV4Gui(toolbar_string) {
	
	if( toolbar_string && parent.site ) {
		parent.layout.update_toolbar(toolbar_string);
		parent.site.set_iframe_document(document);
		parent.site.update_session();
		return false;
	}	

	if( parent.location==document.location ) {
	    var d = new Date();
	    url = new String(document.location);
	    if( url.indexOf('/index.php') ) {
	        redirect_to = url.substring(url.indexOf('/index.php'), url.length);
	        document.location = '/index.php?get=gui&redirect='+escape(redirect_to)+'&'+d.getTime();
	    }else{
	        document.location = '/index.php?get=gui&'+d.getTime();
	    }
	    return true;
	}
}

function removeEasyV4Gui() {
	if( parent.site && parent.location!=document.location ) {
		window.top.location = document.location;
		return true;
	}
	return false;
}

/* Function to set display to whatever on whatever div */
function flipLayer(div, visibility){
	var el = $(div);
	return el.style.display = visibility;	
}

