function xmlrequest(query, obj) {

	path = 'xmlresponse/';
	var xmlrequest;
	var response;
	try {
		xmlrequest = new GeckoActiveXObject("Microsoft.XMLHTTP"); }
	catch (e) {
		try {
			xmlrequest = new ActiveXObject("Microsoft.XMLHTTP"); }
		catch (oc) {
			xmlrequest = null; } }
	if (!xmlrequest && typeof XMLHttpRequest != "undefined") xmlrequest = new XMLHttpRequest();
	if (!xmlrequest) {
		alert('Could not create XML object.');
		return;
	}
	if (obj != '') {
		xmlrequest.open('GET', path+query, true);
		xmlrequest.onreadystatechange = function() {
			if (xmlrequest.readyState == 4) {
				response = xmlrequest.responseText;
				obj.innerHTML = response;
			}
		}
		xmlrequest.send(null);
	}
	else {
		xmlrequest.open('GET', path+query, false);
		xmlrequest.send(null);
		response = xmlrequest.responseText;
	}
	delete xmlrequest;
	return response;
}

var IE = document.all ? true : false;
var source_el = null;
var target_el = null;
var current_hl = null;
var dragging = false;
var helper = null;
var default_alpha = 50;
var hide_tout;
var oversubmenu = false;

document.onmousedown = DragHandler;

function Loader() {
	helper = document.getElementById('helper');
	SetAlpha(helper, 50);
}

function MoveHandler(e) {
	if (e == null) {
		e = window.event;
		var thiselement = e.srcElement;
	}
	else {
		var thiselement = e.target;
	}
	if (e.button <= 1 && dragging) {
		scrolled = GetScroll();
		helper.style.left = e.clientX+scrolled[0]-28+'px';
		helper.style.top = e.clientY+scrolled[1]+12+'px';
		mparent = GetMoveableParent(thiselement);
		if (mparent) {
			target_el = prev_sib(mparent);
			target_el.className = 'highlightbar_on';
			if (current_hl != null) {
				if (target_el != current_hl) current_hl.className = 'highlightbar_off';
			}
			current_hl = target_el;
		}
		else if (thiselement.id.substr(0, 13) == 'dragcontainer') {
			target_el = l_child(thiselement);
			target_el.className = 'highlightbar_on';
			if (current_hl != null) {
				if (target_el != current_hl) current_hl.className = 'highlightbar_off';
			}
			current_hl = target_el;
		}
		return false;
	}
}

function DragEnd(e) {
	document.onmousemove = null;
	document.onmouseup = null;
	
	if (target_el != null) {
		if (!prev_sib(target_el)) prev_id = '0';
		else {
			prev_div = prev_sib(target_el);
			prev_id = prev_div.id.substr(2, prev_div.id.length);
		}
		pos = target_el.parentNode.id.substr(14, 2);
		gp_id = source_el.id.substr(2, source_el.id.length);
		MoveGadget(gp_id, prev_id, pos);
		
		newnode = source_el.cloneNode(true);
		SetAlpha(f_child(newnode), 100);
		insertednode = target_el.parentNode.insertBefore(newnode, target_el);
		newhlnode = document.createElement('div');
		newhlnode.className = 'highlightbar_off';
		insertednode.parentNode.insertBefore(newhlnode, insertednode);
		
		source_hl = prev_sib(source_el);
		source_el.parentNode.removeChild(source_el);
		source_hl.parentNode.removeChild(source_hl);
		
		current_hl.className = 'highlightbar_off';
	}
	else SetAlpha(f_child(source_el), 100);
	
	helper.style.display = 'none';
	
	source_el = null;
	target_el = null;
	dragging = false;
}

function DragHandler(e) {
	if (e == null) {
		e = window.event;
		var thiselement = e.srcElement;
	}
	else {
		var thiselement = e.target;
	}
	
	if (thiselement.id == "draghandle" && thiselement.parentNode.parentNode.parentNode.parentNode.className == "moveable") {
		source_el = thiselement.parentNode.parentNode.parentNode.parentNode;
		
		dragging = true;
		
		scrolled = GetScroll();
		helper.style.display = 'block';
		helper.style.left = e.clientX+scrolled[0]-28+'px';
		helper.style.top = e.clientY+scrolled[1]+12+'px';
		
		SetAlpha(f_child(source_el), default_alpha);
		
		document.onmousemove = MoveHandler;
		document.onmouseup = DragEnd;
		
		return false;
	}
}

function SetAlpha(obj, alpha) {
	if (IE) obj.style.filter = 'alpha(opacity='+alpha+')';
	else obj.style.opacity = alpha/100;
}

function GetMoveableParent(obj) {
	while (obj.parentNode) {
		if (obj.className == 'moveable') return obj;
		obj = obj.parentNode;
	}
	return false;
}

function GetCoords(obj) {
	var h = obj.offsetHeight;
	var w = obj.offsetWidth;
	var x = obj.offsetLeft;
	var y = obj.offsetTop;
	while (obj = obj.offsetParent) {
		x += obj.offsetLeft;
		y += obj.offsetTop;
	}
	return [x,x+w,y,y+h,h,w];
}

function GetScroll() {
	var scrOfX = 0;
	var scrOfY = 0;
	if (typeof(window.pageYOffset) == 'number') {
		scrOfY = window.pageYOffset;
		scrOfX = window.pageXOffset;
	} else if (document.body && (document.body.scrollLeft || document.body.scrollTop)) {
		scrOfY = document.body.scrollTop;
		scrOfX = document.body.scrollLeft;
	} else if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
		scrOfY = document.documentElement.scrollTop;
		scrOfX = document.documentElement.scrollLeft;
	}
	return [scrOfX, scrOfY];
}

function prev_sib(node) {
	var prev = node.previousSibling;
	if (prev == null) return false;
	while (prev.nodeType != 1) {
		if (prev.previousSibling == null) return false
		else prev = prev.previousSibling;
	}
	return prev;
}

function next_sib(node) {
	var next = node.nextSibling;
	if (next == null) return false;
	while (next.nodeType != 1) {
		if (next.nextSibling == null) return false
		else next = next.nextSibling;
	}
	return next;
}

function f_child(node) {
	var first = node.firstChild;
	if (first == null) return false;
	while (first.nodeType != 1) {
		first = first.nextSibling;
	}
	return first;
}

function l_child(node) {
	var last = node.lastChild;
	if (last == null) return false;
	while (last.nodeType != 1) {
		last = last.previousSibling;
	}
	return last;
}

function debug(text) {
	document.getElementById('debug').innerHTML = '<pre>'+text+'</pre>';
}

function show_drop_menu(id, cell) {
	for (i=0; i<menu_items.length; i++) {
		document.getElementById('menu_'+menu_items[i]).style.display = 'none';
	}
	menu = document.getElementById(id);
	cell_coords = GetCoords(cell.parentNode);
	
	menu.style.left = cell_coords[0]+'px';
	menu.style.top = cell_coords[2]+cell_coords[4]+6+'px';
	menu.style.display = 'block';
}

function hide_drop_menu(id, hide) {
	if (hide == 1) {
		menu = document.getElementById(id);
		menu.style.display = 'none';
		clearTimeout(hide_tout);
	}
	else {
	    if(!oversubmenu){
	        hide_tout = setTimeout("hide_drop_menu('"+id+"', 1)", 500);
	    }
	}
}

function show_drop_menu2(trigger, menu){
    for(i=0; i<menu_items2.length; i++){
        document.getElementById(menu_items2[i]).style.display = 'none';
    }
    if(menu != ''){    
        menu2 = document.getElementById(menu);
        cell_coords = GetCoords(trigger);
    	
    	var index = trigger.id.split('-');
    	index = index[1];
    		
    	menu2.style.left = cell_coords[5]+'px';
    	menu2.style.top = (index*cell_coords[4])+'px';
    	menu2.style.display = 'block';
    }
}

function MoveGadget(gp_id, after_id, pos) {
	var _status = xmlrequest('?op=move_page_gadget&gadget='+gp_id+'&after='+after_id+'&pos='+pos, '');
	
	if(_status == 'invalid position')
	{
		alert('The gadget cannot be placed here!');
		document.location.href = document.location.href;
		return false;
	}
}

function DeleteGadget(obj, gp_id) {
	todel1 = obj.parentNode.parentNode.parentNode.parentNode.parentNode;
	todel2 = prev_sib(todel1);
	todel1.parentNode.removeChild(todel1);
	todel2.parentNode.removeChild(todel2);
	xmlrequest('?op=delete_page_gadget&gadget='+gp_id);
}

function ShowGadgets() {
	document.getElementById('gcontainer').style.display = 'block';
}

function HideGadgets() {
	document.getElementById('gcontainer').style.display = 'none';
}

function GetScroll() {
	var scrOfX = 0;
	var scrOfY = 0;
	if (typeof(window.pageYOffset) == 'number') {
		scrOfY = window.pageYOffset;
		scrOfX = window.pageXOffset;
	} else if (document.body && (document.body.scrollLeft || document.body.scrollTop)) {
		scrOfY = document.body.scrollTop;
		scrOfX = document.body.scrollLeft;
	} else if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
		scrOfY = document.documentElement.scrollTop;
		scrOfX = document.documentElement.scrollLeft;
	}
	return [scrOfX, scrOfY];
}
