var dragDropObject = new sbDragDrop();
var currentSubformId = -1;
var currentSubform = null;
var subformsArray = {};
var sbScreenSize = null;

function initAllSubforms() {
	showSubForms();
//	hideAllSubformSbChanges();
}

function isChangedVar(varName) {
	var result = false;
	var sb_changes	= document.getElementsByName(varName)[0];
	if (sb_changes.value != 0) {
		result = true;
	}
	return result;
}

function resetSubformVar(varName) {
	var sb_changes	= document.getElementsByName(varName)[0];
	if (null != sb_changes) {
		sb_changes.value = 0;
	}
}

function showSbChangesForm(formId) {
	if ((formId < subformSbChangesArray.length) && (formId >= 10)) {
		_drawSubForm('subformSbChanges', subformSbChangesArray[formId], 1, subformSbChangesOffsetX[formId], subformSbChangesOffsetY[formId]);
	}
}

function hideCurrent_subformSbChanges(formId) {
	if ((formId < subformSbChangesArray.length) && (formId >= 10)) {
		_drawSubForm('subformSbChanges', subformSbChangesArray[formId], 0, subformSbChangesOffsetX[formId], subformSbChangesOffsetY[formId]);
	}
}

function hideAllSubformSbChanges() {
	if (typeof(subformSbChangesArray) != 'undefined') {
		for (var i = 10; i < subformSbChangesArray.length; i++ ) {
			_drawSubForm('subformSbChanges', subformSbChangesArray[i], 0, subformSbChangesOffsetX[i], subformSbChangesOffsetY[i]);
		}
	}
}

function showSubForms() {
	if (typeof(subformArray) != 'undefined') {
		for (var i = 0; i < subformArray.length; i++ ) {
			_drawSubForm('subform', subformArray[i], 1, subformOffsetX[i], subformOffsetY[i]);
		}
	}
}

function hideSubForms() {
	for (var i = 0; i < subformArray.length; i++ ) {
		_drawSubForm('subform', subformArray[i], 0, subformOffsetX[i], subformOffsetY[i]);
	}
}

function hideCurrent_subform(formId) {
	_drawSubForm('subform', subformArray[formId], 0, subformOffsetX[formId], subformOffsetY[formId]);
}

function _updateSubFormElement(flag, element, left, top, width, height) {
	if (null != element) {
		if (flag == 1) {
			_showSubFormElement(element);
		} else {
			_hideSubFormElement(element);
		}
		_updateSubFormElementStyle(flag, element, left, top, width, height);
	}
}

function _updateVisibility(flag, element) {
	if (null != element) {
		if (flag == 1) {
			_showSubFormElement(element);
		} else {
			_hideSubFormElement(element);
		}
	}
}

function _updateSubFormElementStyle(flag, element, left, top, width, height) {
	if ((flag == 1) || (subformBrowserIsIE != 1)) {
		element.style.left = left + "px"
		element.style.top = top + "px";
		element.style.width = width + "px";
		element.style.height = height + "px";
	}
}

function _updateSubFormElementPosition(element, left, top) {
	if (null != element)
	{
		element.style.left = left + "px"
		element.style.top = top + "px";
	}
}

function _updateSubFormWidth(flag, element, width) {
	if ((width >= 0) && (flag == 1) || (subformBrowserIsIE != 1)) {
		element.style.width = width + "px";
	}
}

function _updateSubFormHeight(flag, element, height) {
	if ((height >= 0) && (flag == 1) || (subformBrowserIsIE != 1)) {
		element.style.height = height + "px";
	}
}

function _hideSubFormElement(element) {
	element.style.visibility = 'hidden';
	element.style.display = 'none';
}

function _showSubFormElement(element) {
	element.style.visibility = 'visible';
	element.style.display = 'block';
}

// Draw SubForm
function _drawSubForm(name, formId, flag, offsetX, offsetY) {
	var endOffset = 40; //const
  	var x,y;
  	if (self.innerHeight) {// all except Explorer
		x = self.innerWidth;
    	y = self.innerHeight;
		window.scrollbars.visible = true;
  	} else if (document.documentElement && document.documentElement.clientHeight) {// Explorer 6 Strict Mode
   		x = document.documentElement.clientWidth;
   		y = document.documentElement.clientHeight;
  	} else if (document.body) {// other Explorers
   		x = document.body.clientWidth;
   		y = document.body.clientHeight;
  	}
	var iframe = document.getElementById('SB_' + name + '_iframe_' + formId);
	var table = document.getElementById('SB_' + name + '_table_' + formId);
	var td = document.getElementById('SB_' + name + '_td_' + formId);
  	var desktop = document.getElementById('SB_' + name + '_desktop');
	if (null != desktop) {
		desktop.style.zIndex = 1;
	}
	_updateSubFormElement(flag, desktop, '0', '0', x, y);
//	_updateSubFormElement(flag, desktop, '0', '0', x, self.screen.height - self.outerHeight);
	_updateSubFormElement(flag, table, '0', '0', x, y);
//	_updateSubFormElement(flag, table, '0', '0', x, self.screen.height - self.outerHeight);

	var screenWidth = x - endOffset;
	var screenHeight = y - endOffset;
	if (screenWidth <= 0) screenWidth = 10;
	if (screenHeight <= 0) screenHeight = 10;
	if (null == sbScreenSize) {
		sbScreenSize = new sbSubformScreenSize(screenWidth, screenHeight);
	}
	var sourceWidth = screenWidth;
	var sourceHeight = screenHeight;
	var sourceTable = document.getElementById('SB_' + name + '_source_' + formId);
	var sourceFields = document.getElementById('SB_' + name + '_source_fields_' + formId);
	var sourceButtons = document.getElementById('SB_' + name + '_source_buttons_' + formId);
	var sourceDiv = document.getElementById('SB_' + name + '_source_div_' + formId);
	var title = document.getElementById('SB_' + name + '_title_' + formId);
	var dilator = document.getElementById('SB_' + name + '_source_dilator_' + formId);
	var div = document.getElementById('SB_' + name + '_div_' + formId);
	
	if (null != sourceTable) {
		if (subformBrowserIsIE == 1) {
			_showSubFormElement(sourceTable);
			_showSubFormElement(div);
		}
		sourceWidth = _getWidth(sourceTable);
		if (sourceWidth <= 0) sourceWidth = 10;
		
		var width = _getWidth(sourceFields);
		if (width <= 0) width = 10;

		if (sourceWidth > screenWidth) {
			sourceWidth = screenWidth;
		}
		if ((sourceWidth < width) && (width < screenWidth)) {
			sourceWidth = width;
		}
//		_updateSubFormWidth(flag, sourceDiv, sourceWidth);
//		_updateSubFormWidth(flag, sourceTable, sourceWidth);
		sourceHeight = _getHeight(sourceTable);
		if (sourceHeight <= 0) sourceHeight = 10;
		var height = _getHeight(sourceFields);
		if (height <= 0) height = 10;
		if (sourceHeight > screenHeight) {
			sourceHeight = screenHeight;
		}
		if ((sourceHeight < height) && (height < screenHeight)) {
			sourceHeight = height;
		}
		if (flag != 1) {
			_hideSubFormElement(div);
			_hideSubFormElement(sourceTable);
		}
	}
	var top = Math.ceil(screenHeight/2 + (offsetY*screenHeight)/100 - (sourceHeight/2));
	var left = Math.ceil(screenWidth/2 + (offsetX*screenWidth)/100 - (sourceWidth/2));
	if (left + sourceWidth > screenWidth) left = screenWidth - sourceWidth;
	if (top + sourceHeight > screenHeight) top = screenHeight - sourceHeight;
	if (left <= 0) left = 10;
	if (top <= 0) top = 10;
	if (null != td && !document.all) {
		td.style.width = window.innerWidth + "px";
		td.style.height = window.innerHeight + "px";
	}
	
	if (null != dilator)
	{
		_updateSubFormWidth(flag, dilator, sourceWidth);
	}
	_updateSubFormElement(flag, sourceTable, left, top, sourceWidth, sourceHeight);
	_updateSubFormElement(flag, iframe, left, top, sourceWidth + 2, sourceHeight + 2);
	_updateSubFormHeight(flag, sourceDiv, 1);
	_updateSubFormElement(flag, div, left, top, sourceWidth, sourceHeight); // 10px is defined in style
	_updateSubFormWidth(flag, sourceDiv, sourceWidth); // 10px is defined in style

	var titleHeight = 0;
	
	if (null != title) {
		titleHeight += _getHeight(title);
	}
	if (null != sourceButtons) {
		titleHeight += _getHeight(sourceButtons);
	}

	_updateSubFormHeight(flag, sourceDiv, sourceHeight - 16 - titleHeight); // 16px is defined in style
	_updateSubFormHeight(flag, sourceFields, sourceHeight - 16 - titleHeight); // 16px is defined in style
	_initCurrentMethods(flag, name, formId, sourceWidth, sourceHeight);
}

function _getWidth(element) {
	var result = parseInt(element.style.width);

	if (isNaN(result) || (result < element.scrollWidth)) {
		result = element.scrollWidth;
	}
	return result;
}

function _getHeight(element) {
	var result = parseInt(element.style.height);

	if (isNaN(result) || (result < element.scrollHeight)) {
		result = element.scrollHeight;
	}
	return result;
}

function _initCurrentMethods(flag, name, formId, width, height) {
	formId = parseInt(formId);
	if (flag == 1) {
		if ((null != subformCloseMethodsArray[formId]))	{
			currentSubformCloseMethod = subformCloseMethodsArray[formId];
		}
		if (null != subformResetMethodsArray[formId + 1]) {
			if (null == currentSubformResetMethod) {
				currentSubformResetMethod = subformResetMethodsArray[formId + 1];
				currentSubformId = formId + 1;
			} else {
				if (formId > currentSubformId) {
					currentSubformResetMethod = subformResetMethodsArray[formId + 1];
					currentSubformId = formId + 1;
				}
			}
		}
		subformsArray[formId] = new sbSubform(name, formId, width, height);
		currentSubform = subformsArray[formId];
		initDragDrop();
	}
	else {
		if ((formId > 0) && (null != subformCloseMethodsArray[formId - 1])) {
			currentSubformCloseMethod = subformCloseMethodsArray[formId - 1];
		}
		if ((formId >= 0) && (null != subformResetMethodsArray[formId])) {
			currentSubformResetMethod = subformResetMethodsArray[formId];
		}
		var newId = formId - 1;
		if (null != currentSubform) {
			currentSubform = null;
			subformsArray[formId] = null;
		}
		while ((newId > 0) && (null == subformsArray[newId])) {
			newId--;
		}
		if (null != subformsArray[newId]) {
			currentSubform = subformsArray[newId];
		}
	}
}

/*
 window.sizeToContent();

 

		for (var i in title) {
			alert('title.' + i + '=' + title[i]);
		}
*/

function sbSubform(name, formId, width, height) {
	this.name = name;
	this.formId = formId;
	this.width = width;
	this.height = height;
}

function sbSubformScreenSize(width, height) {
	this.width = width;
	this.height = height;
}

function sbChangesEvent(apply, discard, formId) {
	this.Apply = function() {
		eval(apply);
	}
	this.Discard = function() {
		eval(discard);
	}
	this.Cancel = function() {
		hideCurrent_subformSbChanges(formId);
		return false;
	}
}

function sbChangesApply() {
	if (null != currentSubformSbChangesEvent) {
		try {
			currentSubformSbChangesEvent.Apply();
		}
		catch (e) {
		}
	}
}

function sbChangesDiscard() {
	if (null != currentSubformSbChangesEvent) {
		try {
			currentSubformSbChangesEvent.Discard();
		}
		catch (e) {
		}
	}
}

function sbChangesCancel() {
	if (null != currentSubformSbChangesEvent) {
		try {
			currentSubformSbChangesEvent.Cancel();
		}
		catch (e) {
		}
	}
}






function sbSubformMethod (methodName, methodBody, formId) {
	this.formId = formId;
	try {
		methodBody = methodBody.replace(/\x27/ig, '\\\'');
		var initStr = 'this.' + methodName + ' = function() { eval(\'' + methodBody + '\'); }';
		eval(initStr);
	} catch(e) {
//			alert (e);
	}
}

function resetChangesOfCurrentSubform() {
	if (null != currentSubformResetMethod) {
		try {
			currentSubformResetMethod.ResetChanges();
		}
		catch (e) {
//			alert (e);
		}
	}
}

function closeCurrentSubform() {
	if (null != currentSubformCloseMethod) {
		try {
			currentSubformCloseMethod.Close();
		}
		catch (e) {
//			alert (e);
		}
	}
}

function initDragDrop() {
	if (null != currentSubform) {
		var titleLeft = document.getElementById('SB_' + currentSubform.name + '_title_left_' + currentSubform.formId);
		var titleRight = document.getElementById('SB_' + currentSubform.name + '_title_right_' + currentSubform.formId);

		sbDragDrop._addEvent(titleLeft, "mousedown", sbDragDrop.dragStart);
		sbDragDrop._addEvent(titleRight, "click", sbDragDrop.dragStart);
	}
}

function sbDragDrop() {
	this._dragging = false;
	this._doc = document;
	this._horizontalOffset = 0;
	this._verticalOffset = 0;
	this._width = 0;
	this._height = 0;
	this._popupDiv = null;
	this._popupSourceDiv = null;
	this._popupIframe = null;
	this._popupDesktop = null;
}

sbDragDrop.dragStart = function(event) {
	if ((dragDropObject._dragging) || (null == currentSubform)) {
		return false;
	}
	dragDropObject._dragging = true;
	
	dragDropObject._width = currentSubform.width;
	dragDropObject._height = currentSubform.height;

	dragDropObject._popupDiv = document.getElementById('SB_' + currentSubform.name + '_div_' + currentSubform.formId);
	dragDropObject._popupSourceDiv = document.getElementById('SB_' + currentSubform.name + '_source_div_' + currentSubform.formId);
	dragDropObject._popupDesktop = document.getElementById('SB_' + currentSubform.name + '_desktop');
	if (subformBrowserIsIE) {
		dragDropObject._popupIframe = document.getElementById('SB_' + currentSubform.name + '_iframe_' + currentSubform.formId);
	} else {
		dragDropObject._popupDummyImage = document.getElementById('SB_' + currentSubform.name + '_dummy_image_' + currentSubform.formId);
	}

	if (subformBrowserIsIE) {
		event = window.event;
	}
	var posX = event.clientX;
	var posY = event.clientY;
	
	if (subformBrowserIsIE) {
		posY += document.body.scrollTop;
		posX += document.body.scrollLeft;
	} else {
		posY += window.scrollY;
		posX += window.scrollX;
	}
	sbDragDrop._initOffset(posX, posY);

/*	
	if ((!subformBrowserIsIE) && 
		((parseInt(dragDropObject._popupSourceDiv.offsetWidth) > parseInt(dragDropObject._popupSourceDiv.scrollWidth)) ||
		(parseInt(dragDropObject._popupSourceDiv.offsetHeight) > parseInt(dragDropObject._popupSourceDiv.scrollHeight)))) {
*/
//	if (!subformBrowserIsIE) {
	if ((!subformBrowserIsIE) && 
		((parseInt(dragDropObject._popupSourceDiv.offsetWidth) > parseInt(dragDropObject._popupSourceDiv.scrollWidth)) ||
		(parseInt(dragDropObject._popupSourceDiv.offsetHeight) > parseInt(dragDropObject._popupSourceDiv.scrollHeight)))) {
		 dragDropObject._popupDummyImage.style.width = dragDropObject._popupSourceDiv.offsetWidth + "px";
		 dragDropObject._popupDummyImage.style.height = dragDropObject._popupSourceDiv.offsetHeight + "px";

		 _hideSubFormElement(dragDropObject._popupSourceDiv);
		 _showSubFormElement(dragDropObject._popupDummyImage);
	}
	
	sbDragDrop._addEvent(dragDropObject._doc, "mousemove", sbDragDrop.dragMove);
	sbDragDrop._addEvent(dragDropObject._doc, "mouseover", sbDragDrop._stopEvent);
	sbDragDrop._addEvent(dragDropObject._doc, "mouseup", sbDragDrop.dragEnd);

	sbDragDrop._stopEvent(event);
}

sbDragDrop._initOffset = function(posX, posY) {
	dragDropObject._horizontalOffset = posX - parseInt(dragDropObject._popupDiv.style.left);
	dragDropObject._verticalOffset = posY - parseInt(dragDropObject._popupDiv.style.top);
}

sbDragDrop.dragMove = function(event) {
	if ((!dragDropObject._dragging) || (null == currentSubform)) {
		return false;
	}
	if (subformBrowserIsIE) {
		event = window.event;
	}
	var posX = event.clientX;
	var posY = event.clientY;
	
	if (subformBrowserIsIE) {
		posY += document.body.scrollTop;
		posX += document.body.scrollLeft;
	} else {
		posY += window.scrollY;
		posX += window.scrollX;
	}
	sbDragDrop._moveWindow(posX, posY);
	sbDragDrop._stopEvent(event);
}

sbDragDrop._moveWindow = function(posX, posY) {
	if ((!dragDropObject._dragging) || (null == currentSubform)) {
		return false;
	}
	var left = posX - dragDropObject._horizontalOffset;
	var top = posY - dragDropObject._verticalOffset;
	if ((left + dragDropObject._width) > sbScreenSize.width) {
		left = sbScreenSize.width - dragDropObject._width;
	}
	if ((top + dragDropObject._height) > sbScreenSize.height) {
		top = sbScreenSize.height - dragDropObject._height;
	}
	if (left < 10) {
		left = 10;
	}
	if (top < 10) {
		top = 10;
	}
	_updateSubFormElementPosition(dragDropObject._popupDiv, left, top);
	if (subformBrowserIsIE) {
		_updateSubFormElementPosition(dragDropObject._popupIframe, left, top);
	}
}

sbDragDrop.dragEnd = function(event) {
	if (subformBrowserIsIE) {
		event = window.event;
	}
	dragDropObject._dragging = false;
	sbDragDrop._removeEvent(dragDropObject._doc, "mouseup", sbDragDrop.dragEnd);
	sbDragDrop._removeEvent(dragDropObject._doc, "mouseover", sbDragDrop._stopEvent);
	sbDragDrop._removeEvent(dragDropObject._doc, "mousemove", sbDragDrop.dragMove);

	if (!subformBrowserIsIE) {
		 _hideSubFormElement(dragDropObject._popupDummyImage);
		 _showSubFormElement(dragDropObject._popupSourceDiv);
	}
	
	sbDragDrop._stopEvent(event);
}

sbDragDrop._addEvent = function(element, evname, func) {
	if (subformBrowserIsIE) {
		element.attachEvent("on" + evname, func);
	} else {
		element.addEventListener(evname, func, true);
	}
}

sbDragDrop._removeEvent = function(element, evname, func) {
	if (subformBrowserIsIE) {
		element.detachEvent("on" + evname, func);
	} else {
		element.removeEventListener(evname, func, true);
	}
}

sbDragDrop._stopEvent = function(event) {
	if (subformBrowserIsIE) {
		event.cancelBubble = true;
		event.returnValue = false;
	} else {
		event.preventDefault();
		event.stopPropagation();
	}
};
