summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPatrick Davison <snapwilliam@gmail.com>2012-07-31 22:34:08 -0700
committerPatrick Davison <snapwilliam@gmail.com>2012-07-31 22:34:08 -0700
commit2d290b23c402561ef30c1de665895c120dd79483 (patch)
tree8bde5ebd953f3dd375abe88e61e40571df313b1f
parent628c2e712e39fe85762583fd1ddc12609746fc58 (diff)
downloadpathery-2d290b23c402561ef30c1de665895c120dd79483.tar.xz
Everything related to the scoreboard.
New feedback page. Changed the speed of the pauses on checkpoints during a path animation. Changed how notifications are recieved.
-rw-r--r--css/stats.css44
-rw-r--r--do.php39
-rw-r--r--globe.php14
-rw-r--r--includes/datas.php136
-rw-r--r--includes/header.php9
-rw-r--r--index.php6
-rw-r--r--js/dateformat.js125
-rw-r--r--js/globe.js35
-rw-r--r--js/mapspecs.js76
-rw-r--r--js/scores.js221
-rw-r--r--pages/about.php3
-rw-r--r--pages/achievements.php6
-rw-r--r--pages/feedback.php71
-rw-r--r--pages/home.php43
14 files changed, 727 insertions, 101 deletions
diff --git a/css/stats.css b/css/stats.css
index 8774ea7..8211711 100644
--- a/css/stats.css
+++ b/css/stats.css
@@ -55,3 +55,47 @@ td, th {
-moz-transition:color 0s;
}
+.leftBtn {
+ left:0px;
+}
+.rightBtn {
+ right:0px;
+}
+.leftBtn, .rightBtn, rightBtn a {
+ text-align:center;
+ text-decoration: none;
+ position:absolute;
+ top:65px;
+ width:50px;
+ background-color: #262631;
+ font-size:200%;
+ height:290px;
+ line-height:270px;
+ border-radius: 5px;
+ border: 1px solid #333;
+}
+.scoreActive:hover {
+ background-color: #343c57;
+}
+.scoreDisabled {
+ background-color: #222223;
+}
+.scoreContainer2 {
+ width:390px;
+ height:500px;
+ margin-left:auto;
+ margin-right:auto;
+ position:relative;
+}
+.scoreMedal {
+ text-align:right;
+ vertical-align:bottom;
+ background-repeat:no-repeat;
+}
+.scoreGold {
+ background-image: url(../images/MedalGoldCAb.png);
+}
+.scoreSilver {
+ background-image: url(../images/MedalSilverCAb.png);
+}
+
diff --git a/do.php b/do.php
index 2bf6bb9..2a83751 100644
--- a/do.php
+++ b/do.php
@@ -5,6 +5,8 @@ include "includes/maps.php";
include "includes/db.inc.php";
include "includes/datas.php";
+$note = false;
+
//Auto login;
include_once("globe.php");
if (!isset($_SESSION['accepted']) || $_SESSION['accepted'] <> 1)
@@ -29,18 +31,39 @@ if (isset($_GET['act']) && $_GET['act'] == "getmap") {
}
}
+// !! Depreciate?
if (isset($_GET['checkachieve']) && $_GET['checkachieve'] == 'true' && $_SESSION['accepted'] == 1) {
$json['notification'] = true;
-
$userID = $_SESSION['userID'];
-
//Located in includes/datas.php
$note = getNotified($userID);
-
if ($note !== false)
$json['notificationtext'] = $note;
}
+if ($_GET['r'] == 'reqScorePage') {
+ $mapID = $_GET['mapid'] + 0;
+ $page = $_GET['reqPage'] + 0;
+ if (!is_int($mapID) OR !is_int($page))
+ return;
+
+ //Include the notification text
+ $json = getScores($mapID, $page, 3);
+ $json['mapid'] = $mapID;
+ $json['page'] = $page;
+
+ if ($_SESSION['accepted'] == 1) {
+ $userID = $_SESSION['userID'];
+ $note = getNotified($userID);
+ if ($note !== false)
+ $json['notificationtext'] = $note;
+ }
+
+ $encoded = json_encode($json);
+ die($encoded);
+}
+
+
if ($_GET['r'] == 'getscores') {
$mapID = $_GET['mapid'] + 0;
if (!is_int($mapID))
@@ -59,12 +82,18 @@ if ($_GET['r'] == 'getsol') {
$userID = $_SESSION['userID'];
- if ($_SESSION['accepted'] == 1)
+///// !! FIX FIX FIX FIX FIX FIX //////
+ if ($_SESSION['accepted'] == 1) {
$json = getSolution($userID, $mapID);
- if (isset($_SESSION[$mapID.'sol']) AND $mysolution == '') {
+ if ($tmp['moves'] > $_SESSION[$mapID.'sol']) {
+ $json = $tmp;
+ }
+ }
+ if (isset($_SESSION[$mapID.'sol'])) {
$json['solution'] = $_SESSION[$mapID.'sol'];
$json['moves'] = $_SESSION[$mapID.'moves'];
}
+
$json['mapid'] = $mapID;
$encoded = json_encode($json);
diff --git a/globe.php b/globe.php
index 3470e78..22e455f 100644
--- a/globe.php
+++ b/globe.php
@@ -1,5 +1,5 @@
<?PHP
-date_default_timezone_set('America/Los_Angeles');
+date_default_timezone_set('America/Los_Angeles');
if (!session_id())
session_start();
//session_regenerate_id();
@@ -36,6 +36,12 @@ function CookieLogin() {
return;
list($claimedid, $display, $isAdmin) = mysql_fetch_row($result);
+
+ //I last-see you now!
+ $sql = "UPDATE `users`
+ SET `dateLogin` = NOW()
+ WHERE `ID` = '$userID'";
+ mysql_query($sql);
$salt = "33qs5d4j6z98gt1a7n6b5d4x1c66f5nuh8a6d8g9j09aphgf56z5745";
$pepper = "Dear sir, have you ever heard of a wild goose chase?
@@ -146,7 +152,7 @@ Function DoRedirect($message = "Thanks", $to = "http://www.pathery.com/", $durat
";
}
-function EmailError($data) {
+function EmailError($data, $subject = "Pathery Error Report") {
$to = 'snapwilliam@gmail.com';
$mycompany = "Pathery";
@@ -157,8 +163,6 @@ function EmailError($data) {
$mime_boundary = "----$mycompany----".md5(time());
# -=-=-=- MAIL HEADERS
- $subject = "Pathery Error Report";
-
$headers = "From: $mycompany <$fromemail>\n";
$headers .= "Reply-To: $mycompany <$replyemail>\n";
$headers .= "MIME-Version: 1.0\n";
@@ -183,4 +187,4 @@ function EmailError($data) {
Return $mail_sent;
}
-?>
+?> \ No newline at end of file
diff --git a/includes/datas.php b/includes/datas.php
index c445ca1..8c0309c 100644
--- a/includes/datas.php
+++ b/includes/datas.php
@@ -49,7 +49,8 @@ function topScores($mapid, $top = 5, $bottom = 0) {
if ($wallEmblem == '')
$wallEmblem = 'blank.png';
- $cdate = date("g:i A (T)", strtotime($cdate));
+ //$cdate = date("g:i A (T)", strtotime($cdate));
+ $cdate = relativeTime(strtotime($cdate));
$background = '#262631';
if ($i % 2 == 1)
@@ -588,6 +589,139 @@ function trackMOTDstats($mapType) {
+//Select Stats/Scores.
+function getScores($mapid, $pageNumber = 1, $pageDivide = 10) {
+ $top = $pageNumber * $pageDivide;
+ $bottom = $top - $pageDivide;
+
+ $pageRequest = 'all';
+
+ if ($pageRequest == 'all') {
+ $pageReqStart = 1;
+ $pageReqEnd = 1000;
+ } elseif (is_int($pageRequest)) {
+ $pageReqStart = $pageRequest;
+ $pageReqEnd = $pageRequest;
+ } else {
+ $tmp = explode($pageRequest, "-");
+ $pageReqStart = $tmp[0];
+ $pageReqEnd = $tmp[1];
+ }
+
+ $sql = "
+ SELECT
+ timediff(solutions.dateModified, TIMESTAMP(CURDATE())) as diff,
+ users.displayName as display,
+ solutions.moves as moves,
+ users.ID as ID,
+ IfNull(userData.displayColor, '#cccccc') as displayColor,
+ IfNull(userData.wallColor, '#666666') as wallColor,
+ IfNull(userData.wallEmblem, 'blank.png') as wallEmblem,
+ solutions.dateModified as cdate
+ FROM
+ `users`
+ JOIN `solutions`
+ ON users.ID = solutions.userID
+ LEFT JOIN `userData`
+ ON users.ID = userData.userID
+ WHERE solutions.mapID = '$mapid'
+ ORDER BY solutions.moves DESC, solutions.dateModified ASC
+ ";
+ $result = mysql_query($sql);
+ //$utime = date("g:i A (T)");
+
+ $output['updateTime'] = date("g:i A (T)");
+
+ $i = 0;
+ $foundUser = false;
+ while ($row = mysql_fetch_assoc($result)) {
+ $i++;
+
+ $moves = $row['moves'];
+ $userID = $row['ID'];
+ if ($i == 1) {
+ $bestMoves = $moves;
+ $output['bestMoves'] = $bestMoves;
+ $output['bestBy'] = $row['display'];
+ }
+
+ if ($_SESSION['userID'] == $userID) {
+ $userPosition = $i;
+ } else {
+ if ($i > $top)
+ continue;
+ if ($i <= $bottom)
+ continue;
+ }
+
+ if ($wallEmblem == '')
+ $wallEmblem = 'blank.png';
+
+ $cdate = $row['cdate'];
+ $cdate = date("g:i A (T)", strtotime($cdate));
+
+ $scoredDate = strtotime($row['cdate']);
+ $secondsSinceScored = strtotime("now") - $scoredDate ;
+
+ //Alternate background colors
+ $background = '#262631';
+ if ($i % 2 == 1)
+ $background = '#20202a';
+
+ if ($userPosition == $i) {
+ $background = '#343c57';
+ $foundUser = true;
+ }
+
+ $medal = 'none';
+ if ($moves == $bestMoves)
+ $medal = 'silver';
+ if ($i == 1)
+ $medal = 'gold';
+
+ $output['users'][$i] = $row;
+ $output['users'][$i]['scoredDate'] = $cdate;
+ $output['users'][$i]['secondsSinceScored'] = $secondsSinceScored;
+ $output['users'][$i]['background'] = $background;
+ $output['users'][$i]['medal'] = $medal;
+ $output['users'][$i]['isUser'] = $userPosition == $i;
+ $output['users'][$i]['debug'] = "Bestmoves: $bestMoves moves: $moves";
+ } // END WHILE
+
+ if ($foundUser) {
+ $userPage = ceil(($userPosition / $pageDivide));
+ $output['userPage'] = $userPage;
+ $output['userPosition'] = $userPosition;
+ }
+
+ $output['pageCount'] = ceil(($i / $pageDivide));
+
+ if ($prevPage > 0) {
+ $navi .= " <a href='javascript:scoresShowPage($mapid, 1);'>&lt;&lt;</a> ";
+ $navi .= " <a href='javascript:scoresShowPage($mapid, $prevPage);'>&lt;</a> ";
+ } else {
+ $navi .= " &lt;&lt; ";
+ $navi .= " &lt;";
+ }
+ for ($x = 1; $x <= $pageCount; $x++) {
+ if ($x < $pageNumber - 3 OR $x > $pageNumber + 3)
+ continue;
+ if ($x == $pageNumber)
+ $navi .= "<strong> $x </strong>";
+ elseif ($userPage == $x)
+ $navi .= " <a href='javascript:scoresShowPage($mapid, $x)'><i>$x</i></a> ";
+ else
+ $navi .= " <a href='javascript:scoresShowPage($mapid, $x)'>$x</a> ";
+ }
+ if ($nextPage <= $pageCount) {
+ $navi .= " <a href='javascript:scoresShowPage($mapid, $nextPage);'>&gt;</a> ";
+ $navi .= " <a href='javascript:scoresShowPage($mapid, $pageCount);'>&gt;&gt;</a> ";
+ }
+
+ return $output;
+}
+
+
diff --git a/includes/header.php b/includes/header.php
index 887aa41..4e19fad 100644
--- a/includes/header.php
+++ b/includes/header.php
@@ -1,6 +1,6 @@
<?php
$accepted = isset($_SESSION['accepted']) && $_SESSION['accepted'] == 1;
-function htmlHeader($css = array(), $title = 'Pathery', $desc = '') {
+function htmlHeader($css = array(), $title = 'Pathery', $desc = '', $scripts = array()) {
global $accepted;
?>
<!DOCTYPE html>
@@ -17,9 +17,12 @@ function htmlHeader($css = array(), $title = 'Pathery', $desc = '') {
}
if ($desc !== '')
echo " <meta name='Description' content='$desc'>";
+
+ foreach ($scripts as $s)
+ echo "<script src='js/$s.js?v=1'></script>";
?>
- <script src="js/ajax.js" async="async"></script>
- <script src="js/mapspecs.js"></script>
+ <script src="js/ajax.js?v=1" async="async"></script>
+ <script src="js/mapspecs.js?v=1"></script>
<script>
(function(d,c){var a,b,g,e;a=d.createElement("script");a.type="text/javascript";a.async=!0;a.src=("https:"===d.location.protocol?"https:":"http:")+'//api.mixpanel.com/site_media/js/api/mixpanel.2.js';b=d.getElementsByTagName("script")[0];b.parentNode.insertBefore(a,b);c._i=[];c.init=function(a,d,f){var b=c;"undefined"!==typeof f?b=c[f]=[]:f="mixpanel";g="disable track track_pageview track_links track_forms register register_once unregister identify name_tag set_config".split(" ");
diff --git a/index.php b/index.php
index a3c6d1b..dc0fe81 100644
--- a/index.php
+++ b/index.php
@@ -56,7 +56,11 @@ switch ($request) {
case "embed":
require("pages/embed.php");
break;
-
+
+ case "feedback":
+ require("pages/feedback.php");
+ break;
+
case "about":
require("pages/about.php");
break;
diff --git a/js/dateformat.js b/js/dateformat.js
new file mode 100644
index 0000000..f8920d8
--- /dev/null
+++ b/js/dateformat.js
@@ -0,0 +1,125 @@
+/*
+ * Date Format 1.2.3
+ * (c) 2007-2009 Steven Levithan <stevenlevithan.com>
+ * MIT license
+ *
+ * Includes enhancements by Scott Trenda <scott.trenda.net>
+ * and Kris Kowal <cixar.com/~kris.kowal/>
+ *
+ * Accepts a date, a mask, or a date and a mask.
+ * Returns a formatted version of the given date.
+ * The date defaults to the current date/time.
+ * The mask defaults to dateFormat.masks.default.
+ */
+
+var dateFormat = function () {
+ var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,
+ timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
+ timezoneClip = /[^-+\dA-Z]/g,
+ pad = function (val, len) {
+ val = String(val);
+ len = len || 2;
+ while (val.length < len) val = "0" + val;
+ return val;
+ };
+
+ // Regexes and supporting functions are cached through closure
+ return function (date, mask, utc) {
+ var dF = dateFormat;
+
+ // You can't provide utc if you skip other args (use the "UTC:" mask prefix)
+ if (arguments.length == 1 && Object.prototype.toString.call(date) == "[object String]" && !/\d/.test(date)) {
+ mask = date;
+ date = undefined;
+ }
+
+ // Passing date through Date applies Date.parse, if necessary
+ date = date ? new Date(date) : new Date;
+ if (isNaN(date)) throw SyntaxError("invalid date");
+
+ mask = String(dF.masks[mask] || mask || dF.masks["default"]);
+
+ // Allow setting the utc argument via the mask
+ if (mask.slice(0, 4) == "UTC:") {
+ mask = mask.slice(4);
+ utc = true;
+ }
+
+ var _ = utc ? "getUTC" : "get",
+ d = date[_ + "Date"](),
+ D = date[_ + "Day"](),
+ m = date[_ + "Month"](),
+ y = date[_ + "FullYear"](),
+ H = date[_ + "Hours"](),
+ M = date[_ + "Minutes"](),
+ s = date[_ + "Seconds"](),
+ L = date[_ + "Milliseconds"](),
+ o = utc ? 0 : date.getTimezoneOffset(),
+ flags = {
+ d: d,
+ dd: pad(d),
+ ddd: dF.i18n.dayNames[D],
+ dddd: dF.i18n.dayNames[D + 7],
+ m: m + 1,
+ mm: pad(m + 1),
+ mmm: dF.i18n.monthNames[m],
+ mmmm: dF.i18n.monthNames[m + 12],
+ yy: String(y).slice(2),
+ yyyy: y,
+ h: H % 12 || 12,
+ hh: pad(H % 12 || 12),
+ H: H,
+ HH: pad(H),
+ M: M,
+ MM: pad(M),
+ s: s,
+ ss: pad(s),
+ l: pad(L, 3),
+ L: pad(L > 99 ? Math.round(L / 10) : L),
+ t: H < 12 ? "a" : "p",
+ tt: H < 12 ? "am" : "pm",
+ T: H < 12 ? "A" : "P",
+ TT: H < 12 ? "AM" : "PM",
+ Z: utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""),
+ o: (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),
+ S: ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10]
+ };
+
+ return mask.replace(token, function ($0) {
+ return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
+ });
+ };
+}();
+
+// Some common format strings
+dateFormat.masks = {
+ "default": "ddd mmm dd yyyy HH:MM:ss",
+ shortDate: "m/d/yy",
+ mediumDate: "mmm d, yyyy",
+ longDate: "mmmm d, yyyy",
+ fullDate: "dddd, mmmm d, yyyy",
+ shortTime: "h:MM TT",
+ mediumTime: "h:MM:ss TT",
+ longTime: "h:MM:ss TT Z",
+ isoDate: "yyyy-mm-dd",
+ isoTime: "HH:MM:ss",
+ isoDateTime: "yyyy-mm-dd'T'HH:MM:ss",
+ isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"
+};
+
+// Internationalization strings
+dateFormat.i18n = {
+ dayNames: [
+ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
+ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
+ ],
+ monthNames: [
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
+ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
+ ]
+};
+
+// For convenience...
+Date.prototype.format = function (mask, utc) {
+ return dateFormat(this, mask, utc);
+}; \ No newline at end of file
diff --git a/js/globe.js b/js/globe.js
new file mode 100644
index 0000000..7fcd6a7
--- /dev/null
+++ b/js/globe.js
@@ -0,0 +1,35 @@
+
+// !! Remember to preload images
+
+
+function showSignin() {
+ var div = document.createElement('div');
+ var pref = '<div class="notification" align="center">';
+ pref += '<div class="notification_close"><a href="javascript:" onclick="this.parentNode.parentNode.parentNode.removeChild(this.parentNode.parentNode);">[Close]</a> </div> ';
+ pref += '<div style="overflow:auto;height:295px;">';
+ var suff = '</div></div>';
+ //var suff = '<button onclick="">'
+ //suff += 'Close</button></div>';
+ div.innerHTML = pref+html+suff;
+ document.body.appendChild(div.firstChild);
+}
+
+
+var signinDiv = '<div class="wrapper" id="oid_wrapper" >
+<h2>Sign in</h2>
+ <div id="oid_box">
+ <h2 style="color:#333;">Do you have an account here?</h2>
+ <a href="#"><img id="oid_btn" src="images/btns/signin_Google.png" alt="Sign in with Google" /></a>
+ <a href="#"><img id="oid_btn" src="images/btns/signin_Yahoo.png" alt="Sign in with Yahoo" /></a>
+ <a href="http://openid.net/get-an-openid/what-is-openid/" style="position:absolute;color:#333;left:10px;bottom:10px;">Learn more about OpenID</a>
+ </div>
+</div>';
+
+
+
+
+
+
+
+
+
diff --git a/js/mapspecs.js b/js/mapspecs.js
index 6d3e4af..87bc173 100644
--- a/js/mapspecs.js
+++ b/js/mapspecs.js
@@ -27,7 +27,6 @@ var blocks = new Array();
var count = new Array();
var mapdata = new Array();
var mapjson = new Array();
-var htmlscores = '';
var htmlnotification = '';
var jsonmapdata = new Object;
//var jsonmapdata.solutions = new Array();
@@ -256,7 +255,8 @@ function resetwalls(mapid) {
function request_path_done() {
var JO = decryptJSON(ajax.response);
- mapjson[JO.mapid] = JO;
+ var mapid = JO.mapid;
+ mapjson[mapid] = JO;
var speedbox = document.getElementById(mapid+',speed'),
speed = speedbox.options[speedbox.selectedIndex].text,
@@ -273,9 +273,6 @@ function request_path_done() {
'response time': responseTime
});
- if (JO.scores)
- updateDsp(JO.mapid, 'dspScore', JO.scores);
-
for(var i in JO.error)
console.error('\n JO error ' + JO.error[i]);
@@ -288,34 +285,7 @@ function request_path_done() {
updateDsp(JO.mapid, 'dspID', disptext);
animatePath(JO.path, JO.mapid, JO.start);
-
- //Get score update.
- ajax.requestFile = "do.php?checkachieve=true&r=getscores&mapid="+JO.mapid; //prepare strdata
- ajax.onCompletion = request_scores_done; // Specify function to be executed on response.
- ajax.runAJAX();// Do it!
-}
-
-// Used at the start
-// Force score update.
-function updateScoresReq(mapid, type) {
- //Get score update.
- ajax.requestFile = "do.php?r=getscores&mapid="+mapid; //prepare strdata
- ajax.onCompletion = updateScoresGet; // Specify function to be executed on response.
- ajax.runAJAX();// Do it!
- mapType = type;
}
-function updateScoresGet() {
- var JO = decryptJSON(ajax.response);
- updateDsp(JO.mapid, 'dspScore', JO.scores);
-}
-
-function reqScoresDone() {
-
- var JO = decryptJSON(ajax.response);
- updateDsp(JO.mapid, 'dspScore', JO.scores);
-}
-//function addscorepage
-
function decryptJSON(text) {
if (typeof(JSON) == 'undefined') {
@@ -343,40 +313,14 @@ function animatePath(path, mapid, start) {
}
function animatePathDone(mapid) {
+ // console.log('Animate Path Done', mapid);
+ scoresRequestPage(mapid, currentPage[mapid]);
document.getElementById(mapid+',btn').disabled = false;
- if (htmlscores) {
- updateDsp(mapid, 'dspScore', htmlscores);
- htmlscores = '';
- }
- if (htmlnotification) {
- //setTimeout("showNotification('"+htmlnotification+"');", 300);
- showNotification(htmlnotification);
- if (checkSound(mapid)) {
- soundManager.setVolume('achieve', 50);
- setTimeout("soundManager.play('achieve');", 350);
- }
- htmlnotification = '';
- }
if (isChallenge == true) {
challengeGo(mapid);
}
}
-function request_scores_done() {
-
- //Get scores.
- if (typeof(JSON) == 'undefined') {
- text = ajax.response;
- var JO = !(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(text.replace(/"(\\.|[^"\\])*"/g, ''))) && eval('(' + text + ')');
- //mapdata[mapid] = eval(document.getElementById(mapid+',mapdata').innerHTML);
- } else {
- var JO = JSON.parse(ajax.response);
- }
- htmlscores = JO.scores;
- htmlnotification = JO.notificationtext;
-}
-
-
function checkSound(mapid) {
if (document.getElementById(mapid+',mute').checked) {
return false;
@@ -632,25 +576,25 @@ function doanimate(x, y, p, c, mapid) {
snake[mapid]['color'] = '#F777FF';
break;
case 'b':
- rs = rs + 500;
+ rs = rs + 410;
snake[mapid]['color'] = '#FFFF11';
//handle.style.backgroundColor = "#000000";
break;
case 'c':
- rs = rs + 500;
+ rs = rs + 410;
snake[mapid]['color'] = '#FF4466';
break;
case 'd':
- rs = rs + 500;
+ rs = rs + 410;
snake[mapid]['color'] = '#ff9911';
break;
case 'e':
- rs = rs + 500;
+ rs = rs + 410;
snake[mapid]['color'] = '#00FFFF';
break;
//Finish target
case 'f':
- rs = rs + 500;
+ rs = rs + 410;
snake[mapid]['color'] = '#ccc';
break;
@@ -681,7 +625,7 @@ function doanimate(x, y, p, c, mapid) {
//The path once teleported - and an r to indicate to gray the teleport-out too.
p = 'q'+tmp[2];
//Slow down
- rs = rs + 1500;
+ rs = rs + 1200;
setTimeout("doanimate("+x+","+y+",'"+p+"','"+t+"',"+mapid+")",rs);
return;
break;
diff --git a/js/scores.js b/js/scores.js
new file mode 100644
index 0000000..9985da1
--- /dev/null
+++ b/js/scores.js
@@ -0,0 +1,221 @@
+var scorePages = new Object;
+var currentPage = new Object;
+
+function scoresRequestPage(mapid, page) {
+ // console.log('scoresRequestPage', mapid, page);
+ if (typeof(ajax) != 'object') {
+ setTimeout(function() {scoresRequestPage(mapid, page)},200);
+ return false;
+ }
+ // Ask again if it's busy.
+ switch (ajax.xmlhttp.readyState) {
+ case 4:
+ case 0:
+ break;
+ default:
+ setTimeout(function() {scoresRequestPage(mapid, page)},300);
+ return false;
+ }
+
+ //console.log("Requesting Page", mapid, page, ajax.inUse);
+
+ // == Additionally, check for achievements.
+ ajax.requestFile = "do.php?checkachieve=true&r=reqScorePage&mapid="+mapid+"&reqPage="+page;
+ ajax.onCompletion = scoresRequestPageDone; // Specify function to be executed on response.
+ //ajax.onLoading = '';
+ //ajax.onLoaded = '';
+ //ajax.onFail = '';
+ ajax.runAJAX();// Do it!
+ return true;
+}
+function scoresRequestLoading() {
+ //Signify that it's working in some manner?
+ //console.log("I'm loading teh page...");
+}
+function scoresRequestPageDone() {
+ //console.log("Request Page Done", ajax.response);
+ var JO = decryptJSON(ajax.response);
+ if (JO == undefined)
+ return;
+ scoresUpdatePage(JO.mapid, JO.page, scoresFormatPage(JO));
+ if (JO.notificationtext != undefined) {
+ showNotification(JO.notificationtext);
+ if (checkSound(JO.mapid)) {
+ soundManager.setVolume('achieve', 50);
+ setTimeout("soundManager.play('achieve');", 350);
+ }
+ }
+}
+function scoresUpdatePage(mapid, page, html) {
+ // console.log("Updating Page", mapid, page);
+ scoresPreparePage(mapid, page);
+ scorePages[mapid][page].html = html;
+ //if (scorePages[mapid][page] == currentPage[mapid]) {
+ if (page == currentPage[mapid]) {
+ scoresShowPage(mapid, page);
+ }
+}
+function scoresShowMyPage(mapid) {
+ //Future use
+}
+
+function scoresShowPage(mapid, page) {
+ mapid = mapid - 0;
+ page = page - 0;
+ // console.log('scoresShowPage', mapid, page);
+ if (scoresPreparePage(mapid, page) == false) {
+ currentPage[mapid] = page;
+ // currentPage[mapid] = scorePages[mapid][page];
+ //Signify some sort of loadingness?
+ //Request Page
+ scoresRequestPage(mapid, page);
+ }
+
+ if (typeof(scorePages[mapid][page].html) === 'undefined') {
+ scoresRequestPage(mapid, page);
+ currentPage[mapid] = page;
+ return;
+ }
+ // console.log('scorpages', scorePages[mapid][page].html);
+ updateDsp(mapid, 'dspScore', scorePages[mapid][page].html);
+ //Also; update the page
+ // console.log('here', scorePages[mapid][page], currentPage[mapid], scorePages[mapid][page] != currentPage[mapid]);
+
+ if (page != currentPage[mapid]) {
+ scoresRequestPage(mapid, page);
+ }
+ currentPage[mapid] = page;
+ //currentPage[mapid] = scorePages[mapid][page];
+}
+
+function scoresPreparePage (mapid, page) {
+ if (typeof(scorePages[mapid]) != 'object') {
+ scorePages[mapid] = new Object;
+ scorePages[mapid][page] = new Object;
+ return false;
+ }
+ if (typeof(scorePages[mapid][page]) != 'object') {
+ scorePages[mapid][page] = new Object;
+ return false;
+ }
+ return true;
+}
+function scoresFormatPage(JO) {
+ // console.log("Formating page");
+
+ var p = "<table class='score'>";
+ if (JO.pageCount > 1) {
+ var navi = scoresFormatPageNavi(JO);
+ p = p+"<tr><td colspan='3' style='text-align:center;'>"+navi+"</td></tr>";
+ }
+ p = p+"<tr title='Updated "+JO.updateTime+"'>";
+ p = p+"<th>Rank</th>";
+ p = p+"<th style='width:125px; overflow:hidden; text-align:left; padding-left:42px;'>Name</th>";
+ p = p+"<th>Moves</th>";
+ p = p+"</tr>";
+
+ var showedLastUser = true;
+ var x = 0;
+
+ var previousI = 0;
+
+ for (var i in JO.users) {
+ var u = JO.users[i];
+ var scoredLocalTime = new Date();
+ scoredLocalTime.setTime(scoredLocalTime.getTime() - u.secondsSinceScored * 1000);
+
+ var styleClass = '';
+
+ if (previousI != i + 1)
+ if (previousI < i - 1 && previousI != 0)
+ styleClass = 'border-top: 6px solid #777799;';
+
+ p = p+ "<tr style='"+styleClass+" background-color: "+u.background+"; color:"+u.displayColor+";' title='Scored "+scoredLocalTime.format("h:MM:ss TT")+"'>";
+ p = p+ "<td style='text-align:right;'>";
+
+ // !! Don't forget to make sure these images are cached;
+ if (u.medal == 'gold') {
+ p = p+ "<img src='../images/MedalGoldCAR.png' style='width:32px;height:32px;vertical-align:middle'>";
+ } else if (u.medal == 'silver') {
+ p = p+ "<img src='../images/MedalSilverCAR.png' style='width:32px;height:32px;vertical-align:middle'>";
+ }
+ //p = p+ "<img src='../images/MedalGoldCAb.png' style='width:30px;height:30px;vertical-align:middle'>";
+
+ p = p+ i+ "</td>";
+ p = p+ "<td style='vertical-align: middle;'>";
+ p = p+ " <div class='grid_td' style='float:left; width:35px; height:35px; background:"+u.wallColor+" url(images/marks/"+u.wallEmblem+");'>";
+ p = p+ " <div style='background-color:transparent;' class='grid_td_inner grid_td_rocks'>";
+ p = p+ " </div>";
+ p = p+ " </div>";
+ p = p+ "";
+ p = p+ "<span style='float:left; padding: 5px 0px 3px 3px; width:120px; overflow:hidden; text-overflow: ellipsis; '><a href='achievements?id="+u.ID+"' style='color:"+u.displayColor+"'>"+u.display+"</a></span>";
+ p = p+ "</td>";
+
+ //Medals commented out 'till able to use them in a more friendly way.
+ // !! Don't forget to make sure these images are cached;
+ // if (u.medal == 'gold') {
+ // p = p+ "<td class='scoreMedal scoreGold'>"+u.moves+"</td>";
+ // } else if (u.medal == 'silver') {
+ // p = p+ "<td class='scoreMedal scoreSilver'>"+u.moves+"</td>";
+ // } else {
+ // p = p+ "<td class='scoreMedal'>"+u.moves+"</td>";
+ // }
+ p = p+ "<td style='text-align:right;'>"+u.moves+"</td>";
+ p = p+ "</tr>";
+
+ previousI = i;
+ }
+
+ //p = p+"<tr><th colspan='3' style='text-align:center;'>"+navi+"</th></tr>";
+ p = p+"</table>";
+
+ var nextPage = JO.page - 0 + 1;
+ var prevPage = JO.page - 1;
+
+ if (JO.pageCount > 1) {
+ if (JO.page < JO.pageCount) {
+ p = p+"<a href='javascript:scoresShowPage("+JO.mapid+", "+nextPage+")' class='rightBtn scoreActive'>&gt;</a>";
+ } else
+ p = "<div class='rightBtn scoreDisabled'>&gt;</div>"+p;
+ if (JO.page > 1) {
+ p = "<a href='javascript:scoresShowPage("+JO.mapid+", "+prevPage+")' class='leftBtn scoreActive'>&lt;</a>"+p;
+ } else
+ p = "<div class='leftBtn scoreDisabled'>&lt;</div>"+p;
+ }
+ p = "<div class='scoreContainer1'>"+p+"</div>";
+
+ //console.log(p);
+ //console.log('jo page', JO.page);
+ //console.log('jo pagecount', JO.pageCount);
+ //javascript:scoresShowPage($mapid, $x)
+ //p = JO.navi+p;
+ return p;
+}
+function scoresFormatPageNavi(JO) {
+ var r = '';
+ var showedPrevPage = true;
+ for (var i = 1; i <= JO.pageCount; i++) {
+ if (
+ (JO.page > i - 3 && JO.page < i + 3)
+ || (i == 1)
+ || (i == JO.pageCount)
+ || (i == JO.userPage)
+ ) {
+
+ if (!showedPrevPage)
+ r = r + ' ... ';
+ if (JO.page == i) {
+ r = r + " <b style='color:#aaaabb; font-size:150%;'>" + i + "</b>";
+ } else if (i == JO.userPage) {
+ r = r + " <a href='javascript:scoresShowPage("+JO.mapid+", "+i+")' style='color:#99cc99;' title='You are on this page'><i>" + i + '</i></a>';
+ } else {
+ r = r + " <a href='javascript:scoresShowPage("+JO.mapid+", "+i+")'>" + i + '</a>';
+ }
+ showedPrevPage = true;
+ } else {
+ showedPrevPage = false;
+ }
+ }
+
+ return r;
+} \ No newline at end of file
diff --git a/pages/about.php b/pages/about.php
index b45883a..77d7712 100644
--- a/pages/about.php
+++ b/pages/about.php
@@ -10,6 +10,9 @@ topbar($Links);
?>
<div class="wrapper">
+ <h2>About Pathery</h2>
+ Send us feedback using the <a href='feedback'>Feedback Page</a>
+ <br /><br />
Email us: <a href='mailto:snap@pathery.com'>snap@pathery.com</a>
<br /><br />Follow us on twitter:
<a href="https://twitter.com/Pathery" class="twitter-follow-button" data-show-count="false">Follow @Pathery</a>
diff --git a/pages/achievements.php b/pages/achievements.php
index 4b508eb..76d993d 100644
--- a/pages/achievements.php
+++ b/pages/achievements.php
@@ -343,7 +343,7 @@ $UTotalSolutions = number_format($UTotalSolutions);
$uStats[1] = $UTotalMoves;
$uStats[2] = $UTotalSolutions;
-echo "<div class='wrapper' style='width:600px;'>";
+echo "<div class='wrapper' style='padding-left:30px; width:800px;'>";
if ($viewer)
echo "<center><h3>Viewing</h3></center>";
echo "
@@ -480,8 +480,8 @@ foreach($achievements as $aType => $a) {
$aTypeNames[1] = "Path Career Level $aLevel!";
$aTypeNames[2] = "Mazes Career Level $aLevel!";
- $aTypeNames[3] = "Maze Mastery Level $aLevel!";
- $aTypeNames[4] = "Champion Level $aLevel!";
+ $aTypeNames[3] = "<img src='../images/MedalSilverCAR.png' style='width:36px;height:36px;vertical-align:middle'>Maze Mastery Level $aLevel!";
+ $aTypeNames[4] = "<img src='../images/MedalGoldCAR.png' style='width:36px;height:36px;vertical-align:middle'>Champion Level $aLevel!";
$aTypeNames[32] = 'Tutorial Complete!';
$aTypeCurrency[1] = "total moves mazed";
diff --git a/pages/feedback.php b/pages/feedback.php
new file mode 100644
index 0000000..dfe022f
--- /dev/null
+++ b/pages/feedback.php
@@ -0,0 +1,71 @@
+<?php
+
+if (isset($_POST['regarding'])) {
+ $data = $_POST;
+ $data['session'] = print_r($_SESSION, true);
+ EmailError($data, "Pathery Feedback");
+ DoRedirect("Thank you for your feedback! <br />
+ I'm Reading this right now.<br />
+ Well, obviously I'm not reading it right NOW.<br />
+ I guess what I meant to say is that I'll be reading it soon.<br />
+ Wow this redirect is taking a while.. Sorry<br />
+ Are you still here?<br />
+ Something must be wrong, you should really have been redirected by now", $mydomain, 8);
+ exit;
+}
+
+htmlHeader(array(), 'Feedback & Contact', 'Send feedback or contact us.');
+?>
+
+<body>
+<?php
+topbar($Links);
+
+if (!$accepted) {
+ echo "
+ <div class='wrapper'>
+ Sorry, you must be logged in to use this.
+ <br />Please email us instead @ snap@pathery.com
+ </div>";
+ exit;
+}
+
+
+?>
+
+
+<div class="wrapper">
+<h2>Contact us</h2>
+<h3>Send us a line!</h3>
+
+<p>Thanks so much for taking the time to say hello!
+
+</p>
+
+<form action="feedback" method="post" name="feedback">
+
+<select id='Regarding' name='regarding'>
+ <option value='Feedback' selected='selected'>General Feedback</option>
+ <option value='Bug'>Bug report</option>
+ <option value='Suggestion'>Suggestion</option>
+ <option value='Hi'>Just saying Hi</option>
+ <option value='Other'>Other</option>
+</select>
+<br /><br />
+
+Title: <input type="text" size="25" maxlength="60" value="" name="title" class="forminput" /><br />
+
+<textarea name='body' rows="10" cols="30"></textarea><br />
+
+<input type="checkbox" name="emailback" value="yes" /> Please email me back
+<br /><br />
+<input type="submit" value="Submit" />
+
+</form>
+
+</div>
+
+
+<?php
+htmlFooter();
+?> \ No newline at end of file
diff --git a/pages/home.php b/pages/home.php
index b1335a4..c2a8e8a 100644
--- a/pages/home.php
+++ b/pages/home.php
@@ -1,5 +1,10 @@
<?php
-htmlHeader(array('stats'), 'Pathery', 'Compete to create the longest maze possible. 4 New maps every day at 9 PM Pacific');
+ob_start("ob_gzhandler");
+htmlHeader(
+ array('stats'), 'Pathery',
+ 'Compete to create the longest maze possible. 4 New maps every day at 9 PM Pacific',
+ array('scores', 'dateformat')
+);
include_once ('./includes/maps.php');
include_once ('./includes/mapoftheday.php');
@@ -100,6 +105,11 @@ topbar($Links);
<div class="wrapper">
+<center>Site update complete!
+<br />If you find any problems/bugs please report them using our <a href='feedback'>Feedback Page</a>
+<br />Thank you!!
+<br /><br />
+</center>
<?
if ($accepted) {
@@ -156,8 +166,14 @@ function displayMaze($motd, $mapType) {
$width = $map[0][0];
//data for the topscores
- $topscores = topScores($motd['id'], 30);
- $topscorediv = "<div id='$mapID,dspScore'>\n$topscores\n</div>";
+ //$topscores = topScores($motd['id'], 30);
+ //$topscorediv = "<div id='$mapID,dspScore'>\n$topscores\n</div>";
+
+ $topscorediv = "
+<div class='scoreContainer2' style='position:relative;' id='$mapID,dspScore'>
+</div>
+<script>scoresShowPage($mapID, 1);</script>
+ ";
$mysolution = '';
$mymoves = '';
@@ -174,16 +190,7 @@ function displayMaze($motd, $mapType) {
$r = "<div id=\"yms-$mapType\" class='hidden-maps'>";
$r .= " <div class='wrapper'>";
-
- // if ($width <= 16) {
- // $r .= ' <div class="col1">';
- // $r .= $topscorediv;
- // $r .= ' </div>';
-
- // $r .= ' <div class="col2">';
- // $r .= "<a href='javascript:requestSol(\"$mapID\");'>Load your best solution</a><br />";
- // $r .= DisplayMap($map, $mapID);
- // $r .= ' </div>';
+
$r .= " <div style='text-align: center;'>";
$r .= " <div style='display:inline-block;margin: 0 auto;text-align: left;'>";
$r .= " <a href='javascript:requestSol(\"$mapID\");'><strong>Load your best solution</strong></a><br />";
@@ -210,7 +217,7 @@ function displayMaze($motd, $mapType) {
$timerem = strtotime("tomorrow") - strtotime("now");
?>
- <div style='text-align: center; margin-top: 5px;'>
+ <div style='text-align: center; margin-top: 5px; position:fixed; bottom:20px; left:20px;'>
New maps in: <span id="countdown">00:00:00</span>
</div>
<script type="text/javascript">
@@ -238,7 +245,10 @@ $timerem = strtotime("tomorrow") - strtotime("now");
timerem = timerem%60;
var seconds = addZero(timerem);
- var stamp = hours + ":" + minutes + ":" + seconds;
+ var stamp = hours + ":" + minutes;
+ if (hours < 1 && minutes < 5)
+ stamp = stamp + ":" + seconds
+
document.getElementById("countdown").innerHTML = stamp;
if (totalSeconds <= 1 && userConfirm == true) {
userConfirm = confirm("It's Tomorrow Today! Go to new maps?")
@@ -291,13 +301,12 @@ function showStats(type) {
jmid[4] = '$jmid[4]';
";
?>
- updateScoresReq(jmid[type], type);
+ scoresRequestPage(jmid[type], currentPage[jmid[type]]);
}
showStats(1);
</script>
<script src="sounds/script/soundmanager.js"></script>
<script type="text/javascript">soundManagerInit();</script>
-
<?PHP echo $noteScript; ?>
<?php