/***
 * Creates new event manager manages all global events on current site
 */
window.onerror = function() { return false; };
 
function eventManager() {
	var current = this;

	this.dragObject = null;

	// Sets the event handler
	if(document.layers) {
		window.captureEvents(Event.KEYDOWN);
		window.captureEvents(Event.MOUSEMOVE);
		window.captureEvents(Event.MOUSEUP);
		window.captureEvents(Event.ERROR);
	}

	document.onkeydown		= function(e) { current.doKeyDown(e); }; // fire event for keydown
	document.onmousemove	= function(e) { current.doMouseMove(e); }; // fire event for keydown
	document.onmouseup		= function(e) { current.doMouseUp(e); }; // fire event for keydown
	document.onerror		= function(e) { current.doError(e); }; // fire event for keydown
}

// Checks error event
eventManager.prototype.doError = function (e) {
	return true;
};

// Checks keydown event
eventManager.prototype.doKeyDown = function (e) {
	if(!e) e = window.event;

	var keyCode = (e.keyCode)? e.keyCode: e.charCode;

	if(keyCode == '27' && BoxManager) {
		BoxManager.closeLastBox();
	}
};

// Checks onmouseup event
eventManager.prototype.doMouseUp = function (e) {
	if(!e) e = window.event;

	delete this.dragObject;

	this.dragObject = null;
};

// Checks onmouseup event
eventManager.prototype.doMouseMove = function (e) {
	if(!e) e = window.event;
									
	if(!this.dragObject || this.dragObject == null) {
		return;
	}

	// Stop current Event
	if(e.preventDefault || e.stopPropagation) {
		e.preventDefault();
		e.stopPropagation();
	} else {
		e.returnValue = false;
		e.cancelBubble = true;
	}
	
	var posY = e.clientY || e.y || e.pageY || null;
	var posX = e.clientX || e.x || e.pageX || null;
					
	var body = document.getElementsByTagName("body")[0];
	var bodyWidth = parseInt(GetWidth(body));
	var bodyHeight = parseInt(GetHeight(body));
	
	if(this.dragObject.dragType == 'dragndrop') {
		var boxContentHeight = parseInt(GetStyle(this.dragObject.getContentDiv(), 'height'));
	
		var boxWidth	= parseInt(GetWidth(this.dragObject.divbox));
		var boxHeight	= parseInt(GetHeight(this.dragObject.divbox));

		var newTop	= parseInt(posY) - parseInt(this.dragObject.dragDiffY);
		var newLeft	= parseInt(posX) - parseInt(this.dragObject.dragDiffX);

		if(newTop <= 0) {
			newTop = 0;
		} else if(newTop >= (bodyHeight-boxHeight)) {
			newTop = (bodyHeight-boxHeight);
		}

		if(newLeft <= 0) {
			newLeft = 0;
		} else if(newLeft >= (bodyWidth-boxWidth)) {
			newLeft = (bodyWidth-boxWidth);
		}

		SetStyle(this.dragObject.divbox, 'top', newTop + 'px');
		SetStyle(this.dragObject.divbox, 'left', newLeft + 'px');
	} else if(this.dragObject.dragType == 'resize') {
		var boxContentHeight = parseInt(GetStyle(this.dragObject.getContentDiv(), 'height'));

		var newLeft		= boxLeft	= parseInt(GetStyle(this.dragObject.divbox, 'left'));
		var newTop		= boxTop	= parseInt(GetStyle(this.dragObject.divbox, 'top'));
		var newWidth	= boxWidth	= parseInt(GetWidth(this.dragObject.divbox));
		var newHeight	= boxHeight	= boxContentHeight + this.dragObject.headerHeight + this.dragObject.footerHeight;
			
		if(this.dragObject.dragMode == 'ne-resize') {
			newTop		= posY - this.dragObject.dragDiffY;

			newWidth	= posX - newLeft - this.dragObject.dragDiffX;
			newHeight	= boxTop + boxHeight - posY + this.dragObject.dragDiffY;
		} else if(this.dragObject.dragMode == 'nw-resize') {
			newTop		= posY - this.dragObject.dragDiffY;
			newLeft		= posX - this.dragObject.dragDiffX;

			newWidth	= boxLeft + boxWidth - posX + this.dragObject.dragDiffX;
			newHeight	= boxTop + boxHeight - posY + this.dragObject.dragDiffY;
		} else if(this.dragObject.dragMode == 'se-resize') {
			newWidth	= posX - newLeft - this.dragObject.dragDiffX;
			newHeight	= posY - newTop - this.dragObject.dragDiffY;
		} else if(this.dragObject.dragMode == 'sw-resize') {
			newLeft		= posX - this.dragObject.dragDiffX;

			newWidth	= boxLeft + boxWidth - posX + this.dragObject.dragDiffX;
			newHeight	= posY - newTop - this.dragObject.dragDiffY;
		}

		if(newWidth < 180 || newHeight < 50) {
			return;
		}
		
		SetStyle(this.dragObject.divbox, 'left', newLeft + 'px');
		SetStyle(this.dragObject.divbox, 'top', newTop + 'px');
		SetStyle(this.dragObject.divbox, 'width', newWidth + 'px');

		SetStyle(this.dragObject.getContentDiv(), 'height', (newHeight - this.dragObject.headerHeight - this.dragObject.footerHeight) + 'px');
		SetStyle(this.dragObject.getContentDiv(), 'maxHeight', (newHeight - this.dragObject.headerHeight - this.dragObject.footerHeight) + 'px');
	}
	
	if(window.getSelection) {
		var currentSelection = window.getSelection();
		if(currentSelection && currentSelection.removeAllRanges) currentSelection.removeAllRanges();
	} else if(typeof document.selection !== 'undefined') {
		var currentSelection = document.selection;
		if(currentSelection && currentSelection.createRange().text != '') currentSelection.empty();
	}
};

eventManager.prototype.isElementForDrag = function(e) {
	if(!e) e = window.event;

	var currentObject = e.target || e.srcElement || null;
	
	if(currentObject != null) {
		var tagName		= currentObject.tagName;
		var className	= currentObject.className;
		
		if(tagName == 'SELECT' || 
			tagName == 'INPUT' || 
			tagName == 'BUTTON' || 
			tagName == 'LABEL' || 
			tagName == 'TEXTAREA') {
			
			return false;
		} else if(tagName == 'DIV') {
			if(stristr(className, 'boxmenu') || 
				stristr(className, 'results') || 
				stristr(className, 'selectobject') || 
				stristr(className, 'list') || 
				stristr(className, 'field') || 
				stristr(className, 'button')) {
			
				return false;
			}	
		} else if(tagName == 'IMG') {
			if(stristr(currentObject.id, 'action') ||
				stristr(currentObject.src, 'actions') ||
				stristr(currentObject.src, 'toolbar') ) {
			
				return false;
			}	
		}
	}
									
	return true;
};

eventManager.prototype.getDragModeBox = function(e, box) {
	if(!e) e = window.event;
	
	var posY = e.clientY || e.y || e.pageY || null;
	var posX = e.clientX || e.x || e.pageX || null;
		
	var boxContentHeight = parseInt(GetStyle(box.getContentDiv(), 'height'));

	var boxLeft		= parseInt(GetStyle(box.divbox, 'left'));
	var boxTop		= parseInt(GetStyle(box.divbox, 'top'));
	var boxWidth	= parseInt(GetWidth(box.divbox));
	var boxHeight	= parseInt(GetHeight(box.divbox));

	var dragMode = 'dragndrop';

	if((boxLeft+10) < posX && posX < (boxLeft+30)) {
		if((boxTop+10) < posY && posY < (boxTop+30)) {
			dragMode = 'nw-resize';
		} else if((boxTop+boxHeight-30) < posY && posY < (boxTop+boxHeight-10)) {
			dragMode = 'sw-resize';
		}
	} else if((boxLeft+boxWidth-30) < posX && posX < (boxLeft+boxWidth-10)) {
		if((boxTop+10) < posY && posY < (boxTop+30)) {
			dragMode = 'ne-resize';
		} else if((boxTop+boxHeight-30) < posY && posY < (boxTop+boxHeight-10)) {
			dragMode = 'se-resize';
		}
	}
	
	return dragMode;
};

eventManager.prototype.initEventsForBox = function(box) {
	var current = this;

	if(box.eventsInitalized) { return; }
	
	if(getObjectName(box) != 'box' && getObjectName(box) != 'calendar') { return; }

	box.divbox.onmouseover	= function(e) {
									if(!e) e = window.event;
									
									if(!current.isElementForDrag(e)) { return; }
									
									var dragMode = current.getDragModeBox(e, box);
									if(dragMode == 'dragndrop') {
										switchCursor(this, '2');
									} else {
										SetStyle(this, 'cursor', dragMode);
									}
								};
	box.divbox.onmousemove	= function(e) {
									if(!e) e = window.event;
									
									if(!current.isElementForDrag(e)) { return; }
									
									if(this.dragObject) { return; }
									
									var dragMode = current.getDragModeBox(e, box);
									if(dragMode == 'dragndrop') {
										switchCursor(this, '2');
									} else {
										SetStyle(this, 'cursor', dragMode);
									}
								};
	box.divbox.onmouseout	= function(e) {
									if(!e) e = window.event;

									if(!current.isElementForDrag(e)) { return; }
									
									if(!this.dragObject || this.dragObject == null) {
										switchCursor(this, '0');
									}
								};
	box.divbox.onclick		= function(e) {
									if(!e) e = window.event;

									if(BoxManager) {
										if(!BoxManager.boxesforclick) { return; }
									
										BoxManager.setBoxAsTop(box);
									}
								};
	
	box.divbox.onmousedown	= function(e) {
									if(!e) e = window.event;

									if(BoxManager) BoxManager.setBoxAsTop(box);
									
									if(!current.isElementForDrag(e)) { return; }
									
									// Stop current Event
									if(e.preventDefault) {
										e.preventDefault();
										e.stopPropagation();
								    } else {
										e.returnValue = false;
										e.cancelBubble = true;
								    }

									var dragType = '';
									var dragMode = current.getDragModeBox(e, box);
	
									var boxContentHeight = parseInt(GetStyle(box.getContentDiv(), 'height'));
									
									var boxLeft		= parseInt(GetStyle(box.divbox, 'left'));
									var boxTop		= parseInt(GetStyle(box.divbox, 'top'));
									var boxWidth	= parseInt(GetWidth(box.divbox));
									var boxHeight	= boxContentHeight + box.headerHeight + box.footerHeight;
			
									var posY = e.clientY || e.y || e.pageY || null;
									var posX = e.clientX || e.x || e.pageX || null;
		
									if(dragMode == 'nw-resize') {
										dragType = 'resize';
										diffX = boxLeft;
										diffY = boxTop;
									} else if(dragMode == 'ne-resize') {
										dragType = 'resize';
										diffX = boxLeft + boxWidth;
										diffY = boxTop;
									} else if(dragMode == 'sw-resize') {
										dragType = 'resize';
										diffX = boxLeft;
										diffY = boxTop + boxHeight;
									} else if(dragMode == 'se-resize') {
										dragType = 'resize';
										diffX = boxLeft + boxWidth;
										diffY = boxTop + boxHeight;
									} else if(dragMode == 'dragndrop') {
										dragType = 'dragndrop';
										diffX = boxLeft;
										diffY = boxTop;

										// Return at clicking on right scrollbar
										if((boxLeft + boxWidth)-37 < posX) {
											return;
										}
									} else {
										return;
									}

									current.dragObject = box;
									current.dragObject.dragType = dragType;
									current.dragObject.dragMode = dragMode;
									current.dragObject.dragDiffX = posX - diffX;
									current.dragObject.dragDiffY = posY - diffY;
								};

	box.eventsInitalized = true;
};
