var DEV = false;
var APPMODE = false;
var LOG = false;
var VER = 'V2.060604.1';
var MAX_COL = 13;
var MAX_ROW = 24;
var MAX_CELL = 10;
var ssCellWidth = 68;
var ssRowSumWidth = 50;
var NUM_VIEWS = 3;
var VIEW_NRM = 0;
var VIEW_SS = 1;
var VIEW_SSPLUS = 2;
var VIEW_NRM_BRITE = 3;
var g_ViewNames = new Array( 'normal', 'spreadsheet', 'spreadsheet+', 'bright' );
var LAYOUT_NRM = 0;
var LAYOUT_SS = 1;
var SCORES_REC = APPMODE ? 'fcell' : 'ncell';
var ANON = 'Anonymous';
var NOT_LOGGED = '(not logged in yet)';
var SCORE_STREAK = 0;
var DONT_SCORE = 1;
var SCORE_TOURNAMENT = 2;
if( DEV )
{
}
else
{
//RF
var IMG_BASE = 'http://www.koningsfortuin.nl/jasper/freecell/i/';
var DLG_BASE = 'http://www.koningsfortuin.nl/jasper/freecell/dlgv2/';
var CARD_IMGS = 'http://www.koningsfortuin.nl/jasper/freecell/i/da_cards2.gif';
var CARD_IMGS_BRITE = 'http://www.koningsfortuin.nl/jasper/freecell/i/da_cardsBrite.gif';
var CGI_URL = "";
var AD_PREFIX = '';
}
var g_CardAnimDelay = 1;
var g_Suitnames = new Array( 'clubs', 'diamonds', 'spades', 'hearts' );
var g_Ranks = new Array( 'A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K' );
var g_GameMenu = new Array( 'Standard', 'Nine to Five', 'Ten to Six', 'Lucky 13', 'Custom', 'Tournament',
'4x4', '4x5', '4x6', '4x7', '4x8', '4x9', '4x10',
'5x3', '5x4', '5x5', '5x6', '5x7', '5x8', '5x9', '5x10',
'6x2', '6x3', '6x4', '6x5', '6x6', '6x7', '6x8', '6x9', '6x10',
'7x2', '7x3', '7x4', '7x5', '7x6', '7x7', '7x8', '7x9',
'8x1', '8x2', '8x3', '8x4', '8x5', '8x6', '8x7', '8x8',
'9x0', '9x1', '9x2', '9x3', '9x4', '9x5', '9x6', '9x7',
'10x0', '10x1', '10x2', '10x3', '10x4', '10x5', '10x6',
'11x0', '11x1', '11x2', '11x3', '11x4', '11x5',
'12x0', '12x1', '12x2', '12x3', '12x4',
'13x0', '13x1', '13x2', '13x3'
);
var g_Cnames = new Array( "A","2","3","4","5","6",
"7","8","9","T","J","Q","K","?" );
var g_Suits = new Array(
"C",
"D",
"S",
"H",
"?"
);
var g_SymSuits = new Array( '♣', '♦', '♠', '♥' );
var g_NumCodes = new Array( '0','1','2','3','4','5','6','7','8','9',':',';','<' );
var g_NumCols;
var g_NumCells;
var g_View;
var g_Layout;
var g_CardIndex;
var g_ViewSpacing;
var g_CardHeight;
var g_CardWidth;
var g_Game;
var g_AllCards;
var g_CardHash;
var g_CommandQueue;
var g_History;
var g_Board;
var g_Aces;
var g_Cells;
var g_ColTflgs;
var g_CPBoard;
var g_CPCells;
var g_CPAces;
var g_CPAll;
var g_ssColSums;
var g_ssRowSums;
var g_ssMainSum;
var g_ShowSums;
var g_MainBoardRect;
var g_GameDifficulty;
var g_StartTime;
var g_GameInProg;
var g_GameSeed;
var g_DoesntCount;
var g_GameMoves;
var g_GameCardsMoved;
var g_CustomGame;
var g_Scores;
var g_ServerMode;
var g_UIState;
var g_NewUser;
var g_LoggedInAs = NOT_LOGGED;
var g_Password = '';
var g_chatWindow = null;
var g_Registered = false;
var g_NonRegPlays = 0;
var g_DlgArguments;
var g_DlgAdNotLoaded = 0;
var g_Initd = false;
function init()
{
arrayFix();
window.document.uname = "testing";
String.prototype.trim = _stringTrim;
if( APPMODE )
{
checkRegistered();
}
flushCommandQueue();
deferCommand( "init" );
}
function cmdInit()
{
if( g_Initd )
{
alert( "cmdInit called twice" );
return;
}
createCardImages();
iddesthilite.addBehavior( '#default#userdata' );
g_Initd = true;
queueCommand( "reset" );
}
function cmdReset()
{
var i, j;
g_CommandQueue = new Array();
g_NumCols = 8;
g_NumCells = 4;
g_View = VIEW_NRM;
g_Layout = LAYOUT_NRM;
g_CardIndex = 0;
g_Game = 'Standard';
g_AllCards = new Array( new Array(13), new Array(13), new Array(13), new Array(13) );
g_CardHash = new Array();
g_History = new History();
g_Board = new Array();
g_Aces = new Array();
g_Cells = new Array();
g_ColTflgs = new Array();
g_CPBoard = new Array();
g_CPCells = new Array();
g_CPAces = new Array();
g_ssColSums = new Array();
g_ssRowSums = new Array();
g_ssMainSum = 0;
g_ShowSums = false;
g_MainBoardRect = null;
g_GameDifficulty = 5;
g_GameInProg = false;
g_GameSeed = null;
g_DoesntCount = false;
g_GameMoves = 0;
g_GameCardsMoved = 0;
g_Scores = new Array();
hideWait();
if( !commInit() )
{
paramName = ANON;
}
for( i = 0; i < 4; i++ )
{
for( j = 0; j < 13; j++ )
{
g_AllCards[i][j] = new Card( i, j );
}
}
for( i = 0; i < MAX_COL; i++ )
{
g_Board[i] = new Array();
g_CPBoard[i] = new CardPile( CP_COL, i );
}
for( i = 0; i < 4; i++ )
{
g_Aces[i] = new Array();
g_CPAces[i] = new CardPile( CP_ACE, i );
}
for( i = 0; i < MAX_CELL; i++ )
{
g_CPCells[i] = new CardPile( CP_CELL, i );
}
initSpreadsheetSums();
try
{
iddesthilite.load( SCORES_REC );
if( paramName == ANON )
{
var s = iddesthilite.getAttribute( 'game' );
if( s )
{
stringToGame( s );
}
s = iddesthilite.getAttribute( 'scores' );
if( s )
{
restoreAllScores( s );
}
}
else
{
var s = iddesthilite.getAttribute( 'servergame' );
if( s )
{
stringToGame( s );
}
g_GameInProg = false;
g_GameSeed = null;
}
}
catch(e)
{
}
drawBoard( g_View, g_NumCols, g_NumCells );
g_CustomGame = new gameParams();
if( g_PollTimerVal == -1 )
{
var b = window.document.body;
b.attachEvent( 'onkeypress', evtKeypress );
b.attachEvent( 'onmousedown', evtMouseDown );
b.attachEvent( 'onmouseup', evtMouseUp );
b.attachEvent( 'onmousemove', evtMouseMove );
b.attachEvent( 'onselectstart', evtNOP );
b.attachEvent( 'oncontextmenu', evtNOP );
window.attachEvent( 'onbeforeunload', evtUnload );
pollLayout();
}
if( paramName != ANON )
{
setUIState( 'off' );
g_ServerMode = true;
if( paramPassword && paramPassword != '' )
{
idloggedinas.innerText = '(Logging in...)';
if( commPutLine( "_LogMeNow " + paramName + "|" + paramPassword + "|" + (paramNewUser ? "new" : "existing")
+ "|" + g_ViewNames[g_View] + "/" + VER ) )
{
commGetLine( 'loginResponse' );
showWait();
}
}
else
{
doLogin( null );
}
}
else
{
g_ServerMode = false;
if( g_GameInProg )
{
s = iddesthilite.getAttribute( 'board' );
if( s )
{
stringToBoard( s );
}
idmoves.innerText = g_GameMoves;
idcardsmoved.innerText = g_GameCardsMoved;
g_LoggedInAs = ANON;
idloggedinas.innerText = ANON;
setUIState( 'play' );
}
else
{
g_LoggedInAs = ANON;
idloggedinas.innerText = ANON;
setUIState( 'ready' );
}
}
}
function doLogin( sMesg )
{
if( sMesg == null )
sMesg = 'New user? Select an unusual name-- most of the common ones are already taken';
var params = new Object();
params.name = paramName;
params.newUser = paramNewUser;
params.mesg = sMesg;
showDlg( "dlgLogin.html", params, 430, 250 );
}
function doLoginDlgRet( ret )
{
hideDlg();
if( ret == null )
{
doLogin( ret.mesg );
return;
}
paramName = ret.name;
paramPassword = ret.password;
paramNewUser = ret.newUser;
if( paramName == ANON )
{
queueCommand( 'reset' );
return;
}
idloggedinas.innerText = '(Logging in...)';
if( commPutLine( "_LogMeNow " + ret.name + "|" + ret.password + "|" + (ret.newUser ? "new" : "existing")
+ "|" + g_ViewNames[g_View] + "/" + VER ) )
{
commGetLine( 'loginResponse' );
showWait();
}
}
function cmdLoginResponse( sRes )
{
var a = sRes.split('\n');
hideWait();
switch( a[0] )
{
case 'Ready':
case 'Premium':
g_LoggedInAs = paramName;
g_Password = paramPassword;
idloggedinas.innerText = paramName;
if( a[0] == 'Premium' )
{
paramNoads = 'noads';
if( document.getElementById( "idpremium" ) )
{
idpremium.innerText = '(Premium member)';
}
}
setUIState( 'ready' );
break;
case 'Illegal':
doLogin( 'Illegal name. Try again.' );
break;
case 'InProgress':
g_LoggedInAs = paramName;
g_Password = paramPassword;
idloggedinas.innerText = paramName;
cmdDealResponse( sRes );
break;
case 'Mismatch':
doLogin( 'Password did not match. Note: passwords and player names are case-sensitive.' );
break;
case 'Exists':
doLogin( 'That name is already in use by someone else. Please select a different name.' );
break;
case 'NotFound':
doLogin( "Player records not found. If you are a new player, please check the 'new player' checkbox." );
break;
default:
doLogin( "Unexpected server response. Please try again." );
break;
}
}
var g_PollTimerVal = -1;
function pollLayout()
{
var r = getAbsOffset( idmainboard );
if( r.top != g_MainBoardRect.top || r.left != g_MainBoardRect.left )
{
g_MainBoardRect = r;
var i;
for( i = 0; i < g_CPAll.length; i++ )
{
var cp = g_CPAll[i];
cp.layout();
}
}
g_PollTimerVal = setTimeout( 'pollLayout();', 500 );
}
function drawBoard( view, cols, cells )
{
var sb = new Array();
var i;
var sHTML;
var layout = view == VIEW_NRM || view == VIEW_NRM_BRITE ? LAYOUT_NRM : LAYOUT_SS;
var finalWidth;
idplayarea.innerHTML = '';
if( layout == LAYOUT_NRM )
{
g_ViewSpacing = 25;
g_CardHeight = 96;
g_CardWidth = 71;
var w1 = cols * 69 + (cols + 1) * 5;
var w2 = (cells + 4) * 69 + (cells + 5) * 3 + 10;
i = w1 > w2 ? w1 : w2;
i = i < 640 ? 640 : i;
finalWidth = i;
sb.push( '
' );
sb.push( '| ' );
sb.push( '[TopButtonBar]' );
sb.push( ' |
' );
sb.push( '' );
sb.push( '' );
sb.push( '| [Cells] | | [Aces] | ' );
sb.push( '| [Columns] | ' );
sb.push( '| ' );
//sb.push( APPMODE ? 'Freecell' : 'NetCELL' );
sb.push( ' | ' );
sb.push( '' );
//RF width was 100%
sb.push( '' );
sb.push( '' );
sb.push( '| Moves: ' + g_GameMoves + ' | ' );
if( APPMODE )
{
sb.push( '' );
}
else
{
sb.push( ' | ' );
}
//RF sb.push( 'Logged in as: ' + g_LoggedInAs + ' ' );
sb.push( '' + g_LoggedInAs + ' ' );
if( !APPMODE && paramNoads == 'noads' )
{
sb.push( '(Premium member)' );
}
else
{
sb.push( '' );
}
sb.push( ' | Card moves: ' + g_GameCardsMoved + ' | ' );
sb.push( ' ' );
sb.push( ' ' );
sb.push( ' | ' );
sb.push( ' ' );
sb.push( ' |
' );
sb.push( '| ' );
sb.push( '[BottomButtonBar]' );
sb.push( ' |
' );
sb.push( '
' );
sHTML = sb.join( "" );
sHTML = sHTML.replace( /\[TopButtonBar\]/, drawTopButtonBar( view, layout ) );
sb = new Array();
sb.push( '' );
for( i = 0; i < cells; i++ )
{
var id = String.fromCharCode( 65 + i );
sb.push( '| ' + id + ' | ' );
}
sb.push( '
' );
var s = sb.join( "" );
sHTML = sHTML.replace( /\[Cells\]/, s );
sb = new Array();
sb.push( '' );
for( i = 0; i < 4; i++ )
{
sb.push( ' | ' );
}
sb.push( '
' );
s = sb.join( "" );
sHTML = sHTML.replace( /\[Aces\]/, s );
sb = new Array();
sb.push( '' );
for( i = 0; i < cols; i++ )
{
sb.push( '| ' + (i+1) + ' | ' );
}
sb.push( '
' );
s = sb.join( "" );
sHTML = sHTML.replace( /\[Columns\]/, s );
sHTML = sHTML.replace( /\[BottomButtonBar\]/, drawBottomButtonBar( layout ) );
idplayarea.innerHTML = sHTML;
}
else
{
var cl, di, sp, he;
g_ViewSpacing = 18;
g_CardHeight = 18;
g_CardWidth = 68;
if( view == VIEW_SSPLUS )
{
cl = '
';
di = '
';
sp = '
';
he = '
';
}
else
{
cl = 'C';
di = 'D';
sp = 'S';
he = 'H';
}
var rows = Math.ceil( 52 / cols ) + 11;
var w1 = cols * ssCellWidth + ssRowSumWidth + (cols + 2) * 7;
var w2 = (cells + 4) * ssCellWidth + (cells + 5) * 5 + 10;
i = w1 > w2 ? w1 : w2;
i = i < 640 ? 640 : i;
finalWidth = i;
sb.push( '' );
sb.push( '| [TopButtonBar] |
' );
sb.push( '' );
sb.push( '| [Cells] | ' );
sb.push( ' | ' );
sb.push( '[Aces] | ' );
sb.push( '| [Columns] | ' );
sb.push( '' );
sb.push( '' );
sb.push( '' );
sb.push( '| Moves: ' + g_GameMoves + ' | ' );
sb.push( 'Logged in as: ' + g_LoggedInAs + ' | ' );
sb.push( 'Card moves: ' + g_GameCardsMoved + ' | ' );
sb.push( ' ' );
sb.push( ' ' );
sb.push( ' | ' );
sb.push( ' ' );
sb.push( ' |
' );
sb.push( ' |
' );
sb.push( '| [BottomButtonBar] |
' );
sb.push( '
' );
sHTML = sb.join( "" );
sHTML = sHTML.replace( /\[TopButtonBar\]/, drawTopButtonBar( view, layout ) );
var sb = new Array();
sb.push( '' );
for( i = 0; i < cells; i++ )
{
sb.push( '| ' + String.fromCharCode(65+i) + ' | ' );
}
sb.push( '
' );
for( i = 0; i < cells; i++ )
{
sb.push( ' | ' );
}
sb.push( '
' );
var s = sb.join( "" );
sHTML = sHTML.replace( /\[Cells\]/, s );
var sb = new Array();
sb.push( '' );
sb.push( '| ' + cl + ' | ' );
sb.push( ' ' + di + ' | ' );
sb.push( ' ' + sp + ' | ' );
sb.push( ' ' + he + ' | ' );
sb.push( '
' );
for( i = 0; i < 4; i++ )
{
sb.push( ' | ' );
}
sb.push( '
' );
s = sb.join( "" );
sHTML = sHTML.replace( /\[Aces\]/, s );
sb = new Array();
sb.push( ' | ' );
for( i = 0; i < cols; i++ )
{
sb.push( '' + (i+1) + ' | ' );
}
sb.push( ' |
' );
var r;
for( r = 0; r < rows; r++ )
{
var rowid = r + 1;
rowid = rowid < 10 ? '0' + rowid : rowid;
sb.push( '| ' + rowid + ' | ' );
var c;
for( c = 0; c < cols; c++ )
{
var id = r == 0 ? ' id=idcols' : '';
sb.push( ' | ' );
}
sb.push( ' |
' );
}
sb.push( ' | ' );
for( i = 0; i < cols; i++ )
{
sb.push( ' | ' );
}
sb.push( ' |
' );
s = sb.join( "" );
sHTML = sHTML.replace( /\[Columns\]/, s );
sHTML = sHTML.replace( /\[BottomButtonBar\]/, drawBottomButtonBar( layout ) );
idplayarea.innerHTML = sHTML;
}
for( i = 0; i < 52; i++ )
{
idcards0[i].style.display = 'none';
idcards1[i].style.display = 'none';
idcards2[i].style.display = 'none';
}
g_CPAll = new Array();
for( i = 0; i < cols; i++ )
{
g_CPAll.push( g_CPBoard[i] );
g_CPBoard[i].reset();
}
for( i = 0; i < cells; i++ )
{
g_CPAll.push( g_CPCells[i] );
g_CPCells[i].reset();
}
for( i = 0; i < 4; i++ )
{
g_CPAll.push( g_CPAces[i] );
g_CPAces[i].reset();
}
g_MainBoardRect = getAbsOffset( idmainboard );
g_NumCols = cols;
g_NumCells = cells;
g_View = view;
g_Layout = layout;
setCardSet( view );
if( APPMODE )
{
var br = getAbsOffset( brdtbl );
window.resizeTo( finalWidth + 13, br.bottom - br.top + 38 );
}
}
function drawTopButtonBar( view, layout )
{
var i;
var sb = new Array();
sb.push( '' );
return sb.join( "" );
}
function drawBottomButtonBar( layout )
{
var sb = new Array();
sb.push( '' );
return sb.join( "" );
}
function createCardImages()
{
var r, s, sHTML;
var sb0 = new Array();
var sb1 = new Array();
var sb2 = new Array();
var suitoff = new Array( 0, 96, 288, 192 );
for( s = 0; s < 4; s++ )
{
for( r = 0; r < 13; r++ )
{
var x, y;
x = r * 75;
y = s * 100;
sb0.push( '' );
x = -(r * 71);
y = -suitoff[s];
sb0.push( '
' );
sb0.push( '' );
var val = (s & 1) ? -1 - Random(39) : 1 + Random(99);
var sval = ' ' + val;
sval = sval.substr( sval.length - 3 );
sval = sval.replace( / /g, ' ' );
sval += '.00';
x = r * 72;
y = s * 26;
var color = s & 1 ? "#cc0000" : "black";
sb1.push( '' );
sb1.push( '' + g_Ranks[r] + g_Suits[s] + ' ' );
sb1.push( '' + sval + '' );
color = s & 1 ? "#cc0000" : "black";
sb2.push( '' );
sb2.push( '' + g_Ranks[r] + '
' );
sb2.push( '' + sval + '' );
}
}
sHTML = sb0.join( "" ) + sb1.join( "" ) + sb2.join( "" );
window.document.body.insertAdjacentHTML( 'beforeEnd', sHTML );
}
function setCardSet( view )
{
var i;
var cardSrc;
switch( view )
{
case VIEW_NRM:
cardSrc = CARD_IMGS;
g_CardIndex = 0;
break;
case VIEW_NRM_BRITE:
cardSrc = CARD_IMGS_BRITE;
g_CardIndex = 0;
break;
case VIEW_SS:
cardSrc = null;
g_CardIndex = 1;
break;
case VIEW_SSPLUS:
cardSrc = null;
g_CardIndex = 2;
break;
}
if( cardSrc != null && idcard0img[0].src != cardSrc )
{
for( i = 0; i < 52; i++ )
{
idcard0img[i].src = cardSrc;
}
}
}
function selectGame()
{
var s = idgameselect.value;
var cols, cells;
switch( s )
{
case 'Standard':
cols = 8;
cells = 4;
break;
case 'Easy':
cols = 8;
cells = 4;
break;
case 'Nine to Five':
cols = 9;
cells = 5;
break;
case 'Lucky 13':
cols = 13;
cells = 0;
break;
case 'Ten to Six':
cols = 10;
cells = 6;
break;
case 'Custom':
cols = g_CustomGame.cols;
cells = g_CustomGame.cells;
break;
case 'Tournament':
cols = g_NumCols;
cells = g_NumCells;
break;
default:
var a = s.split( "x" );
cols = a[0] / 1;
cells = a[1] / 1;
break;
}
g_Game = s;
if( cols != g_NumCols || cells != g_NumCells )
{
if( s != 'Custom' )
{
g_GameSeed = null;
}
btnreplay.disabled = true;
deferCommand( "selectGame " + cols + " " + cells );
}
}
function selectView()
{
var s = idviewselect.value;
deferCommand( "selectView " + s );
}
function playClick()
{
if( APPMODE && !g_Registered )
{
showDlg( 'dlgRegister.html', null, 500, 350 );
}
else
{
playBegin();
}
}
function registerDlgRet( ret )
{
hideDlg();
if( ret == null )
{
if( g_NonRegPlays++ < 5 )
{
playBegin();
}
else
{
showDlg( "dlgLoadGame.html", null, 200, 120 );
setTimeout( "delayedPlay()", 4000 );
}
return;
}
if( isValidRegCode( ret ) )
{
if( !writeRegCode( ret ) )
{
alert( "Your registration code was valid but there was a problem saving it. Maybe some anti-virus software is interfering with the operation of this game. If you cannot resolve the problem, please contact us for you money back." );
}
else
{
alert( "Congratulations! You are now a registered user.\nI really appreciate your support. THANKS!" );
}
g_Registered = true;
playBegin();
}
else
{
alert( "That code didn't work. Be careful and make sure you enter it properly.\n\nHint: maybe try cutting and pasting the registration code from the\nemail into the text box.\n\nLet's try again." );
showDlg( 'dlgRegister.html', null, 500, 350 );
}
}
function delayedPlay()
{
hideDlg();
playBegin();
}
function playBegin()
{
switch( idgameselect.value )
{
case 'Custom':
queueCommand( 'custom' );
break;
case 'Tournament':
if( g_LoggedInAs == ANON )
{
alert( "Sorry-- you must be logged in to the Freecell.com site as a non-anonymous user in order to play tournaments." );
setUIState( 'ready' );
return;
}
if( commPutLine( '_GetTourInfo' ) )
{
commGetLine( 'tourInfoResponse' );
}
break;
default:
queueCommand( 'play' )
break;
}
}
function Card( s, r )
{
this.suit = s;
this.rank = r;
this.rct = new rect( 0, 0, 0, 0 );
this.zIndex = 0;
this.name = g_Ranks[r] + g_Suits[s];
this.sname = g_Cnames[r] + g_Suits[s];
this.cardimg = new Array();
var i = s * 13 + r;
var c = idcards0[i];
var ic = c.children[0];
ic.attachEvent( "ondragstart", evtNOP);
ic.attachEvent( "onmouseenter", evtCardMouseEnter );
this.cardimg[0] = c;
var c = idcards1[i];
c.attachEvent( "ondragstart", evtNOP);
this.cardimg[1] = c;
var c = idcards2[i];
c.attachEvent( "ondragstart", evtNOP);
this.cardimg[2] = c;
this.val = this.cardimg[1].ssval / 1;
g_CardHash[this.name] = this;
}
function evtMouseDown()
{
if( g_UIState != 'play' )
return;
var ev = window.event;
var b = window.document.body;
var x = ev.x + b.scrollLeft;
var y = ev.y + b.scrollTop;
if( !g_GameInProg || !g_MainBoardRect.inside( x, y ) )
return;
queueCommand( "mouseDown " + x + ' ' + y );
ev.cancelBubble = true;
ev.returnValue = true;
}
function evtMouseUp()
{
if( g_UIState != 'play' )
return;
var ev = window.event;
var b = window.document.body;
var x = ev.x + b.scrollLeft;
var y = ev.y + b.scrollTop;
if( !g_GameInProg )
return;
queueCommand( "mouseUp " + x + ' ' + y );
ev.cancelBubble = true;
ev.returnValue = false;
}
function evtMouseMove()
{
if( g_UIState != 'play' )
return;
var ev = window.event;
var b = window.document.body;
var x = ev.x + b.scrollLeft;
var y = ev.y + b.scrollTop;
if( !g_GameInProg || !g_MainBoardRect.inside( x, y) )
return;
queueCommand( "mouseMove " + x + ' ' + y );
ev.cancelBubble = true;
ev.returnValue = true;
}
function evtNOP()
{
var ev = window.event;
ev.cancelBubble = true;
ev.returnValue = false;
}
function evtUnload()
{
var s;
if( g_ServerMode )
{
s = gameToString();
iddesthilite.setAttribute( 'servergame', s );
if( g_GameInProg )
{
if( commPutLine( 'S' ) )
{
commGetLine( 'saveResponse' );
alert( "NetCELL game saved" );
}
}
}
else
{
s = gameToString();
iddesthilite.setAttribute( 'game', s );
s = boardToString();
iddesthilite.setAttribute( 'board', s );
s = saveAllScores();
iddesthilite.setAttribute( 'scores', s );
}
try
{
iddesthilite.save( SCORES_REC );
}
catch(e)
{
}
}
var g_MouseDown = false;
var g_MouseDownCardPile = null;
var g_DragX;
var g_DragY;
var g_DragCard = null;
function cmdMouseDown( x, y )
{
var i, cp;
g_MouseDownCardPile = null;
g_MouseDown = true;
for( i = 0; i < g_CPAll.length; i++ )
{
cp = g_CPAll[i];
if( cp.getRect().inside( x, y ) )
{
g_MouseDownCardPile = cp;
if( g_SelectCode != null )
return;
var oCard;
switch( cp.type )
{
case CP_ACE:
return;
case CP_COL:
var indx;
if( (indx = cp.cards.length) == 0 )
return;
oCard = cp.cards[indx-1];
break;
case CP_CELL:
oCard = cp.card;
if( oCard == null )
return;
break;
}
if( oCard.rct.inside( x, y ) )
{
g_DragCard = oCard;
g_DragX = x;
g_DragY = y;
}
return;
}
}
for( i = 0; i < g_NumCells; i++ )
{
cp = g_CPCells[i];
if( cp.getRect().inside( x, y ) )
{
g_MouseDownCardPile = cp;
if( g_SelectCode != null )
return;
if( cp.card == null )
return;
g_DragCard = cp.card;
g_DragX = x;
g_DragY = y;
return;
}
}
}
function cmdMouseMove( x, y )
{
if( !g_DragCard )
return;
var dx = x - g_DragX;
var dy = y - g_DragY;
g_DragX = x;
g_DragY = y;
var h = g_DragCard.cardimg[g_CardIndex];
var newx = h.style.pixelLeft + dx;
var newy = h.style.pixelTop + dy;
h.style.pixelLeft = newx;
h.style.pixelTop = newy;
h.style.zIndex = 1000;
}
function cmdMouseUp( x, y )
{
g_MouseDown = false;
var cp = g_MouseDownCardPile;
if( cp == null )
{
return;
}
if( g_DragCard == null )
{
if( cp.getRect().inside( x, y ) )
{
doCommand( cp.name, true );
}
g_MouseDownCardPile = null;
}
else
{
var c = g_DragCard;
var h = c.cardimg[g_CardIndex];
var cx = h.style.pixelLeft;
var cy = h.style.pixelTop;
cx += g_CardWidth / 2;
cy += g_CardHeight / 2;
h.style.pixelLeft = c.rct.left;
h.style.pixelTop = c.rct.top;
h.style.zIndex = c.zIndex;
var i;
for( i = 0; i < g_CPAll.length; i++ )
{
cp = g_CPAll[i];
if( cp.getRect().inside( cx, cy ) )
{
if( cp == g_MouseDownCardPile )
{
doCommand( cp.name, true );
g_MouseDownCardPile = null;
g_DragCard = null;
return;
}
doCommand( g_MouseDownCardPile.name, false);
doCommand( cp.name, false );
g_MouseDownCardPile = null;
g_DragCard = null;
return;
}
}
g_DragCard = null;
}
}
var g_CardMouseTimer = -1;
function evtCardMouseEnter()
{
if( g_CommandQueue.length != 0 || g_MouseDown )
{
return;
}
if( g_CardMouseTimer != -1 )
{
clearTimeout( g_CardMouseTimer );
}
var ev = window.event;
var cname = ev.srcElement.parentNode.cname;
var suit = cname.substr( cname.length - 1 );
var rank = cname.substr( 0, cname.length - 1 );
var color = '#000000';
if( suit == 'H' )
{
color = '#990000';
rank += '♥';
}
else if( suit == 'D' )
{
color = '#990000';
rank += '♦';
}
else if( suit == 'C' )
{
rank += '♣';
}
else
{
rank += '♠';
}
idpeekcard.innerHTML = Random(200) == 0 ? "hey micky" : rank;
idpeekcard.style.color = color;
ev.cancelBubble = true;
ev.returnValue = false;
g_CardMouseTimer = setTimeout( "evtCardMouseLeave()", 1000 );
}
function evtCardMouseLeave()
{
idpeekcard.innerText = '';
g_CardMouseTimer = -1;
}
var g_uiTimeout = -1;
function queueCommand( sCmd )
{
g_CommandQueue.push( sCmd );
if( g_uiTimeout == -1 )
{
UI();
}
}
function deferCommand( sCmd )
{
g_CommandQueue.push( sCmd );
if( g_uiTimeout == -1 )
{
g_uiTimeout = setTimeout( 'UI();', 1 );
}
}
function flushCommandQueue()
{
g_CommandQueue = new Array();
}
function setUIState( sMode )
{
var i;
g_UIState = sMode;
switch( sMode )
{
case 'play':
idgameselect.disabled = true;
btnplay.disabled = true;
btngiveup.disabled = false;
btnreplay.disabled = true;
btnscores.disabled = true;
btnchat.disabled = false;
btnoptions.disabled = true;
idviewselect.disabled = true;
try
{
chkshowsums.disabled = true;
} catch( e ) {}
idgameselect.style.display = 'none';
idgamespan.innerText = ' ' + idgameselect.value + ' ';
//RF
//idgamespan.style.display = 'inline';
idviewdisplay.style.visibility = 'hidden';
idlogo.style.visibility = 'hidden';
for( i = 0; i < 13; i++ )
{
btnlocate[i].disabled = false;
}
break;
case 'ready':
idgameselect.disabled = false;
btnplay.disabled = false;
btngiveup.disabled = true;
btnreplay.disabled = g_GameSeed == null;
btnscores.disabled = false;
btnchat.disabled = false;
btnoptions.disabled = g_LoggedInAs == NOT_LOGGED || g_LoggedInAs == ANON ? true : false;
btnundo.disabled = true;
btnredo.disabled = true;
idviewselect.disabled = false;
try
{
chkshowsums.disabled = false;
} catch( e ) {}
//idgameselect.style.display = 'inline';
idgamespan.style.display = 'none';
idgameselect.disabled = false;
//idviewdisplay.style.visibility = 'visible';
idviewdisplay.disabled = false;
idlogo.style.visibility = 'visible';
for( i = 0; i < 13; i++ )
{
btnlocate[i].disabled = true;
}
idsrchilite.style.display = 'none';
iddesthilite.style.display = 'none';
safeFocus( btnplay );
break;
case 'off':
idgameselect.disabled = true;
btnplay.disabled = true;
btngiveup.disabled = true;
btnreplay.disabled = true;
btnscores.disabled = true;
btnchat.disabled = true;
btnoptions.disabled = true;
idviewselect.disabled = true;
try
{
chkshowsums.disabled = true;
}
catch( e ) {}
idgameselect.style.display = 'none';
//idgameselect.style.display = 'inline';
idgameselect.disabled = true;
idgamespan.style.display = 'none';
//idviewdisplay.style.visibility = 'visible';
idviewdisplay.disabled = true;
idlogo.style.visibility = 'visible';
for( i = 0; i < 13; i++ )
{
btnlocate[i].disabled = true;
}
break;
default:
alert( 'Illegal UI state param: ' + sMode );
break;
}
}
var g_CurCard = null;
function UI()
{
var sCmd;
var i;
while( (sCmd = g_CommandQueue.shift()) )
{
var a = sCmd.split( " " );
switch( a[0] )
{
case 'mouseDown':
cmdMouseDown( a[1] / 1, a[2] / 1 );
break;
case 'mouseUp':
cmdMouseUp( a[1] / 1, a[2] / 1 );
break;
case 'mouseMove':
cmdMouseMove( a[1] / 1, a[2] / 1 );
break;
case 'getCard':
g_CurCard = cmdGetCard( a[1] );
break;
case 'putCard':
if( g_CurCard == null )
cmdPutCard( g_CardHash[a[2]], a[1] );
else
{
cmdPutCard( g_CurCard, a[1] );
g_CurCard = null;
}
return delay( g_CardAnimDelay );
case 'selectGame':
drawBoard( g_View, a[1] / 1, a[2] / 1 );
break;
case 'selectView':
drawBoard( a[1]/1, g_NumCols, g_NumCells );
break;
case 'play':
cmdPlay();
break;
case 'replay':
cmdReplay();
break;
case 'custom':
cmdCustom();
break;
case 'deal':
cmdPutCard( g_CardHash[a[1]], a[2] );
return delay( g_CardAnimDelay );
case 'quit':
cmdQuit();
break;
case 'showSums':
g_ShowSums = a[1] == 'true' ? true : false;
break;
case 'win':
cmdWin();
break;
case 'lose':
cmdLose();
break;
case 'hiliteCell':
g_CPCells[a[1]/1].hilite( a[2] );
return delay(1);
case 'hiliteColumn':
g_CPBoard[a[1]/1].hilite( a[2] );
return delay(1);
case 'clearHilites':
idsrchilite.style.display = 'none';
iddesthilite.style.display = 'none';
return delay(1);
case 'flashCards':
cmdFlashCards( a[1]/1, a[2] == 'true' );
return delay( 250 );
case 'undo':
cmdUndo();
break;
case 'redo':
cmdRedo();
break;
case 'scores':
cmdScores();
break;
case 'init':
cmdInit();
break;
case 'reset':
cmdReset();
break;
case 'loginResponse':
cmdLoginResponse( sCmd.substr(14) );
break;
case 'dealResponse':
cmdDealResponse( sCmd.substr(13) );
break;
case 'quitResponse':
cmdQuitResponse( sCmd.substr(13) );
break;
case 'winResponse':
cmdWinResponse( sCmd.substr(12) );
break;
case 'saveResponse':
cmdSaveResponse( sCmd.substr(13) );
break;
case 'tourInfoResponse':
cmdTourInfoResponse( sCmd.substr(17) );
break;
case 'chat':
cmdChat();
break;
case 'options':
cmdOptions();
break;
case 'optionsResponse':
cmdOptionsResponse( sCmd.substr(16) );
break;
case 'optionsSaveResponse':
cmdOptionsSaveResponse( sCmd.substr(20) );
break;
case 'playOnline':
window.open( "http://www.freecell.com/f/c/play.html", "_blank" );
break;
case 'help':
var oHelpWin = window.open( "help.htm", "freecellhelp", "resizable=yes,scrollbars=yes,width=550,height=500" );
oHelpWin.focus();
break;
default:
alert( "unrecognized command: " + sCmd );
}
}
g_uiTimeout = -1;
}
function delay( msecs )
{
g_uiTimeout = setTimeout( "UI();", msecs );
}
function cmdChat()
{
if( g_chatWindow != null )
{
try
{
g_chatWindow.focus();
return;
}
catch(e)
{
}
}
try
{
g_chatWindow = window.open( "/chat/chat.html",
"Chat",
"resizable=yes,scrollbars=yes,width=550 ,height=500" );
g_chatWindow.focus();
}
catch(e)
{
}
}
function cmdOptions()
{
setUIState( 'off' );
if( commPutLine( '_GetOptions' ) )
{
commGetLine( 'optionsResponse' );
}
}
function cmdOptionsResponse( sResp )
{
sResp = sResp.trim();
var a = sResp.split('|');
var ops = new Object();
ops.noChat = false;
ops.noBreak = false;
ops.name = g_LoggedInAs;
ops.email = a[0];
if( a.length )
{
ops.noChat = a[1] == 'true';
}
if( a.length > 2 )
{
ops.noBreak = a[2] == 'true';
}
showDlg( 'dlgOptions.html', ops, 500, 350 );
}
function cmdOptionsDlgRet( ret )
{
hideDlg();
if( ret != null )
{
if( commPutLine( '_Options ' + ret ) )
{
commGetLine( 'optionsSaveResponse' );
}
}
else
{
setUIState( 'ready' );
}
}
function cmdOptionsSaveResponse( sResp )
{
sResp = sResp.trim();
alert( sResp );
setUIState( 'ready' );
}
function cmdDeal( sCard, sCol )
{
var c = g_CardHash[sCard];
cmdPutCard( c, sCol );
}
function cmdPutCard( oCard, sLoc )
{
var indx;
if( sLoc == 'U' )
{
indx = oCard.suit;
g_CPAces[indx].putCard( oCard );
}
else if( (indx = cellIndex( sLoc )) != -1 )
{
g_CPCells[indx].putCard( oCard );
}
else
{
var col = sLoc / 1;
g_CPBoard[col].putCard( oCard );
}
}
function cmdGetCard( sLoc )
{
var indx;
if( (indx = cellIndex( sLoc )) != -1 )
{
return g_CPCells[indx].getCard();
}
else if( (indx = aceIndex( sLoc )) != -1 )
{
return g_CPAces[indx].getCard();
}
else
{
return g_CPBoard[sLoc / 1].getCard();
}
}
function cmdPlay()
{
if( g_ServerMode )
{
setUIState( 'off' );
if( commPutLine( '_NewDeal -1 -1 ' + g_NumCols + ' ' + g_NumCells + ' ' + SCORE_STREAK ) )
{
commGetLine( 'dealResponse' );
}
}
else
{
var sGame = g_NumCols + 'x' + g_NumCells;
if( !g_Scores[sGame] )
{
g_Scores[sGame] = new Score();
}
var score = g_Scores[sGame];
//RF set level
//g_GameDifficulty = Math.floor( score.streak / 10 ) + 5;
g_GameDifficulty = 5
//alert ('streak=' + score.streak + 'level=' + g_GameDifficulty)
g_GameDifficulty = g_GameDifficulty > 10 ? 10 : g_GameDifficulty;
var d = new Date();
g_StartTime = d.getTime();
deal( null );
setUIState( 'play' );
}
}
function cmdDealResponse( sDeal )
{
var bSetMenu = false;
var a = sDeal.split( '\n' );
var i;
var restoreCols, restoreCells;
var bSetupDone = false;
for( i = 0; i < a.length; i++ )
{
var s = a[i];
var aParts = s.split(' ');
var sCmd = aParts[0];
if( sCmd == 'Done' )
{
automove();
chk_win();
break;
}
else if( sCmd == 'InProgress' )
{
bSetMenu = true;
continue;
}
else if( sCmd == 'Ncols' )
{
restoreCols = aParts[1]/1;
}
else if( sCmd == 'Ncells' )
{
restoreCells = aParts[1]/1;
if( restoreCols != g_NumCols || restoreCells != g_NumCells )
{
if( bSetMenu )
{
g_Game = restoreCols + 'x' + restoreCells;
}
drawBoard( g_View, restoreCols, restoreCells );
}
prepareToDeal();
bSetupDone = true;
}
else if( sCmd == 'Moves' )
{
g_GameMoves = aParts[1]/1;
idmoves.innerText = g_GameMoves;
}
else if( sCmd == 'CardsMoved' )
{
g_GameCardsMoved = aParts[1]/1;
idcardsmoved.innerText = g_GameCardsMoved;
}
else if( sCmd == 'Put' )
{
if( !bSetupDone )
{
prepareToDeal();
bSetupDone = true;
}
var col = aParts[1];
var sCardName = aParts[2];
sCardName = sCardName.substr( 1, sCardName.length - 2 );
if( sCardName.substr(0,1) == 'T' )
{
sCardName = '10' + sCardName.substr(1);
}
var oCard = g_CardHash[sCardName];
if( !oCard )
{
alert( "Card object not found for: " + sCardName );
queueCommand( 'reset' );
return;
}
if( col >= 'A' && col <= 'J' )
{
col = col.toLowerCase();
}
else if( col == ':' )
{
col = 10;
}
else if( col == ';' )
{
col = 11;
}
else if( col == '<' )
{
col = 12;
}
put_back_card( col + '', oCard );
}
else
{
alert( "dealResponse: bad command from server: " + s );
queueCommand( 'reset' );
return;
}
g_GameInProg = true;
g_GameSeed = null;
setUIState( 'play' );
}
}
function cmdReplay()
{
var i;
if( g_ServerMode )
{
setUIState( 'off' );
if( commPutLine( '_ReplayDeal' ) )
{
commGetLine( 'dealResponse' );
}
}
else
{
var sGame = g_NumCols + 'x' + g_NumCells;
if( !g_Scores[sGame] )
{
g_Scores[sGame] = new Score();
}
var score = g_Scores[sGame];
var d = new Date();
g_StartTime = d.getTime();
g_DoesntCount = true;
deal( g_GameSeed );
setUIState( 'play' );
}
}
function cmdCustom()
{
g_CustomGame.cols = g_NumCols;
g_CustomGame.cells = g_NumCells;
g_CustomGame.difficulty = g_GameDifficulty;
if( g_GameSeed != null )
g_CustomGame.seed = g_GameSeed;
showDlg( 'dlgCustom.html', g_CustomGame, 300, 310 );
}
function cmdCustomDlgRet( ret )
{
hideDlg();
if( ret == null )
{
setUIState( 'ready' );
return;
}
selectGame();
g_GameSeed = g_CustomGame.random ? null : g_CustomGame.seed;
g_GameDifficulty = g_CustomGame.difficulty;
if( g_ServerMode )
{
if( commPutLine( '_NewDeal ' + (g_CustomGame.random ? -1 : g_CustomGame.seed) + ' ' + g_CustomGame.difficulty
+ ' ' + g_CustomGame.cols + ' ' + g_CustomGame.cells + ' ' + DONT_SCORE ) )
{
commGetLine( 'dealResponse' );
}
}
else
{
queueCommand( 'replay' );
}
}
function cmdTourInfoResponse( sResp )
{
sResp = sResp.trim();
var a = sResp.split(',');
a.theme = a.shift();
a.secsRemaining = a.shift();
a.winFlags = parseInt( a.shift(), 16 );
var nRows = Math.ceil(a.length / 4);
showDlg( 'dlgTournament.html', a, 480, 200 + nRows * 25 );
}
function cmdTourDlgRet( ret )
{
hideDlg();
if( ret == null )
{
setUIState( 'ready' );
}
else
{
ret = ret.trim();
a = ret.split(' ');
var cc = a[0].split('x');
var cols = cc[0];
var cells = cc[1];
var gd = a[1].split('-');
var game = gd[0];
var diff = gd[1];
if( commPutLine( "_NewDeal " + game + " " + diff + " " + cols + " " + cells + " " + SCORE_TOURNAMENT ) )
{
commGetLine( 'dealResponse' );
}
}
}
function cmdQuit()
{
showDlg( 'dlgQuit.html', null, 300, 150 );
}
function cmdQuitDlgRet( ret )
{
hideDlg();
if( ret == true )
{
if( g_ServerMode )
{
if( commPutLine( 'Q' ) )
{
commGetLine( 'quitResponse' );
showWait();
}
}
else
{
queueCommand( 'lose' );
}
g_GameInProg = false;
}
else
{
setUIState( 'play' );
}
}
function cmdQuitResponse( sResp )
{
idsrchilite.style.display = 'none';
iddesthilite.style.display = 'none';
g_GameInProg = false;
hideWait();
var a = sResp.split(' ');
try
{
var aGame = a[2].split('-');
var gameNum = aGame[0];
gameNum = gameNum.substr(1);
g_GameSeed = gameNum / 1;
var gameDifficulty = aGame[1];
gameDifficulty = gameDifficulty.substr( 0, gameDifficulty.length-1 );
}
catch(e)
{
err( "Invalid quit response from server: '\n'" );
deferCommand( 'reset' );
return;
}
var elapsed = a[4];
var streak = a[7];
var sArgs = gameNum + '|' + gameDifficulty + '|' + elapsed + '|' + streak;
var i, gsPlays, gsWins;
gsPlays = 1;
gsWins = 0;
for( i = 7; i < a.length; i++ )
{
if( a[i] == 'gsPlays:' )
{
gsPlays = a[i+1] / 1;
i++;
}
else if( a[i] == 'gsWins:' )
{
gsWins = a[i+1] / 1;
i++;
}
}
sArgs = sArgs + '|' + gsPlays + '|' + gsWins;
showDlg( "dlgLose.html", sArgs, 300, 150 );
var sLoseMesg = "|pToo bad... |f" + g_LoggedInAs + " loses. |F";
for( i = 1; i < 10; i++ )
{
if( a[i] )
{
sLoseMesg += a[i] + ' ';
}
}
if( sLoseMesg.indexOf( "gsPlays" ) != -1 )
{
sLoseMesg = sLoseMesg.substr( 0, sLoseMesg.indexOf( "gsPlays" ) );
}
writeChat( sLoseMesg );
}
function cmdWin()
{
var i;
idsrchilite.style.display = 'none';
iddesthilite.style.display = 'none';
if( g_ServerMode )
{
commGetLine( 'winResponse' );
setUIState( 'off' );
showWait();
}
else
{
var o = new Object();
var now = new Date();
var elapsed = now.getTime() - g_StartTime;
o.elapsed = formatTime( elapsed );
o.streak = doScores( true, elapsed );
o.ncols = g_NumCols;
o.ncells = g_NumCells;
o.gameNumber = g_GameSeed;
o.gameDifficulty = g_GameDifficulty;
o.prefix = AD_PREFIX;
o.sessionID = '';
if( APPMODE )
showDlg( "dlgWin.html", o, 300, 180);
else
//RF: showDlg( "dlgWinAd.html", o, 600, 400 );
showDlg( "dlgWin.html", o, 300, 180);
}
g_GameInProg = false;
}
function cmdWinResponse( sResp )
{
hideWait();
var a = sResp.split(' ');
var o = new Object();
try
{
var aVariant = a[1].substr(1).split('x');
var aGame = a[2].split('-');
}
catch(e)
{
err( "Invalid win response from server: '" + sResp + "'" );
deferCommand( 'reset' );
return;
}
o.gameNumber = aGame[0];
o.gameNumber = o.gameNumber.substr(1);
g_GameSeed = o.gameNumber / 1;
o.gameDifficulty = aGame[1];
o.gameDifficulty = o.gameDifficulty.substr( 0, o.gameDifficulty.length-1 );
o.elapsed = a[4];
o.streak = a[6];
o.playerName = g_LoggedInAs;
o.ncols = aVariant[0];
o.ncells = aVariant[1];
o.prefix = AD_PREFIX;
o.sessionID = paramSession;
var i;
for( i = 7; i < a.length; i++ )
{
if( a[i] == 'Current:' )
{
o.currentPosition = a[i+1] / 1;
i++;
}
else if( a[i] == 'Daily:' )
{
o.dailyPosition = a[i+1] / 1;
i++;
}
else if( a[i] == 'Time:' )
{
o.allTimePosition = a[i+1] / 1;
i++;
}
else if( a[i] == 'gsPlays:' )
{
o.gsPlays = a[i+1] / 1;
i++;
}
else if( a[i] == 'gsWins:' )
{
o.gsWins = a[i+1] / 1;
i++;
}
}
var sWinMesg = "|mCongratulations! |f" + g_LoggedInAs + " wins! |F";
for( i = 1; i < a.length; i++ )
{
if( a[i] == "gsPlays:" )
break;
if( a[i] )
{
sWinMesg += a[i] + ' ';
}
}
writeChat( sWinMesg );
if( paramNoads == 'noads' || APPMODE )
showDlg( "dlgWin.html", o, 300, 180);
else
//RF: showDlg( "dlgWinAd.html", o, 600, 400 );
showDlg( "dlgWin.html", o, 300, 180);
}
function cmdSaveResponse( sResp )
{
}
function cmdLose()
{
var i;
idsrchilite.style.display = 'none';
iddesthilite.style.display = 'none';
var now = new Date();
var elapsed = now.getTime() - g_StartTime;
var streak = doScores( false, elapsed );
var sArgs = g_GameSeed + '|' + g_GameDifficulty + '|' + formatTime(elapsed) + '|' + streak;
showDlg( "dlgLose.html", sArgs, 300, 150 );
}
function cmdLoseDlgRet()
{
dlgRet( 'ready' );
for( i = 0; i < 52; i++ )
{
g_AllCards[i % 4][Math.floor(i / 4)].cardimg[g_CardIndex].style.display = 'none';
}
g_GameInProg = false;
}
function cmdUndo()
{
if( !g_History.canUndo() )
{
return;
}
var aCmds = g_History.undo();
var i;
var cp = null;
for( i = aCmds.length - 1; i >= 0; i-- )
{
var a = aCmds[i].split(' ');
switch( a[0] )
{
case 'getCard':
ungetCard( a[1], cp );
cp = null;
break;
case 'putCard':
cp = unputCard( a[1], a[2] );
break;
default:
alert( "unknown cmd in undo: " + a[0] );
}
}
}
function cmdRedo()
{
if( !g_History.canRedo() )
{
return;
}
var aCmds = g_History.redo();
var i;
var cp;
for( i = 0; i < aCmds.length; i++ )
{
var a = aCmds[i].split(' ');
switch( a[0] )
{
case 'getCard':
cp = regetCard( a[1] );
break;
case 'putCard':
reputCard( a[1], cp );
cp = null;
break;
default:
alert( "unknown cmd in undo: " + a[0] );
}
}
}
function cmdScores()
{
if( g_ServerMode )
{
window.open( 'http://www.freecell.com/f/c/personal.html?uname=' + g_LoggedInAs, '_blank' );
}
else
{
var sGame = g_NumCols + 'x' + g_NumCells;
if( !g_Scores[sGame] )
{
g_Scores[sGame] = new Score();
}
var score = g_Scores[sGame];
score.cols = g_NumCols;
score.cells = g_NumCells;
showDlg( 'dlgScores.html', score, 320, 365 );
}
}
function dlgRet( newstate )
{
hideDlg();
setUIState( newstate );
}
function ungetCard( dest, cp )
{
if( cp == null )
{
alert( "ungetCard: null cp" );
return;
}
put_back_card( dest, cp );
}
function unputCard( src, card )
{
if( src == 'U' )
{
var oCard = g_CardHash[card];
if( oCard == null )
{
alert( 'unputCard: card not in hash: ' + card );
return;
}
src = String.fromCharCode( 87 + oCard.suit );
}
return get_card( src );
}
function reputCard( dest, cp )
{
if( cp == null )
{
alert( "reputCard: null cp" );
return;
}
put_back_card( dest, cp );
}
function regetCard( src )
{
return get_card( src );
}
function doScores( bWin, elapsed )
{
var sGame = g_NumCols + 'x' + g_NumCells;
if( !g_Scores[sGame] )
{
g_Scores[sGame] = new Score();
}
var score = g_Scores[sGame];
score.totalTimePlayed += elapsed;
score.plays++;
if( bWin )
{
if( score.wins == 0 || score.moves != 0 )
{
score.moves += g_GameMoves;
score.cardsMoved += g_GameCardsMoved;
}
score.wins++;
if( g_DoesntCount == false )
{
score.streak++;
if( score.streak > score.bestStreak )
score.bestStreak = score.streak;
score.avgWinTime = calcNewAvg( score.avgWinTime, score.plays, elapsed );
if( score.bestWinTime == 0 || elapsed < score.bestWinTime )
score.bestWinTime = elapsed;
}
g_DoesntCount = false;
return score.streak;
}
else
{
var tmp = score.streak;
if( g_DoesntCount == false )
{
score.streak = 0;
score.streakCnt++;
score.avgStreak = calcNewAvg( score.avgStreak, score.streakCnt, tmp );
}
g_DoesntCount = false;
return tmp;
}
}
function calcNewAvg( prevAvg, newCnt, newVal )
{
var tmp = prevAvg * (newCnt - 1) + newVal;
return tmp / newCnt;
}
function formatTime( elapsed )
{
elapsed /= 100;
elapsed = Math.round( elapsed );
var t = elapsed % 10;
elapsed = Math.floor( elapsed / 10 );
var s = elapsed % 60;
elapsed = Math.floor( elapsed / 60 );
var m = elapsed;
return m + ':' + padLeft( s, '0', 2 ) + '.' + t;
}
function showDlg( sUrl, args, width, height )
{
setUIState( 'off' );
g_DlgArguments = args;
var r = g_MainBoardRect;
var w = r.right - r.left - width;
var left = r.left + Math.floor(w / 2);
var h = r.bottom - r.top - height;
var top = r.top + Math.floor(h / 2);
var oDlg = document.getElementById( "iddlg" );
//RF
//oDlg.style.left = left + "px";
oDlg.style.left = (left+20) + "px";
oDlg.style.top = top + "px";
oDlg.style.display = 'block';
oDlg.style.width = width + "px";
oDlg.style.height = height + "px";
iddlg.location.replace( DLG_BASE + sUrl );
var oClose = document.getElementById( "iddlgclose" );
oClose.style.display = 'block';
//RF
//oClose.style.left = left + "px";
oClose.style.left = (left + 20) + "px";
//RF border was 5 px, now 1px
//oClose.style.width = (width + 10) + "px";
oClose.style.width = (width + 2) + "px";
oClose.style.top = (top - 15) + "px";
oClose.style.height = "15px";
}
function hideDlg()
{
var oDlg = document.getElementById( "iddlg" );
oDlg.style.display = 'none';
iddlg.location.replace( DLG_BASE + 'dlgBlank.html' );
iddlgclose.style.display = 'none';
safeFocus( idbody );
}
function safeFocus( obj )
{
if( obj.currentStyle.visibility != 'hidden' )
{
obj.focus();
}
}
var fillptr = 0;
var bFill = true;
function showWait()
{
idwait.style.display = 'block';
var r = g_MainBoardRect;
var w = r.right - r.left - 300;
var h = r.bottom - r.top - 150;
w = Math.floor( w / 2 );
h = Math.floor( h / 2 );
idwait.style.left = r.left + w;
idwait.style.top = r.top + h;
idwait.style.width = 300;
idwait.style.height = 150;
idwait.style.zIndex = 10000;
fillptr = 0;
bFill = true;
var i;
for( i = 0; i < idbusy.length; i++ )
{
idbusy[i].style.backgroundColor = 'white';
}
idpatience.innerText = "Patience is a virtue. Look inward.";
runBusy();
}
function hideWait()
{
idwait.style.display = 'none';
}
function runBusy()
{
if( idwait.style.display == 'none' )
return;
if( bFill )
{
idbusy[fillptr].style.backgroundColor = '#0000ff';
fillptr++;
if( fillptr == idbusy.length )
{
fillptr--;
bFill = false;
}
}
else
{
idbusy[fillptr].style.backgroundColor = 'white';
fillptr--;
if( fillptr == -1 )
{
fillptr = 0;
bFill = true;
}
}
setTimeout( 'runBusy();', 200 );
}
function cellIndex( sLoc )
{
var sCells = 'abcdefghij';
return sCells.indexOf( sLoc );
}
function aceIndex( sLoc )
{
var sAces = 'WXYZ';
return sAces.indexOf( sLoc );
}
function updateSpreadsheet( col, row, val )
{
var sum, h, color, ssum;
g_ssRowSums[row] += val;
g_ssColSums[col] += val;
g_ssMainSum += val;
sum = g_ssRowSums[row];
ssum = sum == 0 ? '' : sum + '.00';
h = idrowsums[row];
h.innerText = ssum;
h.style.color = sum >= 0 ? 'black' : '#cc0000';
sum = g_ssColSums[col];
ssum = sum == 0 ? '' : sum + '.00';
h = idcolsums[col];
h.innerText = ssum;
h.style.color = sum >= 0 ? 'black' : '#cc0000';
sum = g_ssMainSum;
ssum = sum == 0 ? '' : sum + '.00';
h = idmainsum;
h.innerText = ssum;
h.style.color = sum >= 0 ? 'black' : '#cc0000';
}
function initSpreadsheetSums()
{
var i;
for( i = 0; i < MAX_COL; i++ )
{
g_ssColSums[i] = 0;
}
for( i = 0; i < MAX_ROW; i++ )
{
g_ssRowSums[i] = 0;
}
g_ssMainSum = 0;
}
function evtKeypress()
{
if( g_MouseDown || g_UIState != 'play' )
return;
var keyCode = window.event.keyCode;
var key = String.fromCharCode( keyCode );
if( keyCode >= 49 && keyCode <= 58 )
{
doCommand( String.fromCharCode( keyCode - 1 ), true );
return;
}
if( key == '0' )
{
doCommand( '9', true );
return;
}
if( cellIndex( key ) != -1 )
{
doCommand( key, true );
return;
}
switch( key )
{
case '!':
case 'A':
locateCards( 0 );
break;
case '@':
locateCards( 1 );
break;
case '#':
locateCards( 2 );
break;
case '$':
locateCards( 3 );
break;
case '%':
locateCards( 4 );
break;
case '^':
locateCards( 5 );
break;
case '&':
locateCards( 6 );
break;
case '*':
locateCards( 7 );
break;
case '(':
locateCards( 8 );
break;
case 'T':
locateCards( 9 );
break;
case 'J':
locateCards( 10 );
break;
case 'Q':
locateCards( 11 );
break;
case 'K':
locateCards( 12 );
break;
case '-':
doCommand( '10', true );
break;
case '=':
doCommand( '11', true );
break;
case '+':
doCommand( '12', true );
break;
case 'u':
case 'U':
doCommand( 'U', true );
break;
case 'W':
if( DEV )
{
}
break;
default:
break;
}
}
function saveStateOnError()
{
var s;
if( g_ServerMode )
{
s = gameToString();
iddesthilite.setAttribute( 'servergame', s );
}
try
{
iddesthilite.save( SCORES_REC );
}
catch(e)
{
}
}
function locateCards( rank )
{
var i;
for( i = 0; i < 3; i++ )
{
queueCommand( "flashCards " + rank + " true" );
queueCommand( "flashCards " + rank + " false" );
}
}
function cmdFlashCards( rank, bOn )
{
var i;
for( i = 0; i < 4; i++ )
{
var oCard = g_AllCards[i][rank];
oCard.cardimg[g_CardIndex].style.filter = bOn ? 'invert(enabled=true)' : '';
}
}
function getUserName()
{
return g_LoggedInAs;
}
function getUserPassword()
{
return g_Password;
}
function getAppPath()
{
var sPath = oFCA.commandLine;
if( sPath.charAt(0) == '"' )
sPath = sPath.substr( 1 );
var i = sPath.lastIndexOf( "\\" );
if( i < 0 )
return "";
return sPath.substr( 0, i + 1 );
}
function isValidRegCode( n )
{
n += "";
n = n.replace( /\-/g, '' );
try
{
n = n / 1;
var i;
var sumA = 0;
var sumB = 0;
for( i = 0; i < 3; i++ )
{
sumA += n % 100;
n = Math.floor(n / 100)
sumB += n % 100;
n = Math.floor(n / 100)
}
sumA %= 100;
sumB %= 100;
if( sumA == 25 && sumB == 71 )
return true;
}
catch(e)
{
}
return false;
}
function checkRegistered()
{
try
{
var sPath = getAppPath();
sPath += "rk.opt";
var fso = new ActiveXObject( "Scripting.FileSystemObject" );
if( !fso )
{
alert( "Can't get FileSystemObject-- permissions are set overly strictly on this machine." );
return;
}
var ts = null;
ts = fso.OpenTextFile( sPath, 1, false );
var s = ts.ReadLine();
ts.Close();
if( isValidRegCode( s ) )
g_Registered = true;
}
catch( e )
{
}
}
function writeRegCode( sCode )
{
try
{
var sPath = getAppPath();
sPath += "rk.opt";
var fso = new ActiveXObject( "Scripting.FileSystemObject" );
if( !fso )
{
alert( "Can't get FileSystemObject-- permissions are set overly strictly on this machine." );
return false;
}
var ts = null;
ts = fso.CreateTextFile( sPath, true );
var s = ts.WriteLine( sCode );
ts.Close();
return true;
}
catch( e )
{
}
return false;
}
function writeChat( sMsg )
{
if( g_chatWindow == null )
return;
try
{
g_chatWindow.announce( sMsg.trim() );
}
catch(e)
{
}
}
function commInit()
{
return false;
}
function History()
{
this.entries = 0;
this.index = 0;
this.aHistory = new Array();
this.add = _historyAdd;
this.undo = _historyUndo;
this.redo = _historyRedo;
this.canUndo = _historyCanUndo;
this.canRedo = _historyCanRedo;
}
function _historyAdd( obj )
{
with( this )
{
aHistory[index++] = obj;
entries = index;
btnundo.disabled = false;
btnredo.disabled = true;
}
}
function _historyUndo()
{
with( this )
{
if( index == 0 )
return null;
index--;
btnundo.disabled = index ? false : true;
btnredo.disabled = false;
return aHistory[index];
}
}
function _historyRedo()
{
with( this )
{
if( index == entries )
return null;
var indx = aHistory[index++];
btnundo.disabled = false;
btnredo.disabled = index == entries ? true : false;
return indx;
}
}
function _historyCanUndo()
{
return this.index > 0;
}
function _historyCanRedo()
{
return this.index != this.entries;
}
var CLUB = 0;
var DIAMOND = 1;
var SPADE = 2;
var HEART = 3;
var FC_ERROR = -1;
var FC_OK = 0;
var IN_ORDER = 1;
var NO_ORDER = 0;
var OK = 0;
var g_aCmds = null;
var g_SelectCode = null;
var wonFlag = false;
function doCommand( cmd, hilite )
{
var indx;
if( !g_GameInProg )
return;
if( g_SelectCode == null )
{
if( (indx = cellIndex( cmd )) != -1 )
{
if( indx < g_NumCells )
{
g_SelectCode = cmd;
if( hilite)
queueCommand( 'hiliteCell ' + indx + ' src' );
}
return;
}
indx = cmd / 1;
if( cmd >= 0 && cmd < g_NumCols )
{
g_SelectCode = cmd;
if( hilite)
queueCommand( 'hiliteColumn ' + indx + ' src' );
return;
}
}
else
{
if( (indx = cellIndex( cmd )) != -1 )
{
if( indx < g_NumCells )
{
if( hilite )
queueCommand( 'hiliteCell ' + indx + ' dest' );
queueCommand( 'clearHilites' );
do_cmd( g_SelectCode, cmd );
g_SelectCode = null;
}
return;
}
indx = cmd / 1;
if( cmd >= 0 && cmd < g_NumCols )
{
if( hilite )
queueCommand( 'hiliteColumn ' + indx + ' dest' );
queueCommand( 'clearHilites' );
do_cmd( g_SelectCode, cmd );
g_SelectCode = null;
return;
}
if( cmd == 'U' )
{
queueCommand( 'clearHilites' );
do_cmd( g_SelectCode, cmd );
g_SelectCode = null;
return;
}
queueCommand( 'clearHilites' );
g_SelectCode = null;
}
}
function do_cmd( cmd0, cmd1 )
{
var src, dest;
var cp;
if(valid_col(cmd0) || valid_cell(cmd0))
{
g_aCmds = new Array();
if( valid_col(cmd0) && valid_col(cmd1) )
{
if( cmd0 == cmd1 )
{
riffleColumn( cmd0 / 1 );
return;
}
if( col2col( cmd1 / 1, cmd0 / 1, LOAD_CELLS, null, 0 ) == FC_ERROR )
return;
}
else
{
src = cmd0;
if((cp = get_card(src)) == null)
{
return;
}
dest = cmd1;
if(put_card(dest,cp) == FC_ERROR)
{
put_back_card(src,cp);
return;
}
sendMoveToServer( dest, src );
}
automove();
g_GameMoves++;
idmoves.innerText = g_GameMoves;
if( g_ServerMode )
{
commPutLine( 'M' );
}
if( chk_win() )
return;
if( !g_ServerMode )
{
g_History.add( g_aCmds );
}
g_aCmds = null;
}
}
function sendMoveToServer( dest, src )
{
g_GameCardsMoved++;
idcardsmoved.innerText = g_GameCardsMoved;
if( !g_ServerMode )
return;
dest = serverTranslate( dest );
src = serverTranslate( src );
commPutLine( src + dest );
}
function serverTranslate( s )
{
if( s >= 'W' && s <= 'Z' )
return 'U';
else if( s >= 'a' && s <= 'j' )
return s.toUpperCase();
else if( s == 'U' )
return s;
else
{
return g_NumCodes[s/1];
}
}
function chk_win()
{
var i;
if( !wonFlag )
{
for(i=0; i<4; i++)
if( g_Aces[i].length != 13 )
return false;
}
wonFlag = false;
if( g_GameMoves == 0 && g_ServerMode )
{
commPutLine( 'M' );
}
queueCommand( 'win' );
return true;
}
function riffleColumn( col )
{
}
function valid_col( col )
{
var indx = col / 1;
if( indx >= 0 && indx < g_NumCols )
return true;
return false;
}
function valid_cell( c )
{
return cellIndex( c ) != -1;
}
function deal( gameSeed )
{
var deck;
var col,i,j,indx;
var card;
var seed;
deck = prepareToDeal();
if( gameSeed != null )
{
seed = gameSeed;
}
else
{
seed = new_random_seed();
}
g_GameSeed = seed;
seed_random( seed );
g_aCmds = null;
for( i = 52, j = 1,col = 0; i; i-- )
{
indx = Random(i);
if( g_GameDifficulty < 10 )
{
if( Math.floor(Random(10) / g_GameDifficulty) )
indx = Random(indx);
}
else if( g_GameDifficulty > 10 )
{
var rdiff;
rdiff = 21 - g_GameDifficulty;
if( Math.floor(Random(11) / rdiff) )
{
indx = Random(indx);
indx = i - indx - 1;
}
}
put_back_card( col, deck[indx] );
for( ; indx < i - 1; indx++)
deck[indx] = deck[indx+1];
if( ++col == g_NumCols )
col = 0;
}
automove();
chk_win();
}
function prepareToDeal()
{
var i, deck;
g_SelectCode = null;
deck = new Array();
for( i=0; i<52; i++ )
{
var oCard = deck[51-i] = g_AllCards[i % 4][Math.floor(i / 4)];
oCard.cardimg[g_CardIndex].style.display = 'none';
}
g_CurCard = null;
for( i=0; i < MAX_COL; i++ )
{
g_Board[i] = new Array();
g_ColTflgs[i] = 0;
}
for(i=0; i<4; i++)
{
g_Aces[i] = new Array();
}
for(i=0; i= 0 && c < g_NumCols )
{
if( g_Board[c].length == 0 )
{
return null;
}
cp = g_Board[c].pop();
qCmd( 'getCard ' + c );
return cp;
}
alert( 'get_card failed' );
return null;
}
function put_card( dest, cp )
{
return place_card( dest, cp, IN_ORDER );
}
function put_back_card( dest, cp )
{
place_card( dest, cp, NO_ORDER );
}
function moveCard( dest, src, inOrder )
{
var oCard = get_card( src );
if( oCard == null )
{
return false;
}
if( place_card( dest, oCard, inOrder ) == FC_ERROR )
{
place_card( src, oCard, NO_ORDER );
return false;
}
sendMoveToServer( dest, src );
return true;
}
function place_card( dest, cp, permiss )
{
var c,indx;
var botcard;
if( (indx = cellIndex(dest)) != -1 )
{
if( g_Cells[indx] )
return FC_ERROR;
g_Cells[indx] = cp;
qCmd( 'putCard ' + dest + ' ' + cp.name );
return FC_OK;
}
indx = dest / 1;
if( indx >= 0 && indx < g_NumCols )
{
if( g_Board[indx].length == MAX_ROW )
{
return FC_ERROR;
}
botcard = row_bottom( indx );
if(permiss == IN_ORDER
&& ascend(botcard,cp) == FC_ERROR )
{
return(FC_ERROR);
}
g_Board[indx].push( cp );
qCmd( 'putCard ' + dest + ' ' + cp.name );
return FC_OK;
}
if(dest == 'U' || aceIndex(dest) != -1 )
{
c = cp.suit;
indx = cp.rank;
if( indx != 0 )
{
if( !g_Aces[c][indx-1] )
{
return FC_ERROR;
}
}
g_Aces[c].push( cp );
qCmd( 'putCard ' + dest + ' ' + cp.name );
return FC_OK;
}
alert( 'place_card failed-- bad command: ' + dest );
return FC_ERROR;
}
function ascend( dest, src )
{
if( dest == null )
return FC_OK;
if( dest.rank != src.rank + 1 )
return FC_ERROR;
if( is_red(dest) && is_red(src) )
return FC_ERROR;
if( is_black(dest) && is_black(src) )
return FC_ERROR;
return FC_OK;
}
function row_bottom( col )
{
var row;
if( col >= g_NumCols )
return null;
row = g_Board[col].length;
if( row == 0 )
return null;
return g_Board[col][row - 1];
}
function is_red( cp )
{
return (cp.suit & 1) != 0;
}
function is_black( cp )
{
return (cp.suit & 1) == 0;
}
var g_Seed = 0;
var LOAD_CELLS = 1;
var UNLOAD_CELLS = 2;
var NO_SRC = 31;
function col2col( dest, src, state, precp, tcol )
{
var cp, destcp;
var i;
switch(state)
{
case LOAD_CELLS:
cp = row_bottom(src);
if(cp == null )
return(FC_ERROR);
if(precp && ascend(cp,precp) == FC_ERROR)
return(FC_ERROR);
destcp = row_bottom(dest);
if((destcp == null && g_Board[src].length == 1)
|| (destcp == null && more_ascending(src) == FC_ERROR)
|| (destcp && ascend(destcp,cp) == FC_OK)
)
{
if( !moveCard( dest, src, IN_ORDER ) )
{
return(FC_ERROR);
}
finish_up(dest);
return(FC_OK);
}
if(more_ascending(src) == FC_ERROR)
return(FC_ERROR);
for(i=0; i hirank )
{
hirank = cp.rank;
hicol = i;
}
}
}
if(hirank != 0)
{
g_ColTflgs[hicol] = 0;
col2col(dest,hicol,UNLOAD_CELLS,0,dest);
finish_up(dest);
}
else
{
col2col(dest,NO_SRC,UNLOAD_CELLS,0,dest);
}
}
var CP_COL = 0;
var CP_CELL = 1;
var CP_ACE = 2;
function CardPile( type, index )
{
this.type = type;
this.index = index;
this.rct = null;
this.reset = _cpReset;
this.clear = _cpClear;
this.getRect = _cpGetRect;
this.reset();
this.clear();
if( type == CP_COL )
{
this.name = index + '';
this.putCard = _cpPutColCard;
this.getCard = _cpGetColCard;
this.hilite = _cpColHilite;
this.adjustSpacing = _cpAdjustSpacing;
this.layout = _cpColLayout;
}
else if( type == CP_ACE )
{
this.name = 'U';
this.putCard = _cpPutAceCard;
this.getCard = _cpGetAceCard;
this.hilite = _cpNOP;
this.layout = _cpAceLayout;
}
else
{
this.name = String.fromCharCode( 97 + index );
this.putCard = _cpPutCellCard;
this.getCard = _cpGetCellCard;
this.hilite = _cpCellHilite;
this.layout = _cpCellLayout;
}
}
function _cpReset()
{
this.rct = null;
}
function _cpClear()
{
if( this.type != CP_CELL )
this.cards = new Array();
else
this.card = null;
this.spacing = g_ViewSpacing;
}
function _cpPutColCard( oCard )
{
with( this )
{
var cimg = oCard.cardimg[g_CardIndex];
cimg.style.display = 'block';
cimg.style.position = 'absolute';
if( rct == null )
{
getRect();
}
oCard.rct.left = cimg.style.left = rct.left;
var row = cards.length;
if( g_Layout == LAYOUT_NRM && cards.length )
{
var avail = rct.bottom - rct.top - g_CardHeight;
var spc = spacing;
while( spc * cards.length > avail )
spc--;
if( spc != spacing )
{
spacing = spc;
adjustSpacing();
}
}
oCard.rct.top = cimg.style.top = rct.top + row * spacing;
oCard.rct.right = oCard.rct.left + g_CardWidth;
oCard.rct.bottom = oCard.rct.top + g_CardHeight;
oCard.zIndex = cimg.style.zIndex = row + 100;
oCard.cp = this;
oCard.index = row;
cards.push( oCard );
if( g_Layout == LAYOUT_SS && g_ShowSums )
{
updateSpreadsheet( index, row, oCard.val );
}
}
}
function _cpPutAceCard( oCard )
{
with( this )
{
var cimg = oCard.cardimg[g_CardIndex];
cimg.style.display = 'block';
cimg.style.position = 'absolute';
if( rct == null )
{
getRect();
}
oCard.rct.left = cimg.style.left = rct.left;
oCard.rct.top = cimg.style.top = rct.top;
oCard.rct.right = oCard.rct.left + g_CardWidth;
oCard.rct.bottom = oCard.rct.top + g_CardHeight;
oCard.zIndex = cimg.style.zIndex = cards.length + 100;
oCard.cp = this;
oCard.index = cards.length;
cards.push( oCard );
}
}
function _cpPutCellCard( oCard )
{
with( this )
{
if( card != null )
{
alert( "cell already occupied" );
return;
}
var cimg = oCard.cardimg[g_CardIndex];
cimg.style.display = 'block';
cimg.style.position = 'absolute';
if( rct == null )
{
getRect();
}
oCard.rct.left = cimg.style.left = rct.left;
oCard.rct.top = cimg.style.top = rct.top;
oCard.rct.right = oCard.rct.left + g_CardWidth;
oCard.rct.bottom = oCard.rct.top + g_CardHeight;
oCard.zIndex = cimg.style.zIndex = 100;
oCard.cp = this;
oCard.index = 0;
card = oCard;
}
}
function _cpGetColCard()
{
with( this )
{
if( cards.length == 0 )
return null;
var oCard = cards.pop();
var row = cards.length;
oCard.cp = null;
if( g_Layout == LAYOUT_NRM && cards.length )
{
var avail = rct.bottom - rct.top - g_CardHeight;
var spc = spacing;
var len = cards.length - 1;
while( spc < g_ViewSpacing && (spc + 1) * len < avail )
spc++;
if( spc != spacing )
{
spacing = spc;
adjustSpacing();
}
}
if( g_Layout == LAYOUT_SS && g_ShowSums )
{
updateSpreadsheet( index, row, -oCard.val );
}
return oCard;
}
}
function _cpGetAceCard()
{
with( this )
{
if( cards.length == 0 )
return null;
var oCard = cards.pop();
oCard.cp = null;
return oCard;
}
}
function _cpGetCellCard()
{
with( this )
{
if( card == null )
return null;
var oCard = card;
card = null;
oCard.cp = null;
return oCard;
}
}
function _cpColHilite( sType )
{
with( this )
{
if( rct == null )
{
getRect();
}
var h = sType == 'src' ? idsrchilite : iddesthilite;
h.style.left = rct.left - 2;
h.style.top = rct.top - 2;
h.style.width = rct.right - rct.left + 4;
var high = (cards.length - 1) * spacing;
high = high > 0 ? high : 0;
high += g_CardHeight;
h.style.height = high + 4;
h.style.display = 'block';
}
}
function _cpCellHilite( sType )
{
with( this )
{
if( rct == null )
{
getRect();
}
var h = sType == 'src' ? idsrchilite : iddesthilite;
h.style.left = rct.left - 2;
h.style.top = rct.top - 2;
h.style.width = rct.right - rct.left + 4;
h.style.height = rct.bottom - rct.top + 4;
h.style.display = 'block';
}
}
function _cpGetRect()
{
with( this )
{
if( rct != null )
return rct;
var h;
if( type == CP_COL )
h = idcols[index];
else if( type == CP_CELL )
{
if( g_NumCells > 1 )
h = idcells[index];
else
h = idcells;
}
else
h = idaces[index];
rct = getAbsOffset( h );
if( type == CP_COL )
{
var cr = getAbsOffset( idbotbb );
rct.bottom = cr.top;
}
return rct;
}
}
function _cpAdjustSpacing()
{
with( this )
{
var i;
for( i = 0; i < cards.length; i++ )
{
var c = cards[i];
c.rct.top = c.cardimg[g_CardIndex].style.top = rct.top + i * spacing;
c.rct.bottom = c.rct.top + g_CardHeight;
}
}
}
function _cpNOP()
{
}
function _cpColLayout()
{
with( this )
{
reset();
getRect();
var i;
for( i = 0; i < cards.length; i++ )
{
var oCard = cards[i];
var cimg = oCard.cardimg[g_CardIndex];
oCard.rct.left = cimg.style.left = rct.left;
oCard.rct.top = cimg.style.top = rct.top + i * spacing;
oCard.rct.bottom = oCard.rct.top + g_CardHeight;
oCard.rct.right = oCard.rct.left + g_CardWidth;
}
}
}
function _cpAceLayout()
{
with( this )
{
reset();
getRect();
var i;
for( i = 0; i < cards.length; i++ )
{
var oCard = cards[i];
var cimg = oCard.cardimg[g_CardIndex];
oCard.rct.left = cimg.style.left = rct.left;
oCard.rct.top = cimg.style.top = rct.top;
oCard.rct.bottom = oCard.rct.top + g_CardHeight;
oCard.rct.right = oCard.rct.left + g_CardWidth;
}
}
}
function _cpCellLayout()
{
with( this )
{
reset();
getRect();
var oCard = card;
if( oCard != null )
{
var cimg = oCard.cardimg[g_CardIndex];
oCard.rct.left = cimg.style.left = rct.left;
oCard.rct.top = cimg.style.top = rct.top;
oCard.rct.bottom = oCard.rct.top + g_CardHeight;
oCard.rct.right = oCard.rct.left + g_CardWidth;
}
}
}
var dbgLog = new Array();
function dbg( sMesg )
{
if( !LOG )
return;
dbgLog.push( sMesg );
if( dbgLog.length > 1000 )
{
var i;
for( i = 0; i < 250; i++ )
{
dbgLog.shift();
}
}
}
function showDbg()
{
showDlg( "dlgDbg.html", g_UIState, 600, 500 );
}
function rect(l, t, r, b )
{
this.left = l;
this.top = t;
this.right = r;
this.bottom = b;
if( !rect.prototype.inside )
{
rect.prototype.inside = _rectInside;
rect.prototype.toString = _rectToString;
}
}
function _rectInside( x, y )
{
with( this )
{
if( x < left || x >= right )
return false;
if( y < top || y >= bottom )
return false;
return true;
}
}
function _rectToString()
{
with( this )
{
return left + ',' + top + ',' + right + ',' + bottom;
}
}
function getAbsOffset( h )
{
var top = 0;
var left = 0;
var width = h.offsetWidth;
var height = h.offsetHeight;
while( h.tagName != 'BODY' )
{
top += h.offsetTop;
left += h.offsetLeft;
h = h.offsetParent;
}
return new rect( left, top, left + width, top + height );
}
function seed_random( n )
{
g_Seed = n;
}
function Random( range )
{
g_Seed = g_Seed * 69069;
g_Seed %= 0x100000000;
g_Seed++;
g_Seed %= 0x100000000;
return Math.floor( ((g_Seed / 0x10000) * range) / 0x10000 );
}
function new_random_seed()
{
var n = 1 + Math.floor( Math.random() * 32767 );
var now = new Date();
n += now.getTime() / 1000;
n = Math.floor( n );
n %= 32767;
n++;
return n;
}
function imcmd()
{
var s = eval( idinput.value );
idimres.innerText = s;
}
function _arrayPush( item )
{
this[this.length] = item;
}
function _arrayPop()
{
if( this.length == 0 )
return null;
var item = this[this.length-1];
this.length = this.length - 1;
return item;
}
function _arrayShift()
{
if( this.length == 0 )
return null;
var item = this[0];
var i;
var len = this.length - 1;
for( i = 0; i < len; i++ )
{
this[i] = this[i+1];
}
this.length = len;
return item;
}
function arrayFix()
{
if( Array.prototype.push )
return;
Array.prototype.push = _arrayPush;
Array.prototype.pop = _arrayPop;
Array.prototype.shift = _arrayShift;
}
function _stringTrim()
{
var s = this + '';
while( s.length )
{
var c = s.substr(0,1);
if( c == ' ' || c == '\t' || c == '\r' || c == '\n' )
{
s = s.substr( 1 );
}
else
{
break;
}
}
while( s.length )
{
var c = s.substr( s.length - 1 );
if( c == ' ' || c == '\t' || c == '\r' || c == '\n' )
{
s = s.substr( 0, s.length - 1 );
}
else
{
break;
}
}
return s;
}
function padLeft( s, padChar, cnt )
{
var i;
s += '';
while( s.length < cnt )
s = padChar + s;
return s;
}
function gameParams()
{
this.cols = 8;
this.cells = 4;
this.random = true;
this.difficulty = 5;
this.seed = '';
}
function err( sMesg )
{
var a = new Array();
sArg = "Error (" + VER + ")";
sArg += "\nBrowser: " + window.navigator.userAgent + "\nOnline: " + window.navigator.onLine + "\nSyslang: " + window.navigator.systemLanguage + "\nUserlang: " + window.navigator.userLanguage + "\n";
sArg += "Details: " + sMesg + "\n\nTrace buffer:\n";
a[0] = sArg;
a[1] = dbgLog;
a[2] = g_UIState;
showDlg( 'dlgErr.html', a, 600, 450 );
}
function gameToString()
{
var sb = new Array();
sb.push( 'g_NumCols = ' + g_NumCols );
sb.push( 'g_NumCells = ' + g_NumCells );
sb.push( 'g_View = ' + g_View );
sb.push( 'g_Game = "' + g_Game +'"' );
sb.push( 'g_GameDifficulty = ' + g_GameDifficulty );
sb.push( 'g_GameInProg = ' + g_GameInProg );
sb.push( 'g_GameSeed = ' + g_GameSeed );
sb.push( 'g_DoesntCount = ' + g_DoesntCount );
sb.push( 'g_ShowSums = ' + g_ShowSums );
if( g_GameInProg )
{
var d = new Date();
sb.push( 'elapsed = ' + (d.getTime() - g_StartTime) );
sb.push( 'g_GameMoves = ' + g_GameMoves );
sb.push( 'g_GameCardsMoved = ' + g_GameCardsMoved );
}
sb.push( '' );
var s = sb.join( ';\n' );
return s;
}
function stringToGame( s )
{
var elapsed;
eval( s );
var d = new Date();
g_StartTime = d.getTime() - elapsed;
}
function boardToString()
{
if( !g_GameInProg )
return '';
var i;
var sb = new Array();
for( i = 0; i < g_NumCols; i++ )
{
var sb1 = new Array();
var j;
var col = g_Board[i];
for( j = 0; j < col.length; j++ )
{
sb1.push( col[j].name );
}
var s = sb1.join( ' ' );
sb.push( s );
}
for( i = 0; i < g_NumCells; i++ )
{
if( g_Cells[i] )
sb.push( g_Cells[i].name );
else
sb.push( '' );
}
for( i = 0; i < 4; i++ )
{
var sb1 = new Array();
var j;
var ace = g_Aces[i];
for( j = 0; j < ace.length; j++ )
{
sb1.push( ace[j].name );
}
var s = sb1.join( ' ' );
sb.push( s );
}
var s = sb.join( '\n' );
return s;
}
function stringToBoard( s )
{
var a = s.split( '\n' );
var i;
for( i = 0; i < g_NumCols; i++ )
{
var aCards = a[i].split( ' ' );
var j;
g_CPBoard[i].clear();
for( j = 0; j < aCards.length; j++ )
{
if( aCards[j] == '' )
continue;
var cp = g_CardHash[aCards[j]];
if( cp == null )
{
alert( 'stringToBoard: col card not found: ' + aCards[j] );
continue;
}
put_back_card( i + '', cp );
}
}
for( i = 0; i < g_NumCells; i++ )
{
var sName = a[i + g_NumCols];
g_CPCells[i].clear();
if( sName && sName != '' )
{
var cp = g_CardHash[sName];
if( cp == null )
{
alert( 'stringToBoard: cell card not found: ' + sName );
continue;
}
put_back_card( String.fromCharCode( 97 + i ), cp );
}
}
for( i = 0; i < 4; i++ )
{
var aCards = a[i + g_NumCols + g_NumCells].split( ' ' );
var j;
g_CPAces[i].clear();
for( j = 0; j < aCards.length; j++ )
{
var sName = aCards[j];
if( sName && sName != '' )
{
var cp = g_CardHash[aCards[j]];
if( cp == null )
{
alert( 'stringToBoard: ace card not found: ' + aCards[j] );
continue;
}
put_back_card( 'U', cp );
}
}
}
}
function Score()
{
this.plays = 0;
this.wins = 0;
this.streak = 0;
this.bestStreak = 0;
this.streakCnt = 0;
this.avgStreak = 0;
this.totalTimePlayed = 0;
this.avgWinTime = 0;
this.bestWinTime = 0;
this.moves = 0;
this.cardsMoved = 0;
this.toString = _scoreToString;
this.fromString = _scoreFromString;
}
function _scoreToString()
{
with(this)
{
var sb = new Array();
sb.push( 'plays = ' + plays );
sb.push( 'wins = ' + wins );
sb.push( 'streak = ' + streak );
sb.push( 'bestStreak = ' + bestStreak );
sb.push( 'streakCnt = ' + streakCnt );
sb.push( 'avgStreak = ' + avgStreak );
sb.push( 'totalTimePlayed = ' + totalTimePlayed );
sb.push( 'avgWinTime = ' + avgWinTime );
sb.push( 'bestWinTime = ' + bestWinTime );
sb.push( 'moves = ' + moves );
sb.push( 'cardsMoved = ' + cardsMoved );
sb.push( '' );
var s = sb.join( ';\n' );
return s;
}
}
function _scoreFromString( s )
{
with( this )
{
eval( s );
}
}
function saveAllScores()
{
var cells, cols;
var sb = new Array();
for( cells = 0; cells <= MAX_CELL; cells++ )
{
for( cols = 0; cols <= MAX_COL; cols++ )
{
var sGame = cols + 'x' + cells;
if( g_Scores[sGame] )
{
sb.push( sGame + '~' + g_Scores[sGame].toString() );
}
}
}
var s = sb.join( '|' );
return s;
}
function restoreAllScores( s )
{
var a = s.split( '|' );
var i;
for( i = 0; i < a.length; i++ )
{
var anv = a[i].split( '~' );
var score = new Score();
var sGame = anv[0];
score.fromString( anv[1] );
g_Scores[sGame] = score;
}
}
var S_IDLE = 0;
var S_HOLD = 1;
var S_SEND = 2;
var S_SENDW = 3;
var S_SENDRW = 4;
var S_SENDR = 5;
var _commState;
var _commOutputBuf;
var _commInputBuf;
var _commHoldoffTimerVal = -1;
var _commChannel;
var _commCmdProc;
var _commSeqNum;
var _commError;
function commInit()
{
if( _commHoldoffTimerVal != -1 )
{
clearTimeout( _commHoldoffTimerVal );
_commHoldoffTimerVal = -1;
}
_commOutputBuf = new Array();
_commInputBuf = '';
_commState = S_IDLE;
_commChannel = 0;
_commCmdProc = null;
_commSeqNum = 0;
_commError = false;
return true;
}
function commPutLine( mesg )
{
var d = new Date();
dbg( "commPutLine: " + _commState + " : '" + mesg.substr(0,15) + "'\n" );
var state = _commState;
switch( state )
{
case S_IDLE:
_commOutputBuf.push( mesg + '\n' );
_commHoldoffTimerVal = setTimeout( "commHoldoffTimeout()", 30000 );
_commState = S_HOLD;
break;
case S_HOLD:
case S_SENDW:
_commOutputBuf.push( mesg + '\n' );
break;
case S_SEND:
_commOutputBuf.push( mesg + '\n' );
_commState = S_SENDW;
break;
case S_SENDRW:
case S_SENDR:
err( "commPutLine: called in state " + _commState );
break;
}
return true;
}
function commGetLine( proc )
{
dbg( "commGetLine: " + _commState + " proc=" + proc + "\n" );
if( _commCmdProc != null )
{
err( "commGetLine: " + proc + " called with " + _commCmdProc + " already pending" );
return;
}
if( _commInputBuf != '' )
{
dbg( "input waiting: '" + _commInputBuf + "'\n" );
var sCmd = proc + ' ' + _commInputBuf;
_commInputBuf = '';
queueCommand( sCmd );
return;
}
_commCmdProc = proc;
var state = _commState;
switch( state )
{
case S_IDLE:
_commState = S_SEND;
httpPost();
break;
case S_HOLD:
_commState = S_SENDR;
clearTimeout( _commHoldoffTimerVal );
_commHoldoffTimerVal = -1;
httpPost();
break;
case S_SENDW:
_commState = S_SENDRW;
break;
case S_SEND:
_commState = S_SENDR;
break;
case S_SENDR:
case S_SENDRW:
err( "commGetLine: called in state " + _commState );
break;
}
}
function commHoldoffTimeout()
{
dbg( "commHoldoffTimeout: " + _commState + ' timerVal: ' + _commHoldoffTimerVal + "\n" );
if( _commHoldoffTimerVal == -1 )
{
return;
}
_commHoldoffTimerVal = -1;
var state = _commState;
switch( state )
{
case S_HOLD:
_commState = S_SEND;
httpPost();
break;
case S_IDLE:
case S_SENDW:
case S_SEND:
case S_SENDRW:
case S_SENDR:
err( "commHoldoffTimeout: called in state " + _commState );
break;
}
}
function httpPost()
{
dbg( "* HTTPPost: " + _commState + "\n" );
var p = new post( httpCallback );
var outData = _commOutputBuf.join( "" );
_commOutputBuf = new Array();
var lengthField = outData.length;
if( ++_commSeqNum == 8 )
_commSeqNum = 1;
if( 0 == _commChannel )
{
dbg( "seq num reset\n" );
_commSeqNum = 0;
}
lengthField |= _commSeqNum << 23;
var chksum = commChecksum( outData );
lengthField |= chksum << 15;
outData = padLeft( _commChannel, '0', 8 ) + padLeft( lengthField, '0', 8 ) + outData;
p.url = CGI_URL;
p.data = outData;
p.send();
}
function httpCallback( xstat, resp )
{
dbg( "* HTTPCallback: " + _commState + " xstat=" + xstat + "\n" );
if( xstat != 'OK' )
{
alert( "Error communicating with NetCELL server.\nStatus code: " + xstat + "\n\nPossible causes:\n\n * You disconnected from the Internet\n * General Internet flakiness\n * NetCELL server down\n" );
saveStateOnError();
deferCommand( 'reset' );
return;
}
var chan = resp.substr(0,8);
chan /= 1;
if( chan == -1 )
{
alert( "Lost contact with NetCELL server.\n\nPossible causes:\n\n * You were idle for too long\n * You disconnected from the Internet\n * General Internet flakiness\n * NetCELL server down\n" );
saveStateOnError();
deferCommand( 'reset' );
return;
}
if( _commChannel == 0 )
{
dbg( "set channel: " + chan + "\n" );
_commChannel = chan;
}
resp = resp.substr( 16 );
dbg( "response: '" + resp + "'\n" );
var a = resp.split('\n');
var i;
for( i = 0; i < a.length; i++ )
{
if( a[i] != '' )
_commInputBuf += a[i] + '\n';
}
var state = _commState;
switch( state )
{
case S_IDLE:
case S_HOLD:
err( "httpCallback: called in state " + _commState );
break;
case S_SEND:
_commState = S_IDLE;
break;
case S_SENDW:
_commHoldoffTimerVal = setTimeout( "commHoldoffTimeout()", 60000 );
_commState = S_HOLD;
break;
case S_SENDRW:
if( _commCmdProc == null )
{
err( "httpCallback in SENDRW: cmdProc is null" );
deferCommand( 'reset' );
break;
}
if( _commInputBuf != '' )
{
var sCmd = _commCmdProc + ' ' + _commInputBuf;
_commInputBuf = '';
_commCmdProc = null;
_commState = S_SEND;
deferCommand( sCmd );
}
else
{
_commState = S_SENDR;
}
httpPost();
break;
case S_SENDR:
if( _commCmdProc == null )
{
err( "httpCallback in SENDR: cmdProc is null" );
deferCommand( 'reset' );
break;
}
if( _commInputBuf != '' )
{
var sCmd = _commCmdProc + ' ' + _commInputBuf;
_commInputBuf = '';
_commCmdProc = null;
_commState = S_IDLE;
deferCommand( sCmd );
}
else
{
_commState = S_IDLE;
}
break;
}
}
function commChecksum( s )
{
var i, len, res;
len = s.length;
res = 0;
for( i = 0; i < len; i++ )
{
res += s.charCodeAt( i );
}
res &= 0xff;
res ^= 0x25;
return res;
}
var POST_IDLE = 0;
var POST_OPEN = 1;
var POST_SENDING = 2;
var POST_MAX_TRIES = 2;
var _postSlots = new Array(4);
var _postID = 0;
function post( callbackFunc )
{
this.id = _postID++;
this.slot = this.id % 4;
dbg( "post: " + this.id + "\n" );
if( _postSlots[this.slot] )
{
var obj = _postSlots[this.slot];
obj.destroy();
}
_postSlots[this.slot] = this;
this.xmlhttp = getXMLHTTP();
if( this.xmlhttp == null )
{
alert( "Could not create object for communicating with the server. Please update your browser." );
return;
}
switch( this.slot )
{
case 0:
this.xmlhttp.onreadystatechange = postCallback0;
break;
case 1:
this.xmlhttp.onreadystatechange = postCallback1;
break;
case 2:
this.xmlhttp.onreadystatechange = postCallback2;
break;
case 3:
this.xmlhttp.onreadystatechange = postCallback3;
break;
}
this.clientCallback = callbackFunc;
this.postState = POST_IDLE;
this.tries = 1;
this.url = null;
this.data = null;
this.tmrval = -1;
if( !post.prototype.send )
{
this.send = _postSend;
this.destroy = _postDestroy;
this.retry = _postRetry;
this.callback = _postCallback;
this.timeout = _postTimeout;
}
}
function getXMLHTTP()
{
var xmlhttp = null;
try
{
xmlhttp = new ActiveXObject( "MSXML2.XMLHTTP.3.0" );
if( xmlhttp != null )
return xmlhttp;
}
catch(e)
{
}
try
{
xmlhttp = new ActiveXObject( "MSXML2.XMLHTTP" );
if( xmlhttp != null )
return xmlhttp;
}
catch(e)
{
}
try
{
xmlhttp = new ActiveXObject( "Microsoft.XMLHTTP" );
if( xmlhttp != null )
return xmlhttp;
}
catch(e)
{
}
return xmlhttp;
}
function _postSend()
{
dbg( "_postSend: " + this.data + " length: " + this.data.length + " tries: " + this.tries + " id: " + this.id + "\n" );
with( this )
{
tmrval = setTimeout( 'postTimeout(' + slot + ')', 28000 );
xmlhttp.open("POST", url, true );
postState = POST_OPEN;
xmlhttp.send( data );
postState = POST_SENDING;
}
}
function postCallback0()
{
var obj = _postSlots[0];
if( obj )
obj.callback();
else
dbg( "stray callback on slot 0\n" );
}
function postCallback1()
{
var obj = _postSlots[1];
if( obj )
obj.callback();
else
dbg( "stray callback on slot 1\n" );
}
function postCallback2()
{
var obj = _postSlots[2];
if( obj )
obj.callback();
else
dbg( "stray callback on slot 2\n" );
}
function postCallback3()
{
var obj = _postSlots[3];
if( obj )
obj.callback();
else
dbg( "stray callback on slot 3\n" );
}
function _postCallback()
{
with( this )
{
if( xmlhttp.readyState == 4 )
{
var xstat = xmlhttp.statusText;
if( xstat != 'OK' )
{
dbg( "_postCallback error: " + xstat + " id: " + id + "\n" );
postState = POST_IDLE;
xmlhttp.abort();
destroy();
if( tries != POST_MAX_TRIES )
{
dbg( "retrying on error\n" );
retry();
}
else
{
clientCallback( xstat, null );
}
return;
}
else
{
dbg( "_postCallback done, id: " + id + "\n" );
postState = POST_IDLE;
destroy();
clientCallback( "OK", xmlhttp.responseText );
}
}
}
}
function _postDestroy()
{
with( this )
{
dbg( "_postDestroy: " + id + "\n" );
_postSlots[slot] = null;
if( postState != POST_IDLE )
{
dbg( "destroy aborting\n" );
postState = POST_IDLE;
xmlhttp.onreadystatechange = postNOP;
xmlhttp.abort();
}
if( tmrval != -1 )
{
dbg( "destroy clearing timer\n" );
clearTimeout( tmrval );
tmrval = -1;
}
if( tries != 1 )
{
window.status = window.defaultStatus;
}
dbg( "destroy done\n" );
}
}
function _postRetry()
{
var tryMesgs = new Array( 'zero','first','2nd','3rd');
dbg( "_postRetry id: " + this.id + "\n" );
with( this )
{
var p = new post( clientCallback );
p.url = url;
p.data = data;
p.tries = tries + 1;
idpatience.innerText = "Retrying communication, " + tryMesgs[p.tries] + " try...";
p.send();
}
}
function _postTimeout()
{
dbg( "_postTimeout id: " + this.id + "\n" );
with( this )
{
tmrval = -1;
destroy();
if( tries != POST_MAX_TRIES )
{
dbg( "retrying on timeout\n" );
retry();
}
else
{
dbg( "timeout retries exhaused, notifying client\n" );
clientCallback( "Failsafe timer expired", null );
}
}
}
function postTimeout( n )
{
var obj = _postSlots[n];
if( obj )
obj.timeout();
else
dbg( "stray timeout on slot " + n + "\n" );
}
function postNOP()
{
dbg( "postNOP\n" );
}
/*
function testWIN() {
//For testing purposes only
var o = new Object();
var now = new Date();
var elapsed = now.getTime() - g_StartTime;
o.elapsed = formatTime( elapsed );
o.streak = doScores( true, elapsed );
o.ncols = g_NumCols;
o.ncells = g_NumCells;
o.gameNumber = g_GameSeed;
o.gameDifficulty = g_GameDifficulty;
o.prefix = AD_PREFIX;
o.sessionID = '';
showDlg( "dlgWin.html", o, 300, 180);
}
*/