//	Updated 10/3/2011
//
// Javascript copyright 2003-2010 by Jay Krause.  All rights reserved.
//
//  clib_passcodes.js - key control
//
//	h = clibp_newPassCode(code,action)
//  h = clibp_newActionCode(code,action)
//	h = clibp_newLinkCode(code,url,fNewWindow)
//	clibp_changePassCode(h,action);
//	clibp_changeActionCode(h,action);
//	clibp_changeLinkCode(h,url);

function newPassCode(code,action) { clib_debugFunction(clib_fLocal); clibp_newPassCode (code,action); }
function newActionCode(code,action) { clib_debugFunction(clib_fLocal); clibp_newActionCode (code,action); }

if (eval('typeof clib_fUseAlert') == 'undefined') var clib_fUseAlert = false;
if (eval('typeof clib_fDumpData') == 'undefined') var clib_fDumpData = false;
if (clib_fDumpData) clibdb_register('clibp_s');

function clibp_stateType() {
	this.members='fInit,code,iCodeStart,maxLength,rgCodes,rgActions,nrgCodes,rgKey';
	this.members += ',nrgKey,rgUniqueCodes,rgnActionUniqueCodes,nrgUniqueCodes';
	this.members += ',rgSpecial,nrgSpecial,rgLink,nrgLink,newWinTarget,fnCheck';
	this.fInit = false;
	this.code = "";
	this.iCodeStart = 0;
	this.maxLength = 100;
	this.rgCodes = new Array();
	this.rgActions = new Array();
	this.nrgCodes = 0;
	this.rgUniqueCodes = new Array()
	this.rgnActionUniqueCodes = new Array()
	this.nrgUniqueCodes = 0;
	this.rgKey = new Array();
	this.nrgKey = 0;
	this.rgSpecial = new Array();
	this.nrgSpecial = 0;
	this.rgLink = new Array();
	this.nrgLink = 0;
	this.newWinTarget = '_blank';
	this.fnCheck = null;
	}

var clibp_s = new clibp_stateType();

function clibp_handleSpecialType(n,action) {
	this.members = 'n,action';
	this.n = n;
	this.action = action;
	}

function clibp_setPassCodeChecker(fn) {
	clibp_s.fnCheck = fn;
	}

function clibp_newLinkCode(code,url,fNewWindow) {
	if (fNewWindow == null) fNewWindow = false;
	var h = clibp_s.nrgLink
	clibp_s.rgLink[h] = url;
	clibp_newPassCode(code,'clibp_doLink(' + clibp_s.nrgLink + ',' + fNewWindow + ')');
	clibp_s.nrgLink++;
	return h;
	}

function clibp_changeLinkCode(h,url) {
//	alert('Changed clibp_s.rgLink[' + h + '] = ' + clibp_s.rgLink[h] + ' to ' + url);
	clibp_s.rgLink[h] = url;
	}

function clibp_doLink(i,f) {
	if (f) clib_newWindow(clibp_s.rgLink[i],clibp_s.newWinTarget);
	else clib_gotoTopUrl(clibp_s.rgLink[i]);
	}

function clibp_newPassCode(code,action) {
	initPassCode();
	var h = clibp_s.nrgCodes;
	clibp_s.rgCodes[h]=code;
	clibp_s.rgActions[h]=action;
	clibp_s.maxLength = Math.max(clibp_s.maxLength,code.length);
	clibp_s.nrgCodes++;
	if (clibp_s.nrgCodes == 1) {
		clibp_s.rgUniqueCodes[0] = code;
		clibp_s.rgnActionUniqueCodes[0] = 1;
		return h;
		}
	for (var i = 0; i < clibp_s.nrgUniqueCodes; i++) {
		if (code == clibp_s.rgUniqueCodes[i]) {
			clibp_s.rgnActionUniqueCodes[i]++;
			return h;
			}
		}
	for (var i = clibp_s.nrgUniqueCodes; i >= 0; i--) {
		if (clibp_s.rgUniqueCodes[i] <= code) {
			clibp_s.rgUniqueCodes[i+1] = code;
			clibp_s.rgnActionUniqueCodes[i+1] = 1;
			clibp_s.nrgUniqueCodes++;
			return h;
			}
		clibp_s.rgUniqueCodes[i+1] = clibp_s.rgUniqueCodes[i];
		clibp_s.rgnActionUniqueCodes[i+1] = clibp_s.rgnActionUniqueCodes[i];
		}
	clibp_s.rgUniqueCodes[0] = code;
	clibp_s.rgnActionUniqueCodes[0] = 1;
	clibp_s.nrgUniqueCodes++;
	return h;
	}

function clibp_changePassCode(h,action) {
//	alert('Changed clibp_s.rgActions[' + h + '] = ' + clibp_s.rgActions[h] + ' to ' + action);
	clibp_s.rgActions[h] = action;
	}

function clibp_newActionCode(n,action) {
	var h = clibp_s.nrgSpecial;
	clibp_s.rgSpecial[h] = new clibp_handleSpecialType(n,action);
	clibp_s.nrgSpecial++;
	return h;
	}

function clibp_changeActionCode(h,action) {
//	alert('Changed ' + clibp_s.rgSpecial[h].action + ' to ' + action);
	clibp_s.rgSpecial[h].action = action;
	}

function initPassCode() {
	if (clibp_s.fInit) return;
	clibp_s.fInit = true;
	function keyStateRecord (code,escape) {
		this.members = 'code,escape,fDown';
		this.code = code;
		this.escape = escape;
		this.fDown = false;
		}

	clibp_s.rgKey[clibp_s.nrgKey++] = new keyStateRecord( 9,'#tab#');
//	clibp_s.rgKey[clibp_s.nrgKey++] = new keyStateRecord(13,'#enter#');
	clibp_s.rgKey[clibp_s.nrgKey++] = new keyStateRecord(16,'#shift#');
	clibp_s.rgKey[clibp_s.nrgKey++] = new keyStateRecord(17,'#control#');
	clibp_s.rgKey[clibp_s.nrgKey++] = new keyStateRecord(18,'#alt#');
	clibp_s.rgKey[clibp_s.nrgKey++] = new keyStateRecord(27,'#escape#');
	clibp_s.rgKey[clibp_s.nrgKey++] = new keyStateRecord(37,'#left-arrow#');
	clibp_s.rgKey[clibp_s.nrgKey++] = new keyStateRecord(38,'#up-arrow#');
	clibp_s.rgKey[clibp_s.nrgKey++] = new keyStateRecord(39,'#right-arrow#');
	clibp_s.rgKey[clibp_s.nrgKey++] = new keyStateRecord(40,'#down-arrow#');
	clibp_s.rgKey[clibp_s.nrgKey++] = new keyStateRecord(46,'#delete#');
	
	document.onkeypress = pc_handleKeyPress;
	document.onkeydown = pc_handleKeyDown;
	document.onkeyup = pc_handleKeyUp;

	if (navigator.appName == "Netscape") document.captureEvents(Event.KEYDOWN);
	}

var p_fIgnoreKeystroke = false;
var p_chLast = '';

function NetscapeDupError() {
	p_fIgnoreKeystroke = false;
	}

function pc_handleKeyPress(keyStroke) {															// normal letters & digits
	var eventChooser = (navigator.appName == "Netscape") ? keyStroke.which : event.keyCode;
	var ch = String.fromCharCode(eventChooser).toLowerCase();
	if ((p_fIgnoreKeystroke) && (ch == p_chLast)) return;
	p_chLast = ch;
	if (navigator.appName == "Netscape") {
		p_fIgnoreKeystroke = true;
		setTimeout('NetscapeDupError()',100);
		}
//	for (var i = 0; i < clibp_s.nrgSpecial; i++) if (eventChooser == clibp_s.rgSpecial[i].n) eval(clibp_s.rgSpecial[i].action);
//	if (eventChooser == 13) { if (clib_fUseAlert) clib_hideAlert(); }
	if (eventChooser >= 32) {
		clibp_s.code += ch;
		if (clibp_s.code.length > clibp_s.maxLength) clibp_s.code = clibp_s.code.substr(clibp_s.code.length-clibp_s.maxLength,clibp_s.maxLength);
		checkPassCode(clibp_s.code, false);
		}
	return true;
	}

var p_fIgnoreKeydown = false;
var p_kcLast = '';
function NetscapeDupError2() {
	p_fIgnoreKeydown = false;
	}

function pc_handleKeyDown(keyStroke) {															// special characters ie arrows, etc.
	var eventChooser = (navigator.appName == "Netscape") ? keyStroke.which : event.keyCode;
	if ((p_fIgnoreKeydown) && (eventChooser == p_kcLast)) return;
	p_kcLast = eventChooser;
	if (navigator.appName == "Netscape") {
		p_fIgnoreKeydown = true;
		setTimeout('NetscapeDupError2()',100);
		}
	for (var i = 0; i < clibp_s.nrgSpecial; i++) if (eventChooser == clibp_s.rgSpecial[i].n) { eval(clibp_s.rgSpecial[i].action); }
	var fFound = false;
	for (var i = 0; i < clibp_s.nrgKey; i++) {
		if (eventChooser == clibp_s.rgKey[i].code) {
			clibp_s.code += clibp_s.rgKey[i].escape;
			if (clibp_s.code.length > clibp_s.maxLength) clibp_s.code = clibp_s.code.substr(clibp_s.code.length-clibp_s.maxLength,clibp_s.maxLength);
			checkPassCode(clibp_s.code, false);
			fFound = true;
			break;
			}
		}
	if (navigator.appName != "Netscape") initPassCode();
	document.onkeydown = pc_handleKeyDown;
	return true;
	}

function pc_handleKeyUp(keyStroke) {
	var eventChooser = (navigator.appName == "Netscape") ? keyStroke.which : event.keyCode;
	for (var i = 0; i < clibp_s.nrgKey; i++) {
		if (eventChooser==clibp_s.rgKey[i].code) {
			clibp_s.rgKey[i].fDown = false;
			break;
			}
		}
	document.onkeyup = pc_handleKeyUp;
	return true;
	}

function checkPassCode(str,fEsc) {
	var j = clibp_s.iCodeStart;
	for (var i = 0; i < clibp_s.nrgCodes; i++) {
		if (str.length >= clibp_s.rgCodes[j].length) {
			var id = (fEsc ? str : str.substr(str.length-clibp_s.rgCodes[j].length,clibp_s.rgCodes[j].length));
			if (clibp_s.rgCodes[j] == id) {
				if (clibp_s.fnCheck != null) if (eval(clibp_s.fnCheck + '("' + id + '")')) return false;
				eval(clibp_s.rgActions[j]);
				clibp_s.iCodeStart = j + 1;
				if (clibp_s.iCodeStart >= clibp_s.nrgCodes) clibp_s.iCodeStart = 0;
				document.onkeypress = pc_handleKeyPress;
				return true;
				}
			}
		j++;
		if (j >= clibp_s.nrgCodes) j = 0;
		}
	return false;
	}

function xyzzyMsg() {
	var msg,nCols,nRows,wP;
	if (clib_fUseAlert) {
		nCols = 3;
		nRows = Math.floor((clibp_s.nrgUniqueCodes+nCols-1)/nCols);
		wP = Math.floor(100/nCols);
		msg  = '<div align=center style="cursor:default;"><b>Magic Words</b><hr>';
		msg += '<table align=center width="95%" border=0 cellspacing=0 colspacing=0><tr>';
		msg += '<td valign="top" align="center" width="' + wP + '%"><font color="#000000"><nobr>';
		msg += clibp_s.rgUniqueCodes[0];
		if (clibp_s.rgnActionUniqueCodes[0] > 1) msg += " (" + clibp_s.rgnActionUniqueCodes[0] + ")";

		for (var i = 1; i < clibp_s.nrgUniqueCodes; i++) {
			msg += '</nobr>';
			if ((i/nRows) == Math.floor(i/nRows))
				msg += '</font></td><td valign="top" align="center" width="' + wP + '%"><font color="#000000">';
			else msg += '<br>';
			msg += '<nobr>';
			if (clibp_s.rgUniqueCodes[i] == 'plugh') msg += '<a href="javascript:plughMsg()"><font color=black>plugh</font></a>';
			else msg += clibp_s.rgUniqueCodes[i];
			if (clibp_s.rgnActionUniqueCodes[i] > 1) msg += ' (' + clibp_s.rgnActionUniqueCodes[i] + ')';
			}
		msg += '</font></td></tr></table></div>';
		var rg = msg.split('~');
		if (rg.length > 1) {
			msg = rg[0];
			for (var i = 1; i < rg.length; i++) msg += '&#126;' + rg[i];
			}
		clib_showAlert(msg);
		}
	else {
		nCols = 4;
		msg = 'Magic words on this page are:';
		for (var i = 0; i < clibp_s.nrgUniqueCodes; i++) {
			if ((i/nCols) == Math.floor(i/nCols)) msg += '\n"';
			else msg += '  "';
			msg += clibp_s.rgUniqueCodes[i] + '"';
			if (clibp_s.rgnActionUniqueCodes[i] > 1) msg += ' (' + clibp_s.rgnActionUniqueCodes[i] + ')';
			}
		window.alert(msg);
		}
	}

function plughMsg() {
	var msg;
	if (clib_fUseAlert) {
		msg  = '<div align=center style="cursor:default;"><b>Magic Words</b><hr>';
		msg += '<table align=center width="80%" border=0 cellspacing=0 colspacing=0>';
		for (var i = 0; i < clibp_s.nrgCodes; i++) {
			msg += '<tr><td align="left" valign="top"><a href="javascript:eval(clibp_s.rgActions[' + i + '])"><font color=black>' + clibp_s.rgCodes[i] + '&nbsp;</font></a></td>';
			msg += '<td align="left" valign="top"><font color=black><nobr>' + clibp_s.rgActions[i] + '</nobr></font></td></tr>';
			}
		msg += '</table></div>';
		var rg = msg.split('~');
		if (rg.length > 1) {
			msg = rg[0];
			for (var i = 1; i < rg.length; i++) msg += '&#126;' + rg[i];
			}
		clib_showAlert(msg);
		}
	else {
		msg  = 'Magic Words:\n';
		for (var i = 0; i < clibp_s.nrgCodes; i++) {
			msg +=  '\n'+ clibp_s.rgCodes[i] + ': ';
			msg += clibp_s.rgActions[i];
			}
		window.alert(msg);
		}
	}

function pc_showPreloadErrors() {
	var rgError = new Array();
	var nrgError = 0;
	for (var i = 0; i < clib_nrgPreLoad; i++) if (!clib_rgPreLoad[i].img.complete) rgError[nrgError++] = clib_rgPreLoad[i].url + ' [' + clib_rgPreLoad[i].caller + ']';
	var msg = 'clib_rgPreLoad errors: ' + (nrgError == 0 ? 'none' : '<br>\n');
	for (var i = 0; i < nrgError; i++) msg += rgError[i] + '<br>\n';
	clib_showAlert(msg);
	}

clibp_newActionCode(13,'if (clib_fUseAlert) clib_hideAlert(true);');
clibp_newPassCode('xyzzy','xyzzyMsg()');
clibp_newPassCode('plugh','plughMsg()');

if (clib_fLocal) clib_writeln('<scri' + 'pt language="JavaScript" type="text/javascript" src="' + clib_homePrefix + '../' + 'Local' + '/' + 'local_pcodes' + '.' + 'js"></sc' + 'ript>');

