home *** CD-ROM | disk | FTP | other *** search
/ Freelog 117 / FreelogNo117-OctobreNovembre2013.iso / Theme / 8GadgetPack / 8GadgetPackSetup.msi / picturePuzzle.js_1 < prev    next >
Text (UTF-16)  |  2012-05-19  |  48KB  |  894 lines

  1. ////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // THIS CODE IS NOT APPROVED FOR USE IN/ON ANY OTHER UI ELEMENT OR PRODUCT COMPONENT.
  4. // Copyright (c) 2009 Microsoft Corporation. All rights reserved.
  5. //
  6. ////////////////////////////////////////////////////////////////////////////////
  7. var L_PAUSE_TEXT = "Suspendre le minuteur";
  8. var L_SHOW_TEXT = "Afficher l’image";
  9. var L_SHUFFLE_TEXT = "Lecture aléatoire";
  10. var L_SOLVE_TEXT = "Résoudre";
  11. var L_CONGRATULATIONS_TEXT = "";
  12. var L_YOU_WIN_TEXT = "Vous avez gagné !";
  13. var toolbarTextList = new Array(L_PAUSE_TEXT, L_SHOW_TEXT, L_SOLVE_TEXT);
  14. var tile = new Array(), x, y, i;
  15. var solvedTiles = new Array();
  16. var gShuffleCount = 1000;
  17. var emptyTile = null;
  18. var gridSize = 4;
  19. var tileSize = 27;
  20. var allowEvent = true;
  21. var puzzleObject = new clsPuzzleObject();
  22. var gameStarted = System.Gadget.Settings.read("gameStarted");
  23. var puzzleDirection = new Array(4);
  24. var sourceImage = "../images/1.png";
  25. var shuffleEvent = false;
  26. var totalSeconds = System.Gadget.Settings.read("totalSeconds") || 0;
  27. var timerActive = false;
  28. var timerTick = null;
  29.  
  30. puzzleDirection[0] = "U";
  31. puzzleDirection[1] = "D";
  32. puzzleDirection[2] = "L";
  33. puzzleDirection[3] = "R";
  34.  
  35. System.Gadget.settingsUI = "settings.html"
  36. System.Gadget.onSettingsClosed = settingsClosed;
  37. ////////////////////////////////////////////////////////////////////////////////
  38. //
  39. // Load main gadget function
  40. //
  41. ////////////////////////////////////////////////////////////////////////////////
  42. function loadMain()
  43.     L_CONGRATULATIONS.innerHTML = L_CONGRATULATIONS_TEXT;
  44.     L_YOU_WIN.innerHTML = L_YOU_WIN_TEXT;
  45.     
  46.     if (document.getElementsByTagName("html")[0].dir != "")
  47.     {
  48.         pageDir = document.getElementsByTagName("html")[0].dir;
  49.     }
  50.     
  51.     mySettings.load();
  52.     disableToolbar();
  53.     
  54.     sourceImage = "../images/" + mySettings.imageID + ".png";
  55.     gamePicture.src = sourceImage;
  56.     
  57.     // Attaching events to the toolbar buttons
  58.     timer.attachEvent("onmousedown", function(){doTimer('stop');});
  59.     timer.attachEvent("onkeydown", function(){doTimer('stop');});
  60.     hint.attachEvent("onmousedown", function(){hintShow()});
  61.     hint.attachEvent("onmouseup", function(){hintHide();});
  62.     hint.attachEvent("onkeydown", function(){hintShow()});
  63.     hint.attachEvent("onkeyup", function(){hintHide();});
  64.     shuffle.attachEvent("onmousedown", function(){shuffleHandler('true');});
  65.     shuffle.attachEvent("onkeydown",
  66.         function()
  67.         {
  68.             if ( event.keyCode == 13 )
  69.             {
  70.                 shuffleHandler('true');
  71.             }
  72.         } );
  73.     
  74.     toolbar();
  75.     displayGame();
  76. }
  77. ////////////////////////////////////////////////////////////////////////////////
  78. //
  79. // Move tile pieces if arrow keys down
  80. //
  81. ////////////////////////////////////////////////////////////////////////////////
  82. function testKey()
  83. {
  84.     if (event.keyCode == 37 || event.keyCode == 39 ||
  85.         event.keyCode == 38 || event.keyCode == 40)
  86.     {
  87.         self.focus;document.body.focus();
  88.         testTarget();
  89.     }
  90. }
  91. ////////////////////////////////////////////////////////////////////////////////
  92. //
  93. // Validate selected target tile
  94. //
  95. ////////////////////////////////////////////////////////////////////////////////
  96. function testTarget()
  97. {
  98.     var newTile;
  99.     var tileCount = 0;
  100.     var posCount = 0;
  101.     var xCord = 1;
  102.     var yCord = 1;
  103.     
  104.     // Stop right-clicking from causing tile movement
  105.     if (allowEvent == false || (event && event.button == 2))
  106.     {
  107.         return false;
  108.     }
  109.     
  110.     // Left
  111.     if (event.keyCode == 39)
  112.     {
  113.         newTile = emptyTile.index - 1;
  114.     }
  115.     // Right
  116.     else if (event.keyCode == 37)
  117.     {
  118.         newTile = emptyTile.index + 1;
  119.     }
  120.     // Up
  121.     else if (event.keyCode == 40)
  122.     {
  123.         newTile = emptyTile.index - 4;
  124.     }
  125.     // Down
  126.     else if (event.keyCode == 38)
  127.     {
  128.         newTile = emptyTile.index + 4;
  129.     }
  130.     
  131.     // Spoof x&y coords from arrow click for position values
  132.     if (newTile && (newTile > 0) && (newTile < 17))
  133.     {
  134.         for(y = 0; y < 4; y++)
  135.         {
  136.             for(x = 0; x < 4; x++, posCount++)
  137.             {
  138.                 if ((newTile - 1) == posCount)
  139.                 {
  140.                     xCord = 1 + (tileSize * x);
  141.                     yCord = 1 + (tileSize * y);
  142.                 }
  143.             }
  144.         }
  145.     }
  146.     // Grab x&y mouse click coords
  147.     else
  148.     {
  149.         xCord = event.offsetX;
  150.         yCord = event.offsetY;
  151.     }
  152.  
  153.     isValidChoice(xCord, yCord);
  154. }
  155. ////////////////////////////////////////////////////////////////////////////////
  156. //
  157. // 
  158. //
  159. ////////////////////////////////////////////////////////////////////////////////
  160. document.onselectstart = document.ondragstart = function shutup()
  161. {
  162.     return false;
  163. }
  164. ////////////////////////////////////////////////////////////////////////////////
  165. //
  166. // Puzzle object
  167. //
  168. ////////////////////////////////////////////////////////////////////////////////
  169. function clsPuzzleObject()
  170. {
  171.     this.invalidDirection = "";
  172.     this.currentIndex = 0;
  173.     this.newIndex = 0;
  174.     this.tileArray = new Array();
  175.     
  176.     this.resetPuzzle = function()
  177.     {    
  178.         this.currentIndex = (gridSize * gridSize);
  179.         if (this.tileArray.length > 0)
  180.         {
  181.             this.tileArray.splice(0);
  182.         }
  183.         for (var i = 0; i < (gridSize * gridSize); i++)
  184.         {
  185.             this.tileArray[i] = i;
  186.         }
  187.         this.reOrderPuzzle();
  188.     }
  189.     
  190.     this.reOrderPuzzle = function()
  191.     {
  192.         
  193.         var tempArray = new Array();
  194.         for (var i = 0; i < solvedTiles.length; i++)
  195.         {
  196.             tempArray[i] = solvedTiles[i];
  197.         }
  198.         tile.splice(0,tile.length);
  199.         
  200.         // If first display of a game, shuffle
  201.         if (gameStarted != true)
  202.         {
  203.             this.shuffle();
  204.             for (var i = 0; i < this.tileArray.length; i++)
  205.             {
  206.                 tile[i] = tempArray[ this.tileArray[i] ];
  207.             }
  208.         }
  209.         // If game has been displayed but sidebar closed and re-opened,
  210.         // then display saved pattern
  211.         else
  212.         {
  213.             for (var i = 0; i < this.tileArray.length; i++)
  214.             {
  215.                 var tileIndex = System.Gadget.Settings.read("savedTile"+(i+1));
  216.                 tile[i] = tempArray[tileIndex-1];
  217.             }
  218.         }
  219.     }
  220.     
  221.     this.shuffle = function(tempArray)
  222.     {    
  223.         var hold = 0;
  224.         for (var i = 0; i < gShuffleCount; i++)
  225.         {        
  226.             puzzleDirection.sort(function()
  227.             {
  228.                 return Math.random()-0.5;
  229.             });
  230.             for (var ii=0; ii < puzzleDirection.length; ii++)
  231.             {
  232.                 if ( this.isDirectionValid( puzzleDirection[ii] ) )
  233.                 {
  234.                     this.newIndex = this.getNextMove(puzzleDirection[ii]);
  235.                     if (this.newIndex != 0)
  236.                     {
  237.                         if ( this.isNextMoveValid() )
  238.                         {
  239.                             hold = this.tileArray[this.currentIndex-1];
  240.                             this.tileArray[this.currentIndex-1] = this.tileArray[this.newIndex - 1];
  241.                             this.tileArray[this.newIndex - 1] = hold;
  242.                             this.setInvalidDirection(puzzleDirection[ii]);
  243.                             this.currentIndex = this.newIndex;
  244.                             break;
  245.                         }
  246.                     }
  247.                 }    
  248.             }
  249.         }
  250.     }
  251.     
  252.     this.setInvalidDirection = function(direction)
  253.     {
  254.         switch (direction)
  255.         {
  256.             case "U" : this.invalidDirection = "D"; break;
  257.             case "L" : this.invalidDirection = "R"; break;
  258.             case "R" : this.invalidDirection = "L"; break;
  259.             case "D" : this.invalidDirection = "U"; break;            
  260.         }    
  261.     }
  262.  
  263.     this.isNextMoveValid = function()
  264.     {
  265.         var returnVal = false;
  266.     
  267.         // Validates Up, Down, Left, and Right tiles
  268.         if ((this.currentIndex - gridSize == this.newIndex) ||
  269.             (this.currentIndex + gridSize == this.newIndex) ||
  270.             ((this.currentIndex - 1 == this.newIndex) && (this.currentIndex % gridSize != 1)) ||
  271.             ((this.currentIndex + 1 == this.newIndex) && (this.currentIndex % gridSize != 0)))
  272.             {
  273.             returnVal = true;
  274.         }
  275.         return returnVal;
  276.     }
  277.     
  278.     this.getNextMove = function( direction )
  279.     {
  280.         var index = 0;
  281.         switch (direction)
  282.         {
  283.             case "U" : index = (this.currentIndex - gridSize); break;
  284.             case "L" : index = (this.currentIndex - 1); break;
  285.             case "R" : index = (this.currentIndex + 1); break;
  286.             case "D" : index = (this.currentIndex + gridSize); break;            
  287.         }
  288.         if ( index <= 0 | index > 16)
  289.         {
  290.             index = 0;
  291.         }
  292.         return index;
  293.     }
  294.  
  295.     this.isDirectionValid = function ( direction )
  296.     {
  297.         return ( this.invalidDirection != direction );
  298.     }
  299. }
  300. ////////////////////////////////////////////////////////////////////////////////
  301. //
  302. // No Animation Shuffle
  303. //
  304. ////////////////////////////////////////////////////////////////////////////////
  305. function onShuffleNoAnimation()
  306. {    
  307.     disableEvents();
  308.     pad.filters(0).apply();
  309.     puzzleObject.resetPuzzle();
  310.     
  311.     for(y = 0, i = 0; y < gridSize; y++)
  312.     {
  313.         for(x = 0; x < gridSize; x++, i++)
  314.         {
  315.             if (tile[i])
  316.             {
  317.                 tile[i].setAttribute("index", i + 1);
  318.                 moveNoAnimation(tile[i], x * tileSize, y * tileSize);
  319.             }
  320.         }
  321.     }
  322.     
  323.     pad.filters(0).play();
  324.     emptyTile.style.display = "";
  325.     setTimeout(enableEvents, 1000);
  326.     setTimeout("hint.disabled = ''", 900);
  327.     setTimeout("shuffle.disabled = ''", 900);
  328.     System.Gadget.Settings.write("gameStarted", true);
  329. }
  330. ////////////////////////////////////////////////////////////////////////////////
  331. //
  332. // No Animation Move
  333. //
  334. ////////////////////////////////////////////////////////////////////////////////
  335. function moveNoAnimation(tileObj, x, y)
  336. {
  337.     tileObj.x = x; 
  338.     tileObj.y = y;
  339.     tileObj.runtimeStyle.left = x;
  340.     tileObj.runtimeStyle.top = y;
  341.     tileObj.runtimeStyle.zIndex = 0
  342.     
  343.     if (gameStarted != true)
  344.     {
  345.         saveTile(tileObj.index, tileObj.originalPosition);
  346.     }
  347. }
  348. ////////////////////////////////////////////////////////////////////////////////
  349. //
  350. // Settings close
  351. //
  352. ////////////////////////////////////////////////////////////////////////////////
  353. function settingsClosed(event)
  354. {
  355.     if (event.closeAction == event.Action.commit)
  356.     {
  357.         var previousPicId = mySettings.imageID;
  358.         mySettings.load();
  359.  
  360.         if ( previousPicId !== mySettings.imageID )
  361.         {
  362.             sourceImage = "../images/" + mySettings.imageID + ".png";
  363.             gamePicture.src = sourceImage;
  364.  
  365.             for (var i = 1; i < 16; i++)
  366.             {
  367.                 document.getElementById("img"+i).parentElement.style.backgroundImage = 'url('+sourceImage+')';
  368.             }
  369.  
  370.             shuffleEvent = true;
  371.             shuffleHandler(true);
  372.         }
  373.     }
  374.     else if(event.closeAction == event.Action.cancel)
  375.     {
  376.     }
  377.     event.cancel = false;
  378. }
  379. ////////////////////////////////////////////////////////////////////////////////
  380. //
  381. // Display Game
  382. //
  383. ////////////////////////////////////////////////////////////////////////////////
  384. function displayGame()
  385. {
  386.     var counter = 0;
  387.     for(y = 0; y < gridSize; y++)
  388.     {
  389.         for(x = 0; x < gridSize; x++)
  390.         {
  391.             var tileLeft = x * tileSize;
  392.             var tileTop = y * tileSize;
  393.             pad.insertAdjacentHTML("beforeEnd",
  394.                 "<div dir='ltr' id='t"+y+x+"' onclick='swapTile(this)' originalPosition='"+(++counter)+"' "+
  395.                 "style='position: absolute; width: "+tileSize+"; height: "+tileSize+"; left: "+tileLeft+"; top: "+tileTop+"; background: no-repeat -"+tileLeft+" -"+tileTop+" url("+sourceImage+");'>"+
  396.                 "<img id='img"+counter+"' style='position: absolute; left: 0; top: 0; width: "+tileSize+"; height: "+tileSize+"' src='../images/tile_bezel.png'></div>"
  397.             );
  398.             tile.push(pad.lastChild);
  399.             solvedTiles.push(pad.lastChild);
  400.         }
  401.     }
  402.  
  403.     img16.parentElement.style.background="";
  404.     img16.parentElement.disabled = true;
  405.     img16.src = "../images/tile_drop_shadow.png";
  406.     emptyTile = tile[15]; 
  407.     setTimeout(onShuffleNoAnimation,500);
  408. }
  409. ////////////////////////////////////////////////////////////////////////////////
  410. //
  411. // On Shuffle
  412. //
  413. ////////////////////////////////////////////////////////////////////////////////
  414. function onShuffle()
  415. {
  416.     if ( event !== undefined && event !== null )
  417.     {
  418.         if ( (event.button && event.button != 1) || (event.keyCode && event.keyCode != 13) )
  419.         {
  420.             return false;
  421.         }
  422.     }
  423.     
  424.     disableToolbar();
  425.     disableEvents();
  426.     pad.filters(0).apply();
  427.     gamePictureDiv.style.display = "none";
  428.     emptyTile.index = "";
  429.     puzzleObject.resetPuzzle();
  430.     
  431.     for(y = 0, i = 0; y < gridSize; y++)
  432.     {
  433.         for(x = 0; x < gridSize; x++, i++)
  434.         {
  435.             tile[i].setAttribute("index", i + 1);
  436.             moveNoAnimation(tile[i], x * tileSize, y * tileSize);
  437.         }
  438.     }
  439.     
  440.     pad.filters(0).play();
  441.     emptyTile.style.display = "";
  442.     setTimeout(enableEvents, 1000);
  443.     setTimeout("hint.disabled = ''", 900);
  444.     setTimeout("shuffle.disabled = ''", 900);
  445.     gameStarted = true;
  446.     self.focus;document.body.focus();
  447. }
  448. ////////////////////////////////////////////////////////////////////////////////
  449. //
  450. // Handler to decide whether to shuffle or solve the puzzle
  451. //
  452. ////////////////////////////////////////////////////////////////////////////////
  453. function doTimer(timerAction)
  454. {
  455.     if ( event !== undefined && event !== null )
  456.     {
  457.         if ((event.button && event.button != 1) ||
  458.             (event.keyCode && event.keyCode != 13 &&
  459.             event.keyCode != 37 && event.keyCode != 39 &&
  460.             event.keyCode != 38 && event.keyCode != 40))
  461.         {
  462.             return false;
  463.         }
  464.     }
  465.     
  466.     switch (timerAction)
  467.     {
  468.         case 'start':
  469.             timerTick = setInterval(function(){tick();}, 1000);
  470.             timerActive = true;
  471.             timer.disabled = '';
  472.             break;
  473.             
  474.         case 'stop':
  475.             clearInterval(timerTick);
  476.             timer.disabled = 'true';
  477.             timerActive = false;
  478.             break;
  479.         
  480.         case 'reset':
  481.             clearInterval(timerTick);
  482.             timer.disabled = 'true';
  483.             timerActive = false;
  484.             totalSeconds = -1;
  485.             timerTick = setInterval(function(){tick();}, 1);
  486.             setTimeout('clearInterval(timerTick)', 1);
  487.             break;
  488.         
  489.         default:
  490.             timer.disabled = 'true';
  491.             timerActive = false;
  492.             totalSeconds = totalSeconds - 1;
  493.             timerTick = setInterval(function(){tick();}, 1);
  494.             setTimeout('clearInterval(timerTick)', 1);
  495.             break;
  496.     }
  497.     
  498.     function tick()
  499.     {
  500.         var timeCount = Math.abs(++totalSeconds);
  501.         var hours = parseInt(timeCount / 3600);
  502.         var minutes = parseInt((timeCount / 60) % 60);
  503.         var seconds = parseInt(timeCount % 60);
  504.         timerCount.innerText = (hours < 10 ? "0" : "")+hours+":"+(minutes < 10 ? "0" : "")+minutes+":"+(seconds < 10 ? "0" : "")+seconds;
  505.         System.Gadget.Settings.write("totalSeconds", totalSeconds);
  506.     }
  507. }
  508. ////////////////////////////////////////////////////////////////////////////////
  509. //
  510. // Handler to decide whether to shuffle or solve the puzzle
  511. //
  512. ////////////////////////////////////////////////////////////////////////////////
  513. function shuffleHandler(action)
  514. {
  515.     if (shuffleEvent == true)
  516.     {
  517.         if (action)
  518.         {
  519.             gameStarted = false;
  520.             onShuffle();
  521.             doTimer('reset');
  522.         }
  523.         shuffleEvent = false;
  524.         shuffle.title = L_SOLVE_TEXT;
  525.     }
  526.     else
  527.     {
  528.         if (action)
  529.         {
  530.             onSolve();
  531.             doTimer('reset');
  532.         }
  533.         shuffleEvent = true;
  534.         shuffle.title = L_SHUFFLE_TEXT;
  535.     }
  536. }
  537. ////////////////////////////////////////////////////////////////////////////////
  538. //
  539. // Disable mouse clicks and key presses
  540. //
  541. ////////////////////////////////////////////////////////////////////////////////
  542. function disableEvents()
  543. {
  544.     allowEvent = false;
  545. }
  546. ////////////////////////////////////////////////////////////////////////////////
  547. //
  548. // Enable mouse clicks and key presses
  549. //
  550. ////////////////////////////////////////////////////////////////////////////////
  551. function enableEvents()
  552. {
  553.     allowEvent = true;
  554. }
  555. ////////////////////////////////////////////////////////////////////////////////
  556. //
  557. // On Solve
  558. //
  559. ////////////////////////////////////////////////////////////////////////////////
  560. function onSolve()
  561. {
  562.     if ((event.button && event.button != 1) || (event.keyCode && event.keyCode != 13))
  563.     {
  564.         return false;
  565.     }
  566.     
  567.     disableToolbar();
  568.     disableEvents();
  569.     pad.filters(0).apply();
  570.     var i = 0;
  571.     
  572.     for(var y = 0; y < gridSize; y++)
  573.     {
  574.         for(var x = 0; x < gridSize; x++)
  575.         {
  576.             var style = window["t"+y+x].runtimeStyle;
  577.             style.posLeft = x * tileSize, style.posTop = y * tileSize;
  578.             document.getElementById("t"+y+x).setAttribute("index", ++i);
  579.             tile[i-1] = document.getElementById("t"+y+x);
  580.             saveTile(tile[i-1].index, tile[i-1].originalPosition);
  581.         }
  582.     }
  583.     
  584.     pad.filters(0).play();
  585.     setTimeout('gamePictureDiv.style.display = "none"', 70);
  586.     enableEvents();
  587.     setTimeout("hint.disabled = ''", 900);
  588.     setTimeout("shuffle.disabled = ''", 900);
  589. }
  590. ////////////////////////////////////////////////////////////////////////////////
  591. //
  592. // Check For Valid Choice
  593. //
  594. ////////////////////////////////////////////////////////////////////////////////
  595. function isValidChoice(xCord, yCord)
  596. {
  597.     // Find tile in array with matching x/y coords
  598.     var tileCount = 0;
  599.     while(tileObj = tile[tileCount++])
  600.     {
  601.         var runObj = tileObj.runtimeStyle;
  602.         if(runObj.posLeft < xCord &&
  603.             runObj.posLeft + tileSize > xCord &&
  604.             runObj.posTop < yCord &&
  605.             runObj.posTop + tileSize > yCord)
  606.         {
  607.             // Validates Up, Down, Left, and Right tiles
  608.             var index = tileObj.index;
  609.             if ((index > 0) && (index < 17) &&
  610.                 ((index == emptyTile.index - gridSize) ||
  611.                 (index == emptyTile.index + gridSize) ||
  612.                 ((index == emptyTile.index - 1) && (emptyTile.index % gridSize != 1)) ||
  613.                 ((index == emptyTile.index + 1) && (emptyTile.index % gridSize != 0))))
  614.             {
  615.                 // Fire off a click for that tile
  616.                 tileObj.click();
  617.                 if (!timerActive && !isGameOver())
  618.                 {
  619.                     doTimer('start');
  620.                 }
  621.                 
  622.                 if (shuffleEvent && !isGameOver())
  623.                 {
  624.                     shuffleHandler();
  625.                 }
  626.             }
  627.         }
  628.     }
  629.  
  630.     if ((index != emptyTile.index) && (Math.ceil(index / gridSize) == Math.ceil(emptyTile.index / gridSize)))
  631.     {
  632.         // Slide multiple tiles left
  633.         if (index > emptyTile.index)
  634.         {
  635.             for (count = emptyTile.index + 1; count <= index; count++)
  636.             {
  637.                 var left = emptyTile.runtimeStyle.posLeft + (tileSize+1);
  638.                 var top = emptyTile.runtimeStyle.posTop + 1;
  639.                 isValidChoice(left, top);
  640.             }
  641.         }
  642.         else
  643.         {
  644.             // Slide multiple tiles right
  645.             for (count = emptyTile.index - 1; count >= index; count--)
  646.             {
  647.                 var left = emptyTile.runtimeStyle.posLeft - (tileSize-1);
  648.                 var top = emptyTile.runtimeStyle.posTop + 1;
  649.                 isValidChoice(left, top);
  650.             }
  651.         }
  652.     }
  653.     else if ((index != emptyTile.index) && (index % gridSize == emptyTile.index % gridSize))
  654.     {
  655.         // Slide multiple tiles up
  656.         if (index > emptyTile.index)
  657.         {
  658.             for (count = emptyTile.index + gridSize; count <= index; count = count + gridSize)
  659.             {
  660.                 var left = emptyTile.runtimeStyle.posLeft + 1;
  661.                 var top = emptyTile.runtimeStyle.posTop + (tileSize+1);
  662.                 isValidChoice(left, top);
  663.             }
  664.         }
  665.         else
  666.         {
  667.             // Slide multiple tiles down
  668.             for (count = emptyTile.index - gridSize; count >= index; count = count - gridSize)
  669.             {
  670.                 var left = emptyTile.runtimeStyle.posLeft + 1;
  671.                 var top = emptyTile.runtimeStyle.posTop - (tileSize-1);
  672.                 isValidChoice(left, top);
  673.             }
  674.         }
  675.     }
  676. }
  677. ////////////////////////////////////////////////////////////////////////////////
  678. //
  679. // Swap Tiles
  680. //
  681. ////////////////////////////////////////////////////////////////////////////////
  682. function swapTile(tileObj)
  683. {
  684.     disableEvents();
  685.     var index = "";
  686.     var increment = 9;
  687.     var count = 0;
  688.     var startTop = tileObj.runtimeStyle.posTop;
  689.     var endTop = emptyTile.runtimeStyle.posTop;
  690.     var startLeft = tileObj.runtimeStyle.posLeft;
  691.     var endLeft = emptyTile.runtimeStyle.posLeft;
  692.     var endIndex = emptyTile.index;
  693.     
  694.     // Swap tile indices
  695.     tempIndex = tileObj.index;
  696.     tileObj.index = emptyTile.index;
  697.     emptyTile.index = tempIndex;
  698.     
  699.     // Swap runtimeStyle left position
  700.     tempLeft = tileObj.runtimeStyle.posLeft;
  701.     emptyTile.runtimeStyle.posLeft = tempLeft;
  702.     
  703.     // Swap runtimeStyle top position
  704.     tempTop = tileObj.runtimeStyle.posTop;
  705.     emptyTile.runtimeStyle.posTop = tempTop;
  706.     
  707.     emptyTile.runtimeStyle.zIndex = -1;
  708.     
  709.     // Slide tiles
  710.     setTimeout(tilePosition);
  711.     
  712.     function tilePosition()
  713.     {
  714.         if (count++ < increment)
  715.         {
  716.             tileObj.runtimeStyle.posTop = tileObj.runtimeStyle.posTop - ((startTop - endTop) / increment);
  717.             tileObj.runtimeStyle.posLeft = tileObj.runtimeStyle.posLeft - ((startLeft - endLeft) / increment);
  718.             return setTimeout(tilePosition, 10);
  719.         }
  720.         else
  721.         {
  722.             enableEvents();
  723.         }
  724.     }
  725.     
  726.     // Write tile/emptyTile data, erase old tile data
  727.     saveTile(tileObj.index, tileObj.originalPosition);
  728.     System.Gadget.Settings.write("savedTile" + emptyTile.index, 16);
  729.     
  730.     if (isGameOver())
  731.     {
  732.         doTimer('stop');
  733.         winner();
  734.     }
  735. }
  736. ////////////////////////////////////////////////////////////////////////////////
  737. //
  738. // Save Tile Data
  739. //
  740. ////////////////////////////////////////////////////////////////////////////////
  741. function saveTile(currentPos, originalPos)
  742. {
  743.     // Write tile/emptyTile data, erase old tile data
  744.     System.Gadget.Settings.write("savedTile" + currentPos, originalPos);
  745. }
  746. ////////////////////////////////////////////////////////////////////////////////
  747. //
  748. // Win Game
  749. //
  750. ////////////////////////////////////////////////////////////////////////////////
  751. function winner()
  752. {
  753.     if (!shuffleEvent)
  754.     {
  755.         shuffleHandler();
  756.     }
  757.     disableToolbar();
  758.     gamePictureDiv.filters(0).apply();
  759.     gamePictureDiv.style.display = "";
  760.     gamePictureDiv.filters(0).play();
  761.     setTimeout("winMessageDisplay(100)", 1000);
  762. }
  763. ////////////////////////////////////////////////////////////////////////////////
  764. //
  765. // Win Game
  766. //
  767. ////////////////////////////////////////////////////////////////////////////////
  768. function winMessageDisplay(val)
  769. {
  770.     winMessage.style.visibility = 'visible';
  771.     
  772.     if (val > 0)
  773.     {
  774.         val--;
  775.         winMessage.style.filter = "alpha(opacity=" + val + ")";
  776.         if (val == 35)
  777.         {
  778.             shuffle.disabled = '';
  779.         }
  780.         setTimeout("winMessageDisplay(" + val + ");", 60);
  781.     }
  782.     else
  783.     {
  784.         winMessage.style.visibility = 'hidden';
  785.     }
  786. }
  787. ////////////////////////////////////////////////////////////////////////////////
  788. //
  789. // Game Over
  790. //
  791. ////////////////////////////////////////////////////////////////////////////////
  792. function isGameOver()
  793. {
  794.     var returnVal = true;
  795.     
  796.     for (var i = 0; i < tile.length; i++)
  797.     {
  798.         if (tile[i].index != tile[i].originalPosition)
  799.         {
  800.             returnVal = false;
  801.             break;
  802.         }
  803.     }
  804.     
  805.     return returnVal;
  806. }
  807. ////////////////////////////////////////////////////////////////////////////////
  808. //
  809. // Toolbar
  810. //
  811. ////////////////////////////////////////////////////////////////////////////////
  812. function toolbar()
  813. {
  814.     var imgList = bar.all.tags("img");
  815.     var i = 0;
  816.     var img;
  817.     
  818.     doTimer();
  819.     
  820.     while (img = imgList[i++])
  821.     {
  822.         with (img)
  823.         {
  824.             src = "../images/"+id+"_up.png";
  825.             title = toolbarTextList[i-1];
  826.             tabIndex = i+1;
  827.             onmouseover = function(){this.over = true; swapImage(this)}
  828.             onmouseout = function(){this.over = false; swapImage(this)}
  829.             onmousedown = function(){this.down = true; swapImage(this); this.setCapture()}
  830.             onmouseup = function()
  831.             {
  832.                 this.down = false;
  833.                 this.releaseCapture();
  834.                 var button = document.elementFromPoint(event.clientX, event.clientY);
  835.                 if (button != this)
  836.                 {
  837.                     this.over = false;
  838.                     button.fireEvent("onmouseover");
  839.                 }
  840.                 swapImage(this);
  841.             }
  842.         
  843.             function swapImage(button){
  844.                 var state = "up";
  845.                 if (button.down && !button.disabled)
  846.                 {
  847.                     state = "down";
  848.                 }
  849.                 else if (button.over && !button.disabled)
  850.                 {
  851.                     state = "over";
  852.                 }
  853.                 button.src = "../images/"+button.id+"_"+state+".png";                
  854.             }
  855.         }
  856.     }
  857. }
  858. ////////////////////////////////////////////////////////////////////////////////
  859. //
  860. // Disable toolbar buttons
  861. //
  862. ////////////////////////////////////////////////////////////////////////////////
  863. function disableToolbar()
  864. {
  865.     timer.disabled = 'true';
  866.     hint.disabled = 'true';
  867.     shuffle.disabled = 'true';
  868. }
  869. ////////////////////////////////////////////////////////////////////////////////
  870. //
  871. // Show Hint image
  872. //
  873. ////////////////////////////////////////////////////////////////////////////////
  874. function hintShow()
  875. {
  876.     if (!hint.disabled && (event.button == 1 || event.keyCode == 13))
  877.     {
  878.         gamePictureDiv.style.display = "";
  879.     }
  880. }
  881. ////////////////////////////////////////////////////////////////////////////////
  882. //
  883. // Hide Hint image
  884. //
  885. ////////////////////////////////////////////////////////////////////////////////
  886. function hintHide()
  887. {
  888.     if (!hint.disabled && (event.button == 1 || event.keyCode == 27))
  889.     {
  890.         gamePictureDiv.style.display = "none";
  891.     }
  892. }
  893.