var frame_enableDebug = true;

//var draggableList = [];

function frame_setDraggableMode(el, dialog) {
	var elements = el.getElementsByTagName("table");
	for(var i=0; i < elements.length; i++) {
		if(elements[i].getAttribute("wertti_draggable")) {
			debugPrint("frame_setDraggableMode: found draggable element: "+elements[i], "frame");
			el.className = "frame fixed";

			var draggable = {};
			draggable.position = {x:0, y:0};

			if(el.style && el.style.left) draggable.position.x = Number(el.style.left.replace(/[^0-9]/gi,''));
			if(el.style && el.style.top) draggable.position.y = Number(el.style.top.replace(/[^0-9]/gi,''));

			draggable.element = el;
			draggable.dockable = false;
			draggable.docked = 0;
			draggable.timerId = null;
			draggable.setPosition = common_createBoundedWrapper(draggable, frame_setPosition);
			draggable.center = common_createBoundedWrapper(draggable, frame_center);
			draggable.resizeToContent = common_createBoundedWrapper(draggable, frame_resizeToContent);
			draggable.getSize = common_createBoundedWrapper(draggable, frame_getSize);
			draggable.getClientSize = common_createBoundedWrapper(draggable, frame_getClientSize);
			draggable.updatePosition = common_createBoundedWrapper(draggable, frame_updatePosition);
			draggable.keepInClientArea = common_createBoundedWrapper(draggable, frame_keepInClientArea);
			draggable.toggleDocking = common_createBoundedWrapper(draggable, frame_toggleDocking);
			var positionCookie = el.getAttribute('positionCookie');
			if(positionCookie) draggable.positionCookie = positionCookie;
			debugPrint("positionCookie="+positionCookie, "frame");

			draggable.dragFunc = common_createBoundedWrapper(draggable, frame_drag);
			draggable.dragEndFunc = common_createBoundedWrapper(draggable, frame_drag_end);

			draggable.handleElement = elements[i];
			draggable.handleElement.onselect = cancelEvent;
			draggable.handleElement.onselectstart = cancelEvent;
			draggable.handleElement.onmousedown = common_createBoundedWrapper(draggable, frame_drag_start);

			if(elements[i].getAttribute("wertti_dockable")) {
				draggable.dockable = true;
				draggable.handleElement.oncontextmenu = cancelEvent;
			}

			var imgs = el.getElementsByTagName("img");
			for(var i=0; i < imgs.length; i++) {
				if(imgs[i].getAttribute("w3_closable")) {
					debugPrint("frame_setDraggableMode: found close element: "+imgs[i], "frame");
					draggable.closeElement = imgs[i];
					draggable.close = common_createBoundedWrapper(draggable, frame_close);
					draggable.destroy = common_createBoundedWrapper(draggable, frame_destroy);
					draggable.closeElement.onclick = draggable.close;
					draggable.dialog = dialog;
				}
			}
			return draggable;
		}
	}
	return null;
}

function frame_destroy() {
	debugPrint("frame_destroy "+this.element, "frame");
	if(this.dragging) {
		if (document.removeEventListener){
			document.removeEventListener('mousemove', this.dragFunc, true);
			document.removeEventListener('mouseup', this.dragEndFunc, true);
		} else if(document.detachEvent){
			document.detachEvent('onmousemove', this.dragFunc);
			document.detachEvent('onmouseup', this.dragEndFunc);
		}
	}
	if(this.timerId) clearTimeout(this.timerId);
}

function frame_close(e) {
	debugPrint("frame_close "+this.element, "frame");
	if(this.dialog) {
		// jos frame on dialogin omistama, kutsutaan dialogin closea, joka huolehtii framen tuhoamisesta
		this.dialog.close();
	} else {
		// muuten vaan tuhotaan frame
		this.destroy();
	}
}

function frame_setPosition(pos) {
	debugPrint("frame_setPosition pos="+pos, "frame");
	if(pos) {
		this.position = {"x": pos.x, "y": pos.y};
		this.updatePosition();
//		this.keepPosition();
	} else {
		this.center();
	}
}

function frame_center() {
	var cArea = common_getClientArea();
	var dSize = common_getSize(this.element);
	debugPrint("frame_center display="+this.element.style.display+" cArea.width="+cArea.width+" dSize.width="+dSize.width, "frame");
	this.position = {"x": (cArea.width - dSize.width) / 2, "y": (cArea.height - dSize.height) / 2};
	this.updatePosition();
//	this.keepPosition();
}

function frame_resizeToContent() {
	var contentCell = this.element.rows[1].cells[1];
	debugPrint("frame_resizeToContent(): contentCell = " + contentCell.tagName,"frame");

	var contentSize = frame_getContentSize(contentCell);

	this.element.rows[0].cells[1].style.width = contentSize.width+"px";
	this.element.rows[1].cells[1].style.width = contentSize.width+"px";
	this.element.rows[2].cells[1].style.width = contentSize.width+"px";
/*
	var contentDiv = contentCell.childNodes[0];
	var originalSize = common_getSize(contentDiv);
	this.element.style.tableLayout = "";
	var contentSize = common_getSize(contentDiv);
	debugPrint("contentWidth = " + contentSize.width,"frame");
	this.center();
*/
/*
	var clientSize = common_getClientArea();
	var frameSize = common_getSize(this.element);
	if(this.position.x < 0) this.position.x = 0;
	if(this.position.y < 0) this.position.y = 0;
	if(this.position.x > clientSize.width - frameSize.width) this.position.x = clientSize.width - frameSize.width;
	if(this.position.y > clientSize.height - frameSize.height) this.position.y = clientSize.height - frameSize.height;
	this.updatePosition();
*/
	this.updatePosition();
	return contentSize;
}

function frame_getContentSize(el) {
	var contentSize = {'width':0, 'height':0};
	if(el.hasChildNodes()) {

		for(var i in el.childNodes) {
			if(el.childNodes[i].nodeType == Node.ELEMENT_NODE) {
				if(el.childNodes[i].offsetWidth && el.childNodes[i].offsetWidth > contentSize.width) {
					contentSize.width = el.childNodes[i].offsetWidth;
				}
				if(el.childNodes[i].offsetHeight && el.childNodes[i].offsetHeight > contentSize.height) {
					contentSize.height = el.childNodes[i].offsetHeight;
				}
			}
		}

		for(var i in el.childNodes) {
			if(el.childNodes[i].nodeType == Node.ELEMENT_NODE) {
				if(el.childNodes[i].hasChildNodes()) {
					childSize = frame_getContentSize(el.childNodes[i]);
					if(childSize.width > contentSize.width) contentSize.width = childSize.width;
					if(childSize.height > contentSize.height) contentSize.height = childSize.height;
				}
			}
		}

	}

//	debugPrint("frame_findMaxWidth "+el+" : width="+contentSize.width+" height="+contentSize.height,"frame");

	return contentSize;
}

function frame_getSize() {
//	debugPrint("frame_getSize","frame");
	sz = common_getSize(this.element);
	return sz;
}

function frame_getClientSize() {
	debugPrint("frame_getClientSize","frame");
	var sz = {width:0, height:0};
	var divs = this.element.getElementsByTagName('div');
	for(var i = 0; i < divs.length; i++) {
		var isClientArea = divs[i].getAttribute('clientarea');
		if(isClientArea) {
			debugPrint("frame_getClientSize: found clientArea-div "+divs[i],"frame");
			sz = common_getSize(divs[i]);
			break;
		}
	}
	return sz;
}


/*
function frame_keepPosition() {
	this.updatePosition();
	if(this.timerId) clearTimeout(this.timerId);
	this.timerId = setTimeout(this.keepPosition, 20);
}
*/


function frame_keepInClientArea() {
	var clientSize = common_getClientArea();
	var frameSize = this.getSize();
//	debugPrint("frameSize.width="+frameSize.width+" clientsize.width="+clientSize.width, "frame");
	if(this.position.x < 0) this.position.x = 0;
	if(this.position.y > clientSize.height - frameSize.height) this.position.y = clientSize.height - frameSize.height;
	if(this.position.x > clientSize.width - frameSize.width) this.position.x = clientSize.width - frameSize.width;
	if(this.position.y < 0) this.position.y = 0;
}

function frame_updatePosition() {
//	var scroll = common_getScroll();
//	this.element.style.left = (this.position.x + scroll.x) + "px";
//	this.element.style.top = (this.position.y + scroll.y) + "px";
	this.keepInClientArea();
	this.element.style.left = Math.floor(this.position.x) + "px";
	this.element.style.top = Math.floor(this.position.y) + "px";

//	var sz = this.getSize();
//	alert("frame_updatePosition() x="+this.position.x+" y="+this.position.y+" height="+this.element.style.height+" sz.height="+sz.height);
//	debugPrint("frame_updatePosition() x="+this.position.x+" y="+this.position.y, "frame");
}

function frame_drag_start(e) {
	if(!e) e = window.event;
	debugPrint("frame_drag_start() "+e.type, "frame");

	if(this.dragging) return false;

	var btn = common_resolveButton(e);
	if(btn & 4) {
		this.toggleDocking();
		return false;
	}

	this.drag_start = {x:this.position.x, y:this.position.y};
	this.drag_mouse = common_getMousePosition(e);

	this.dragging = true;
	if (document.addEventListener) {
		document.addEventListener('mousemove', this.dragFunc, true);
		document.addEventListener('mouseup', this.dragEndFunc, true);
	} else if(document.attachEvent){
		document.attachEvent('onmousemove', this.dragFunc);
		document.attachEvent('onmouseup', this.dragEndFunc);
	}

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

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

	var mousePos = common_getMousePosition(e);
//	var scroll = common_getScroll();
	var dx = (mousePos.x - this.drag_mouse.x);
	var dy = (mousePos.y - this.drag_mouse.y);
	this.position.x = this.drag_start.x + dx;
	this.position.y = this.drag_start.y + dy;

/*
	var clientSize = common_getClientArea();
	var frameSize = common_getSize(this.element);
	if(this.position.x < 0) this.position.x = 0;
	if(this.position.y < 0) this.position.y = 0;
	if(this.position.x > clientSize.width - frameSize.width) this.position.x = clientSize.width - frameSize.width;
	if(this.position.y > clientSize.height - frameSize.height) this.position.y = clientSize.height - frameSize.height;
*/
	this.updatePosition();

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

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

	debugPrint("frame_drag_end("+e+")", "frame");

	if(this.dragging) {
		if (document.removeEventListener){
			document.removeEventListener('mousemove', this.dragFunc, true);
			document.removeEventListener('mouseup', this.dragEndFunc, true);
		} else if(document.detachEvent){
			document.detachEvent('onmousemove', this.dragFunc);
			document.detachEvent('onmouseup', this.dragEndFunc);
		}

		if(this.positionCookie) {
			var postData = {'action':'frame', 'frame-action':'rememberPosition', 'frame-positionCookie':this.positionCookie, 'frame-x':this.position.x, 'frame-y':this.position.y, 'frame-dock':this.docked};
			var storePositionRequest = xmlhttp_request('index.php', postData, null, frame_positionStored);
			storePositionRequest.send();
		}
	}
	this.dragging = false;

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

function frame_positionStored(request) {
	debugPrint("frame_positionStored "+request.response.x+","+request.response.y+","+request.response.dock, "frame");
}

function frame_setTransferTitle(text) {
	var el = document.getElementById("transfer_title");
	if(el) el.innerHTML = text;
}

function frame_setTransferText(text) {
	var el = document.getElementById("transfer_text");
	if(el) el.innerHTML = text;
}

function frame_toggleDocking() {
	if(!this.element) return;

	var classesToDock = ['frame_content','tabArea'];

	var dock = 0;
	for(var i = 0; i < classesToDock.length; i++) {
		var el = this.element.querySelector("."+classesToDock[i]);
		if(el) {
			if(css_hasClass(el, 'docked')) {
				css_removeClass(el, 'docked');
				dock = 0;
			} else {
				css_addClass(el, 'docked');
				dock = 1;
			}
		}
	}
	this.docked = dock;

	if(this.positionCookie) {
		var postData = {'action':'frame', 'frame-action':'rememberPosition', 'frame-positionCookie':this.positionCookie, 'frame-x':this.position.x, 'frame-y':this.position.y, 'frame-dock':this.docked};
		var storePositionRequest = xmlhttp_request('index.php', postData, null, frame_positionStored);
		storePositionRequest.send();
	}

}


