Scroll To Bottom Mystery Master Change Log Member



  1. Removed sitemap.php file. Affected index.php page.
  2. Removed donation.php file. Affected index.php, help/membership.php, hq/index.php, puzzles/index.php pages.


  1. Updated css/app.css: use hover instead for Link Grids, Big Grids in app.css
  2. Updated js/viewer/UIX: removed doLinkGridCell, doGridCell, gridCellStyles. gridHeadStyles
  3. Updated js/viewer/Former: removed mouse events to highlight cell in grids and link grids because of lag
  4. Rebuilt puzzle pieces for help/puzzle, help/solved
  5. Must specify absolute path for images (if given) because of og:image tag. Affects index files.
  6. Put images for index files in root image folder: help.gif, hq.gif
  7. Removed unused images from various img folders.
  8. Removed detective.gif from puzzles/img folder.


  1. Removed help/analysis/index.php
  2. Updated help/build-puzzle-parts.php
  3. Updated help/metawork.php
  4. Fixed js references in help/logic-puzzle-model-js.php, help/logic-puzzle-view-js.php
  5. Updated inc/head.php: Added "img/" to path where If not set $myImage = "img/$myName.gif"
  6. Updated inc/header.php: Removed "img/" from img tag.
  7. Updated index.php files: index.php, puzzles/index.php, help/index.php, hq/index.php
  8. Updated help/index.php, help/about.php, help/guide.php
  9. Updated help/analysis/inc/head.php
  10. Updated inc/head.php, inc/header.php, inc/footer.php
  11. Added to inc/head.php so UIX is global: window.UIX = UIX;


  1. Updated puzzles/inc/footer.php.
  2. Uploaded metawork/api folder to help/api folder.
  3. Removed file build-library-files.php
  4. Removed file upload-library-files.php
  5. Uploaded help/index.php and help/typescript.php
  6. Uploaded help metawork files: metawork.php, build-api-docs.php, build-js-files.php, build-php-files.php, build-puzzles-indexes.php, build-puzzle-parts.php
  7. Removed help/build-puzzle-modules.php
  8. Added PHP variable $myName to analysis files.


  1. Added typescript.php, metawork.php to the help folder.
  2. Added ts folder to the website.
  3. Added metawork folder to the website
  4. Added js folder to the website. This will replace the /puzzles/js folder.
  5. Updated index.php page.
  6. Updated inc/head.php file to load JavaScript modules from js folder. Changed $path to $pathname.
  7. Removed help/csharp folder.
  8. Removed puzzle-data folder from development.
  9. Removed metadata/changelog.txt from development.
  10. Removed metadata/changelog.php from development
  11. Updated app.css, default.css in the css folder.
  12. Updated puzzles/inc/head.php to load JavaScript modules from js folder.


  1. Converting JavaScript to TypeScript. TypeScript is more like a modern language, but still "transpiles" to JavaScript.
  2. Converting metawork done in JavaScript/PHP to TypeScript running under Node.js.
  3. New metawork files include: build-php-files.ts, build-puzzle-indexes.ts, build-puzzle-parts.ts

2020-11-09 Puzzles with New JavaScript Modules (in alphabetical order)

  1. "Collector's Corner"
  2. "Cranberry Scones"
  3. "Cuddle Toys"
  4. "Four Wishes"
  5. "Gathering Strays"
  6. "The Global Marketplace"
  7. "Lake Snowmore"
  8. "Lethal Women"
  9. "Partners In Grime"
  10. "Rural Delivery"
  11. "Saucer Shenanigans"
  12. "Tombstone Geography"
  13. "Yo-Yo Masters"


  1. Avoid global variables.
  2. Place "use strict;" immediately after jshint lines at top of JavaScript file.
  3. Do NOT include parenthesis for callback function in setTimeout. Example: setTimeout(viewer.doSolve, ms);
  4. Cannot convert get/set property functions to lambda expressions.
  5. Use let or const instead of var keyword.
  6. Use const to assign lambda function to variable.
  7. Declare all JavaScript variables instead of checking if they are undefined.


  1. Remove following Help files: create-android-app, dotnet, mystery-master-dot-code, visual-studio-solution.
  2. Change "affectionados" to "aficionados" for blurb of "Collector's Corner".
  3. Test long usernames to see how they display.
  4. Test user marks.
  5. Consider links where getVerb() returns Maybe. For puzzles with placers like "Is age1 less than age2?" See "Dandy Salespeople".
  6. Consider "Scroll Into View" as an option.
  7. Lawyer methods doFacts1, doFacts2, doFacts3, doFacts4 needs setTimeout for call to solver.


  1. Added Open Graph meta tags to puzzle pages. This allows Facebook to easily see the title, description, and image for the puzzle. Below are the tags for "A Day At The Zoo".
		<meta property="og:title" content="A Day At The Zoo" />
		<meta property="og:type"  content="article" />
		<meta property="og:url"   content="" />
		<meta property="og:image" content="" />
		<meta property="og:description" content="Child's play." />


  1. Added "puzzle parts" for new puzzles.


  1. After taking a year off to do other things, I am back!
  2. Currently adding JavaScript modules for puzzles without one.


  1. Updated logic-puzzle-model-js.php and upload-library-files.php in the help folder.
  2. Updated sitemap.php and changelog.php in the root folder.


  1. Global verbs IsNot, Is, Maybe are now "static" variables of the Verb class.
  2. Affected classes: UIX, Verb, SmartLink, SmartRule, Viewer, TabbyViewer, Puzzle, Solver, Finder, Lawyer.
  3. Global link With is now a "static" variable of the Link class.
  4. Affected classes: Link, Puzzle.
  5. Updated all puzzle modules.


  1. Uploaded website with latest version. This version does not have a Web Worker.
  2. All JavaScript files except Finder.js and Lawyer.js in /puzzles/js/inc folder.
  3. All JavaScript files (puzzle modules) in /puzzles/js folder.


  1. Removed JavaScript jot method.
  2. Removed addMessage method from Viewer and BoardViewer.


  1. Removed Web Worker thread. Now use UI thread with setTimeout and callbacks.
  2. Removed Worker.js file, and updated upload-library-files help file.
  3. Pass prodFlag to viewer.init method.
  4. Rebuilt JavaScript libraries.


  1. Removed setTimeout for functions in Solver.doResume.
  2. Removed setTimeout for addMark in Solver.addMarkByRule.
  3. Removed setTimeout for sayContradiction in Solver.addMark.
  4. Removed setTimeout for sayAddMark in Solver.addMark.
  5. Removed setTimeout for sayRemoveMark in Solver.removeMark.
  6. Removed parenthesis for callback function in Finder.doResume.
  7. Removed setTimeout for doQuit in Finder.doNextLevel.
  8. Removed setTimeout for doQuit in Finder.doAssumptions.


  1. Added default index.php file to puzzles/js and puzzles/js/inc folders.
  2. Added build-library-files.php file to help folder.
  3. Puzzle modules return Puzzle object instead of inheriting Puzzle class.
  4. Removed prototype chain for puzzle modules.
  5. Updated all puzzle modules (*.js files) with this change.
  6. Rebuilt JavaScript library files.
  7. Modified Big5GameRangers.css


  1. Modified inSession() method in session.php file.
  2. Modified puzzles\inc\footer.php file to look at $okPuzzle flag to load solver components. And do not load puzzle-data-form.php if $prodFlag is true
  3. Modified TabbyViewer.js to update nouns, verbs, and links when the tab is pressed.
  4. Added sitemap page to help logic puzzle developers.
  5. Added Develop Logic Puzzles page to help developers.
  6. Updated JavaScript library files.


  1. Recompiled and uploaded JavaScript libraries.


  1. Output mark's reason in TabbyViewer.updateMark() to input tag instead of table cell.


  1. Updated "Puzzle Parts" project to include session in its pages.


  1. Added session to almost every page.


  1. Encrypted password in MySQL. The password fields now have the blob type.


  1. Use regular expressions to validate various fields in the member page.


  1. Added include file "session.php" to track current member. The current member is displayed in include file "header.php".


  1. Added include file "Logjam.php" containing its class and code to log to a file.


  1. Added include file "Debe.php" (pronounced "Debbie"), a database wrapper class for MySQL.


  1. Renamed maxNouns to numNouns in Puzzle class.
  2. Removed following "max" variables from Puzzle class: maxNounTypes, maxLinks, maxFacts, maxRules.


  1. Incorporated Helper.getElapsedTimeAsString() method into Solver class.


  1. Added "Scroll To Bottom" button in header.php files for main page and puzzle pages.
  2. Added "Scroll To Top" button in footer.php files for main page and puzzle pages.
  3. Removed reference to gridVerb from TabbyViewer.js


  1. Converted var to const and let.
  2. Added PHP header <?php header("X-XSS-Protection: 0") ?> as the first line of savePuzzleParts.php


  1. Renamed global print(msg) method to jot(msg) for debugging.
  2. Moved Helper.getClueNumMsg to private method in Puzzle class.
  3. Renamed Helper.getMsgElapsedTime to Helper.getElapsedTimeAsString
  4. Inline Helper.getStartedMsg method at Solver.sayStarted.
  5. Inline Helper.getStoppedMsg method at Solver.sayStopped.
  6. Inline Helper.getSolutionMsg method at Solver.saySolution.


  1. All pages now load: Helper.js, Locker.js, UIX.js, Verb.js. Adding these files allow "puzzle part" documents to be clickable without raising errors (though the clicks may not invoke anything).
  2. Update all "puzzle parts" under the "puzzle" and "solved" folders in the help folder.


  1. Changed column header for marks from "Name" to "Reason".
  2. Update only mark in Marks form and Grids form instead of entire form. This renders form much faster.
  3. Added "Scroll Into View" for facts, rules, marks, but is too jarring for big grids.


  1. Set okPauseNext flag to false in Viewer.updateUI, Viewer.reset.
  2. Removed updateRule in Viewer.
  3. Set chkPauseSolution to true in SetupViewer.reset.


  1. Updated all puzzle part files under the help folder.
  2. Puzzle footer has links to the unfilled Grids form and the filled Marks form.


  1. Set checkmark for valid marks in the Marks form.
  2. Removed Filer.js and use PHP to save puzzle parts to appropriate files under the help folder.


  1. Changed field name from chkPausePlacers to chkPausePlacer.


  1. When User enables/disables fact/rule before there are marks, this overrides initEnabled flag for fact/rule.
  2. Passed toggleFact, toggleRule events from UI to WW as updateFact, updateRule.
  3. Removed Viewer variable from Worker.js file.


  1. Use Google's closure compiler to create solver-lib.js, viewer-lib.js, worker-lib.js


  1. Renamed WebWorker.js to Worker.js.


  1. Optimized "Hello Dolly!" puzzle module to solve without assumptions.


  1. Removed lonerNum from Mark class. lonerNum is now local to doAssumptions.
  2. Implement undo after solution is found for level 4 to see if there are additional solutions.


  1. Rule 3 in "Small Town Motels" is not be necessary since I implemented the link "twice the sequence number of".


  1. Updates placers in UI. See "Abbondanza!", "Astrophysics Conference", "Dandy Salespeople".
  2. In mark.addPlacer, don't add if already there or noun.noun is already that value.


  1. Changed pairs array to hold noun instead of mark. See Noun class and solver.addMark.


  1. Changed Solver.MaxLevels to Solver.MAX_LEVELS.
  2. Changed Solver.MaxLaws to Solver.MAX_LAWS.


  1. Added Object.seal() to new JavaScript objects in the Puzzle class.
  2. Removed "this" keyword with returning closures in most classes.
  3. Return closures have get/set functions for variables.
  4. Added optional getVerb parameter to puzzle.addLink method.


  1. Canceled Yahoo! Small Business for hosting the Mystery Master website.
  2. Changed the contact email address to my Hotmail account.


  1. Began transition of hosting the Mystery Master website from Yahoo! to GoDaddy.


  1. Set css display to none for the Solver component of the puzzle page.


  1. Moved css for each puzzle into its own file.
  2. Extracted HTML for each puzzle into its own file.


  1. Replaced "js" folder with js-puzzle and js-viewer folders.
  2. Removed The Builder Series on the Help page.
  3. Removed The Development Series on the Help page.
  4. Updated the About page
  5. Updated the CSS files.
  6. Updated the JavaScript files for the puzzles.
  7. Merged solver.php into footer.php.
  8. Update footer.php to show solver forms if the puzzle module exists.


  1. Performed "spring cleaning" on the website.
  2. Reorganized the Board control displayed on a logic puzzle page.


  1. Updated the number of logic puzzles to 120, though not all have a corresponding JavaScript file.


  1. Modified PHP code to display encoded HTML. Example:
    				$str = file_get_contents("../puzzles/inc/setup.php");
    				echo htmlspecialchars($str);
  2. Created PHP function showFileAsPre.


  1. Created the /blog folder.
  2. My first article "Model a Logic Puzzle in JavaScript" has been published by CodeProject.
  3. My second article "View a Logic Puzzle in JavaScript" has been submitted to CodeProject.


  1. Created tabby.php.
  2. In tabby.php, removed class="tabButton" from each button in divTabButtons.


  1. WebWorker returns "saySolverStatus" message to inform Viewer if Finder and Lawyer are loaded. This change impacts: Board, Solver, and Viewer.


  1. Moved core JavaScript files for puzzles from "/puzzles/js/inc" to "/js".


  1. Added button on home page to show/hide the "fun" images. These are the images that appear on the right-hand-side of pages, including the puzzle pages.
  2. Changed Locker class as static.


  1. Removed leading blank in "resetWork" when posting to worker in viewer.resetWork.


  1. Corrected problem with noun type in Verb.js


  1. Went live with my Indiegogo crowdfunding campaign.


  1. Fixed problem in Tabby.js assigning tabNum1 from locker.


  1. Enable facts previously disabled by a mark in puzzle.removeMark


  1. Disable fact in doLevel1a, doLevel1b


  1. Added JSDoc comments
  2. Moved call to solver.quitWork from finder.doAssumptions to solver.doWork


  1. Removed status field from Mark class
  2. Absorbed setGridMark3 into setGridMark2 in Puzzle class


  1. Removed okFacts option


  1. Fix pausing