/*****************************************************************/
/* CMFLAT Version 1.3 - Javascript Frontend Functions            */
/* Copyright 2011 by Matthias Kleiser, CPKI GbR <info@cpki.de>   */
/*                                                               */
/* NO UNAUTHORIZED USE! DO NOT REMOVE THIS COPYRIGHT NOTICE!     */
/*****************************************************************/


//++++++++++++++++++++++++++
//	mouse tracker
//++++++++++++++++++++++++++
var mouseX = -1;
var mouseY = -1;
function cm_trackMouse() {
	document.addEvent('mousemove', function(event) {
		if (event.page && event.page.x) {
			mouseX = event.page.x;
			mouseY = event.page.y;
		}
		else {
			mouseX = event.clientX + document.body.scrollLeft - document.body.clientLeft;
			mouseY = event.clientY + document.body.scrollTop  - document.body.clientTop;
		}
	});
}
cm_trackMouse();

//++++++++++++++++++++++++++
//	positioning
//++++++++++++++++++++++++++
function getBody(w) {
	if (!w) w = document;
	else w = w.document;
    return (w.compatMode && w.compatMode == "CSS1Compat") ? w.documentElement : w.body || null;
}

function getDocSize() {
    var obj = new Object();
	var doc = getBody();
   	obj.x = Math.max( doc.scrollWidth, doc.offsetWidth, doc.clientWidth );
   	obj.y = Math.max( doc.scrollHeight, doc.offsetHeight, doc.clientHeight );
   	return obj;
}

function getWindowSize() {
    var obj = new Object();
	if (document.all) {
		var win = getBody(window);
		obj.x = win.clientWidth;
		obj.y = win.clientHeight;
	}
	else {
		obj.x = window.innerWidth;
		obj.y = window.innerHeight;	
	}
	return obj;
}

function getScrollPos() {
    var obj = new Object();
	if (document.all) {
		var win = getBody(window);
		obj.x = win.scrollLeft;
		obj.y = win.scrollTop;
	}
	else {
		obj.x = window.pageXOffset;
		obj.y = window.pageYOffset;	
	}
	return obj;
}

function getPosition(e) {
	x = e.offsetLeft;
	y = e.offsetTop;
    var obj = new Object();
	parentObj = e.offsetParent;
	while(parentObj != null) {
		x += parentObj.offsetLeft;
		y += parentObj.offsetTop;
		parentObj = parentObj.offsetParent;
	}
	obj.x = x;
	obj.y = y;
	return obj;
}

function showTip(e, text) {
    var pos = new Object();
    pos = getPosition(e);
    var tip = document.getElementById('tip');
    tip.innerHTML = base64_decode(text);
	tip.setStyles({
		'top': pos.y,
		'left': pos.x,
		'display': 'block'
	});	
}

function hideTip() {
    var tip = document.getElementById('tip');
	if (!e) var e = window.event;
	var tg = (window.event) ? e.srcElement : e.target;
	if (tg.nodeName!='DIV') return;
	var reltg = (e.relatedTarget) ? e.relatedTarget : e.toElement;
	while (reltg != tg && reltg.nodeName != 'BODY')
		reltg = reltg.parentNode;
	if (reltg==tg) return;
    tip.innerHTML = '';
	tip.style = '';	
}

//++++++++++++++++++++++++++
//	styles
//++++++++++++++++++++++++++

function has_class (el, classname) {
  return(
	 (" " + (el.className || '') + " ").indexOf(classname) >= 0
  );
}

function add_class (el, newclass) {
  var classes = (el.className || '').split(" ");
  classes.push(newclass);
  el.className = classes.join(" ");
  return el;
}

function remove_class (el, endclass) {
  if(!el.className) return el;
  var classes = el.className.split(" ");
  for(var i = 0; i < classes.length; i++) {
    if(classes[i] == endclass) classes[i] = '';
  }
  el.className = classes.join(" ");
  return el;
}


function cm_hilite(e, hiliteClass) {
	add_class(e, hiliteClass);
}

function cm_lowlite(e, hiliteClass) {
	remove_class (e, hiliteClass);
}

//++++++++++++++++++++++++++
//	layer functions
//++++++++++++++++++++++++++
function cm_showLayer(layer, duration) {
	if (layer.getAttribute('showHideActive')=='1')
		return false;
	if (layer.getStyle('display')!='none')
		return false;
	layer.setAttribute('showHideActive', '1');
	layer.setStyles({
		'display': 'block',
		'opacity': 0.01
	});
	var realOverflow = layer.getStyle('overflow');
	var realHeight = layer.getSize().y;
	layer.setStyles({
		'overflow': 'hidden',
		'height': '1px',
		'opacity': 0
	});
	var fx = new Fx.Morph(layer, {duration: duration, wait: false});
	fx.start({
		'height': realHeight+'px',
		'opacity': 1
	}).chain(function(){
		layer.setStyles({
			'overflow': realOverflow,
			'height': 'auto',//realHeight+'px',
			'opacity': 1
		});
		layer.setAttribute('showHideActive', '0');
		this.start();
	});
	return true;
}

function cm_hideLayer(layer, duration) {
	if (layer.getAttribute('showHideActive')=='1')
		return false;
	if (layer.getStyle('display')=='none')
		return false;
	layer.setAttribute('showHideActive', '1');
	var realOverflow = layer.getStyle('overflow');
	var realHeight = layer.getSize().y;
	layer.setStyle('overflow', 'hidden');
	layer.setStyle('height', realHeight+'px');
	var fx = new Fx.Morph(layer, {duration: duration, wait: false});
	fx.start( {
		'height': '1px',
		'opacity': 0
	} ).chain(function(){
		layer.setStyles({
			'display': 'none'
		});
		this.start();
	}).chain(function(){
		layer.setStyles({
			'opacity': 1,
			'visibility': 'visible',
			'overflow': realOverflow,
			'height': realHeight+'px'
		});
		layer.setAttribute('showHideActive', '0');
		this.start();
	});
	return true;
}

function cm_toggleLayer(layer, duration) {
	var l=$(layer); 
	if (l.getStyle('display')=='none')
		cm_showLayer(l, duration);
	else
		cm_hideLayer(l, duration);
}
function cm_exclusiveToggleLayer(elem, cl, duration) {
	$$('.'+cl).each(function(item) {
		cm_hideLayer(item, duration);
		if (item.id==elem)
			cm_showLayer(item, duration);
	});
}

function cm_toggleDisplay(elem) {
	var e = $(elem);
	if (e.getStyle('display')=='none')
		e.setStyle('display', 'block');
	else
		e.setStyle('display', 'none');
}
function cm_toggleDisplayByCheckbox(cbox, elem) {
	var e = $(elem);
	if ($(cbox).checked==true)
		e.setStyle('display', 'block');
	else
		e.setStyle('display', 'none');
}

function cm_exclusiveToggleDisplay(elem, cl) {
	$$('.'+cl).each(function(item) {
		item.setStyle('display', 'none');
		if (item.id==elem)
			item.setStyle('display', 'block');
	});
}


function cm_toggleLayerWithCookie(layer, duration) {
	var l=$(layer); 
	if (l.getStyle('display')=='none') {
		cm_showLayer(l, duration);
		Cookie.write(layer, 'opened');
	}
	else {
		cm_hideLayer(l, duration);
		Cookie.write(layer, 'closed');
	}
}
function cm_toggleLayerWithIcon(img, elemid, imgopen, imgclosed, duration) {
	var el=$(elemid);
	if (el.getStyle('display')=='none') {
		cm_showLayer(el, duration);
		img.setProperty('src', imgopen);
		Cookie.write(elemid, 'opened');
	} 
	else {
		cm_hideLayer(el, duration);
		img.setProperty('src', imgclosed);
		Cookie.write(elemid, 'closed');	
	}
}

function cm_toggleWidth(el, min, max) {
	var elem = $(el);
	if (elem.getSize().x>(max+min)*0.5) { 
		elem.setStyle('width', min+'px');
	}
	else {
		elem.setStyle('width', max+'px');
	}
}
function cm_toggleHeight(el, min, max) {
	var elem = $(el);
	if (elem.getSize().y>(max+min)*0.5) { 
		elem.setStyle('height', min+'px');
	}
	else {
		elem.setStyle('height', max+'px');
	}
}
function cm_exclusiveToggleWidth(el, cl, min, max) {
	var elem = $(el);
	if (elem.getSize().x>(max+min)*0.5) {
		elem.setStyle('width', min+'px');
	}
	else {
		$$('.'+cl).each(function(item) {
			item.setStyle('width', min+'px')
		});
		elem.setStyle('width', max+'px');	
	}
}
function cm_exclusiveToggleHeight(el, cl, min, max) {
	var elem = $(el);
	if (elem.getSize().y>(max+min)*0.5) {
		elem.setStyle('height', min+'px');
	}
	else {
		$$('.'+cl).each(function(item) {
			item.setStyle('height', min+'px')
		});
		elem.setStyle('height', max+'px');	
	}
}

function cm_toggleAttrSelection(el, cl, ident, on, handle, coo) {

	if (has_class(el, handle + 'Active'))
		return;
	if (on=='none') {
		$$('.' + cl + '_' + ident).each(function(item) {
			item.setStyle('display', 'none');
		});
	}
	else if (on=='all') {
		$$('.' + cl + '_' + ident).each(function(item) {
			item.setStyle('display', 'block');
		});
	}
	else {
		$$('.' + cl + '_' + ident).each(function(item) {
			if (has_class(item, cl + '_' + ident + '_' + on))
				item.setStyle('display', 'block');
			else
				item.setStyle('display', 'none');
		});
	}
	$$('.' + handle + '_' + ident).each(function(item) {
		remove_class(item, handle + 'Active');
	});
	add_class(el, handle + 'Active');
	if (coo)
		Cookie.write(coo + '_' + ident, on);
}

//++++++++++++++++++++++++++
//	zoom images
//++++++++++++++++++++++++++
function zoomImg(url, e) {
	var tgt = url+'&zoom=img&src='+escape(e);
	cm_ajaxOverlayBoxLoader(tgt, '50% 50%');
}


//++++++++++++++++++++++++++
//	gallery functions
//++++++++++++++++++++++++++
var gallery = new Array();
function cm_initGallery(n, source, alt, title, desc, thumb) {
	gallery[n] = new Object();
	gallery[n]['source']=base64_decode(source).replace("'", "`");
	gallery[n]['alt']=base64_decode(alt).replace("'", "`");
	gallery[n]['title']=base64_decode(title).replace("'", "`");
	gallery[n]['desc']=base64_decode(desc).replace("'", "`");
	gallery[n]['thumb']=base64_decode(thumb).replace("'", "`");
}
function cm_toggleGallery(mode, id, n) {

	if (mode=='foto') {
		$(id + '_foto').innerHTML = '<img src=\"'+gallery[n]['source']+'\" alt=\"'+gallery[n]['alt']+'\" title=\"'+gallery[n]['title']+'\" />';
	}
	if (mode=='video') {
		$(id + '_video').innerHTML = ((gallery[n]['source']!='') ? gallery[n]['source'] : gallery[n]['alt']);
	}
	$(id + '_title').innerHTML = gallery[n]['title'];
	$(id + '_desc').innerHTML = gallery[n]['desc'];
	
	// set thumb active class
	var n_alt = parseInt(document.getElementById(id + '_actBrowse').innerHTML);
	remove_class($(id+'_thumb_'+n_alt), 'activeThumb');
	add_class($(id+'_thumb_'+n), 'activeThumb');
	$(id + '_actBrowse').innerHTML = n;
}

function cm_browseGallery(mode, id, dir) {
	var n = parseInt($(id + '_actBrowse').innerHTML);
	var m = parseInt($(id + '_maxBrowse').innerHTML);
	if (dir=='prev') {
		n = n-1<1 ? m : n-1;
	} 
	else {
		n = n+1>m ? 1 : n+1;
	}
	if (mode=='foto')
		cm_toggleGallery('foto', id, n);
	if (mode=='video')
		cm_toggleGallery('video', id, n);
}

//++++++++++++++++++++++++++
//	tab functions
//++++++++++++++++++++++++++
function cm_showTab(tabId, n, c, mode) {
	$$('.'+tabId+'_tabContent').each(function(item){
		item.setStyle('display', 'none');
	});
	if (n!='')
		$(tabId+'_tabContent_'+n).setStyle('display', 'block');
	$$('.'+tabId+'_tabHandleActive').each(function(item){
		item.removeClass(tabId+'_tabHandleActive');
		item.removeClass(c+'Active');
	});
	if (n!='') {
		cm_hilite($(tabId+'_tabHandle_'+n), tabId+'_tabHandleActive '+c+'Active');
		Cookie.write(tabId+'_openTab', n);
	}
	if (mode!='') {
		$(tabId+'_mode').value = mode;
	}
}

//++++++++++++++++++++++++++
//	menu functions
//++++++++++++++++++++++++++
var cm_menuFlag="0";
function cm_hideMenuOrNot(a) {
	if (cm_menuFlag!=a) {
		var ul = $(a);
		ul.style.display="none";
	}
}
function cm_hideMenu(a, duration) {
	cm_menuFlag="";
	if (duration>0) {
		setTimeout("cm_hideMenuOrNot('" + a + "')", duration);
	}
	else {
		var ul = $(a);
		ul.style.display="none";		
	}
}
function cm_showMenu(a) {
	var ul = $(a);
	cm_menuFlag=a;
	ul.style.display="block";
}


function cm_toggleMenu(a, cid, duration) {
	var ul = $(a);
	if (ul.getStyle('display')=='none') {
		cm_showLayer(ul, duration);
		Cookie.write('menuState_'+cid, 'open');
	}
	else {
		cm_hideLayer(ul, duration);
		Cookie.write('menuState_'+cid, 'close');
	}
}

function cm_toggleMenuWithIcon(a, cid, img, imgopen, imgclosed, duration) {
	var ul = $(a);
	if (ul.getStyle('display')=='none') {
		cm_showLayer(ul, duration);
		img.setProperty('src', imgopen);
		Cookie.write('menuState_'+cid, 'open');
	}
	else {
		cm_hideLayer(ul, duration);
		img.setProperty('src', imgclosed);
		Cookie.write('menuState_'+cid, 'close');
	}
}

		
		
		
function cm_setLinkElement (url, el) {
	$(el).setStyle('cursor', 'pointer');
    $(el).addEvent('click', function(){
		window.location = url; 
    });
}


//++++++++++++++++++++++++++
//	tree functions
//++++++++++++++++++++++++++
function cm_stopPropagation(e) {
	if (!e) var e = window.event;
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
}

function cm_toggleTreeElement(event, treeId, elementId, childsId, switchId, openIcon, closeIcon, bgImg, duration) {
	cm_stopPropagation(event);
	if ($(childsId).style.display!="none") {
		cm_hideLayer($(childsId), duration);
		$(switchId).src = openIcon;
		$('treeIcon_' + treeId + '_' + elementId).setStyle('background-image', 'none');
		Cookie.write("treeStatus_"+treeId+'_'+elementId, 'close', {path: '/cmdev/adminarea/'});
	}
	else {
		cm_showLayer($(childsId), duration);
		$(switchId).src = closeIcon;
		$('treeIcon_' + treeId + '_' + elementId).setStyle('background-image', 'url('+ bgImg + ')');
		Cookie.write("treeStatus_"+treeId+'_'+elementId, 'open');
	}
}

//++++++++++++++++++++++++++
//	form functions
//++++++++++++++++++++++++++

function cm_checkboxAll(elem, classid) {
	if (elem.checked==true){ 
		$$('.'+classid).each(function(item) {
			item.checked = true;
		});
	}
	else {
		$$('.'+classid).each(function(item) {
			item.checked = false;
		});
	}
}

function cm_enumAll(elem, classid) {
	var id = elem.value;
	$$('.'+classid).each(function(item) {
		if (item.id!=elem.id) {
			for (var i=0; i<=item.length-1; i=i+1) {
				if (id == item.options[i].value) {
					item.options[i].selected = true;
					item.selectedIndex = i;
				}
			}
		}
	});
}


//****************************************************************
// form array handlers
//****************************************************************
function cm_reduceFormArrayEntry(e, msg) {
	if (confirm(msg))
		$(e).destroy();
}

function cm_cloneFormArrayEntry(id) {
	var c = $('arrayCount_' + id).value;
	$('arrayEntry_' + id + c).setStyle('display', '');
	$('arrayCount_' + id).value = parseInt(c)+1;
}



//++++++++++++++++++++++++++
//	INSTANT FORM VALIDATION
//++++++++++++++++++++++++++
var cm_exclusiveInstantForm = 'off';
function cm_openInstantForm(url, suffix, ident) {
 	
	if (cm_exclusiveInstantForm != 'off') {
		cm_closeInstantForm();
	}
	cm_exclusiveInstantForm = ident;
	$('instantContent_' + ident).setStyle('display', 'none');
	cm_ajaxSimpleLoader(url + '&instant=showForm&' + suffix + '&ident=' + ident, 'instantForm_' + ident, '');

}

function cm_closeInstantForm() {
	$('instantForm_' + cm_exclusiveInstantForm).set('html', '');
	$('instantContent_' + cm_exclusiveInstantForm).setStyle('display', '');
	cm_exclusiveInstantForm = 'off';
}

function cm_validateInstantForm(url, suffix, ident, fld) {
	if (ident!=cm_exclusiveInstantForm) {
		alert('ERROR in cm_validateInstantForm: bad ident.' + ident + ':' + cm_exclusiveInstantForm);
	}
	else {
		var fldvalue = document.forms["mikroForm"].elements[fld].value;
		var datastring = fld+"="+fldvalue;
		new Request({
			url: url + '&instant=validateForm&' + suffix + '&ident=' + ident,
			method: 'post',
			data: datastring,
			onSuccess: function(text, xml) {
				if (text=="_CM_FORM_VALID_") {
					document.forms["mikroForm"].submit();
				}
				else {
					$('instantForm_' + ident).set('html', text);
				}
			}
		 }).send();
	}
}



//++++++++++++++++++++++++++
//	cookie and reload
//++++++++++++++++++++++++++
function cm_setCookie(name, value) {
	Cookie.write(name, value);
}

function cm_setCookieAndLoad(name, value, url) {
	Cookie.write(name, value);
	window.location = url; 
}

function cm_setContentFilter(cid) {
	var mask = 'contentFilter_' + cid + '_rs_';
	var filter = '';
	$$('.contentFilter_' + cid).each(function(item) {
		if (item.value!='') {
			var fld = item.id.substr(mask.length);
			var txt = item.value;
			filter += "[" + fld + "]" + "=[" + txt + "]";
		}
	});
	Cookie.write('contentFilter_' + cid, filter);
}

function cm_resetContentFilter(cid, fld) {
	$('contentFilter_' + cid + '_rs_' + fld).value = '';
	cm_setContentFilter(cid);
}

function cm_setContentFilterURL(cid, url) {
	var mask = 'contentFilter_' + cid + '_rs_';
	var filter = '';
	$$('.contentFilter_' + cid).each(function(item) {
		if (item.value!='') {
			var fld = item.id.substr(mask.length);
			var txt = item.value;
			filter += escape("[" + fld + "]" + "=[" + txt + "]");
		}
	});
	window.location = url + ((filter!='') ? '&filter_' + cid + '=' + filter : '');
}

function cm_resetContentFilterURL(cid, fld, url) {
	$('contentFilter_' + cid + '_rs_' + fld).value = '';
	cm_setContentFilterURL(cid, url);
}

function cm_confirmAction(msg, url) {
	if (confirm(msg)) window.location = url;
}

function cm_setSelectionAndLoad(type, name, elem, url) {
	var k = elem.selectedIndex;
	var value = elem.options[k].value;
	if (type=='cookie') {
		Cookie.write(name, value);
	}
	if (type=='get') {
		url = url + '&' + name + '=' + value;
	}
	window.location = url; 
}

//++++++++++++++++++++++++++
// ajax loaders
//++++++++++++++++++++++++++
/* JUST LOAD */
function cm_ajaxSimpleLoader(url, target, args) {
	new Request({
		url: url,
		method: 'get',
		onSuccess: function(text, xml) {
			$(target).set('html', text);
		}
	 }).send();
}

//++++++++++++++++++++++++++
//	OVERLAY
//++++++++++++++++++++++++++
var cm_oBoxCounter = 0;
function cm_validateOverlayAction(url, formid) {
	var datastring = '';
	var skipfields = new Array();
	for (var i=0; i<document.forms[formid].elements.length; i++) {
		var type = document.forms[formid].elements[i].type;
		var name = document.forms[formid].elements[i].name;
		var value = '';
		if (type=='checkbox') {
			if (document.forms[formid].elements[name].checked==true)
				value = document.forms[formid].elements[name].value;
		}
		else if (type=='select' || type=='select-one') {
			var k = document.forms[formid].elements[name].selectedIndex;
			value = document.forms[formid].elements[name].options[k].value;
		}
		else if (type=='radio') {
			if (skipfields[name]===true) continue;
			skipfields[name]=true;
			var r = document.forms[formid].elements[name];
			for (var k=0; k<r.length; k++) {
				if (r[k].checked==true) 
					value = r[k].value;
			}	
		}
		else if (type=='button') {
			continue;
		}
		else {
			value = document.forms[formid].elements[name].value;
		}		
		datastring += (datastring==''?'':'&') + escape(name) + '=' + escape(value); 		
	}
	new Request({
		url: url,
		method: 'post',
		data: datastring,
		onSuccess: function(text, xml) { 
			if (text=="_CM_FORM_VALID_") {
				document.forms[formid].submit();
			}
			else {
				$('overlay-content'+cm_oBoxCounter).set('html', text);
			}
		}
	 }).send();
}

function cm_ajaxOverlayBoxLoader(url, args) {// args: top, left, class
	var a = args.split(' ');
	cm_oBoxCounter += 1;
	if ($('overlay-bgbox'+cm_oBoxCounter)!=null) return false;
	
	var layerElement  = new Element('div', {
		'id': 'overlay-bgbox'+cm_oBoxCounter,
		'class' : 'overlay-bg'
	});
	var docSize = getDocSize();
	layerElement.inject($(document.body));
	layerElement.setStyles({
			'z-index': '65555',
			'position': 'absolute',
			'top': '0px',
			'left': '0px', 
			'width': docSize.x+'px', 
			'height': docSize.y+'px'
		}		
	);
	var contentElement  = new Element('div', {
		'id': 'overlay-content'+cm_oBoxCounter,
		'class': a[2]
	});
	contentElement.inject($(document.body));
	var pos = makePosition(a[0], a[1]);
	var postpos = false;
	if (a[0].indexOf('%')>0 || a[1].indexOf('%')>0) {
		postpos = true;
	}
	contentElement.setStyles({
			'z-index': '65557',
			'position': 'absolute',
			'top': pos.y,
			'left': pos.x
		}
	);			
	new Request({
		url: url,
		method: 'get',
		onSuccess: function(text, xml) {
			contentElement.set('html', text);
			if (postpos) {
				if (a[0].indexOf('%')>0) {
					yy = parseInt(pos.y.substr(0, pos.y.indexOf('px')));
					hh = parseInt(0.5 * $('overlay-content'+cm_oBoxCounter).getSize().y);
					yy = yy - hh;
					if (yy<0) yy = 0;
					$('overlay-content'+cm_oBoxCounter).setStyle('top', yy + 'px');
				}
				if (a[1].indexOf('%')>0) {
					xx = parseInt(pos.x.substr(0, pos.x.indexOf('px')));
					ww = parseInt(0.5 * $('overlay-content'+cm_oBoxCounter).getSize().x);
					xx = xx - ww;
					if (xx<0) xx = 0;
					$('overlay-content'+cm_oBoxCounter).setStyle('left', xx + 'px');
				}
				$('overlay-content'+cm_oBoxCounter).setStyle('display', 'block');
			}
		}
	}).send();
}

function cm_ajaxOverlayBoxLoader2(url, args) {// args: top, left, class
	var a = args.split(' ');
	cm_oBoxCounter += 1;
	if ($('overlay-bgbox'+cm_oBoxCounter)!=null) return false;
	
	var layerElement  = new Element('div', {
		'id': 'overlay-bgbox'+cm_oBoxCounter,
		'class' : 'overlay-bg'
	});
	var docSize = getDocSize();
	layerElement.inject($(document.body));
	layerElement.setStyles({
			'z-index': '65555',
			'position': 'absolute',
			'top': '0px',
			'left': '0px', 
			'width': docSize.x+'px', 
			'height': docSize.y+'px'
		}		
	);
	var contentElement  = new Element('div', {
		'id': 'overlay-content'+cm_oBoxCounter,
		'class': a[2]
	});
	contentElement.inject($(document.body));
	var pos = makePosition(a[0], a[1]);
	var postpos = false;
	contentElement.setStyles({
			'z-index': '65557',
			'position': 'fixed',
			'top': pos.y,
			'left': pos.x
		}
	);		
	new Request({
		url: url,
		method: 'get',
		onSuccess: function(text, xml) {
			contentElement.set('html', text);
			contentElement.addEvent('click', function(){
			    cm_ajaxOverlayBoxClose();
			});			
		}
	}).send();
}

function cm_ajaxOverlayBoxClose() {
	$('overlay-content'+cm_oBoxCounter).dispose();
	$('overlay-bgbox'+cm_oBoxCounter).dispose();
	cm_oBoxCounter -= 1;
}


//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// RESIZABLE ELEMENTS
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

var // Configurables:
  Drag_increments = 10, // number of pixels that we grow by

  Min_Width =  10,   Max_Width  = 1200,
  Min_Height =  10,   Max_Height = 900
;

var New_width, New_height, Grip, Cursor_start_x, Cursor_start_y, SetCookie;

//------------------------------------------------------------
var Target, Orig_width, Orig_height;

function cm_resize_start (event, draggable, target_id, args) {
	var el;
	Target = $(target_id);
  
	a = args.split(' ');
	if (a[0]) {	Min_Width = a[0];	}
	if (a[1]) {	Max_Width = a[1];	}
	if (a[2]) {	Min_Height = a[2];	}
	if (a[3]) {	Max_Height = a[3];	}
	if (a[4]) {	Drag_increments = a[4];	}
	SetCookie = (a[5]=='cookie') ? target_id : '';

	//find draggable
	if (event.target) el = event.target;
	else el = event.srcElement;
	if (el.nodeType == 3)  el = el.parentNode;
	while(el) {
    	if( el.tagName == "BODY" ) { el = false; break; }
    	if( has_class(el, draggable) ) break; // found it!
    	el = el.parentNode;
  	}
  	if(!el) return false; // undraggable
  	Grip = el;

  	add_class(Grip, "activedrag");

  	Cursor_start_x = event.clientX;
  	Cursor_start_y = event.clientY;
  	var orig_size = Target.getSize();
  	Orig_width   = parseInt( orig_size.x    , 10 );
  	Orig_height  = parseInt( orig_size.y   , 10 );

  	// Capture mousemove and mouseup events on the page.
  	if (document.addEventListener) {
		document.addEventListener ("mousemove", cm_resize_move, true);
		document.addEventListener ("mouseup", cm_resize_stop, true);
	} else if (document.attachEvent) {
		document.attachEvent ("onmousemove", cm_resize_move);
		document.attachEvent ("onmouseup", cm_resize_stop);
	} else {
		document.onmousemove = cm_resize_move;
		document.onmouseup = cm_resize_stop;
	}

  	if (event.preventDefault) event.preventDefault();
  	else event.returnValue = false;
  	return;
}


function cm_resize_move(event) {
   	New_width  = event.clientX - Cursor_start_x + Orig_width;
   	New_height = event.clientY - Cursor_start_y + Orig_height;

  	if (Max_Width>0) New_width  = constrain_range(Min_Width, New_width , Max_Width, Drag_increments);;
  	if (Max_Height>0) New_height = constrain_range(Min_Height, New_height, Max_Height, Drag_increments);;

  	if (Max_Width>0) Target.style.width  = New_width + 'px';
  	if (Max_Height>0) Target.style.height = New_height + 'px';

  	if (event.preventDefault) event.preventDefault();
  	else event.returnValue = false;
  	
  	return;
}

function cm_resize_stop(event) {
  	// Stop capturing the mousemove and mouseup events.
  	remove_class(Grip, "activedrag");
  	if (document.removeEventListener) {
		document.removeEventListener ("mousemove", cm_resize_move, true);
		document.removeEventListener ("mouseup", cm_resize_stop, true);
	} else if (document.detachEvent) {
		document.detachEvent ("onmousemove", cm_resize_move);
		document.detachEvent ("onmouseup", cm_resize_stop);
	} else {
		document.onmousemove = null;
		document.onmouseup = null;
	}
	if (SetCookie!='') {
  		if (Max_Width>0) Cookie.write(SetCookie + '_width', New_width);
  		if (Max_Height>0) Cookie.write(SetCookie + '_height', New_height);
  	}
  	return;
}

//------------------------------------------------------------
var multiTarget = new Array();
var multiOrig_width = new Array();
var multiOrig_height = new Array();

function cm_multiResize_start (event, draggable,  target_id, args) {
	multiTarget = $$('.' + target_id);
  
	a = args.split(' ');
	if (a[0]!='') {	Min_Width = a[0];	}
	if (a[1]!='') {	Max_Width = a[1];	}
	if (a[2]!='') {	Min_Height = a[2];	}
	if (a[3]!='') {	Max_Height = a[3];	}
	if (a[4]!='') {	Drag_increments = a[4];	}
	SetCookie = (a[5]=='cookie') ? target_id : '';

	//find draggable
	var el = event.target;
	if (el.nodeType == document.TEXT_NODE)  el = el.parentNode;
	while(el) {
    	if( el.tagName == "BODY" ) { el = false; break; }
    	if( has_class(el, draggable) ) break; // found it!
    	el = el.parentNode;
  	}
  	if(!el) return false; // undraggable
  	Grip = el;

  	add_class(Grip, "activedrag");

  	Cursor_start_x = event.clientX;
  	Cursor_start_y = event.clientY;
  	if (SetCookie!='') {
  		var w = parseInt(Cookie.read(SetCookie + '_width'));
  		Orig_width = (isNaN(w)) ? 0 : w;
  		var h = parseInt(Cookie.read(SetCookie + '_height'));
  		Orig_height = (isNaN(h)) ? 0 : h;
  	}
  	else {
  		Orig_width = 0;
  		Orig_height = 0;
  	}  	
  	multiTarget.each(function(item, index) {
  		multiOrig_width[index] = item.getStyle('width');
  		multiOrig_height[index] = item.getStyle('height');
  	});
  	
  	// Capture mousemove and mouseup events on the page.
  	document.addEventListener("mousemove", cm_multiResize_move, true);
  	document.addEventListener("mouseup",   cm_multiResize_stop, true);

  	event.preventDefault();
  	return;
}


function cm_multiResize_move(event) {
   	if (Max_Width>0) New_width  = event.clientX - Cursor_start_x + Orig_width;
   	if (Max_Height>0) New_height = event.clientY - Cursor_start_y + Orig_height;

  	if (Max_Width>0) New_width  = constrain_range(Min_Width, New_width , Max_Width, Drag_increments);;
  	if (Max_Height>0) New_height = constrain_range(Min_Height, New_height, Max_Height, Drag_increments);;

  	multiTarget.each(function(item, index) {
	  	if (Max_Width>0) item.style.width  = parseInt(multiOrig_width[index]) + parseInt(New_width) - parseInt(Orig_width) + 'px';
	  	if (Max_Height>0) item.style.height = parseInt(multiOrig_height[index]) + parseInt(New_height) - parseInt(Orig_height) + 'px';
  	});

  	event.preventDefault();
  	return;
}

function cm_multiResize_stop(event) {
  	// Stop capturing the mousemove and mouseup events.
  	remove_class(Grip, "activedrag");
  	document.removeEventListener("mousemove", cm_multiResize_move, true);
  	document.removeEventListener("mouseup",   cm_multiResize_stop, true);
  	if (SetCookie!='') {
  		if (Max_Width>0) Cookie.write(SetCookie + '_width', New_width);
  		if (Max_Height>0) Cookie.write(SetCookie + '_height', New_height);
  	}
  	return;
}


//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// SORTABLE content blocks
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
var draggedContentElement = false;
var draggingContentActive = false;

function cm_initContentDragsortAction(urlPrefix, target, args) {
	Sortables.implement({
		serialize: function(){
			var serial = [];
			this.list.getChildren().each(function(el, i){
				var ident = el.getProperty('id');
				serial[i] = ident.substr(ident.indexOf('__ID__')+6);
			}, this);
			return serial;
		}
	});
	$(target).store('sort', 
		new Sortables($(target), {
			'clone': true,
			'opacity': 0.5,
			'revert': true,
			'onStart': function() {
				draggingContentActive = true;
			},
			'onComplete': function(el) { 
				var order = this.serialize();
				var ident = el.getProperty('id').substr(el.getProperty('id').indexOf('__ID__')+6);
				var newpos = order.indexOf(ident);
				if (!draggedContentElement) alert('Drag Error');
				if (newpos<0) alert('Drop Error');
				if (newpos==0) {
					window.location = urlPrefix+"&"+draggedContentElement+"&dropId="+order[1]+"&dropPos=before";
				}
				else {
					window.location = urlPrefix+"&"+draggedContentElement+"&dropId="+order[newpos-1]+"&dropPos=after";
				}
				draggedContentElement = false;
				draggingContentActive = false;
			}
		}).detach()
	);
}

function cm_activateDragsort(target, ids) {
	if (!draggingContentActive) {
		draggedContentElement = ids;
    	$(target).retrieve('sort').attach();
    }
}
function cm_deactivateDragsort(target) {
	if (!draggingContentActive) {
		draggedContentElement = false;
    	$(target).retrieve('sort').detach();
    }
}

//****************************************************************
// tree drag'n'drop
//****************************************************************


var cm_treeDraggedElement = null;
var cm_treeDroppedElement = null;
var cm_treeDraggedVisible = false;
var cm_treeDropPosition = "";
var cm_treeDropOnElementId = "";
var cm_treeOverCount = 0;

function cm_treeCreateDraggableImg(treeId, realId, urlPrefix) {
	if (cm_treeDraggedElement!=null)
		return;
	$$(".treeDraggable_"+treeId).each(function(el, index) {
		el.destroy();
	});
	cm_treeDraggedElement = null;
	cm_treeDroppedElement = null;
	cm_treeDraggedVisible = false;
	cm_treeDropPosition = "";
	cm_treeDropOnElementId = "";
	cm_treeOverCount = 0;
	var de = document.createElement('div');
	de.innerHTML = '<img unselectable="on" src="'+$('treeIconImg_'+treeId+"_"+realId).src+'" alt="" border="0">';
	de.setAttribute('id', 'treeDraggable_'+treeId+'_'+realId);
	document.body.appendChild(de);
	$('treeDraggable_'+treeId+'_'+realId).setProperties({
	    'id': 'treeDraggable_'+treeId+'_'+realId,
	    'onMouseOut': "cm_treeRemoveDraggableImg('"+treeId+"', '"+realId+"');",
	    'class': "treeDraggable_"+treeId
	});
	var pos = $('treeIconImg_'+treeId+"_"+realId).getPosition();
	de.setStyles({
	   'border': 'none',//'2px solid #000',
	   'position': 'absolute',
	   'top': pos.y+'px',
	   'left': pos.x+'px',
	   'cursor': 'move',
	   'display': 'block',
	   'z-index': 9999
	});
	de.injectAfter('treeElement_'+treeId+"_"+realId);

	if (document.all)
		de.setProperty('UNSELECTABLE', 'on');

	de.makeDraggable({
		'droppables': $$('.treeElementOf_'+treeId),
		'onStart': function () {
            $('treeDraggable_'+treeId+'_'+realId).setProperty("onMouseOut", "");
            $('treeElement_'+treeId+'_'+realId).setStyle("opacity", "0.6");
            $('treeDraggable_'+treeId+'_'+realId).setStyle("opacity", "0.6");
		},
		'onDrag': function (e) {
			cm_treeShowDragmarker(treeId);
		},
		'onComplete': function () {
			cm_treeRemoveDraggableImg(treeId, realId);
            $('treeElement_'+treeId+'_'+realId).setStyle("opacity", "1");
		},
		'onEmptydrop': function () {
			alert("ERROR: EMPTYDROP!");
			cm_treeRemoveDraggableImg(treeId, realId);
            $('treeElement_'+treeId+'_'+realId).setStyle("opacity", "1");
		},
        'onEnter': function (element, droppable) {
			cm_treeDraggedVisible = true;
			cm_treeShowDragmarker(treeId, element, droppable);
		},
        'onLeave': function (element, droppable) {
			if ($("treeDragmarker_"+treeId))
				 $("treeDragmarker_"+treeId).destroy();
			cm_treeDraggedVisible = false;
		},
        'onDrop': function (element, droppable) {
        	if (droppable) {
				cm_treeDropElement(treeId, element, droppable, urlPrefix);
			}
			cm_treeDraggedElement = null;
			cm_treeDroppedElement = null;
			cm_treeDraggedVisible = false;
			cm_treeDropPosition = "";
			cm_treeDropOnElementId = "";
			cm_treeOverCount = 0;
		}
	});
}

function cm_treeShowDragmarker(treeId, draggedElement, dropElement) {
	if ($("treeDragmarker_"+treeId) && !cm_treeDraggedVisible)
		 $("treeDragmarker_"+treeId).destroy();
	if (!cm_treeDraggedVisible)
		return;
	if (typeof draggedElement == "undefined") {
		if (cm_treeDraggedElement == null)
			return;
		draggedElement = cm_treeDraggedElement;
	}
	else
		cm_treeDraggedElement = draggedElement;
	if (typeof dropElement == "undefined")
		dropElement = cm_treeDroppedElement;
	else
		cm_treeDroppedElement = dropElement;
	if (!$('treeDragmarker_'+treeId)) {
		var dm = document.createElement('div');
		dm.innerHTML = '<font style="font-size:0px">&nbsp;</font>';
		dm.setAttribute('id', 'treeDragmarker_'+treeId);
		dm.style.display = 'none';
		document.body.appendChild(dm);
		$('treeDragmarker_'+treeId).setStyles({
		   'border': '2px solid red',
		   'position': 'absolute',
		   'top': '0px',
		   'left': '0px',
		   'display': 'none',
		   'z-index': 9999
		});
	}
	if (typeof dropElement != "undefined") {
		var dropCoords = dropElement.getCoordinates();
		var d = $('treeDragmarker_'+treeId);
		var tmp = dropElement.id.split('treeElement_'+treeId+'_');
		var dropId = cm_treeDropOnElementId = tmp[1];
		var dropIconCoords = $('treeIconImg_'+treeId+'_'+dropId).getCoordinates();
		var dropIconSize = $('treeIconImg_'+treeId+'_'+dropId).getSize();
		var zeropx = document.all?2:0;
		var firefoxWidthFix = document.all?0:4;
//c5_debugTrace("dropCoords: "+dropCoords.left+", "+dropCoords.top+"<br/>"+"mouse: "+mouseX+", "+mouseY+"<br/>"+"dropElement: "+dropElement.id);
		if (mouseY<dropCoords.top+dropCoords.height/3) {
			cm_treeDropPosition = "above";
			d.setStyles({
			   'top': (dropCoords.top-2)+'px',
			   'left': dropIconCoords.left+'px',
			   'width': dropIconSize.x+'px',
			   'height': zeropx+'px',
			   'display': 'block'
			}); 
		}
		else if (mouseY>dropCoords.top+dropCoords.height/3*2) {
			cm_treeDropPosition = "below";
			d.setStyles({
			   'top': (dropCoords.top+dropCoords.height-2)+'px',
			   'left': dropIconCoords.left+'px',
			   'width': dropIconSize.x+'px',
			   'height': zeropx+'px',
			   'display': 'block'
			});
		}
		else {
			cm_treeDropPosition = "inside";
			d.setStyles({
			   'top': dropCoords.top+'px',
			   'left': dropIconCoords.left+'px',
			   'width': dropIconSize.x+'px',
			   'height': dropIconSize.y+'px',
			   'display': 'block'
			});
		}
	}
	//else
	//	c5_debugTrace("NO DROP ELEMENT!!!");
}

function cm_treeRemoveDraggableImg(treeId, realId) {
	$('treeDraggable_'+treeId+'_'+realId).destroy();
	$$("treeDraggable_"+treeId).each(function(el, index) {
		el.destroy();
	});
	if ($("treeDragmarker_"+treeId))
		 $("treeDragmarker_"+treeId).destroy();
	$$('.treeElementOf_'+treeId).each(function(drop, index){
		drop.removeEvent('over');
		drop.removeEvent('leave');
		drop.removeEvent('drop');
	});
}

var cm_treeDontDropAgain = false;
function cm_treeDropElement(treeId, dragElement, dropElement, urlPrefix) {
	if (cm_treeDontDropAgain)
		return;
	cm_treeDontDropAgain = true;
	var tmp1 = dropElement.id.split('treeElement_'+treeId+'_');
	var dropId = tmp1[1];
	var tmp2 = dragElement.id.split('treeDraggable_'+treeId+'_');
	var dragId = tmp2[1];
	window.location = urlPrefix+"&dropId="+dropId+"&dropPos="+cm_treeDropPosition;
}

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// drag and drop Elements
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
var cm_draggedElement = false;
var cm_dropElement = false;
var cm_draggingActive = false;

function cm_initElementDragAndDrop(handle, ident, dropTarget, urlPrefix) {
	if (cm_draggingActive)
		return;
	$$(".theDragImg").each(function(el, index) {
		el.destroy();
	});
	var theDragImg = document.createElement('div');
	theDragImg.innerHTML = '<img unselectable="on" src="userfiles/images/actions/move.png" alt="" border="0">';
	theDragImg.setAttribute('id', 'theDragImg_'+ident);
	document.body.appendChild(theDragImg);
	$('theDragImg_'+ident).setProperties({
	    'id': 'theDragImg_'+ident,
	    'onMouseOut': "cm_removeElemDragImg('"+ident+"', '"+dropTarget+"');",
	    'class': 'theDragImg'
	});
	var pos = $(handle).getPosition();
	var size = $(handle).getSize();
	var top = pos.y;
	var left = pos.x;
	theDragImg.setStyles({
	   'border': 'none',
	   'position': 'absolute',
	   'top': top+'px',
	   'left': left+'px',
	   'cursor': 'move',
	   'display': 'block',
	   'z-index': 9999
	});
	theDragImg.injectBefore(handle);

	if (document.all)
		theDragImg.setProperty('UNSELECTABLE', 'on');

	theDragImg.makeDraggable({
		'droppables': $$('.' + dropTarget),
		'onStart': function () {
			cm_draggedElement = ident;
            theDragImg.setProperty("onMouseOut", "");
            theDragImg.setStyle("opacity", "0.6");
            $('cm_pageEd_element_'+ident).setStyle("opacity", "0.6");
		},
		'onDrag': function (e) {
			//cm_treeShowDragmarker(treeId);
		},
		'onComplete': function () {
			cm_removeElemDragImg(ident, dropTarget);
            $('cm_pageEd_element_'+ident).setStyle("opacity", "1");
			cm_draggedElement = false;
			cm_dropElement = false;
			cm_draggingActive = false;
		},
		'onEmptydrop': function () {
			alert("ERROR: EMPTYDROP!");
			cm_removeElemDragImg(ident, dropTarget);
            $('cm_pageEd_element_'+ident).setStyle("opacity", "1");
			cm_draggedElement = false;
			cm_dropElement = false;
			cm_draggingActive = false;
		},
        'onEnter': function (element, droppable) {
			cm_dropElement = droppable;
			droppable.setStyle('background-color', 'maroon');
		},
        'onLeave': function (element, droppable) {
			cm_dropElement = false;
			droppable.setStyle('background-color', '');
		},
        'onDrop': function (element, droppable) {
        	if (droppable) {
				cm_dragElementDrop(ident, dropTarget, element, droppable, urlPrefix);
			}
			cm_draggedElement = false;
			cm_dropElement = false;
			cm_draggingActive = false;
		}
	});
}

function cm_removeElemDragImg(ident, dropTarget) {
	$('theDragImg_'+ident).destroy();
	$$(".theDragImg").each(function(el, index) {
		el.destroy();
	});
	$$('.' + dropTarget).each(function(drop, index){
		drop.removeEvent('over');
		drop.removeEvent('leave');
		drop.removeEvent('drop');
	});
}


var cm_elemDontDropAgain = false;
function cm_dragElementDrop(ident, dropTarget, dragElement, dropElement, urlPrefix) {
	if (cm_elemDontDropAgain)
		return;
	cm_elemDontDropAgain = true;
	var tmp1 = dropElement.id.split(dropTarget + '_');
	var dropId = tmp1[1];
	var dragId = ident;
	if (ident==cm_draggedElement)
		window.location = urlPrefix+"&dragId="+dragId+"&dropId="+dropId;
}


//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// date selector
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
function selectDate(url, formid, target, date) { 
	url += '&calendar=show&id=' + formid + '&tgt=' + target;
	if (date=='') date = $(formid + '_' + target).value;
	if (date!='') url += '&date=' + date;
	cm_ajaxSimpleLoader(url, formid + '_' + target + '_dateSelector');
}
function setDate(url, formid, target, date) {
	$(formid + '_' + target).value = date;
	url += '&calendar=hide&id=' + formid + '&tgt=' + target + '&date=' + date;
	cm_ajaxSimpleLoader(url, formid + '_' + target + '_dateSelector');
	$(formid + '_' + target).focus();
}

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// helpers
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

function constrain_range (min, i, max, incr) {
  if(incr)  i = Math.floor(i/incr) * incr;
  return(
	 (i > max) ? max
	:(i < min) ? min
        : i
  );
}

function makePosition(x, y) { 
	var xx = x ? x : '50%';
	var yy = y ? y : '50%';
	var scrollPos = getScrollPos();
	var windowSize = getWindowSize();
	var obj = new Object();
	// left
	if (xx.indexOf('%')>0) {
		xx = (parseInt(xx.substr(0, xx.indexOf('%'))) * 0.01 * windowSize.x + scrollPos.x );
	}
	else {
		if (xx.indexOf('px')>=0) { 
			xx = xx.substr(0, xx.indexOf('px'));
		}
		if (parseInt(xx)<0) { 
			xx = windowSize.x - parseInt(xx);
		}
		//xx = 1*xx + 1*scrollPos.x;
	}
	// top
	if (yy.indexOf('%')>0) {
		yy = (parseInt(yy.substr(0, yy.indexOf('%'))) * 0.01 * windowSize.y + scrollPos.y );
	}
	else {
		if (yy.indexOf('px')>=0) { 
			yy = yy.substr(0, yy.indexOf('px'));
		}
		if (parseInt(yy)<0) { 
			yy = windowSize.y - parseInt(yy);
		}
		//yy = 1*yy + 1*scrollPos.y;
	}
	obj.x = xx + 'px';
	obj.y = yy + 'px';
	return obj;
}



function utf8_encode (argString) {
    // Encodes an ISO-8859-1 string to UTF-8  
    // 
    // version: 1103.1210
    // discuss at: http://phpjs.org/functions/utf8_encode
    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: sowberry
    // +    tweaked by: Jack
    // +   bugfixed by: Onno Marsman
    // +   improved by: Yves Sucaet
    // +   bugfixed by: Onno Marsman
    // +   bugfixed by: Ulrich
    // *     example 1: utf8_encode('Kevin van Zonneveld');
    // *     returns 1: 'Kevin van Zonneveld'
    var string = (argString + ''); // .replace(/\r\n/g, "\n").replace(/\r/g, "\n");
    var utftext = "",
        start, end, stringl = 0;
 
    start = end = 0;
    stringl = string.length;
    for (var n = 0; n < stringl; n++) {
        var c1 = string.charCodeAt(n);
        var enc = null;
 
        if (c1 < 128) {
            end++;
        } else if (c1 > 127 && c1 < 2048) {
            enc = String.fromCharCode((c1 >> 6) | 192) + String.fromCharCode((c1 & 63) | 128);
        } else {
            enc = String.fromCharCode((c1 >> 12) | 224) + String.fromCharCode(((c1 >> 6) & 63) | 128) + String.fromCharCode((c1 & 63) | 128);
        }
        if (enc !== null) {
            if (end > start) {
                utftext += string.slice(start, end);
            }
            utftext += enc;
            start = end = n + 1;
        }
    }
 
    if (end > start) {
        utftext += string.slice(start, stringl);
    }
 
    return utftext;
}

function utf8_decode ( str_data ) {
    // Converts a UTF-8 encoded string to ISO-8859-1  
    // 
    // version: 909.322
    // discuss at: http://phpjs.org/functions/utf8_decode    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
    // +      input by: Aman Gupta
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Norman "zEh" Fuchs
    // +   bugfixed by: hitwork    // +   bugfixed by: Onno Marsman
    // +      input by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: utf8_decode('Kevin van Zonneveld');
    // *     returns 1: 'Kevin van Zonneveld'    var tmp_arr = [], i = 0, ac = 0, c1 = 0, c2 = 0, c3 = 0;
    return str_data;
    
    str_data += '';
    var i=0;
    var tmp_arr
    while ( i < str_data.length ) {        
    	c1 = str_data.charCodeAt(i);
        if (c1 < 128) {
            tmp_arr[ac++] = String.fromCharCode(c1);
            i++;
        } else if ((c1 > 191) && (c1 < 224)) {            
        	c2 = str_data.charCodeAt(i+1);
            tmp_arr[ac++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
            i += 2;
        } else {
            c2 = str_data.charCodeAt(i+1);            
            c3 = str_data.charCodeAt(i+2);
            tmp_arr[ac++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
            i += 3;
        }
    } 
    return tmp_arr.join('');
}


function base64_decode (data) {
    // Decodes string using MIME base64 algorithm  
    // 
    // version: 909.322
    // discuss at: http://phpjs.org/functions/base64_decode    // +   original by: Tyler Akins (http://rumkin.com)
    // +   improved by: Thunder.m
    // +      input by: Aman Gupta
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: Onno Marsman    // +   bugfixed by: Pellentesque Malesuada
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // -    depends on: utf8_decode    // *     example 1: base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA==');
    // *     returns 1: 'Kevin van Zonneveld'
    // mozilla has this native
    // - but breaks in 2.0.0.12!
    //if (typeof this.window['btoa'] == 'function') {    //    return btoa(data);
    //}
 
    var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, dec = "", tmp_arr = []; 
    if (!data) {
        return data;
    }
     data += '';
 
    do {  // unpack four hexets into three octets using index points in b64
        h1 = b64.indexOf(data.charAt(i++));
        h2 = b64.indexOf(data.charAt(i++));        
        h3 = b64.indexOf(data.charAt(i++));
        h4 = b64.indexOf(data.charAt(i++));
 
        bits = h1<<18 | h2<<12 | h3<<6 | h4;
        o1 = bits>>16 & 0xff;
        o2 = bits>>8 & 0xff;
        o3 = bits & 0xff;
 
        if (h3 == 64) {            
        	tmp_arr[ac++] = String.fromCharCode(o1);
        } else if (h4 == 64) {
            tmp_arr[ac++] = String.fromCharCode(o1, o2);
        } else {
            tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);        }
    } while (i < data.length);
 
    dec = tmp_arr.join('');
    dec = utf8_decode(dec); 
    return dec;
}

