var dialog_enableDebug = false;

var dialog_offset_x = 0;
var dialog_offset_y = 0;

var dialog_dragging = false;
var dialog_drag_x1 = 0;
var dialog_drag_y1 = 0;
var dialog_drag_dx = 0;
var dialog_drag_dy = 0;

function openDialog(disableCentering) {
	debugPrint("openDialog","dialog");
	el = document.getElementById('hiddenDialog');
	el.style.display = 'block';

	if(!disableCentering) centerDialog();
}

function centerDialog() {
	el = document.getElementById('hiddenDialog');
	// keskitetään
	dialog_offset_x = (document.body.clientWidth - el.offsetWidth) / 2;
	dialog_offset_y = (document.body.clientHeight - el.offsetHeight) / 2;
	positionDialog();
}

function closeDialog() {
	el = document.getElementById('hiddenDialog');
	el.style.display= 'none';	// ja piiloon
	el.innerHTML = "";	// putsataan turha koodi hidastamasta sivua
	positionDialog();
}

function loadDialog(url, callback) {
	var slicePos = url.indexOf('?');
	var postData = url.substr(slicePos+1);
	var url = url.substr(0,slicePos);

	debugPrint("loadDialog: "+postData,"dialog");

	var dialogrequest = createXMLHttpRequest();
	dialogrequest.open("POST", url, true);

	dialogrequest.onreadystatechange=function() {
		if(dialogrequest.readyState==4) {
			if(dialogrequest.status == 200) {
				debugPrint("loadDialog: dialog loaded","dialog");
				var el = document.getElementById('hiddenDialog');

				var regString = '<!-- <dialog> -->([^\000]*?)<!-- </dialog> -->';
				var rx = new RegExp(regString, "mig");
				var match = rx.exec(dialogrequest.responseText);
				if(match) {
					debugPrint("loadDialog: updating dynamic dialog innerHTML","dialog");
					el.innerHTML = match[0];
					openDialog();
					if(callback) callback();
				} else {
					alert("loadDialog: xmlhttprequest returned no dialog-content. What it returned was:\n"+dialogrequest.responseText);
				}
			} else {
				alert("status != 200");
			}
		}
	}
	// vältetään cachetus
	dialogrequest.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
	dialogrequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded');

	dialogrequest.send(postData);

	debugPrint("loadDialog: sent XMLHttpRequest","dialog");

	return;
}

function refreshDialog(url, callback) {
	var slicePos = url.indexOf('?');
	var postData = url.substr(slicePos+1);
	var url = url.substr(0,slicePos);

	debugPrint("refreshDialog: "+postData,"dialog");

	var dialogrequest = createXMLHttpRequest();
	dialogrequest.open("POST", url, true);

	dialogrequest.onreadystatechange=function() {
		if(dialogrequest.readyState==4) {
			if(dialogrequest.status == 200) {
				debugPrint("refreshDialog: dialog loaded","dialog");
				var el = document.getElementById('hiddenDialog');

				var regString = '<!-- <dialog> -->([^\000]*?)<!-- </dialog> -->';
				var rx = new RegExp(regString, "mig");
				var match = rx.exec(dialogrequest.responseText);
				if(match) {
					debugPrint("refreshDialog: updating dynamic dialog innerHTML","dialog");
					el.innerHTML = match[0];
					openDialog(true);
					if(callback) callback();
				} else {
					alert("refreshDialog: xmlhttprequest returned no dialog-content. What it returned was:\n"+dialogrequest.responseText);
				}
			} else {
				alert("status != 200");
			}
		}
	}
	// vältetään cachetus
	dialogrequest.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
	dialogrequest.setRequestHeader('Content-Type','application/x-www-form-urlencoded');

	dialogrequest.send(postData);

	debugPrint("refreshDialog: sent XMLHttpRequest","dialog");

	return;
}



function dialog_focusFirst() {
	el = document.getElementById('hiddenDialog');
	if(el) {
		var inputs = document.getElementsByName("dialogProp");
		if(inputs) inputs[0].focus();
	}
}

function dialog_focusById(id) {
	var dlg = document.getElementById('hiddenDialog');
	var focusElement = dialog_searchChildWithId(dlg, id);
	if(focusElement) {
		focusElement.focus();
		focusElement.select();
	}
}

function dialog_searchChildWithId(el, id) {
	var ret = null;
	if(el.hasChildNodes()) {
//		var failSafe = 16;
//		debugPrint("childCount: "+el.childNodes.length,"dialog");
		for(var i=0; i<el.childNodes.length; i++) {
//			debugPrint("child "+i+": "+el.childNodes[i].tagName,"dialog");
			if(el.childNodes[i].id == id) {
				return el.childNodes[i];
			}
			if(ret = dialog_searchChildWithId(el.childNodes[i], id)) {
				break;
			}
//			failSafe--;
//			if(failSafe < 0) break;
		}
	}
	return ret;
}

/*
// expressionit css-styleen jotka pitävät dialogin oikeassa kohdassa.
function centerDialogY() {
	el = document.getElementById("hiddenDialog");

	return Math.floor(document.body.scrollTop + (document.body.clientHeight - el.offsetHeight) / 2);
}
function centerDialogX() {
	el = document.getElementById("hiddenDialog");

	var xpos = Math.floor(document.body.scrollLeft + (document.body.clientWidth - el.offsetWidth) / 2);
	// jos löytyy jompikumpi seuraavista elementeistä keskitetään siihen, muuten keskitetään bodyyn.
	baseEl = document.getElementById("editor_body");
	if(!baseEl) baseEl = document.getElementById("editor_short_body");
	if(baseEl) {
		xpos = Math.floor(getOffsetLeft(baseEl) + (baseEl.offsetWidth/2) - (el.offsetWidth/2));
	}

	baseEl = document.getElementById("pageInfo");
	if(baseEl) {
		xpos = Math.floor(getOffsetLeft(baseEl));
	}

	return xpos;
}
*/

function positionDialog() {

	if(!dialog_dragging) {
		el = document.getElementById("hiddenDialog");
		el.style.left = dialog_offset_x + document.body.scrollLeft;
		el.style.top = dialog_offset_y + document.body.scrollTop;
//	el.style.left = centerDialogX() + dialog_offset_x;
//	el.style.top = centerDialogY() + dialog_offset_y;
	}
	setTimeout("positionDialog()", 10);
}

// kertoo onko dialogin DIV näkyvissä.
function isDialogVisible() {
	var el = document.getElementById('hiddenDialog');

	if(el) {
		if(el.style) {
			if(el.style.display == "block") {
				return true;
			} else {
				return false;
			}
		} else {
			return false;
		}
	} else {
		return false;
	}
}



function dialog_drag_start(e) {
	if(!e) e = window.event;

	debugPrint("dialog_drag_start(): e.button="+e.button, "dialog");

/*
	if (document.addEventListener){
		document.addEventListener('mouseup', dialog_drag_end, false);
	} else if(document.attachEvent){
		document.attachEvent('onmouseup', dialog_drag_end);
	}
*/

	var dialog = document.getElementById("hiddenDialog");
	if(dialog) {
		// Selvitetään hiiren koordinaatit suhteessa KOKO dokumentin yläkulmaan ()
		if (e.pageX || e.pageY) {
			mouseX = e.pageX;
			mouseY = e.pageY;
		} else if(e.clientX || e.clientY) {
			mouseX = e.clientX;
			mouseY = e.clientY;
			mouseX += document.body.scrollLeft;
			mouseY += document.body.scrollTop;
		}

		dialog_drag_x1 = Math.floor(dialog.style.left.replace(/[^\d\.]/mig,""));
		dialog_drag_y1 = Math.floor(dialog.style.top.replace(/[^\d\.]/mig,""));
		dialog_drag_dx = mouseX - dialog_drag_x1;
		dialog_drag_dy = mouseY - dialog_drag_y1;

		debugPrint("dialog_drag_start: "+dialog_drag_x1+" "+dialog_drag_y1, "dialog");

		dialog_dragging = true;

		if (document.addEventListener){
			document.addEventListener('mousemove', dialog_drag, true);
			document.addEventListener('mouseup', dialog_drag_end, true);
		} else if(document.attachEvent){
			document.attachEvent('onmousemove', dialog_drag);
			document.attachEvent('onmouseup', dialog_drag_end);
		}
	}

	if(e.preventDefault) e.preventDefault();
	e.cancelBubble = true;
	return false;
}

function dialog_drag(e) {
	if(!e) e = window.event;

	var dialog = document.getElementById("hiddenDialog");
	if(dialog) {
		// Selvitetään hiiren koordinaatit suhteessa KOKO dokumentin yläkulmaan ()
		if (e.pageX || e.pageY) {
			mouseX = e.pageX;
			mouseY = e.pageY;
		} else if(e.clientX || e.clientY) {
			mouseX = e.clientX;
			mouseY = e.clientY;
			mouseX += document.body.scrollLeft;
			mouseY += document.body.scrollTop;
		}

		var dx = (mouseX - dialog_drag_x1) - dialog_drag_dx;
		var dy = (mouseY - dialog_drag_y1) - dialog_drag_dy;

		dialog_offset_x = Math.floor(dialog_drag_x1) + Math.floor(dx) - document.body.scrollLeft;
		dialog_offset_y = Math.floor(dialog_drag_y1) + Math.floor(dy) - document.body.scrollTop;

		dialog.style.left = Math.floor(dialog_drag_x1) + Math.floor(dx);
		dialog.style.top = Math.floor(dialog_drag_y1) + Math.floor(dy);

		debugPrint("dialog_drag: "+dx+" "+dy, "dialog");
	}

	if(e.preventDefault) e.preventDefault();
	e.cancelBubble = true;
	return false;
}



function dialog_drag_end(e) {
	debugPrint("dialog_drag_end()", "dialog");
	dialog_reset_drag();

	e.cancelBubble = true;
	return false;
}

function dialog_reset_drag() {
	debugPrint("dialog_reset_drag()", "dialog");

	dialog_dragging = false;

	if (document.removeEventListener){
		document.removeEventListener('mousemove', dialog_drag, true);
		document.removeEventListener('mouseup', dialog_drag_end, true);
	} else if(document.detachEvent){
		document.detachEvent('onmousemove', dialog_drag);
		document.detachEvent('onmouseup', dialog_drag_end);
	}

}
