/* -------------------------------------------------------------------------- */
/*                         Window Management Methods                          */
/* -------------------------------------------------------------------------- */

function JSV_onBlur() {
	null;
}

function JSV_onFocus() {
	null;
}

function JSV_onLoad() {
	null;
}

function JSV_onResize() {
	null;
}

function JSV_onUnload() {
	if ( !_windowDefintionClosed() ) jsvWDH.close();
	JSV_closeAllWindows();
}

/* -------------------------------------------------------------------------- */
/*                     Single Window Management Methods                       */
/* -------------------------------------------------------------------------- */

function JSV_popWindow(winHandle, winName, winURL, winAttributes, winReplace) {
	var winClosed = false;
	if (winHandle == null) winClosed = true;
	else if (winHandle.closed) winClosed = true;

	if (!winClosed) {
		if (winReplace)
			winHandle.location.replace( winURL );
		else
			winHandle.location.href = winURL;
	}
	else {
		winHandle = window.open(winURL, winName, winAttributes);
	}
	return winHandle;
}

/* -------------------------------------------------------------------------- */
/*                        Window Management Utilities                         */
/* -------------------------------------------------------------------------- */

var jsvWDH = null;

function _windowDefintionClosed() {
	var wdhClosed = false;
	if (jsvWDH == null)
		wdhClosed = true;
	else if (jsvWDH.closed)
		wdhClosed = true;
	return wdhClosed;
}

function JSV_showWindowDefintion(winName) {
	var externalWindowName = winName;
	if ( _windowDefintionClosed() ) {
		jsvWDH = JSV_popWindow( jsvWDH, 
								"WindowDefintion", 
								"JSV_BlankWindow.html", 
								"status=1,scrollbars=1,resizable=1,width=580,height=240,left=0,top=0,screenX=0,screenY=0",
								false );
	}

	var winPointer = _getWindowPointer(winName);
	if (winPointer != WINDOWNOTDEFINED) {
		jsvWDH.document.write("Window Name: ".bold() + externalWindowName + JSV_br());
		jsvWDH.document.write("URL: ".bold() + jsvDefinedWindows[winPointer].wURL + JSV_br());
		jsvWDH.document.write("Attributes: ".bold() + jsvDefinedWindows[winPointer].wAttributes + JSV_br());
		if (jsvDefinedWindows[winPointer].wOptions != null) {
			var i = 0;
			var optionArray = jsvDefinedWindows[winPointer].wOptions;
			jsvWDH.document.write("Options: ".bold() + JSV_br());
			for (i=0; i<optionArray.length; i++) {
				if (optionArray[i] == CLOSEBEFOREPARENT) jsvWDH.document.write(JSV_nbsp(6) + "CLOSEBEFOREPARENT".bold() + JSV_br());
			}
		}
		jsvWDH.document.write("Replace: ".bold() + jsvDefinedWindows[winPointer].wReplace + JSV_br(2));
	}
	else {
		jsvWDH.document.write("Window Name: ".bold() + externalWindowName + " has not been defined." + JSV_br(2));
	}
}

/* -------------------------------------------------------------------------- */
/*                         Window Management Methods                          */
/* -------------------------------------------------------------------------- */

var jsvDefinedWindows = new Array();

var WINDOWNOTDEFINED = null;
var CLOSEBEFOREPARENT = 10001;

function JSV_isWindowOptionSet(winName, winOption) {
	var isOptionSet = false;
	var winPointer = _getWindowPointer(winName);
	if (winPointer != WINDOWNOTDEFINED) {
		if (jsvDefinedWindows[winPointer].wOptions != null) {
			var i = 0;
			var optionsArray = jsvDefinedWindows[winPointer].wOptions;
			for (i=0; i<optionsArray.length; i++) {
				if (optionsArray[i] == winOption) {
					isOptionSet = true;
					break;
				}
			}
		}
	}
	return isOptionSet;
}

function _getWindowPointer(winName) {
	var windowPointer = WINDOWNOTDEFINED,
		nWindows = JSV_numberOfWindowsDefined();

	if (nWindows != 0) {
		var i = 0;
		var internalWindowName = winName.toLowerCase();
		for (i=0; i<nWindows; i++) {
			if (internalWindowName == jsvDefinedWindows[i].wName) {
				windowPointer = i;
				break;
			}
		}
	}
	return windowPointer;
}

function _defineWindow(winHandle, winURL, winName, winAttributes, winReplace, winOptions) {
	this.wHandle = winHandle;
	this.wURL = winURL;
	this.wName = winName;
	this.wAttributes = winAttributes;
	this.wOptions = winOptions;
	this.wReplace = winReplace;
}

function _checkWindowName(winName) {
	if ( !JSV_isWhitespace(winName) )
		return JSV_allowInString(winName.toLowerCase(), jsvLowercaseLetters + jsvDigits + "_");
	else
		return false;
}

function JSV_defineWindow() {
	var winPointer = WINDOWNOTDEFINED;
	var validWindowDefinition = false;

	if (JSV_defineWindow.arguments.length != 0) {
		var winName = JSV_defineWindow.arguments[0].toLowerCase();
		validWindowDefinition = _checkWindowName(winName);
	}

	if (validWindowDefinition) {
		var winURL = JSV_defineWindow.arguments[1];
		var winAttributes = JSV_defineWindow.arguments[2];
		var winReplace = JSV_defineWindow.arguments[3];
		var winOptions = null;

		if (JSV_defineWindow.arguments.length > 4) {
			var i = 0, j = 0;
			winOptions = new Array();
			for (i=4; i<JSV_defineWindow.arguments.length; i++) {
				if (typeof JSV_defineWindow.arguments[i] == "number") {
					winOptions[j++] = JSV_defineWindow.arguments[i];
				}
			}
			if (j < 1) winOptions = null;
		}

		winPointer = _getWindowPointer(winName);
		if (winPointer == WINDOWNOTDEFINED) {
			// Define and open the window
			var nextWindow = JSV_numberOfWindowsDefined();
			var optionsArray = ( winOptions != null ? JSV_splitString(winOptions, ',') : null );
			jsvDefinedWindows[nextWindow] = new _defineWindow(null, winURL, winName, winAttributes, winReplace, winOptions);
			winPointer = nextWindow;
		}
		else {
			if (winAttributes != null) JSV_defineWindow[winPointer].wAttributes = winAttributes;
			if (winURL != null) JSV_defineWindow[winPointer].wURL = winURL;
			if (winReplace != null) JSV_defineWindow[winPointer].wReplace = winReplace;
			if (winOptions != null) JSV_defineWindow[winPointer].wOptions = winOptions;
		}
	}
	return winPointer;
}

function JSV_openWindow() {
	var winName = '';
	var winURL = null;
	var winAttributes = null;
	var winReplace = false;
	var winOptions = null;

	var windowOpened = false;
	if (JSV_openWindow.arguments.length > 0) {
		winName = JSV_openWindow.arguments[0].toLowerCase();
		var windowOpened = _checkWindowName(winName);
	}

	if (windowOpened) {
		if (JSV_openWindow.arguments.length > 1) {
			winURL = JSV_openWindow.arguments[1];
		}
		if (JSV_openWindow.arguments.length > 2) {
			winAttributes = JSV_openWindow.arguments[2];
		}
		if (JSV_openWindow.arguments.length == 4) {
			winReplace = JSV_openWindow.arguments[3];
		}
		if (JSV_openWindow.arguments.length == 5) {
			winOptions = JSV_openWindow.arguments[4];
		}

		var winPointer = _getWindowPointer(winName);
		if (winPointer == WINDOWNOTDEFINED) {
			winPointer = JSV_defineWindow(winName, winURL, winAttributes, winReplace, winOptions);
			jsvDefinedWindows[winPointer].wHandle = window.open(winURL, winName, winAttributes);
		}
		else if ( JSV_isWindowOpen(winName) ) {
			// Display either the default or passed URL
			var displayURL =
				( winURL == null ? jsvDefinedWindows[winPointer].wURL : winURL );
			if ( winReplace == null ? jsvDefinedWindows[winPointer].wReplace : winReplace )
				jsvDefinedWindows[winPointer].wHandle.location.replace( displayURL );
			else
				jsvDefinedWindows[winPointer].wHandle.location.href = displayURL;
		}
		else {
			jsvDefinedWindows[winPointer].wHandle =
				window.open(
					( winURL == null ? jsvDefinedWindows[winPointer].wURL : winURL ),
					winName,
					( winAttributes == null ? jsvDefinedWindows[winPointer].wAttributes : winAttributes )
				);
		}
	}
	return windowOpened;
}

function JSV_numberOfWindowsDefined() {
	return jsvDefinedWindows.length;
}

function JSV_isWindowDefined(winName) {
	return ( _getWindowPointer(winName) == WINDOWNOTDEFINED ? false : true );
}

function JSV_numberOfWindowsOpen() {
	var windowOpenCount = 0;
	var windowCount = JSV_numberOfWindowsDefined();
	if (windowCount != 0) {
		var i = 0;
		for (i=0; i<windowCount; i++) {
			if ( JSV_isWindowOpen(jsvDefinedWindows[i].wName) ) {
				windowOpenCount += 1;
			}
		}
	}
	return windowOpenCount;
}

function JSV_anyWindowsOpen() {
	return ( (JSV_numberOfWindowsOpen() != 0) ? true : false );
}

function JSV_isWindowOpen(winName) {
	var windowOpen = true;
	if (JSV_numberOfWindowsDefined() != 0) {
		var winPointer = _getWindowPointer(winName);
		if ( winPointer != WINDOWNOTDEFINED ) {
			if (jsvDefinedWindows[winPointer].wHandle == null)
				windowOpen = false;
			else if (jsvDefinedWindows[winPointer].wHandle.closed)
				windowOpen = false;
		}
	}
	else {
		windowOpen = false;
	}
	return windowOpen;
}

function JSV_isWindowClosed(winName) {
	return !JSV_isWindowOpen(winName);
}

function JSV_closeWindow(winName) {
	if ( JSV_isWindowOpen(winName) ) {
		var winPointer = _getWindowPointer(winName);
		if ( winPointer != WINDOWNOTDEFINED ) {
			jsvDefinedWindows[winPointer].wHandle.close();
		}
	}
}

function JSV_focusWindow(winName) {
	if ( JSV_isWindowOpen(winName) ) {
		var winPointer = _getWindowPointer(winName);
		if ( winPointer != WINDOWNOTDEFINED ) {
			jsvDefinedWindows[winPointer].wHandle.focus();
		}
	}
}

function JSV_blurWindow(winName) {
	if ( JSV_isWindowOpen(winName) ) {
		var winPointer = _getWindowPointer(winName);
		if ( winPointer != WINDOWNOTDEFINED ) {
			windowBlurred = true;
			jsvDefinedWindows[winPointer].wHandle.blur();
		}
	}
}

function JSV_resizeWindow(winName) {
	null;
}

function _leaveParent() {
	var permissionToLeave = true;
	var windowCount = JSV_numberOfWindowsDefined();
	if (windowCount != 0) {
		var i = 0;
		for (i=0; i<windowCount; i++) {
			if ( JSV_isWindowOpen(jsvDefinedWindows[i].wName) ) {
				if ( JSV_isWindowOptionSet(jsvDefinedWindows[i].wName, CLOSEBEFOREPARENT) ) {
					permissionToLeave = false;
					JSV_focusWindow(jsvDefinedWindows[i].wName);
				}
			}
		}
	}
	return permissionToLeave;
}

function JSV_hyperLink(URL, replace) {
	replace = ( (JSV_hyperLink.arguments[1] == null) ? false : replace );

	if ( _leaveParent() ) {
		if (replace)
			window.location.replace( URL );
		else 
			window.location.href = URL;
	}
}

function JSV_stayOnTop() {
	self.focus();
}

function JSV_closeAllWindows() {
	var windowCount = JSV_numberOfWindowsDefined();
	if (windowCount != 0) {
		var i = 0;
		for (i=0; i<windowCount; i++) {
			if ( JSV_isWindowOpen(jsvDefinedWindows[i].wName) ) {
				jsvDefinedWindows[i].wHandle.close();
			}
		}
	}
}

/* --- Document Manipulation Functions -------------------------------------- */

function JSV_documentWrite(winName, expW) {
	if ( JSV_isWindowOpen(winName) ) {
		var winPointer = _getWindowPointer(winName);
		if ( winPointer != WINDOWNOTDEFINED ) {
			jsvDefinedWindows[winPointer].wHandle.document.write( expW );
		}
	}
}

function JSV_documentClose(winName) {
	if ( JSV_isWindowOpen(winName) ) {
		var winPointer = _getWindowPointer(winName);
		if ( winPointer != WINDOWNOTDEFINED ) {
			jsvDefinedWindows[winPointer].wHandle.document.close();
		}
	}
}

/* -------------------------------------------------------------------------- */
/*                          Form Management Methods                           */
/* -------------------------------------------------------------------------- */

function JSV_onSubmit() {
	return _leaveParent();
}

/* -------------------------------------------------------------------------- */
/*                         JavaScript Debug  Methods                          */
/* -------------------------------------------------------------------------- */

var jsvDebugIndex = 0;
var jsvDebugConsole = "DebugConsole";

function JSV_openDebugConsole() {
	var dcStatus = true;
	var dcAttributes = 
			'scrollbars=1,resizable=1,' + 
			'width=460,height=120,' + 
			'left=320,top=50,screenX=330,screenY=50' +
			( !JSV_isWhitespace(JSV_openDebugConsole.arguments[0]) ? ',' + JSV_openDebugConsole.arguments[0] : '' );

	if ( JSV_isWindowClosed(jsvDebugConsole) ) {
		dcStatus = JSV_openWindow(jsvDebugConsole, '', dcAttributes, false);
		JSV_focusWindow(jsvDebugConsole);
	}

	return dcStatus;
}

function JSV_writeDebug() {
	var argc = JSV_writeDebug.arguments.length;
	if (argc != 0) {
		if ( JSV_openDebugConsole() ) {
			var i = 0;
			var debugData = '';
			for (i=0; i<argc; i++) {
				debugData = debugData + " " + JSV_writeDebug.arguments[i];
			}
			debugData += "<BR>";
			JSV_documentWrite(jsvDebugConsole, debugData);
		}
		else {
			alert("Debug Error: Your brower was not able to open the JavaScript Vision Debug Console.");
		}
	}
}

function JSV_writeDebug2() {
	var argc = JSV_writeDebug2.arguments.length;
	if (argc != 0) {
		if ( JSV_openDebugConsole() ) {
			var i = 0;
			var debugData = JSV_writeDebug2.caller.toString();
			debugData = debugData.substring(9, debugData.indexOf(')') + 1) + ": ";
			for (i=0; i<argc; i++) {
				debugData = debugData + " " + JSV_writeDebug2.arguments[i];
			}
			debugData += "<BR>";
			JSV_documentWrite(jsvDebugConsole, debugData);
		}
		else {
			alert("Debug2 Error: Your brower was not able to open the JavaScript Vision Debug Console.");
		}
	}
}

