Note Heading

Index

Sections

DOCTYPE

Page1

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Strict//EN" "http://www.w3.org/TR/html4/strict.dtd">

html

Page1

<html lang="en"> 

head

Page1

<head>

title

Page1

<title>Progress Dialog Box - Test Page</title>

link

Page1

<link rel="stylesheet" type="text/css" href="common.css" />

script imports

Page1

<script type="text/javascript" src="common.js"></script>

Old

<script type="text/javascript" src="EB_addin_Test.js"></script>

script - start

Page1

<script type="text/javascript">

Test_ShowModelessDialog()

Page1

function Test_ShowModelessDialog()
{
	var p = new classProgressDialogModeless();

	function loop()
	{

		var total /*: int*/ = 10000;

		p.start();

		for (var i /*: int*/ = 0; i < total; i++)
		{
			p.setBarOneProgress(i + 1, total);
			if (p.stopped) { break; }
		}
	}

	loop();  // no need for any window.setTimeout
}

classProgressDialogModeless - START

Code

var classProgressDialogModeless /*: Function*/ = (function(){

classProgressDialogModeless(config : Object)

Code

function classProgressDialogModeless( 
	config /*: Object*/
)
{
	this.dialog /*: Window*/;
	this.doc /*: HTMLDocument*/;
	this.config /*: Object*/;
	this.stopped /*: Boolean*/;

	this.barOneUnits /*: int*/;
	this.barOneTable /*: HTMLTableElement*/;
	this.barOneRow /*: HTMLTableRowElement*/;
	this.barOneLit /*: int*/;
	this.barOneCountField /*: HTMLParagraphElement*/;
	this.barOneCountFieldText /*: Text*/;

	this.stopButton /*: HTMLInputElement*/;

	this.initialise(config);
}

var constr /*: Function*/ = classProgressDialogModeless;
var proto /*: Object*/ = ExtendClass(classProgressDialogModeless, Object);

initialise(config : Object) : void

Code

function initialise(
	config /*: Object*/
) /*: void*/
{
	var me /*: classProgressDialog*/ = this;
	var height /*: int*/;
	var defaults /*: Object*/; 
	var dialogOptions /*: String*/;
	var doc /*: HTMLDocument*/;
	var style /*: CSSStyleDeclaration*/;
	var elm /*: HTMLElement*/;
	var elmInner /*: HTMLElement*/;
	var table /*: HTMLTableElement*/;
	var row /*: HTMLTableRowElement*/
	var cell /*: HTMLTableCellElement*/;
	var text /*: Text*/;
	var tbody /*: HTMLTableSectionElement*/;
	var hr /*: HTMLHRElement*/;
	var times /*: int*/ = 5;

	// DEFAULT CONFIGURATION

	defaults = { 
		width : 400,
		windowTitle : "Test 1 - showModelessDialog",
		barOneUnits : 20,
		stopButton : true,
		closeButton: true
	};

	// DEFAULT APPLIES IF NOT SPECIFIED IN USER SUPPLIED CONFIG

	if (!config) { config = {}; }

	for (var k /*: String*/ in defaults)
	{
		if (typeof config[k] == typeof defaults[k]) { continue; }
		config[k] = defaults[k];
	}

	this.config = config;

	// OPEN MODELESS DIALOG

	dialogOptions = "dialogHeight:10px; dialogWidth:" + config.width + "px; center:no; edge:raised; help:no; resizable:no; scroll:no; status:no; unadorned:no;";
	this.dialog = window.showModelessDialog("046-stub.htm", this, dialogOptions);

	while(times--)
	{
		doc = this.dialog.document;
		if (doc) { break; }
		Sleep(200);
	}

	this.doc = doc;

	// STYLES
	var head /*: HTMLHeadElement*/ = doc.getElementsByTagName("head")[0];
	var link /*: HTMLLinkElement*/ = doc.createElement("link");
		
	link.type = "text/css";
	link.rel = "stylesheet";
	link.href =  "common.css";
	link.media = "screen";

	head.appendChild(link);

	// DIALOG TITLE

	this.setWindowTitle(config.windowTitle);

	container = doc.createElement("div");
	container.className = "classProgressDialogContainer";
	doc.body.appendChild(container);

	// BAR ONE

	this.barOneUnits = (typeof config.barOneUnits == "number") ? Math.floor(config.barOneUnits) : 10; 

	// BAR ONE TABLE

	table = doc.createElement("table");
	table.className	= "classProgressDialogBarOneTable";
	table.style.width = config.width + "px";
	table.cellPadding = "0";
	table.cellSpacing = "2";

	tbody = doc.createElement("tbody");
	table.appendChild(tbody);

	row = doc.createElement("tr");
	tbody.appendChild(row);

	for (var i /*: int*/ = 0; i < this.barOneUnits; i++)
	{
		cell = doc.createElement("td");
		cell.className = "classProgressDialogBarOneCell";
		row.appendChild(cell);
	}

	container.appendChild(table);

	this.barOneTable = table;
	this.barOneRow = row;
	this.barOneLit = 0;

	elm = doc.createElement("p");
	elm.className = "classProgressDialogBarOneCount";
	text = doc.createTextNode("0 of 0");
	elm.appendChild(text);
	container.appendChild(elm);
	this.barOneCountField = elm;
	this.barOneCountFieldText = text;

	addSeparator(); 

	// STOP BUTTON

	if (config.stopButton)
	{
		elm = doc.createElement("input");
		elm.type = "button";
		elm.className = "classProgressDialogStopButton";
		container.appendChild(elm);

		elm.value = "Stop";
		elm.onclick = function () { me.stop(); };

		this.stopButton = elm;
	}

	// CLOSE BUTTON

	if (config.closeButton)
	{
		elm = doc.createElement("input");
		elm.type = "button";
		elm.className = "classProgressDialogCloseButton";
		container.appendChild(elm);

		elm.value = "Close";
		elm.onclick = function () { me.close(); };

		this.closeButton = elm;
	}

	// DIMENSION WINDOW BASED ON CONTENT

	this.dialog.dialogWidth = container.offsetWidth + "px";
	this.dialog.dialogHeight = container.offsetHeight + "px"; 

	// START

	this.stopped = false; 

	// FUNCTIONS

	function addSeparator()
	{
		hr = doc.createElement("hr");
		container.appendChild(hr);
	}
}

AddMethod(constr, initialise);

start() : void

Page1

function start() /*: void*/
{
	HTMLElement_AddClassName(this.stopButton, "classProgressDialogStopButtonActive");
}

AddMethod(constr, start);

setWindowTitle(s : String)

Page1

function setWindowTitle(
	s /*: String*/
) /*: void*/
{
	if (!this.doc) { return; }
	this.doc.title = s;
}

AddMethod(constr, setWindowTitle);

setBarOneProgress(progress : int, total : int): void

Page1

function setBarOneProgress(
	progress /*: int*/,
	total /*: int*/
)/*: void*/
{
	if (this.barOneCountFieldText) 
	{ 
		this.barOneCountFieldText.nodeValue = progress + " of " + total;
	}

	if (!this.barOneRow) { return; }
	
	var count /*: int*/ = Math.floor((progress/total) * this.barOneUnits);

	if (count == this.barOneLit) { return; }

	for (var i /*: int*/ = 0; i < count; i++)
	{ 
		HTMLElement_AddClassName(this.barOneRow.cells[i], "classProgressDialogBarOneCellHighlight");
	}

	this.barOneLit = count;

	if (progress + 1 >= total)
	{
		HTMLElement_RemoveClassName(this.stopButton, "classProgressDialogStopButtonActive");
	}
}

AddMethod(constr, setBarOneProgress);

resetBarOneProgress(): void

Page1

function resetBarOneProgress()/*: void*/
{
	if (this.barOneCountFieldText) 
	{ 
		this.barOneCountFieldText.nodeValue = "0 of 0";
	}

	if (!this.barOneRow) { return; }
	
	for (var i /*: int*/ = 0; i < this.barOneRow.cells.length; i++)
	{ 
		HTMLElement_RemoveClassName(this.barOneRow.cells[i], "classProjectDialogBarOneCellHighlight");
	}

	this.barOneLit = 0;
}

AddMethod(constr, resetBarOneProgress);

close() : void

Page1

function close() /*: void*/
{
	if (!this.dialog) { return; }
	this.stop();
	this.dialog.close();
}

AddMethod(constr, close);

stop() : void

Page1

function stop() /*: void*/
{
	HTMLElement_RemoveClassName(this.stopButton, "classProgressDialogStopButtonActive");
	this.stopped = true;
}

AddMethod(constr, stop);

classProgressDialogModeless - END

Code

	return constr;
})();

Test_ShowModalDialog()

Page1

function Test_ShowModalDialog()
{
	var p = new classProgressDialogModal();

	p.initialise({
		callFunction : loop
	});

	function loop()
	{

		var total /*: int*/ = 10000;

		p.start();

		for (var i /*: int*/ = 0; i < total; i++)
		{
			p.setBarOneProgress(i + 1, total);
			if (p.stopped) { break; }
		}
	}
}

classProgressDialogModal - START

Code

var classProgressDialogModal /*: Function*/ = (function(){

classProgressDialogModal(config : Object)

Code

function classProgressDialogModal( 
	config /*: Object*/
)
{
	this.dialog /*: Window*/;
	this.doc /*: HTMLDocument*/;
	this.config /*: Object*/;
	this.stopped /*: Boolean*/;

	this.barOneUnits /*: int*/;
	this.barOneTable /*: HTMLTableElement*/;
	this.barOneRow /*: HTMLTableRowElement*/;
	this.barOneLit /*: int*/;
	this.barOneCountField /*: HTMLParagraphElement*/;
	this.barOneCountFieldText /*: Text*/;

	this.dheight;
	this.dwidth;

	this.stopButton /*: HTMLInputElement*/;
	this.closeButton /*: HTMLInputElement*/;
}

var constr /*: Function*/ = classProgressDialogModal;
var proto /*: Object*/ = ExtendClass(classProgressDialogModal, Object);

initialise(config : Object) : void

Code

function initialise(
	config /*: Object*/
) /*: void*/
{
	var me /*: classProgressDialog*/ = this;
	var height /*: int*/;
	var defaults /*: Object*/; 
	var dialogOptions /*: String*/;
	var doc /*: HTMLDocument*/;
	var style /*: CSSStyleDeclaration*/;
	var elm /*: HTMLElement*/;
	var elmInner /*: HTMLElement*/;
	var table /*: HTMLTableElement*/;
	var row /*: HTMLTableRowElement*/
	var cell /*: HTMLTableCellElement*/;
	var text /*: Text*/;
	var tbody /*: HTMLTableSectionElement*/;
	var hr /*: HTMLHRElement*/;
	var times /*: int*/ = 5;

	// DEFAULT CONFIGURATION

	defaults = { 
		width : 400,
		windowTitle : "Test 2 - showModalDialog",
		barOneUnits : 20,
		stopButton : true,
		closeButton: true,
		callFunction : function(){}
	};

	// DEFAULT APPLIES IF NOT SPECIFIED IN USER SUPPLIED CONFIG

	if (!config) { config = {}; }

	for (var k /*: String*/ in defaults)
	{
		if (typeof config[k] == typeof defaults[k]) { continue; }
		config[k] = defaults[k];
	}

	this.config = config;

	// OPEN MODAL DIALOG

	dialogOptions = "dialogHeight:10px; dialogWidth:" + config.width + "px; center:no; edge:raised; help:no; resizable:no; scroll:no; status:no; unadorned:no;";
	this.dialog = window.showModalDialog("046-modalstub.htm", this, dialogOptions);
}

AddMethod(constr, initialise);

initialise2(win : Window, doc : HTMLDocument) : void

Code

function initialise2(
	win /*: Window*/,
	doc /*: HTMLDocument*/
) /*: void*/
{
	var me /*: classProgressDialog*/ = this;
	var height /*: int*/;
	var defaults /*: Object*/; 
	var dialogOptions /*: String*/;
	var doc /*: HTMLDocument*/;
	var style /*: CSSStyleDeclaration*/;
	var elm /*: HTMLElement*/;
	var elmInner /*: HTMLElement*/;
	var table /*: HTMLTableElement*/;
	var row /*: HTMLTableRowElement*/
	var cell /*: HTMLTableCellElement*/;
	var text /*: Text*/;
	var tbody /*: HTMLTableSectionElement*/;
	var hr /*: HTMLHRElement*/;
	var times /*: int*/ = 5;

	var config = this.config;
	this.dialog = win;
	this.doc = doc;

	// STYLES
	var head /*: HTMLHeadElement*/ = doc.getElementsByTagName("head")[0];
	var link /*: HTMLLinkElement*/ = doc.createElement("link");
		
	link.type = "text/css";
	link.rel = "stylesheet";
	link.href =  "common.css";
	link.media = "screen";

	head.appendChild(link);

	// DIALOG TITLE

	this.setWindowTitle(config.windowTitle);

	container = doc.createElement("div");
	container.className = "classProgressDialogContainer";
	doc.body.appendChild(container);

	// BAR ONE

	this.barOneUnits = (typeof config.barOneUnits == "number") ? Math.floor(config.barOneUnits) : 10; 

	// BAR ONE TABLE

	table = doc.createElement("table");
	table.className	= "classProgressDialogBarOneTable";
	table.style.width = config.width + "px";
	table.cellPadding = "0";
	table.cellSpacing = "2";

	tbody = doc.createElement("tbody");
	table.appendChild(tbody);

	row = doc.createElement("tr");
	tbody.appendChild(row);

	for (var i /*: int*/ = 0; i < this.barOneUnits; i++)
	{
		cell = doc.createElement("td");
		cell.className = "classProgressDialogBarOneCell";
		row.appendChild(cell);
	}

	container.appendChild(table);

	this.barOneTable = table;
	this.barOneRow = row;
	this.barOneLit = 0;

	elm = doc.createElement("p");
	elm.className = "classProgressDialogBarOneCount";
	text = doc.createTextNode("0 of 0");
	elm.appendChild(text);
	container.appendChild(elm);
	this.barOneCountField = elm;
	this.barOneCountFieldText = text;

	addSeparator(); 


	// STOP BUTTON

	if (config.stopButton)
	{
		elm = doc.createElement("input");
		elm.type = "button";
		elm.className = "classProgressDialogStopButton";
		container.appendChild(elm);

		elm.value = "Stop";
		elm.onclick = function () { me.stop(); };

		this.stopButton = elm;
	}

	// CLOSE BUTTON

	if (config.closeButton)
	{
		elm = doc.createElement("input");
		elm.type = "button";
		elm.className = "classProgressDialogCloseButton";
		container.appendChild(elm);

		elm.value = "Close";
		elm.onclick = function () { me.close(); };

		this.closeButton = elm;
	}

	// DIMENSION WINDOW BASED ON CONTENT

	this.dialog.dialogWidth = container.offsetWidth + "px";
	this.dialog.dialogHeight = container.offsetHeight + "px"; 

	this.dheight = this.dialog.dialogHeight;
	this.dwidth = this.dialog.dialogWidth;

	// START

	this.stopped = false; 

	// does not work
	if (this.config.callFunction) { 
		win.setTimeout(function(){me.config.callFunction()}, 200); 
	}

	// FUNCTIONS

	function addSeparator()
	{
		hr = doc.createElement("hr");
		container.appendChild(hr);
	}
}

AddMethod(constr, initialise2);

start() : void

Page1

function start() /*: void*/
{
	HTMLElement_AddClassName(this.stopButton, "classProgressDialogStopButtonActive");
}

AddMethod(constr, start);

setWindowTitle(s : String)

Page1

function setWindowTitle(
	s /*: String*/
) /*: void*/
{
	if (!this.doc) { return; }
	this.doc.title = s;
}

AddMethod(constr, setWindowTitle);

setBarOneProgress(progress : int, total : int): void

Page1

function setBarOneProgress(
	progress /*: int*/,
	total /*: int*/
)/*: void*/
{
	//this.dialog.dialogHeight = this.dheight;
	//this.dialog.dialogWidth = this.dwidth;

	if (this.barOneCountFieldText) 
	{ 
		this.barOneCountFieldText.nodeValue = progress + " of " + total;
	}

	if (!this.barOneRow) { return; }
	
	var count /*: int*/ = Math.floor((progress/total) * this.barOneUnits);

	if (count == this.barOneLit) { return; }

	for (var i /*: int*/ = 0; i < count; i++)
	{ 
		HTMLElement_AddClassName(this.barOneRow.cells[i], "classProgressDialogBarOneCellHighlight");
	}

	this.barOneLit = count;

	if (progress + 1 >= total)
	{
		HTMLElement_RemoveClassName(this.stopButton, "classProgressDialogStopButtonActive");
	}
}

AddMethod(constr, setBarOneProgress);

resetBarOneProgress(): void

Page1

function resetBarOneProgress()/*: void*/
{
	if (this.barOneCountFieldText) 
	{ 
		this.barOneCountFieldText.nodeValue = "0 of 0";
	}

	if (!this.barOneRow) { return; }
	
	for (var i /*: int*/ = 0; i < this.barOneRow.cells.length; i++)
	{ 
		HTMLElement_RemoveClassName(this.barOneRow.cells[i], "classProjectDialogBarOneCellHighlight");
	}

	this.barOneLit = 0;
}

AddMethod(constr, resetBarOneProgress);

close(timeout : int) : void

Page1

function close(
	timeout /*: int*/
) /*: void*/
{
	if (!this.dialog) { return; }

	this.stop();

	if (typeof timeout == "number")
	{
		var me /*: classProgressDialog*/ = this;
		window.setTimeout(function(){ me.dialog.close(); }, timeout);
	}
	else
	{
		this.dialog.close();
	}
}

AddMethod(constr, close);

stop() : void

Page1

function stop() /*: void*/
{
	HTMLElement_RemoveClassName(this.stopButton, "classProgressDialogStopButtonActive");
	this.stopped = true;
}

AddMethod(constr, stop);

classProgressDialog - END

Code

	return constr;
})();

Test_WindowOpen_IE()

Page1

function Test_WindowOpen_IE()
{
	var p = new classProgressDialogOpenIE();

	function loop()
	{
		var total /*: int*/ = 10000;

		p.start();

		for (var i /*: int*/ = 0; i < total; i++)
		{
			p.setBarOneProgress(i + 1, total);
			if (p.stopped) { break; }
		}
	}

	window.setTimeout(loop, 500);
}

classProgressDialogOpenIE - START

Code

var classProgressDialogOpenIE /*: Function*/ = (function(){

classProgressDialogOpenIE(config : Object)

Code

function classProgressDialogOpenIE( 
	config /*: Object*/
)
{
	this.dialog /*: Window*/;
	this.doc /*: HTMLDocument*/;
	this.config /*: Object*/;
	this.stopped /*: Boolean*/;

	this.barOneUnits /*: int*/;
	this.barOneTable /*: HTMLTableElement*/;
	this.barOneRow /*: HTMLTableRowElement*/;
	this.barOneLit /*: int*/;
	this.barOneCountField /*: HTMLParagraphElement*/;
	this.barOneCountFieldText /*: Text*/;

	this.stopButton /*: HTMLInputElement*/;
	this.closeButton /*: HTMLInputElement*/;

	this.initialise(config);
}

var constr /*: Function*/ = classProgressDialogOpenIE;
var proto /*: Object*/ = ExtendClass(classProgressDialogOpenIE, Object);

initialise(config : Object) : void

Code

function initialise(
	config /*: Object*/
) /*: void*/
{
	var me /*: classProgressDialog*/ = this;
	var height /*: int*/;
	var defaults /*: Object*/; 
	var dialogOptions /*: String*/;
	var doc /*: HTMLDocument*/;
	var style /*: CSSStyleDeclaration*/;
	var elm /*: HTMLElement*/;
	var elmInner /*: HTMLElement*/;
	var table /*: HTMLTableElement*/;
	var row /*: HTMLTableRowElement*/
	var cell /*: HTMLTableCellElement*/;
	var text /*: Text*/;
	var tbody /*: HTMLTableSectionElement*/;
	var hr /*: HTMLHRElement*/;
	var times /*: int*/ = 5;

	// DEFAULT CONFIGURATION

	defaults = { 
		width : 400,
		windowTitle : "Test 3 - window.open (IE)",
		barOneUnits : 20,
		stopButton : true,
		closeButton: true
	};

	// DEFAULT APPLIES IF NOT SPECIFIED IN USER SUPPLIED CONFIG

	if (!config) { config = {}; }

	for (var k /*: String*/ in defaults)
	{
		if (typeof config[k] == typeof defaults[k]) { continue; }
		config[k] = defaults[k];
	}

	this.config = config;

	// OPEN MODELESS DIALOG

	dialogOptions = "height=100,width=" + config.width + ",menubar=no,resizable=no,scrollbars=no,location=no,status=no,chrome=no,dependent=no,dialog=no,directories=no,titlebar=no,close=no";

	this.dialog = window.open("046-stub.htm", "TestWindow", dialogOptions);

	while(times--)
	{
		doc = this.dialog.document;
		if (doc) { break; }
		Sleep(200);
	}

	this.doc = doc;

	// STYLES
	var head /*: HTMLHeadElement*/ = doc.getElementsByTagName("head")[0];
	var link /*: HTMLLinkElement*/ = doc.createElement("link");

	link.type = "text/css";
	link.rel = "stylesheet";
	link.href = "common.css";
	link.media = "screen";

	head.appendChild(link);

	// DIALOG TITLE

	this.setWindowTitle(config.windowTitle);

	container = doc.createElement("div");
	container.className = "classProgressDialogContainer";
	doc.body.appendChild(container);

	// BAR ONE

	this.barOneUnits = (typeof config.barOneUnits == "number") ? Math.floor(config.barOneUnits) : 10; 

	// BAR ONE TABLE

	table = doc.createElement("table");
	table.className	= "classProgressDialogBarOneTable";
	table.style.width = config.width + "px";
	table.cellPadding = "0";
	table.cellSpacing = "2";

	tbody = doc.createElement("tbody");
	table.appendChild(tbody);

	row = doc.createElement("tr");
	tbody.appendChild(row);

	for (var i /*: int*/ = 0; i < this.barOneUnits; i++)
	{
		cell = doc.createElement("td");
		cell.className = "classProgressDialogBarOneCell";
		row.appendChild(cell);
	}

	container.appendChild(table);

	this.barOneTable = table;
	this.barOneRow = row;
	this.barOneLit = 0;

	elm = doc.createElement("p");
	elm.className = "classProgressDialogBarOneCount";
	text = doc.createTextNode("0 of 0");
	elm.appendChild(text);
	container.appendChild(elm);
	this.barOneCountField = elm;
	this.barOneCountFieldText = text;

	addSeparator(); 

	// STOP BUTTON

	if (config.stopButton)
	{
		elm = doc.createElement("input");
		elm.type = "button";
		elm.className = "classProgressDialogStopButton";
		container.appendChild(elm);

		elm.value = "Stop";
		elm.onclick = function () { me.stop(); };

		this.stopButton = elm;
	}

	// CLOSE BUTTON

	if (config.closeButton)
	{
		elm = doc.createElement("input");
		elm.type = "button";
		elm.className = "classProgressDialogCloseButton";
		container.appendChild(elm);

		elm.value = "Close";
		elm.onclick = function () { me.close(); };

		this.closeButton = elm;
	}


	// DIMENSION WINDOW BASED ON CONTENT

	this.dialog.dialogWidth = container.offsetWidth + "px";
	this.dialog.dialogHeight = container.offsetHeight + "px"; 

	// START

	this.stopped = false; 

	// FUNCTIONS

	function addSeparator()
	{
		hr = doc.createElement("hr");
		container.appendChild(hr);
	}
}

AddMethod(constr, initialise);

start() : void

Page1

function start() /*: void*/
{
	HTMLElement_AddClassName(this.stopButton, "classProgressDialogStopButtonActive");
}

AddMethod(constr, start);

setWindowTitle(s : String)

Page1

function setWindowTitle(
	s /*: String*/
) /*: void*/
{
	if (!this.doc) { return; }
	this.doc.title = s;
}

AddMethod(constr, setWindowTitle);

setBarOneProgress(progress : int, total : int): void

Page1

function setBarOneProgress(
	progress /*: int*/,
	total /*: int*/
)/*: void*/
{
	if (this.barOneCountFieldText) 
	{ 
		this.barOneCountFieldText.nodeValue = progress + " of " + total;
	}

	if (!this.barOneRow) { return; }
	
	var count /*: int*/ = Math.floor((progress/total) * this.barOneUnits);

	if (count == this.barOneLit) { return; }

	for (var i /*: int*/ = 0; i < count; i++)
	{ 
		HTMLElement_AddClassName(this.barOneRow.cells[i], "classProgressDialogBarOneCellHighlight");
	}

	this.barOneLit = count;

	if (progress + 1 >= total)
	{
		HTMLElement_RemoveClassName(this.stopButton, "classProgressDialogStopButtonActive");
	}
}

AddMethod(constr, setBarOneProgress);

resetBarOneProgress(): void

Page1

function resetBarOneProgress()/*: void*/
{
	if (this.barOneCountFieldText) 
	{ 
		this.barOneCountFieldText.nodeValue = "0 of 0";
	}

	if (!this.barOneRow) { return; }
	
	for (var i /*: int*/ = 0; i < this.barOneRow.cells.length; i++)
	{ 
		HTMLElement_RemoveClassName(this.barOneRow.cells[i], "classProjectDialogBarOneCellHighlight");
	}

	this.barOneLit = 0;
}

AddMethod(constr, resetBarOneProgress);

close(timeout : int) : void

Page1

function close(
	timeout /*: int*/
) /*: void*/
{
	if (!this.dialog) { return; }

	this.stop();

	if (typeof timeout == "number")
	{
		var me /*: classProgressDialog*/ = this;
		window.setTimeout(function(){ me.dialog.close(); }, timeout);
	}
	else
	{
		this.dialog.close();
	}
}

AddMethod(constr, close);

stop() : void

Page1

function stop() /*: void*/
{
	HTMLElement_RemoveClassName(this.stopButton, "classProgressDialogStopButtonActive");
	this.stopped = true;
}

AddMethod(constr, stop);

classProgressDialogOpenIE - END

Code

	return constr;
})();

Test_WindowOpen_Others()

Page1

function Test_WindowOpen_Others()
{
	var p = new classProgressDialogOpenOthers();

	window.setTimeout(init, 200);

	function init()
	{
		p.initialise2();
		window.setTimeout(loop,200);
	}

	function loop()
	{
		var total /*: int*/ = 10000;

		p.start();

		for (var i /*: int*/ = 0; i < total; i++)
		{
			p.setBarOneProgress(i + 1, total);
			if (p.stopped) { break; }
		}
	}
}

classProgressDialogOpenOthers - START

Code

var classProgressDialogOpenOthers /*: Function*/ = (function(){

classProgressDialogOpenOthers(config : Object)

Code

function classProgressDialogOpenOthers( 
	config /*: Object*/
)
{
	this.dialog /*: Window*/;
	this.doc /*: HTMLDocument*/;
	this.config /*: Object*/;
	this.stopped /*: Boolean*/;

	this.barOneUnits /*: int*/;
	this.barOneTable /*: HTMLTableElement*/;
	this.barOneRow /*: HTMLTableRowElement*/;
	this.barOneLit /*: int*/;
	this.barOneCountField /*: HTMLParagraphElement*/;
	this.barOneCountFieldText /*: Text*/;

	this.stopButton /*: HTMLInputElement*/;
	this.closeButton /*: HTMLInputElement*/;

	this.initialise(config);
}

var constr /*: Function*/ = classProgressDialogOpenOthers;
var proto /*: Object*/ = ExtendClass(classProgressDialogOpenOthers, Object);

initialise(config : Object) : void

Code

function initialise(
	config /*: Object*/
) /*: void*/
{
	var me /*: classProgressDialog*/ = this;
	var height /*: int*/;
	var defaults /*: Object*/; 
	var dialogOptions /*: String*/;
	var doc /*: HTMLDocument*/;
	var style /*: CSSStyleDeclaration*/;
	var elm /*: HTMLElement*/;
	var elmInner /*: HTMLElement*/;
	var table /*: HTMLTableElement*/;
	var row /*: HTMLTableRowElement*/
	var cell /*: HTMLTableCellElement*/;
	var text /*: Text*/;
	var tbody /*: HTMLTableSectionElement*/;
	var hr /*: HTMLHRElement*/;
	var times /*: int*/ = 5;

	// DEFAULT CONFIGURATION

	defaults = { 
		width : 400,
		windowTitle : "Test 3 - window.open (Others)",
		barOneUnits : 20,
		stopButton : true,
		closeButton: true
	};

	// DEFAULT APPLIES IF NOT SPECIFIED IN USER SUPPLIED CONFIG

	if (!config) { config = {}; }

	for (var k /*: String*/ in defaults)
	{
		if (typeof config[k] == typeof defaults[k]) { continue; }
		config[k] = defaults[k];
	}

	this.config = config;

	// OPEN MODELESS DIALOG

	dialogOptions = "height=100,width=" + config.width + ",menubar=no,resizable=no,scrollbars=no,location=no,status=no,chrome=no,dependent=no,dialog=no,directories=no,titlebar=no,close=no";

	this.dialog = window.open("046-stub.htm", "TestWindow", dialogOptions);
}

AddMethod(constr, initialise);

initialise2(config : Object) : void

Code

function initialise2(
	config /*: Object*/
) /*: void*/
{
	var me /*: classProgressDialog*/ = this;
	var height /*: int*/;
	var defaults /*: Object*/; 
	var dialogOptions /*: String*/;
	var doc /*: HTMLDocument*/;
	var style /*: CSSStyleDeclaration*/;
	var elm /*: HTMLElement*/;
	var elmInner /*: HTMLElement*/;
	var table /*: HTMLTableElement*/;
	var row /*: HTMLTableRowElement*/
	var cell /*: HTMLTableCellElement*/;
	var text /*: Text*/;
	var tbody /*: HTMLTableSectionElement*/;
	var hr /*: HTMLHRElement*/;
	var times /*: int*/ = 5;


	var config /*: Object*/ = this.config;

	doc = this.doc = this.dialog.document;

	// STYLES
	var head /*: HTMLHeadElement*/ = doc.getElementsByTagName("head")[0];
	var link /*: HTMLLinkElement*/ = doc.createElement("link");

	link.type = "text/css";
	link.rel = "stylesheet";
	link.href = "common.css";
	link.media = "screen";

	head.appendChild(link);

	// DIALOG TITLE

	this.setWindowTitle(config.windowTitle);

	container = doc.createElement("div");
	container.className = "classProgressDialogContainer";
	doc.body.appendChild(container);

	// BAR ONE

	this.barOneUnits = (typeof config.barOneUnits == "number") ? Math.floor(config.barOneUnits) : 10; 

	// BAR ONE TABLE

	table = doc.createElement("table");
	table.className	= "classProgressDialogBarOneTable";
	table.style.width = config.width + "px";
	table.cellPadding = "0";
	table.cellSpacing = "2";

	tbody = doc.createElement("tbody");
	table.appendChild(tbody);

	row = doc.createElement("tr");
	tbody.appendChild(row);

	for (var i /*: int*/ = 0; i < this.barOneUnits; i++)
	{
		cell = doc.createElement("td");
		cell.className = "classProgressDialogBarOneCell";
		row.appendChild(cell);
	}

	container.appendChild(table);

	this.barOneTable = table;
	this.barOneRow = row;
	this.barOneLit = 0;

	elm = doc.createElement("p");
	elm.className = "classProgressDialogBarOneCount";
	text = doc.createTextNode("0 of 0");
	elm.appendChild(text);
	container.appendChild(elm);
	this.barOneCountField = elm;
	this.barOneCountFieldText = text;

	addSeparator(); 

	// STOP BUTTON

	if (config.stopButton)
	{
		elm = doc.createElement("input");
		elm.type = "button";
		elm.className = "classProgressDialogStopButton";
		container.appendChild(elm);

		elm.value = "Stop";
		elm.onclick = function () { me.stop(); };

		this.stopButton = elm;
	}

	// CLOSE BUTTON

	if (config.closeButton)
	{
		elm = doc.createElement("input");
		elm.type = "button";
		elm.className = "classProgressDialogCloseButton";
		container.appendChild(elm);

		elm.value = "Close";
		elm.onclick = function () { me.close(); };

		this.closeButton = elm;
	}


	// DIMENSION WINDOW BASED ON CONTENT

	this.dialog.dialogWidth = container.offsetWidth + "px";
	this.dialog.dialogHeight = container.offsetHeight + "px"; 

	// START

	this.stopped = false; 

	// FUNCTIONS

	function addSeparator()
	{
		hr = doc.createElement("hr");
		container.appendChild(hr);
	}
}

AddMethod(constr, initialise2);

start() : void

Page1

function start() /*: void*/
{
	HTMLElement_AddClassName(this.stopButton, "classProgressDialogStopButtonActive");
}

AddMethod(constr, start);

setWindowTitle(s : String)

Page1

function setWindowTitle(
	s /*: String*/
) /*: void*/
{
	if (!this.doc) { return; }
	this.doc.title = s;
}

AddMethod(constr, setWindowTitle);

setBarOneProgress(progress : int, total : int): void

Page1

function setBarOneProgress(
	progress /*: int*/,
	total /*: int*/
)/*: void*/
{
	if (this.barOneCountFieldText) 
	{ 
		this.barOneCountFieldText.nodeValue = progress + " of " + total;
	}

	if (!this.barOneRow) { return; }
	
	var count /*: int*/ = Math.floor((progress/total) * this.barOneUnits);

	if (count == this.barOneLit) { return; }

	for (var i /*: int*/ = 0; i < count; i++)
	{ 
		HTMLElement_AddClassName(this.barOneRow.cells[i], "classProgressDialogBarOneCellHighlight");
	}

	this.barOneLit = count;

	if (progress + 1 >= total)
	{
		HTMLElement_RemoveClassName(this.stopButton, "classProgressDialogStopButtonActive");
	}
}

AddMethod(constr, setBarOneProgress);

resetBarOneProgress(): void

Page1

function resetBarOneProgress()/*: void*/
{
	if (this.barOneCountFieldText) 
	{ 
		this.barOneCountFieldText.nodeValue = "0 of 0";
	}

	if (!this.barOneRow) { return; }
	
	for (var i /*: int*/ = 0; i < this.barOneRow.cells.length; i++)
	{ 
		HTMLElement_RemoveClassName(this.barOneRow.cells[i], "classProjectDialogBarOneCellHighlight");
	}

	this.barOneLit = 0;
}

AddMethod(constr, resetBarOneProgress);

close(timeout : int) : void

Page1

function close(
	timeout /*: int*/
) /*: void*/
{
	if (!this.dialog) { return; }

	this.stop();

	if (typeof timeout == "number")
	{
		var me /*: classProgressDialog*/ = this;
		window.setTimeout(function(){ me.dialog.close(); }, timeout);
	}
	else
	{
		this.dialog.close();
	}
}

AddMethod(constr, close);

stop() : void

Page1

function stop() /*: void*/
{
	HTMLElement_RemoveClassName(this.stopButton, "classProgressDialogStopButtonActive");
	this.stopped = true;
}

AddMethod(constr, stop);

classProgressDialogOpenOthers - END

Code

	return constr;
})();

Test_Iframe()

Page1

function Test_Iframe()
{
	var p = new classProgressDialogIframe({iframeId:"test4iframe"});

	function loop()
	{

		var total /*: int*/ = 10000;

		p.start();

		for (var i /*: int*/ = 0; i < total; i++)
		{
			p.setBarOneProgress(i + 1, total);
			if (p.stopped) { break; }
		}
	}

	window.setTimeout(loop,15);
}

classProgressDialogIframe - START

Code

var classProgressDialogIframe /*: Function*/ = (function(){

classProgressDialogIframe(config : Object)

Code

function classProgressDialogIframe( 
	config /*: Object*/
)
{
	this.iframe /*: HTMLIFrameElement*/;
	this.dialog /*: Window*/;
	this.doc /*: HTMLDocument*/;
	this.config /*: Object*/;
	this.stopped /*: Boolean*/;

	this.barOneUnits /*: int*/;
	this.barOneTable /*: HTMLTableElement*/;
	this.barOneRow /*: HTMLTableRowElement*/;
	this.barOneLit /*: int*/;
	this.barOneCountField /*: HTMLParagraphElement*/;
	this.barOneCountFieldText /*: Text*/;

	this.stopButton /*: HTMLInputElement*/;
	this.closeButton /*: HTMLInputElement*/;

	this.initialise(config);
}

var constr /*: Function*/ = classProgressDialogIframe;
var proto /*: Object*/ = ExtendClass(classProgressDialogIframe, Object);

initialise(config : Object) : void

Code

function initialise(
	config /*: Object*/
) /*: void*/
{
	var me /*: classProgressDialog*/ = this;
	var height /*: int*/;
	var defaults /*: Object*/; 
	var dialogOptions /*: String*/;
	var doc /*: HTMLDocument*/;
	var style /*: CSSStyleDeclaration*/;
	var elm /*: HTMLElement*/;
	var elmInner /*: HTMLElement*/;
	var table /*: HTMLTableElement*/;
	var row /*: HTMLTableRowElement*/
	var cell /*: HTMLTableCellElement*/;
	var text /*: Text*/;
	var tbody /*: HTMLTableSectionElement*/;
	var hr /*: HTMLHRElement*/;
	var times /*: int*/ = 5;

	// DEFAULT CONFIGURATION

	defaults = { 
		width : 400,
		windowTitle : "Test 1 - showModelessDialog",
		barOneUnits : 20,
		stopButton : true
	};

	// DEFAULT APPLIES IF NOT SPECIFIED IN USER SUPPLIED CONFIG

	if (!config) { config = {}; }

	for (var k /*: String*/ in defaults)
	{
		if (typeof config[k] == typeof defaults[k]) { continue; }
		config[k] = defaults[k];
	}

	this.config = config;

	// GET IFRAME

	this.iframe = document.getElementById(config.iframeId);	

	this.iframe.style.borderWidth = 0;

	this.dialog = (document.frames && document.frames[config.iframeId]) || (window.frames && window.frames[config.iframeId]) || (this.iframe && this.iframe.contentWindow) || (this.iframe.contentDocument && (this.iframe.contentDocument.parentWindow || this.iframe.contentDocument.defaultView || this.iframe.contentDocument.contentWindow));

	while(times--)
	{
		doc = this.dialog.document || this.iframe.contentDocument;
		if (doc) { break; }
		Sleep(200);
	}

	this.doc = doc;

	// STYLES
	var head /*: HTMLHeadElement*/ = doc.getElementsByTagName("head")[0];
	var link /*: HTMLLinkElement*/ = doc.createElement("link");
		
	link.type = "text/css";
	link.rel = "stylesheet";
	link.href =  "common.css";
	link.media = "screen";

	head.appendChild(link);

	// DIALOG TITLE

	container = doc.createElement("div");
	container.className = "classProgressDialogContainer";
	doc.body.appendChild(container);

	container.style.width = config.width + "px";

	// BAR ONE

	this.barOneUnits = (typeof config.barOneUnits == "number") ? Math.floor(config.barOneUnits) : 10; 

	// BAR ONE TABLE

	table = doc.createElement("table");
	table.className	= "classProgressDialogBarOneTable";
	table.style.width = config.width + "px";
	table.cellPadding = "0";
	table.cellSpacing = "2";

	tbody = doc.createElement("tbody");
	table.appendChild(tbody);

	row = doc.createElement("tr");
	tbody.appendChild(row);

	for (var i /*: int*/ = 0; i < this.barOneUnits; i++)
	{
		cell = doc.createElement("td");
		cell.className = "classProgressDialogBarOneCell";
		row.appendChild(cell);
	}

	container.appendChild(table);

	this.barOneTable = table;
	this.barOneRow = row;
	this.barOneLit = 0;

	elm = doc.createElement("p");
	elm.className = "classProgressDialogBarOneCount";
	text = doc.createTextNode("0 of 0");
	elm.appendChild(text);
	container.appendChild(elm);
	this.barOneCountField = elm;
	this.barOneCountFieldText = text;

	addSeparator(); 


	// STOP BUTTON

	if (config.stopButton)
	{
		elm = doc.createElement("input");
		elm.type = "button";
		elm.className = "classProgressDialogStopButton";
		container.appendChild(elm);

		elm.value = "Stop";
		elm.onclick = function () { me.stop(); };

		this.stopButton = elm;
	}

	// DIMENSION WINDOW BASED ON CONTENT

	this.iframe.style.width = (container.offsetWidth + 20) + "px";
	this.iframe.style.height = (container.offsetHeight + 20) + "px"; 

	// START

	this.stopped = false; 

	// FUNCTIONS

	function addSeparator()
	{
		hr = doc.createElement("hr");
		container.appendChild(hr);
	}

}

AddMethod(constr, initialise);

start() : void

Page1

function start() /*: void*/
{
	HTMLElement_AddClassName(this.stopButton, "classProgressDialogStopButtonActive");
}

AddMethod(constr, start);

setBarOneProgress(progress : int, total : int): void

Page1

function setBarOneProgress(
	progress /*: int*/,
	total /*: int*/
)/*: void*/
{
	//this.dialog.dialogHeight = this.dheight;
	//this.dialog.dialogWidth = this.dwidth;

	if (this.barOneCountFieldText) 
	{ 
		this.barOneCountFieldText.nodeValue = progress + " of " + total;
	}

	if (!this.barOneRow) { return; }
	
	var count /*: int*/ = Math.floor((progress/total) * this.barOneUnits);

	if (count == this.barOneLit) { return; }

	for (var i /*: int*/ = 0; i < count; i++)
	{ 
		HTMLElement_AddClassName(this.barOneRow.cells[i], "classProgressDialogBarOneCellHighlight");
	}

	this.barOneLit = count;

	if (progress + 1 >= total)
	{
		HTMLElement_RemoveClassName(this.stopButton, "classProgressDialogStopButtonActive");
	}
}

AddMethod(constr, setBarOneProgress);

resetBarOneProgress(): void

Page1

function resetBarOneProgress()/*: void*/
{
	if (this.barOneCountFieldText) 
	{ 
		this.barOneCountFieldText.nodeValue = "0 of 0";
	}

	if (!this.barOneRow) { return; }
	
	for (var i /*: int*/ = 0; i < this.barOneRow.cells.length; i++)
	{ 
		HTMLElement_RemoveClassName(this.barOneRow.cells[i], "classProjectDialogBarOneCellHighlight");
	}

	this.barOneLit = 0;
}

AddMethod(constr, resetBarOneProgress);

stop() : void

Page1

function stop() /*: void*/
{
	HTMLElement_RemoveClassName(this.stopButton, "classProgressDialogStopButtonActive");
	this.stopped = true;
}

AddMethod(constr, stop);

classProgressDialog - END

Code

	return constr;
})();

Test_Continuation()

Page1

function Test_Continuation()
{
	var p = new classProgressDialogContinuation();

	p.initialise({
		divId : "test5div",
		width : 400,
		barOneUnits : 20,
		stopButton : true
	});

	var state /*: Object*/ = {};

	state.progress = p;

	Continuation_Run(1,10000,500,100,loop1, afterLoop1,state);

	function loop1(i, total, state)
	{
		state.progress.setBarOneProgress(i, total);
		if (state.progress.stopped) { return true; }
		return false;
	}

	function afterLoop1(state)
	{
		state.progress.resetBarOneProgress();
		Continuation_Run(1,5000,500,100,loop2,afterLoop2,state);
	}

	function loop2(i, total, state)
	{
		state.progress.setBarOneProgress(i, total);
		if (state.progress.stopped) { return true; }
		return false;
	}

	function afterLoop2(state)
	{
		alert("Done");
	}
}


function Continuation_Run(
	start /*: int*/,
	end /*: int*/,
	chunk /*: int*/,
	timeout /*: int*/,
	iteration /*: Function*/,
	after /*: Function*/,
	state /*: Object*/
) /*: void*/
{
	var at /*: int*/ = start;
	var stop /*: Boolean*/;

	window.setTimeout(loopChunk, timeout);

	function loopChunk()
	{
		if (at > end)
		{
			window.setTimeout(function(){ after(state); }, timeout);
			return;
		}

		for (var i /*: int*/ = at; i <= end, i < at + chunk; i++)
		{
			stop = iteration(i, end, state);
			if (stop) { return; }
		}

		at = at + chunk;

		if (at >= end)
		{
			window.setTimeout(function(){ after(state); }, 15);
		}
		else
		{
			window.setTimeout(loopChunk,timeout);
		}
	}
}

Test_Continuation_ZeroTimeout()

Page1

function Test_Continuation_ZeroTimeout()
{
	var p = new classProgressDialogContinuation();

	p.initialise({
		divId : "test5div",
		width : 400,
		barOneUnits : 20,
		stopButton : true
	});

	var state /*: Object*/ = {};

	state.progress = p;

	Continuation_Run_ZeroTimeout(1,10000,500,100,loop1, afterLoop1,state);

	function loop1(i, total, state)
	{
		state.progress.setBarOneProgress(i, total);
		if (state.progress.stopped) { return true; }
		return false;
	}

	function afterLoop1(state)
	{
		alert("Done Loop 1");
		state.progress.resetBarOneProgress();
		Continuation_Run_ZeroTimeout(1,5000,500,100,loop2,afterLoop2,state);
	}

	function loop2(i, total, state)
	{
		state.progress.setBarOneProgress(i, total);
		if (state.progress.stopped) { return true; }
		return false;
	}

	function afterLoop2(state)
	{
		alert("Done Loop 2");
	}
}


function Continuation_Run_ZeroTimeout(
	start /*: int*/,
	end /*: int*/,
	chunk /*: int*/,
	timeout /*: int*/,
	iteration /*: Function*/,
	after /*: Function*/,
	state /*: Object*/
) /*: void*/
{
	var at /*: int*/ = start;
	var stop /*: Boolean*/;

	ZeroTimeout(loopChunk);

	function loopChunk()
	{
		if (at > end)
		{
			ZeroTimeout(function(){ after(state); });
			return;
		}

		for (var i /*: int*/ = at; i <= end, i < at + chunk; i++)
		{
			stop = iteration(i, end, state);
			if (stop) { return; }
		}

		at = at + chunk;

		if (at >= end)
		{
			ZeroTimeout(function(){ after(state); });
		}
		else
		{
			ZeroTimeout(loopChunk);
		}
	}
}

classProgressDialogContinuation - START

Code

var classProgressDialogContinuation /*: Function*/ = (function(){

classProgressDialogContinuation(config : Object)

Code

function classProgressDialogContinuation( 
	config /*: Object*/
)
{
	this.panel /*: HTMLDivElement*/;
	this.config /*: Object*/;
	this.stopped /*: Boolean*/;

	this.barOneUnits /*: int*/;
	this.barOneTable /*: HTMLTableElement*/;
	this.barOneRow /*: HTMLTableRowElement*/;
	this.barOneLit /*: int*/;
	this.barOneCountField /*: HTMLParagraphElement*/;
	this.barOneCountFieldText /*: Text*/;

	this.stopButton /*: HTMLInputElement*/;
}

var constr /*: Function*/ = classProgressDialogContinuation;
var proto /*: Object*/ = ExtendClass(classProgressDialogContinuation, Object);

initialise(config : Object) : void

Code

function initialise(
	config /*: Object*/
) /*: void*/
{
	var me /*: classProgressDialog*/ = this;
	var height /*: int*/;
	var defaults /*: Object*/; 
	var dialogOptions /*: String*/;
	var doc /*: HTMLDocument*/;
	var style /*: CSSStyleDeclaration*/;
	var elm /*: HTMLElement*/;
	var elmInner /*: HTMLElement*/;
	var table /*: HTMLTableElement*/;
	var row /*: HTMLTableRowElement*/
	var cell /*: HTMLTableCellElement*/;
	var text /*: Text*/;
	var tbody /*: HTMLTableSectionElement*/;
	var hr /*: HTMLHRElement*/;
	var times /*: int*/ = 5;

	// DEFAULT CONFIGURATION

	defaults = { 
		width : 200,
		barOneUnits : 10,
		stopButton : true
	};

	// DEFAULT APPLIES IF NOT SPECIFIED IN USER SUPPLIED CONFIG

	if (!config) { config = {}; }

	for (var k /*: String*/ in defaults)
	{
		if (typeof config[k] == typeof defaults[k]) { continue; }
		config[k] = defaults[k];
	}

	this.config = config;

	// GET IFRAME

	this.panel = document.getElementById(config.divId);
	this.panel.innerHTML = "";
	
	var doc = this.doc = document;

	// DIALOG TITLE

	container = doc.createElement("div");
	container.className = "classProgressDialogContainer";
	this.panel.appendChild(container);

	container.style.width = config.width + "px";

	// BAR ONE

	this.barOneUnits = (typeof config.barOneUnits == "number") ? Math.floor(config.barOneUnits) : 10; 

	// BAR ONE TABLE

	table = doc.createElement("table");
	table.className	= "classProgressDialogBarOneTable";
	table.style.width = config.width + "px";
	table.cellPadding = "0";
	table.cellSpacing = "2";

	tbody = doc.createElement("tbody");
	table.appendChild(tbody);

	row = doc.createElement("tr");
	tbody.appendChild(row);

	for (var i /*: int*/ = 0; i < this.barOneUnits; i++)
	{
		cell = doc.createElement("td");
		cell.className = "classProgressDialogBarOneCell";
		row.appendChild(cell);
	}

	container.appendChild(table);

	this.barOneTable = table;
	this.barOneRow = row;
	this.barOneLit = 0;

	elm = doc.createElement("p");
	elm.className = "classProgressDialogBarOneCount";
	text = doc.createTextNode("0 of 0");
	elm.appendChild(text);
	container.appendChild(elm);
	this.barOneCountField = elm;
	this.barOneCountFieldText = text;

	addSeparator(); 

	// STOP BUTTON

	if (config.stopButton)
	{
		elm = doc.createElement("input");
		elm.type = "button";
		elm.className = "classProgressDialogStopButton";
		container.appendChild(elm);

		elm.value = "Stop";
		elm.onclick = function () { me.stop(); };

		this.stopButton = elm;
	}

	// DIMENSION WINDOW BASED ON CONTENT

	this.panel.style.width = (container.offsetWidth + 20) + "px";
	this.panel.style.height = (container.offsetHeight + 20) + "px"; 

	// START

	this.stopped = false; 

	// FUNCTIONS

	function addSeparator()
	{
		hr = doc.createElement("hr");
		container.appendChild(hr);
	}

}

AddMethod(constr, initialise);

start() : void

Page1

function start() /*: void*/
{
	HTMLElement_AddClassName(this.stopButton, "classProgressDialogStopButtonActive");
}

AddMethod(constr, start);

setBarOneProgress(progress : int, total : int): void

Page1

function setBarOneProgress(
	progress /*: int*/,
	total /*: int*/
)/*: void*/
{
	//this.dialog.dialogHeight = this.dheight;
	//this.dialog.dialogWidth = this.dwidth;

	if (this.barOneCountFieldText) 
	{ 
		this.barOneCountFieldText.nodeValue = progress + " of " + total;
	}

	if (!this.barOneRow) { return; }
	
	var count /*: int*/ = Math.floor((progress/total) * this.barOneUnits);

	if (count == this.barOneLit) { return; }

	for (var i /*: int*/ = 0; i < count; i++)
	{ 
		HTMLElement_AddClassName(this.barOneRow.cells[i], "classProgressDialogBarOneCellHighlight");
	}

	this.barOneLit = count;

	if (progress + 1 >= total)
	{
		HTMLElement_RemoveClassName(this.stopButton, "classProgressDialogStopButtonActive");
	}
}

AddMethod(constr, setBarOneProgress);

resetBarOneProgress(): void

Page1

function resetBarOneProgress()/*: void*/
{
	if (this.barOneCountFieldText) 
	{ 
		this.barOneCountFieldText.nodeValue = "0 of 0";
	}

	if (!this.barOneRow) { return; }
	
	for (var i /*: int*/ = 0; i < this.barOneRow.cells.length; i++)
	{ 
		HTMLElement_RemoveClassName(this.barOneRow.cells[i], "classProgressDialogBarOneCellHighlight");
	}

	this.barOneLit = 0;
}

AddMethod(constr, resetBarOneProgress);

stop() : void

Page1

function stop() /*: void*/
{
	HTMLElement_RemoveClassName(this.stopButton, "classProgressDialogStopButtonActive");
	this.stopped = true;
}

AddMethod(constr, stop);

classProgressDialogContinuation - END

Code

	return constr;
})();

Test_Worker()

Page1

function Test_Worker()
{
	var p = new classProgressDialogWorker();

	p.initialise({
		divId : "test6div",
		width : 400,
		barOneUnits : 20,
		stopButton : true
	});

	var worker = new Worker("run.js");

	worker.onmessage = function(event){
		var data /*: Object*/ = event.data;
		
		if (data.type == "Progress")
		{
			p.setBarOneProgress(data.i, data.total);
			if (p.stopped) { worker.postMessage( {type : "Stop"} ); }
		}
		if (data.type == "Done")
		{
			alert("Done");
		}
	};

	worker.postMessage( { type:"CompleteLoop" } );
}

classProgressDialogWorker - START

Code

var classProgressDialogWorker /*: Function*/ = (function(){

classProgressDialogWorker(config : Object)

Code

function classProgressDialogWorker( 
	config /*: Object*/
)
{
	this.panel /*: HTMLDivElement*/;
	this.config /*: Object*/;
	this.stopped /*: Boolean*/;

	this.barOneUnits /*: int*/;
	this.barOneTable /*: HTMLTableElement*/;
	this.barOneRow /*: HTMLTableRowElement*/;
	this.barOneLit /*: int*/;
	this.barOneCountField /*: HTMLParagraphElement*/;
	this.barOneCountFieldText /*: Text*/;

	this.stopButton /*: HTMLInputElement*/;
}

var constr /*: Function*/ = classProgressDialogWorker;
var proto /*: Object*/ = ExtendClass(classProgressDialogWorker, Object);

initialise(config : Object) : void

Code

function initialise(
	config /*: Object*/
) /*: void*/
{
	var me /*: classProgressDialog*/ = this;
	var height /*: int*/;
	var defaults /*: Object*/; 
	var dialogOptions /*: String*/;
	var doc /*: HTMLDocument*/;
	var style /*: CSSStyleDeclaration*/;
	var elm /*: HTMLElement*/;
	var elmInner /*: HTMLElement*/;
	var table /*: HTMLTableElement*/;
	var row /*: HTMLTableRowElement*/
	var cell /*: HTMLTableCellElement*/;
	var text /*: Text*/;
	var tbody /*: HTMLTableSectionElement*/;
	var hr /*: HTMLHRElement*/;
	var times /*: int*/ = 5;

	// DEFAULT CONFIGURATION

	defaults = { 
		width : 200,
		barOneUnits : 10,
		stopButton : true
	};

	// DEFAULT APPLIES IF NOT SPECIFIED IN USER SUPPLIED CONFIG

	if (!config) { config = {}; }

	for (var k /*: String*/ in defaults)
	{
		if (typeof config[k] == typeof defaults[k]) { continue; }
		config[k] = defaults[k];
	}

	this.config = config;

	// GET IFRAME

	this.panel = document.getElementById(config.divId);
	this.panel.innerHTML = "";
	
	var doc = this.doc = document;

	// DIALOG TITLE

	container = doc.createElement("div");
	container.className = "classProgressDialogContainer";
	this.panel.appendChild(container);

	container.style.width = config.width + "px";

	// BAR ONE

	this.barOneUnits = (typeof config.barOneUnits == "number") ? Math.floor(config.barOneUnits) : 10; 

	// BAR ONE TABLE

	table = doc.createElement("table");
	table.className	= "classProgressDialogBarOneTable";
	table.style.width = config.width + "px";
	table.cellPadding = "0";
	table.cellSpacing = "2";

	tbody = doc.createElement("tbody");
	table.appendChild(tbody);

	row = doc.createElement("tr");
	tbody.appendChild(row);

	for (var i /*: int*/ = 0; i < this.barOneUnits; i++)
	{
		cell = doc.createElement("td");
		cell.className = "classProgressDialogBarOneCell";
		row.appendChild(cell);
	}

	container.appendChild(table);

	this.barOneTable = table;
	this.barOneRow = row;
	this.barOneLit = 0;

	elm = doc.createElement("p");
	elm.className = "classProgressDialogBarOneCount";
	text = doc.createTextNode("0 of 0");
	elm.appendChild(text);
	container.appendChild(elm);
	this.barOneCountField = elm;
	this.barOneCountFieldText = text;

	addSeparator(); 

	// STOP BUTTON

	if (config.stopButton)
	{
		elm = doc.createElement("input");
		elm.type = "button";
		elm.className = "classProgressDialogStopButton";
		container.appendChild(elm);

		elm.value = "Stop";
		elm.onclick = function () { me.stop(); };

		this.stopButton = elm;
	}

	// DIMENSION WINDOW BASED ON CONTENT

	this.panel.style.width = (container.offsetWidth + 20) + "px";
	this.panel.style.height = (container.offsetHeight + 20) + "px"; 

	// START

	this.stopped = false; 

	// FUNCTIONS

	function addSeparator()
	{
		hr = doc.createElement("hr");
		container.appendChild(hr);
	}

}

AddMethod(constr, initialise);

start() : void

Page1

function start() /*: void*/
{
	HTMLElement_AddClassName(this.stopButton, "classProgressDialogStopButtonActive");
}

AddMethod(constr, start);

setBarOneProgress(progress : int, total : int): void

Page1

function setBarOneProgress(
	progress /*: int*/,
	total /*: int*/
)/*: void*/
{
	//this.dialog.dialogHeight = this.dheight;
	//this.dialog.dialogWidth = this.dwidth;

	if (this.barOneCountFieldText) 
	{ 
		this.barOneCountFieldText.nodeValue = progress + " of " + total;
	}

	if (!this.barOneRow) { return; }
	
	var count /*: int*/ = Math.floor((progress/total) * this.barOneUnits);

	if (count == this.barOneLit) { return; }

	for (var i /*: int*/ = 0; i < count; i++)
	{ 
		HTMLElement_AddClassName(this.barOneRow.cells[i], "classProgressDialogBarOneCellHighlight");
	}

	this.barOneLit = count;

	if (progress + 1 >= total)
	{
		HTMLElement_RemoveClassName(this.stopButton, "classProgressDialogStopButtonActive");
	}
}

AddMethod(constr, setBarOneProgress);

resetBarOneProgress(): void

Page1

function resetBarOneProgress()/*: void*/
{
	if (this.barOneCountFieldText) 
	{ 
		this.barOneCountFieldText.nodeValue = "0 of 0";
	}

	if (!this.barOneRow) { return; }
	
	for (var i /*: int*/ = 0; i < this.barOneRow.cells.length; i++)
	{ 
		HTMLElement_RemoveClassName(this.barOneRow.cells[i], "classProgressDialogBarOneCellHighlight");
	}

	this.barOneLit = 0;
}

AddMethod(constr, resetBarOneProgress);

stop() : void

Page1

function stop() /*: void*/
{
	HTMLElement_RemoveClassName(this.stopButton, "classProgressDialogStopButtonActive");
	this.stopped = true;
}

AddMethod(constr, stop);

classProgressDialogWorkers - END

Code

	return constr;
})();

New Section

Page1

function Test_ProgressElement()
{
	var progress = document.getElementById("idProgress");


	function loop()
	{
		var total /*: int*/ = 1000000;

		for (var i /*: int*/ = 0; i < total; i++)
		{
			progress.value = i + 1;
		}
	}

	loop();  // no need for any window.setTimeout
}

AddMethod(constructor : Function, method : Function [, methodName : String]) : void

Code

function AddMethod(
	constructor /*: Function*/,
	method /* Function*/,
	methodName /*: Function*/
) /*: void*/
{
	var methodName /*: String*/ = methodName || Function_GetIdentifier(method);
	var proto /*: Object*/ = constructor.prototype;
	
	method.name = methodName;
	method.ownerProto = proto;
	proto[methodName] = method;

	method.constructorName = constructor.name ||  Function_GetIdentifier(constructor, true);
}

Meta

<META>
MODULE <core>
INCLUDE <if_used>
TYPE <module_public_function>
NAME <AddMethod>
CLASS <>
EXTENDS <>
REQUIRES <
@core.Function_GetIdentifier
>

AddStaticMethod(constructor : Function, method : Function [, methodName : String]) : void

Code

function AddStaticMethod(
	constructor /*: Function*/,
	method /* Function*/,
	methodName /*: Function*/
) /*: void*/
{
	var methodName /*: String*/ = methodName || Function_GetIdentifier(method);
	
	method.name = methodName;
	constructor[methodName] = method;

	method.constructorName = constructor.name ||  Function_GetIdentifier(constructor, true);
}

Meta

<META>
MODULE <core>
INCLUDE <if_used>
TYPE <module_public_function>
NAME <AddMethod>
CLASS <>
EXTENDS <>
REQUIRES <
@core.Function_GetIdentifier
>

ExtendClass(constructor : Function, superConstructor : Function) : Object

Code

function ExtendClass(
	constructor /*: Function*/,
	superConstructor /*: Function*/
) /*: Object*/
{
	var f = function(){};
	f.prototype = superConstructor.prototype;

	var proto /*: Object*/ = constructor.prototype = new f();
	proto.prototype /*: Object*/ = proto;
	proto.superPrototype /*: Object*/ = f.prototype;
	proto.constructor /*: Function*/ = constructor;
	proto.superConstructor /*: Function*/ = superConstructor;

	constructor.superConstructor  = superConstructor;

	var constructorName /*: String*/ = Function_GetIdentifier(constructor);
	constructor.name = constructorName;
	proto.constructorName = constructorName;

	return proto;
}

Meta

<META>
MODULE <core>
INCLUDE <if_used>
TYPE <module_public_function>
NAME <ExtendClass>
CLASS <>
EXTENDS <>
REQUIRES <
>

GetAppFolder() : String

Page1

function GetAppFolder() /*: String*/
{
	var index /*: int*/;
	var url /*: String*/ = document.URL;

	if (url.indexOf("%") > -1)
	{
		url = unescape(url);
	}

	url = url.replace(/^\s*file:(\/+)/, "");

	index = url.lastIndexOf("\\");

	if (index > - 1)
	{
		url = url.substring(0, index + 1);
	}

	index = url.lastIndexOf("\/");

	if (index > - 1)
	{
		url = url.substring(0, index + 1);
	}

	return url;
}

HTMLElement_RemoveClassName(element : HTMLElement, className : String) : void

Code

function HTMLElement_RemoveClassName(
	element /*: HTMLElement*/,
	className /*: String*/
) /*: void*/
{
	var current  /*: String*/ = String_Trim(element.className) || "";
	
	if (!current)
	{
		return;
	}
	else if (current.indexOf(className) == -1)
	{
		return;
	}
	else
	{
		var pattern /*: String*/ = "(^|\\s)" + className + "(\\s|$)";
		var re /*: RegExp*/ = new RegExp(pattern);
		re.lastIndex = 0;
		current = current.replace(re, "$1$2").replace(/\s+/g, " ");
		element.className = String_Trim(current);
	}
}

HTMLElement_AddClassName(element : HTMLElement, className : String) : void

Code

function HTMLElement_AddClassName(
	element /*: HTMLElement*/, 
	className /*: String*/
) /*: void*/
{
	var current /*: String*/ = String_Trim(element.className) || "";
	
	if (!current)
	{
		element.className = className;
		return;
	}
	else if (current.indexOf(className) == -1)
	{
		element.className += " " + className;
	}
	else
	{
		var pattern /*: String*/ = "(^|\\s)" + className + "(\\s|$)";
		var re /*: RegExp*/ = new RegExp(pattern);
		re.lastIndex = 0;

		if (!re.test(current))
		{
			element.className += " " + className;		
		}
	}
}

String_Trim(s : String) : String

Page1

function String_Trim(
	s /*: String*/
) /*: String*/
{
	return s.replace(/^\s+|\s+$/g, "");
}

Sleep(ms : Milliseconds) : void

Page1

function Sleep(
	ms /*: Milliseconds*/
) /*: void*/
{
	var start /*: int*/ = new Date().getTime();
    	while (new Date().getTime() < start + ms);
}

ZeroTimeout(f : Function)

temp

// http://dbaron.org/log/20100309-faster-timeouts

function ZeroTimeout(f /*: Function*/)
{
	if (!ZeroTimeout.init ) { ZeroTimeout_Init(); }
	if (!ZeroTimeout.available) { throw Error("ZeroTimeout not available"); }
	ZeroTimeout.timeouts.push(f);
	window.postMessage(ZeroTimeout.messageName, "*");
}

function ZeroTimeout_Init()
{
	ZeroTimeout.init = true;
	ZeroTimeout.available = true;

	if (typeof window.postMessage == "undefined") 
	{ 
		ZeroTimeout.available = false; 
		return;
	} 
	
	ZeroTimeout.timeouts = [];
	ZeroTimeout.messageName = "zero-timeout";
	
        function ZeroTimeout_MessageHandler(event /*: Any*/) 
	{
		var f /*: Function*/;

            	if (event.source == window && event.data == ZeroTimeout.messageName)
		{
                	event.stopPropagation();
                	if (ZeroTimeout.timeouts.length > 0) 
			{
                    		f = ZeroTimeout.timeouts.shift();
                    		f();
			}
                }

        }

        window.addEventListener("message", ZeroTimeout_MessageHandler, true);
}

Page1

http://dbaron.org/log/20100309-faster-timeouts
// Only add setZeroTimeout to the window object, and hide everything
    // else in a closure.
    (function() {
        var timeouts = [];
        var messageName = "zero-timeout-message";

        // Like setTimeout, but only takes a function argument.  There's
        // no time argument (always zero) and no arguments (you have to
        // use a closure).
        function setZeroTimeout(fn) {
            timeouts.push(fn);
            window.postMessage(messageName, "*");
        }

        function handleMessage(event) {
            if (event.source == window && event.data == messageName) {
                event.stopPropagation();
                if (timeouts.length > 0) {
                    var fn = timeouts.shift();
                    fn();
                }
            }
        }

        window.addEventListener("message", handleMessage, true);

        // Add the one thing we want added to the window object.
        window.setZeroTimeout = setZeroTimeout;
    })();

script - end

Page1

</script>

head - end

Page1

</head>

body - start

Page1

<body>

title

Page1

<h1>Progress Bar Tests</h1>
<br>
<br>
<p>Tested in IE 6-8, Opera 11, Chrome 9, Safari 4, Firefox 3.5</p>
<hr>
<br>

test 1 - showModelessDialog

Page1

<h2>Test 1 - showModelessDialog (PASS - IE ONLY)</h2>
<p>Works perfectly; my ideal solution.</p>
<input type=button value="Run Test" onclick="Test_ShowModelessDialog();">
<br>
<br>
<hr>
<br>

test 2 - showModalDialog

Page1

<h2>Test 2 - showModalDialog (FAIL - ALL BROWSERS)</h2>
<input type=button value="Run Test" onclick="Test_ShowModalDialog();">
<br>
<br>
<hr>
<br>

test 3 - window.open

Page1

<h2>Test 3 - window.open (PASS - IE, FAIL - ALL OTHERS)</h2>
<input type=button value="Run Test (IE)" onclick="Test_WindowOpen_IE();">
<input type=button value="Run Test (OTHERS)" onclick="Test_WindowOpen_Others();">
<br>
<br>
<hr>
<br>

test 4 - iframe

Page1

<h2>Test 4 - iframe (FAIL - ALL BROWSERS)</h2>
<input type=button value="Run Test" onclick="Test_Iframe();">
<br>
<iframe id=test4iframe name=test4iframe src="046-stub.htm" style='width: 200px; height:40px' scrolling="no" frameborder="1"></iframe>
<br>
<br>
<hr>
<br>

test 5 - continuation

Page1

<h2>Test 5 - setTimeout and continuation (PASS - ALL BROWSERS)</h2>
<input type=button value="Run Test" onclick="Test_Continuation();">
<input type=button value="Run Test (Zero Timeout)" onclick="Test_Continuation_ZeroTimeout();">
<p>Note that zero timeout can be instantaneous on some browsers in relation to the loop I am running.</p>
<br>
<div id=test5div></div>
<br>
<br>
<hr>
<br>

test 6 - worker

Page1

<h2>Test 6 - Worker (PASS - OPERA + FIREFOX, FAIL - OTHER BROWSERS)</h2>
<input type=button value="Run Test" onclick="Test_Worker();">
<br>
<div id=test6div></div>
<br>
<br>
<hr>
<br>

test 7 - progress

Page1

<h2>Test 7 - Progress (PASS - OPERA, FAIL - ALL OTHER BROWSERS)</h2>
<input type=button value="Run Test" onclick="Test_ProgressElement();">
<br>
<br>
<progress id=idProgress value="0" max="1000000" style="width:400px; height:30px;"></progress>
<br>
<br>
<hr>
<br>

body - end

Page1

</body>

html - end

Page1

</html>

code

Page1

var stopped /*: Boolean*/ = false;

self.onmessage = function(event)
{
	var data /*: Object*/ = event.data;

	if (event.data.type == "CompleteLoop")
	{
		CompleteLoop();
	}
	else if (event.data.type == "Stop")
	{
		stopped = true;
	}
	
};

function CompleteLoop()
{
	var total /*: int*/ = 10000;

	for (var i /*: int*/ = 0; i < total; i++)
	{
		if (stopped) { break; }

		self.postMessage ({type : "Progress", i : i + 1, total : total});
	}

	self.postMessage ({type : "Done"} );
}