summaryrefslogtreecommitdiff
path: root/static
diff options
context:
space:
mode:
Diffstat (limited to 'static')
-rw-r--r--static/css/admin.css23
-rwxr-xr-xstatic/css/dump.css17
-rwxr-xr-xstatic/css/header.css339
-rw-r--r--static/img/colorshift.gifbin0 -> 15191 bytes
-rw-r--r--static/img/hourglass.pngbin0 -> 306 bytes
-rw-r--r--static/img/thumbs/favidear.gifbin0 -> 84 bytes
-rw-r--r--static/img/thumbs/grheart.gifbin0 -> 64 bytes
-rw-r--r--static/img/thumbs/grhearthover.gifbin0 -> 67 bytes
-rw-r--r--static/img/thumbs/stripes.gifbin0 -> 602 bytes
-rw-r--r--static/js/admin.js17
-rw-r--r--static/js/invalid_domains.js2
-rw-r--r--static/js/pichat.js24
-rw-r--r--static/tests/avatars.html40
-rw-r--r--static/tests/avatars/20100311/1268317730569-dumpfm-unicorngirl-unicornpink.gifbin0 -> 1037 bytes
-rw-r--r--static/tests/avatars/20100311/1268317730569-dumpfm-unicorngirl-unicornpink.thumb.gifbin0 -> 1057 bytes
-rw-r--r--static/tests/avatars/20100311/1268331012620-dumpfm-AndersStuka-supermensa.pngbin0 -> 279469 bytes
-rw-r--r--static/tests/avatars/20100311/1268331012620-dumpfm-AndersStuka-supermensa.thumb.pngbin0 -> 5106 bytes
-rw-r--r--static/tests/avatars/20100311/1268353224487-dumpfm-mu0p-mu0p.gifbin0 -> 5188 bytes
-rw-r--r--static/tests/avatars/20100311/1268353224487-dumpfm-mu0p-mu0p.thumb.gifbin0 -> 865 bytes
-rw-r--r--static/tests/avatars/20100311/1268356801824-dumpfm-sam-pent11satanshimmel.gifbin0 -> 5927 bytes
-rw-r--r--static/tests/avatars/20100311/1268356801824-dumpfm-sam-pent11satanshimmel.thumb.gifbin0 -> 3557 bytes
-rw-r--r--static/tests/avatars/20100311/1268360109151-dumpfm-zoeee-Photo-316.jpgbin0 -> 68581 bytes
-rw-r--r--static/tests/avatars/20100311/1268360109151-dumpfm-zoeee-Photo-316.thumb.jpgbin0 -> 681 bytes
-rw-r--r--static/tests/avatars/20100311/index.html49
-rw-r--r--static/tests/avatars/20100317/1268824131789-dumpfm-nigga-babyjump.gifbin0 -> 662066 bytes
-rw-r--r--static/tests/avatars/20100317/1268824131789-dumpfm-nigga-babyjump.thumb.gifbin0 -> 21369 bytes
-rw-r--r--static/tests/avatars/20100317/1268843598216-dumpfm-tmkunt-girl.gifbin0 -> 3195 bytes
-rw-r--r--static/tests/avatars/20100317/1268843598216-dumpfm-tmkunt-girl.thumb.gifbin0 -> 1828 bytes
-rw-r--r--static/tests/avatars/20100317/1268843634561-dumpfm-tmkunt-tevye.jpgbin0 -> 25796 bytes
-rw-r--r--static/tests/avatars/20100317/1268843634561-dumpfm-tmkunt-tevye.thumb.jpgbin0 -> 17808 bytes
-rw-r--r--static/tests/avatars/20100317/1268844983487-dumpfm-foot-final.gifbin0 -> 33538 bytes
-rw-r--r--static/tests/avatars/20100317/1268844983487-dumpfm-foot-final.thumb.gifbin0 -> 6475 bytes
-rw-r--r--static/tests/avatars/20100317/1268845052790-dumpfm-foot-beads_placed_in_bone.gifbin0 -> 729279 bytes
-rw-r--r--static/tests/avatars/20100317/1268845052790-dumpfm-foot-beads_placed_in_bone.thumb.gifbin0 -> 55343 bytes
-rw-r--r--static/tests/avatars/20100317/1268854482173-dumpfm-loghorn-Picture-27.pngbin0 -> 60870 bytes
-rw-r--r--static/tests/avatars/20100317/1268854482173-dumpfm-loghorn-Picture-27.thumb.pngbin0 -> 5897 bytes
-rw-r--r--static/tests/avatars/20100317/1268860204161-dumpfm-ghoulalt-allentown2009-11.jpgbin0 -> 210178 bytes
-rw-r--r--static/tests/avatars/20100317/1268860204161-dumpfm-ghoulalt-allentown2009-11.thumb.jpgbin0 -> 683 bytes
-rw-r--r--static/tests/avatars/20100317/1268873465668-dumpfm-grusandcrux-kissdubgiffblanc63ok1.gifbin0 -> 606161 bytes
-rw-r--r--static/tests/avatars/20100317/1268873465668-dumpfm-grusandcrux-kissdubgiffblanc63ok1.thumb.gifbin0 -> 11727 bytes
-rw-r--r--static/tests/avatars/20100317/1268875089450-dumpfm-mistaxiii-b2.gifbin0 -> 173588 bytes
-rw-r--r--static/tests/avatars/20100317/1268875089450-dumpfm-mistaxiii-b2.thumb.gifbin0 -> 12174 bytes
-rw-r--r--static/tests/avatars/20100317/1268875138982-dumpfm-hankpeters-53-icon.pngbin0 -> 168173 bytes
-rw-r--r--static/tests/avatars/20100317/1268875138982-dumpfm-hankpeters-53-icon.thumb.pngbin0 -> 6289 bytes
-rw-r--r--static/tests/avatars/20100317/1268875479356-dumpfm-cassandreamy-japansmiley.JPGbin0 -> 4718 bytes
-rw-r--r--static/tests/avatars/20100317/1268875479356-dumpfm-cassandreamy-japansmiley.thumb.JPGbin0 -> 842 bytes
-rw-r--r--static/tests/avatars/20100317/1268875995007-dumpfm-SrProlapse-keatonlolsmall.pngbin0 -> 18980 bytes
-rw-r--r--static/tests/avatars/20100317/1268875995007-dumpfm-SrProlapse-keatonlolsmall.thumb.pngbin0 -> 2225 bytes
-rw-r--r--static/tests/avatars/20100317/1268877139344-dumpfm-coeur-GoatBoy.jpgbin0 -> 40496 bytes
-rw-r--r--static/tests/avatars/20100317/1268877139344-dumpfm-coeur-GoatBoy.thumb.jpgbin0 -> 782 bytes
-rw-r--r--static/tests/avatars/20100317/1268877902821-dumpfm-3noneTwo-100ico.pngbin0 -> 20870 bytes
-rw-r--r--static/tests/avatars/20100317/1268877902821-dumpfm-3noneTwo-100ico.thumb.pngbin0 -> 1916 bytes
-rw-r--r--static/tests/avatars/20100317/1268878362813-dumpfm-okeeblow-3-smith.gifbin0 -> 484 bytes
-rw-r--r--static/tests/avatars/20100317/1268878362813-dumpfm-okeeblow-3-smith.thumb.gifbin0 -> 551 bytes
-rw-r--r--static/tests/avatars/20100317/1268879836325-dumpfm-bendover-clifford-1.pngbin0 -> 58365 bytes
-rw-r--r--static/tests/avatars/20100317/1268879836325-dumpfm-bendover-clifford-1.thumb.pngbin0 -> 1783 bytes
-rw-r--r--static/tests/avatars/20100317/1268879862249-dumpfm-justytamp-JUSTY-TAMP.pngbin0 -> 74170 bytes
-rw-r--r--static/tests/avatars/20100317/1268879862249-dumpfm-justytamp-JUSTY-TAMP.thumb.pngbin0 -> 1900 bytes
-rw-r--r--static/tests/avatars/20100317/1268881084236-dumpfm-mistaxiii-moooovies.gifbin0 -> 552509 bytes
-rw-r--r--static/tests/avatars/20100317/1268881084236-dumpfm-mistaxiii-moooovies.thumb.gifbin0 -> 32847 bytes
-rw-r--r--static/tests/avatars/20100317/1268881491088-dumpfm-abraham-stuntmaster_box_side_pic.jpgbin0 -> 124232 bytes
-rw-r--r--static/tests/avatars/20100317/1268881491088-dumpfm-abraham-stuntmaster_box_side_pic.thumb.jpgbin0 -> 6905 bytes
-rw-r--r--static/tests/avatars/20100317/12688py862249-dumpfm-justytamp-JUSTY-TAMP.thumb.pngbin0 -> 1900 bytes
-rw-r--r--static/tests/avatars/20100317/index.html114
-rw-r--r--static/tests/avatars/bg.gifbin0 -> 106 bytes
-rw-r--r--static/tests/avatars2.html39
-rw-r--r--static/tests/avatars3.html40
-rw-r--r--static/tests/canvas1/index.html24
-rw-r--r--static/tests/canvas1/jsplatformer5_files/AnimatedGameObject.js80
-rw-r--r--static/tests/canvas1/jsplatformer5_files/ApplicationManager.js42
-rw-r--r--static/tests/canvas1/jsplatformer5_files/GameObject.js46
-rw-r--r--static/tests/canvas1/jsplatformer5_files/GameObjectManager.js125
-rw-r--r--static/tests/canvas1/jsplatformer5_files/Main.js81
-rw-r--r--static/tests/canvas1/jsplatformer5_files/RepeatingGameObject.js90
-rw-r--r--static/tests/canvas1/jsplatformer5_files/Utils.js27
-rw-r--r--static/tests/canvas1/jsplatformer5_files/VisualGameObject.js49
-rw-r--r--static/tests/canvas2/index.html24
-rw-r--r--static/tests/canvas2/jsplatformer5_files/AnimatedGameObject.js80
-rw-r--r--static/tests/canvas2/jsplatformer5_files/ApplicationManager.js42
-rw-r--r--static/tests/canvas2/jsplatformer5_files/GameObject.js46
-rw-r--r--static/tests/canvas2/jsplatformer5_files/GameObjectManager.js125
-rw-r--r--static/tests/canvas2/jsplatformer5_files/Main.js81
-rw-r--r--static/tests/canvas2/jsplatformer5_files/RepeatingGameObject.js90
-rw-r--r--static/tests/canvas2/jsplatformer5_files/Utils.js27
-rw-r--r--static/tests/canvas2/jsplatformer5_files/VisualGameObject.js49
85 files changed, 1820 insertions, 12 deletions
diff --git a/static/css/admin.css b/static/css/admin.css
index 10932e8..8aa758e 100644
--- a/static/css/admin.css
+++ b/static/css/admin.css
@@ -1,3 +1,4 @@
+
.errorbox {
border: 2px solid red;
}
@@ -12,4 +13,24 @@ color:red;
}
#adminmute a:hover{
color:blue;
-} \ No newline at end of file
+}
+
+.msvDiv {
+ cursor: pointer;
+}
+.errorbox {
+ border: 2px solid red;
+}
+#adminmute{
+position:absolute;
+color:red;
+font-weight:bold;
+top:0;left:5;
+}
+#adminmute a{
+color:red;
+}
+#adminmute a:hover{
+color:blue;
+}
+
diff --git a/static/css/dump.css b/static/css/dump.css
index a587ed3..9f7d1dd 100755
--- a/static/css/dump.css
+++ b/static/css/dump.css
@@ -44,12 +44,16 @@ a:active {
font-size:14px;
color: #fff;
}
+#dcontent{
+ z-index: 3;
+ overflow: auto;
+ min-width:600px;
+}
#content{
z-index: 3;
overflow: auto;
min-width:600px;
}
-
#chatboxx {
position: fixed;
top:80px;
@@ -90,7 +94,7 @@ bottom:76;
bottom:-8px;
line-height:1.6;
font-size:11px;
-word-spacing:6px;
+word-spacing:15px;
height:28px;
color: #000;
@@ -478,15 +482,14 @@ border:1px solid blue;
border-right:2px solid #c8cbce;
border-bottom:2px solid #c8cbce;
- box-shadow: 3px 4px 4px #c8cbce;
--webkit-box-shadow: 3px 4px 4px #c8cbce;
--moz-box-shadow: 3px 3px 4px #c8cbce;
-filter: progid:DXImageTransform.Microsoft.dropShadow(color=#c8cbce, offX=3, offY=4, positive=true);
+ box-shadow: 3px 4px 3px #c8cbce;
+-webkit-box-shadow: 3px 4px 3px #c8cbce;
+-moz-box-shadow: 3px 3px 3px #c8cbce;
text-overflow:ellipsis;
/* opacity:0.75;*/
z-index:18;
text-align: left;
-background-image:url(/static/img/bg.dither.gif);
+background-color:white;
}
#userList a:hover{color:#ffffff;}
diff --git a/static/css/header.css b/static/css/header.css
index fd189f1..9a80830 100755
--- a/static/css/header.css
+++ b/static/css/header.css
@@ -243,4 +243,343 @@ a.youtube {
cursor:pointer;
width:100;
}
+ /*searchstuff*/
+#searchbox{
+position:absolute;
+top:19px;
+margin-right:10px;
+}
+#search-query{
+background: white;
+border: 1px solid #999;
+color: #C0C8D3;
+font-size: 13px;
+padding: 3px 12px 3px 37px;
+padding-left: 37px;
+padding-left: 37px;
+width:190px;
+
+}
+#search-query .search_icon {
+background:url("http://dump.fm/static/img/hourglass.png") no-repeat scroll center center transparent;
+bottom:3px;
+cursor:pointer;
+left:6px;
+opacity:0.8;
+position:absolute;
+top:3px;
+width:32px;
+}
+
+.white a:hover {
+ text-decoration: none;
+ color: #fff;
+}
+.white a:active {
+ text-decoration: none;
+
+
+ color: #fff;
+}
+#header7{
+ margin: 0px auto -1px auto;
+ top:-1px;
+height:49px;
+ position:fixed;background-image:url(/static/img/bg.dither.gif);
+background-color:#eee;
+border:1px solid #000;
+width:100%;
+min-width:600px;
+left:-1px;
+ box-shadow: 0 0 10px #d8dbde, 0px 0px 2px #000;
+ -webkit-box-shadow: 0 0 10px #d8dbde, 0px 0px 2px #000;
+ -moz-box-shadow: 0 0 10px #d8dbde, 0px 0px 2px #000;
+}
+#bar7{
+ top:19px;
+ position:absolute;
+ word-spacing:-1;
+ font-size: 16px;
+height:22;
+
+text-indent:14px;
+line-height:1.9;
+ left: 125px;
+ margin-left: 0.1%;
+ margin-right: 8%;
+ letter-spacing:.2px;
+ z-index: 999;
+}
+
+#bar7 img{
+margin-top:4;display:none;
+ vertical-align: top;
+}
+#bar7 a{
+ text-decoration: none;
+ font-size:13;
+padding:6px;
+cursor:pointer;
+ color: #000;
+
+
+}
+#bar7 a:hover{
+ text-decoration: none;
+padding:6px;background-color:#fff;
+ color: #000;
+
+}
+#logout7{
+ top:-1px;
+height:16px;
+padding-left:4px;padding-right:3px;
+
+ border-bottom-left-radius:3px;
+ -webkit-border-bottom-left-radius:3px;
+ -moz-border-radius-bottomleft:3px;
+ position:relative;
+ font-size:1px;
+border-left:1px solid #999;
+border-bottom:1px solid #999;
+background-color:#eff5fb;
+ float:right;
+ font-family: Arial, Helvetica, sans-serif;
+ font-weight: normal;
+}
+#logout7 img{display:none;
+}
+#logout7 a{font-size:10px; color: #5a5858;
+
+}
+#logout7 a:hover{font-size:10px;
+color:#000; text-shadow: 0px 1px 0px #fff;
+}
+#toplogin{
+margin-top:8px;
+margin-right:5px;
+
+}
+
+.white a:link {
+ text-decoration: none;
+ font-size:14px;
+ color: #fff;
+}
+.white a:visited {
+ text-decoration: none;
+ font-size:14px;
+ color: #fff;
+}
+#logo7{
+ margin-left: 10px;
+ z-index:1050; text-decoration: none;
+ float:left;
+ margin-top:-1px;
+}
+#logo7 a{font-size:28px;
+
+letter-spacing:-1;
+font-weight:bold; text-decoration: none;
+color:#000;
+}
+#logo7 a:hover{
+color:#000; text-decoration: none;
+text-shadow: -0.5px -0.5px 0px #f0e;
+}
+#dumplist{
+top:0px:width:100%;padding:0px;background-color:#fff;
+color:#000;font-size:60%;text-transform:uppercase;text-decoration: none;
+border-bottom:1px solid #999;text-align:right;
+padding-right:70px;line-height:1.1;background-color:#eff5fb;
+/*margin-left:40%;
+ border-bottom-left-radius:5px;
+ -webkit-border-bottom-left-radius:5px;
+ -moz-border-radius-bottomleft:5px;text-decoration: none;
+border-left:1px solid #999;*/
+}
+#dumplist a{color:#000;font-size:100%;text-transform:uppercase;text-decoration: none;
+}
+#dumplist a:hover{color:#000;text-decoration: none;
+
+}
+#rapper7{
+ top: 0px;
+ left:0px;
+ position:absolute;
+ width: 100%;
+ height: 62px;
+ z-index: 1000;
+}
+#logoicons{
+width:auto;
+}
+#registerlink{
+ font-size: 16px;
+word-spacing:2;
+line-height:2.4;
+font-weight:bold;
+}
+
+#registerlink img{
+display:none;
+}
+
+.no-cursor { cursor: none; }
+.invisible { display: none !important; }
+#cursor-big { position: absolute; z-index: 1000; }
+
+.thumb {
+ cursor:pointer;
+}
+
+img.chat-thumb {
+ cursor:pointer;
+ position: absolute;
+ /*margin-top: -10px;*/
+ width: 16px;
+ height: 16px;
+ bottom: 4px;
+ right: 4px;
+ /*left: 4px;*/
+ display: block;
+ margin: 0;
+ padding: 0;
+}
+
+
+.dump .nick {
+ position: relative;
+ padding-right: 15px;
+}
+
+.logged-dump {
+ position: relative;
+}
+
+/* sharing */
+.buttons{
+ cursor:pointer;
+
+
+}
+.buttons .share {
+ opacity: 0.8;
+}
+.buttons .share:hover {
+ opacity: 1;
+}
+.buttons .other-sites {
+ /*padding-left: 20px;*/
+}
+img.thumb {
+ position: absolute;
+image-rendering: -moz-crisp-edges;
+ margin-left: 0px;
+ margin-top: 0px;
+ height: 27px;
+ width: 27px;
+ left:110px;
+ bottom: 9px;
+ display: block;
+}
+
+.thumb.favorite {
+ position: absolute;
+ margin-left: 0px;
+ margin-top: 0px;
+ height: 27px;
+ width: 27px;
+ display: block;
+}
+
+a.youtube {
+ position: relative;
+}
+
+.youtube .youtube-thumb {
+ width: 130px;
+ height: 97px;
+ padding-bottom: 22px;
+ margin: 0;
+}
+.youtube .youtube-controls {
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ margin: 0;
+}
+.share-buttons{
+cursor:pointer;
+width:100;
+}
+.msvDiv {
+ cursor: pointer;
+}
+
+div.msgDiv:hover {
+ cursor: pointer;
+background-image:url("/static/img/thumbs/smallheart.gif");
+
+}
+
+.msgDiv.favorite{
+ cursor: pointer;
+background-image:url("/static/img/thumbs/grheart.gif");
+}
+.content{background-color:white;}
+.nick{background-color:white;margin-right:3px;}
+.msgDiv dump{background-color:white;}
+ /*searchstuff*/
+#searchbox{
+position:absolute;
+top:18px;
+right:36px;
+}
+#search-query{
+background: white;
+border: 1px solid #999;
+color: #C0C8D3;
+font-size: 13px;
+padding: 3px 12px 3px 37px;
+padding-left: 37px;
+text-indent:5px;
+ border-radius: 50px;
+ -webkit-border-radius: 50px;
+ -moz-border-radius: 50px;
+}
+.search_icon {
+background:url("http://dump.fm/static/img/hourglass.png") no-repeat scroll center center transparent;
+bottom:3px;
+cursor:pointer;
+left:6px;
+opacity:0.8;
+border-right:1px solid #C0C8D3;
+position:absolute;
+top:3px;
+width:32px;
+}
+
+#searchresults{
+ top:50px;
+ overflow:auto;
+ position:fixed;background-image:url(/static/img/bg.dither.gif);
+background-color:#eee;
+width:100%;
+min-width:600px;
+border-bottom:1px solid #000;
+left:-1px;
+margin-top:-1px;
+}
+#searchresults img{
+ max-width:300px;
+ width: expression(this.width > 300 ? 300: true);
+ max-height:50px;
+ height: expression(this.width > 300 ? 300: true);
+ max-width:300px;
+ border:1px solid #eee;
+ float:left;
+ display:inline;
+ margin-right:10px;
+} \ No newline at end of file
diff --git a/static/img/colorshift.gif b/static/img/colorshift.gif
new file mode 100644
index 0000000..f27eaec
--- /dev/null
+++ b/static/img/colorshift.gif
Binary files differ
diff --git a/static/img/hourglass.png b/static/img/hourglass.png
new file mode 100644
index 0000000..cc0a6e5
--- /dev/null
+++ b/static/img/hourglass.png
Binary files differ
diff --git a/static/img/thumbs/favidear.gif b/static/img/thumbs/favidear.gif
new file mode 100644
index 0000000..83b8cfe
--- /dev/null
+++ b/static/img/thumbs/favidear.gif
Binary files differ
diff --git a/static/img/thumbs/grheart.gif b/static/img/thumbs/grheart.gif
new file mode 100644
index 0000000..ec66c55
--- /dev/null
+++ b/static/img/thumbs/grheart.gif
Binary files differ
diff --git a/static/img/thumbs/grhearthover.gif b/static/img/thumbs/grhearthover.gif
new file mode 100644
index 0000000..4da2897
--- /dev/null
+++ b/static/img/thumbs/grhearthover.gif
Binary files differ
diff --git a/static/img/thumbs/stripes.gif b/static/img/thumbs/stripes.gif
new file mode 100644
index 0000000..cb2edbf
--- /dev/null
+++ b/static/img/thumbs/stripes.gif
Binary files differ
diff --git a/static/js/admin.js b/static/js/admin.js
index e54368c..fc18685 100644
--- a/static/js/admin.js
+++ b/static/js/admin.js
@@ -102,4 +102,19 @@ Admin.cancelMute = function(id, nick) {
buttons: { 'OK': submit , 'Cancel': close }
});
html.dialog('open');
-} \ No newline at end of file
+}
+
+
+/*
+$('.msgDiv').live('mouseenter', function() {
+ $(this).css({'border': '1px dotted red',
+ 'margin': '-1' });
+})
+
+$('.msgDiv').live('mouseleave', function() {
+ $(this).css({'border': 'none',
+ 'margin': '0'});
+})
+
+
+*/ \ No newline at end of file
diff --git a/static/js/invalid_domains.js b/static/js/invalid_domains.js
index e0159d0..7f9dd45 100644
--- a/static/js/invalid_domains.js
+++ b/static/js/invalid_domains.js
@@ -65,6 +65,8 @@ var InvalidDomains = [
"http://geneology2.com",
"http://www.geneology2.com",
"http://img.waffleimages.com",
+ "http://www.worldofstock.com",
+ "http://aphrodite.cooltext.com",
"http://www.onemetal.com",
"http://static.funnyjunk.com",
"http://www.whimsical-wits.com",
diff --git a/static/js/pichat.js b/static/js/pichat.js
index 62cf52e..a236ba0 100644
--- a/static/js/pichat.js
+++ b/static/js/pichat.js
@@ -18,7 +18,7 @@ Imgs = {
}
Anim = {
- "chatThumbBig": {"width": "27px", "height": "27px", "right": "0px", "bottom": "2px"},
+ "chatThumbBig": {"width": "54px", "height": "54px", "right": "0px", "bottom": "2px"},
"chatThumbTiny": {"width": "8px", "height": "8px", "right": "8px", "bottom": "8px"},
"chatThumb": {"width": "16px", "height": "16px", "right": "4px", "bottom": "4px"},
"logThumb": {"width": "27px", "height": "27px", "marginRight": "0px", "marginTop": "0px"},
@@ -199,10 +199,10 @@ function buildMessageDiv(msg, isLoading) {
var loadingClass = isLoading ? ' loading' : '';
var containsImageClass = LastMsgContainsImage ? ' contains-image' : '';
return '<div class="msgDiv dump ' + loadingClass + containsImageClass + '" ' + msgId + '>'
- + '<span class="nick"><b><a href="http://dump.fm/' + nick + ' ">' + nick + '</a></b>'
+ + '<span class="nick"><b><a href="http://dump.fm/' + nick + ' " target="_blank">' + nick + '</a></b>'
+ ' <img src="'+Imgs.chatThumbDot+'" class="chat-thumb" onclick="Tag.favorite(this)"> '
+ '</span>'
- + buildMsgContent(msg.content)
+ + '<span class="content">' + buildMsgContent(msg.content) + '</span>'
+ '</div>';
}
@@ -1032,3 +1032,21 @@ function startTitleUpdater() {
$(function() {
OrigTitle = $('title').text();
});
+
+
+$('.msgDiv').live('click', function(e) {
+ var tagName = e.target.tagName;
+ if (tagName == 'A' || tagName == 'IMG') {
+ return;
+ }
+ var wasFavorited = $(this).hasClass("favorite");
+ var button = $(this).find('.chat-thumb');
+ if (wasFavorited) {
+ $(button).attr("src", Imgs.chatThumbOff);
+ } else {
+ $(button).attr("src", Imgs.chatThumbBig);
+ $(button).stop().animate(Anim.chatThumbBig, 'fast').animate(Anim.chatThumb, 'fast', 'swing');
+ }
+ Tag.favorite(button);
+ return false;
+});
diff --git a/static/tests/avatars.html b/static/tests/avatars.html
new file mode 100644
index 0000000..37b5577
--- /dev/null
+++ b/static/tests/avatars.html
@@ -0,0 +1,40 @@
+<html>
+<head>
+<style>
+img { width: 32px; height: 32px; }
+</style>
+</head>
+<body>
+<div>
+<img src="http://dump.fm/avatars/20100328/1269820420675-dumpfm-andrej-a2bone.gif"><br>
+<img src="http://dump.fm/avatars/20100528/1275024874455-dumpfm-erikhaspresence-logo.gif"><br>
+<img
+src="http://dump.fm/avatars/20100609/1276057658623-dumpfm-maryrachel-1276057548339-dumpfm-lobstersoap-lobstersoap_mr2.gif"><br>
+<img src="http://dump.fm/avatars/20100430/1272664838950-dumpfm-DaK4nDyM4nFU-cupcake-flashback.gif"><br>
+<img
+src="http://dump.fm/avatars/20100424/1272088155321-dumpfm-thekraken-ac37341b3621ae002fe5fbf7bf829be0c04df97c_m.gif"><br>
+<img src="http://imgur.com/H0sNp.gif"><br>
+<img src="http://dump.fm/avatars/20100605/1275765282700-dumpfm-foot-dizzy-jump.gif"><br>
+<img src="http://dump.fm/avatars/20100602/1275456693159-dumpfm-Savour-pikasleepgif.gif"><br>
+<img src="http://dump.fm/avatars/20100413/1271199038897-dumpfm-cdma-Game_of_life_animated_glider.gif"><br>
+<img src="http://dump.fm/avatars/20100531/1275301955882-dumpfm-whatevz-Zeke_sodabomb_side.gif"><br>
+<img src="http://dump.fm/images/20100410/1270925016612-dumpfm-justytamp-Laptop.gif"><br>
+<img src="http://dump.fm/avatars/20100609/1276134099153-dumpfm-ryder-4421765655_44401c9e82_o.gif"><br>
+<img src="http://dump.fm/avatars/20100512/1273643435184-dumpfm-frankhats-dotfade.gif"><br>
+<img src="http://dump.fm/avatars/20100423/1272000363897-dumpfm-stefan-See_King1.gif"><br>
+<img
+src="http://dump.fm/avatars/20100526/1274899226905-dumpfm-noisia-1274373752899-dumpfm-noisia-Neko_animated.gif"><br>
+<img src="http://dump.fm/avatars/20100421/1271878413411-dumpfm-mat3i-404.gif"><br>
+<img src="http://dump.fm/avatars/20100522/1274555551274-dumpfm-anitahug-creatures_015.gif"><br>
+<img src="http://dump.fm/avatars/20100611/1276243669179-dumpfm-jertronic-smallercolordog.gif"><br>
+<img src="http://dump.fm/avatars/20100407/1270672327296-dumpfm-illalli-wheelchair_lg_nwm.gif"><br>
+<img src="http://dump.fm/avatars/20100517/1274085059285-dumpfm-AGT528-1267051064894-Pop-corn-5.gif"><br>
+<img src="http://dump.fm/avatars/20100510/1273466455783-dumpfm-beaf-skream.gif"><br>
+<img
+src="http://dump.fm/avatars/20100415/1271354812432-dumpfm-melipone-1270872653089-dumpfm-tomauty-1245200306995.gif"><br>
+<img src="http://dump.fm/avatars/20100515/1273927592920-dumpfm-frederick-683150mjhfl22ijf.gif"><br>
+<img
+src="http://dump.fm/avatars/20100605/1275748101974-dumpfm-minty-1275748020937-dumpfm-jumanji-1275745357313-dumpfm-minty-tetes_mort-04.gif"><br>
+</div>
+</body>
+</html>
diff --git a/static/tests/avatars/20100311/1268317730569-dumpfm-unicorngirl-unicornpink.gif b/static/tests/avatars/20100311/1268317730569-dumpfm-unicorngirl-unicornpink.gif
new file mode 100644
index 0000000..e0b85c9
--- /dev/null
+++ b/static/tests/avatars/20100311/1268317730569-dumpfm-unicorngirl-unicornpink.gif
Binary files differ
diff --git a/static/tests/avatars/20100311/1268317730569-dumpfm-unicorngirl-unicornpink.thumb.gif b/static/tests/avatars/20100311/1268317730569-dumpfm-unicorngirl-unicornpink.thumb.gif
new file mode 100644
index 0000000..51f863b
--- /dev/null
+++ b/static/tests/avatars/20100311/1268317730569-dumpfm-unicorngirl-unicornpink.thumb.gif
Binary files differ
diff --git a/static/tests/avatars/20100311/1268331012620-dumpfm-AndersStuka-supermensa.png b/static/tests/avatars/20100311/1268331012620-dumpfm-AndersStuka-supermensa.png
new file mode 100644
index 0000000..0873f9d
--- /dev/null
+++ b/static/tests/avatars/20100311/1268331012620-dumpfm-AndersStuka-supermensa.png
Binary files differ
diff --git a/static/tests/avatars/20100311/1268331012620-dumpfm-AndersStuka-supermensa.thumb.png b/static/tests/avatars/20100311/1268331012620-dumpfm-AndersStuka-supermensa.thumb.png
new file mode 100644
index 0000000..c8c5530
--- /dev/null
+++ b/static/tests/avatars/20100311/1268331012620-dumpfm-AndersStuka-supermensa.thumb.png
Binary files differ
diff --git a/static/tests/avatars/20100311/1268353224487-dumpfm-mu0p-mu0p.gif b/static/tests/avatars/20100311/1268353224487-dumpfm-mu0p-mu0p.gif
new file mode 100644
index 0000000..4408809
--- /dev/null
+++ b/static/tests/avatars/20100311/1268353224487-dumpfm-mu0p-mu0p.gif
Binary files differ
diff --git a/static/tests/avatars/20100311/1268353224487-dumpfm-mu0p-mu0p.thumb.gif b/static/tests/avatars/20100311/1268353224487-dumpfm-mu0p-mu0p.thumb.gif
new file mode 100644
index 0000000..3505243
--- /dev/null
+++ b/static/tests/avatars/20100311/1268353224487-dumpfm-mu0p-mu0p.thumb.gif
Binary files differ
diff --git a/static/tests/avatars/20100311/1268356801824-dumpfm-sam-pent11satanshimmel.gif b/static/tests/avatars/20100311/1268356801824-dumpfm-sam-pent11satanshimmel.gif
new file mode 100644
index 0000000..cc68e71
--- /dev/null
+++ b/static/tests/avatars/20100311/1268356801824-dumpfm-sam-pent11satanshimmel.gif
Binary files differ
diff --git a/static/tests/avatars/20100311/1268356801824-dumpfm-sam-pent11satanshimmel.thumb.gif b/static/tests/avatars/20100311/1268356801824-dumpfm-sam-pent11satanshimmel.thumb.gif
new file mode 100644
index 0000000..46a47aa
--- /dev/null
+++ b/static/tests/avatars/20100311/1268356801824-dumpfm-sam-pent11satanshimmel.thumb.gif
Binary files differ
diff --git a/static/tests/avatars/20100311/1268360109151-dumpfm-zoeee-Photo-316.jpg b/static/tests/avatars/20100311/1268360109151-dumpfm-zoeee-Photo-316.jpg
new file mode 100644
index 0000000..2ba74e7
--- /dev/null
+++ b/static/tests/avatars/20100311/1268360109151-dumpfm-zoeee-Photo-316.jpg
Binary files differ
diff --git a/static/tests/avatars/20100311/1268360109151-dumpfm-zoeee-Photo-316.thumb.jpg b/static/tests/avatars/20100311/1268360109151-dumpfm-zoeee-Photo-316.thumb.jpg
new file mode 100644
index 0000000..838080e
--- /dev/null
+++ b/static/tests/avatars/20100311/1268360109151-dumpfm-zoeee-Photo-316.thumb.jpg
Binary files differ
diff --git a/static/tests/avatars/20100311/index.html b/static/tests/avatars/20100311/index.html
new file mode 100644
index 0000000..39fd34c
--- /dev/null
+++ b/static/tests/avatars/20100311/index.html
@@ -0,0 +1,49 @@
+<html>
+<head>
+ <style>
+ td { text-align: right;}
+ .big { max-width: 500px; max-height: 500px; }
+ .small { max-width: 30px; max-height: 30px; height: 30px; }
+ body {background-image: url(../bg.gif);}
+ thead td { background-color: #000; color: #fff; border: 3px solid #888; }
+ </style>
+</head>
+<body>
+
+<table>
+ <thead>
+ <tr><td>original image w/ max-width/height</td><td>css resize</td><td>thumb</td></tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><img class="big" src="1268317730569-dumpfm-unicorngirl-unicornpink.gif"></td>
+ <td><img class="small" src="1268317730569-dumpfm-unicorngirl-unicornpink.gif"></td>
+ <td><img class="thumb" src="1268317730569-dumpfm-unicorngirl-unicornpink.thumb.gif"></td>
+ </tr>
+ <tr>
+ <td><img class="big" src="1268353224487-dumpfm-mu0p-mu0p.gif">
+ <td><img class="small" src="1268353224487-dumpfm-mu0p-mu0p.gif">
+ <td><img class="thumb" src="1268353224487-dumpfm-mu0p-mu0p.thumb.gif">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268360109151-dumpfm-zoeee-Photo-316.jpg">
+ <td><img class="small" src="1268360109151-dumpfm-zoeee-Photo-316.jpg">
+ <td><img class="thumb" src="1268360109151-dumpfm-zoeee-Photo-316.thumb.jpg">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268331012620-dumpfm-AndersStuka-supermensa.png">
+ <td><img class="small" src="1268331012620-dumpfm-AndersStuka-supermensa.png">
+ <td><img class="thumb" src="1268331012620-dumpfm-AndersStuka-supermensa.thumb.png">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268356801824-dumpfm-sam-pent11satanshimmel.gif ">
+ <td><img class="small" src="1268356801824-dumpfm-sam-pent11satanshimmel.gif ">
+ <td><img class="thumb" src="1268356801824-dumpfm-sam-pent11satanshimmel.thumb.gif ">
+ </tr>
+ </tbody>
+</table>
+
+
+
+</body>
+</html> \ No newline at end of file
diff --git a/static/tests/avatars/20100317/1268824131789-dumpfm-nigga-babyjump.gif b/static/tests/avatars/20100317/1268824131789-dumpfm-nigga-babyjump.gif
new file mode 100644
index 0000000..3c4a5d8
--- /dev/null
+++ b/static/tests/avatars/20100317/1268824131789-dumpfm-nigga-babyjump.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268824131789-dumpfm-nigga-babyjump.thumb.gif b/static/tests/avatars/20100317/1268824131789-dumpfm-nigga-babyjump.thumb.gif
new file mode 100644
index 0000000..8030754
--- /dev/null
+++ b/static/tests/avatars/20100317/1268824131789-dumpfm-nigga-babyjump.thumb.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268843598216-dumpfm-tmkunt-girl.gif b/static/tests/avatars/20100317/1268843598216-dumpfm-tmkunt-girl.gif
new file mode 100644
index 0000000..db844ff
--- /dev/null
+++ b/static/tests/avatars/20100317/1268843598216-dumpfm-tmkunt-girl.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268843598216-dumpfm-tmkunt-girl.thumb.gif b/static/tests/avatars/20100317/1268843598216-dumpfm-tmkunt-girl.thumb.gif
new file mode 100644
index 0000000..864558e
--- /dev/null
+++ b/static/tests/avatars/20100317/1268843598216-dumpfm-tmkunt-girl.thumb.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268843634561-dumpfm-tmkunt-tevye.jpg b/static/tests/avatars/20100317/1268843634561-dumpfm-tmkunt-tevye.jpg
new file mode 100644
index 0000000..affa502
--- /dev/null
+++ b/static/tests/avatars/20100317/1268843634561-dumpfm-tmkunt-tevye.jpg
Binary files differ
diff --git a/static/tests/avatars/20100317/1268843634561-dumpfm-tmkunt-tevye.thumb.jpg b/static/tests/avatars/20100317/1268843634561-dumpfm-tmkunt-tevye.thumb.jpg
new file mode 100644
index 0000000..6e672b4
--- /dev/null
+++ b/static/tests/avatars/20100317/1268843634561-dumpfm-tmkunt-tevye.thumb.jpg
Binary files differ
diff --git a/static/tests/avatars/20100317/1268844983487-dumpfm-foot-final.gif b/static/tests/avatars/20100317/1268844983487-dumpfm-foot-final.gif
new file mode 100644
index 0000000..66eda90
--- /dev/null
+++ b/static/tests/avatars/20100317/1268844983487-dumpfm-foot-final.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268844983487-dumpfm-foot-final.thumb.gif b/static/tests/avatars/20100317/1268844983487-dumpfm-foot-final.thumb.gif
new file mode 100644
index 0000000..8844ec6
--- /dev/null
+++ b/static/tests/avatars/20100317/1268844983487-dumpfm-foot-final.thumb.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268845052790-dumpfm-foot-beads_placed_in_bone.gif b/static/tests/avatars/20100317/1268845052790-dumpfm-foot-beads_placed_in_bone.gif
new file mode 100644
index 0000000..1479702
--- /dev/null
+++ b/static/tests/avatars/20100317/1268845052790-dumpfm-foot-beads_placed_in_bone.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268845052790-dumpfm-foot-beads_placed_in_bone.thumb.gif b/static/tests/avatars/20100317/1268845052790-dumpfm-foot-beads_placed_in_bone.thumb.gif
new file mode 100644
index 0000000..7f1c588
--- /dev/null
+++ b/static/tests/avatars/20100317/1268845052790-dumpfm-foot-beads_placed_in_bone.thumb.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268854482173-dumpfm-loghorn-Picture-27.png b/static/tests/avatars/20100317/1268854482173-dumpfm-loghorn-Picture-27.png
new file mode 100644
index 0000000..60697e2
--- /dev/null
+++ b/static/tests/avatars/20100317/1268854482173-dumpfm-loghorn-Picture-27.png
Binary files differ
diff --git a/static/tests/avatars/20100317/1268854482173-dumpfm-loghorn-Picture-27.thumb.png b/static/tests/avatars/20100317/1268854482173-dumpfm-loghorn-Picture-27.thumb.png
new file mode 100644
index 0000000..7fc6cf0
--- /dev/null
+++ b/static/tests/avatars/20100317/1268854482173-dumpfm-loghorn-Picture-27.thumb.png
Binary files differ
diff --git a/static/tests/avatars/20100317/1268860204161-dumpfm-ghoulalt-allentown2009-11.jpg b/static/tests/avatars/20100317/1268860204161-dumpfm-ghoulalt-allentown2009-11.jpg
new file mode 100644
index 0000000..50c741d
--- /dev/null
+++ b/static/tests/avatars/20100317/1268860204161-dumpfm-ghoulalt-allentown2009-11.jpg
Binary files differ
diff --git a/static/tests/avatars/20100317/1268860204161-dumpfm-ghoulalt-allentown2009-11.thumb.jpg b/static/tests/avatars/20100317/1268860204161-dumpfm-ghoulalt-allentown2009-11.thumb.jpg
new file mode 100644
index 0000000..d877c88
--- /dev/null
+++ b/static/tests/avatars/20100317/1268860204161-dumpfm-ghoulalt-allentown2009-11.thumb.jpg
Binary files differ
diff --git a/static/tests/avatars/20100317/1268873465668-dumpfm-grusandcrux-kissdubgiffblanc63ok1.gif b/static/tests/avatars/20100317/1268873465668-dumpfm-grusandcrux-kissdubgiffblanc63ok1.gif
new file mode 100644
index 0000000..70b1e6e
--- /dev/null
+++ b/static/tests/avatars/20100317/1268873465668-dumpfm-grusandcrux-kissdubgiffblanc63ok1.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268873465668-dumpfm-grusandcrux-kissdubgiffblanc63ok1.thumb.gif b/static/tests/avatars/20100317/1268873465668-dumpfm-grusandcrux-kissdubgiffblanc63ok1.thumb.gif
new file mode 100644
index 0000000..ba44afe
--- /dev/null
+++ b/static/tests/avatars/20100317/1268873465668-dumpfm-grusandcrux-kissdubgiffblanc63ok1.thumb.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268875089450-dumpfm-mistaxiii-b2.gif b/static/tests/avatars/20100317/1268875089450-dumpfm-mistaxiii-b2.gif
new file mode 100644
index 0000000..655a3f2
--- /dev/null
+++ b/static/tests/avatars/20100317/1268875089450-dumpfm-mistaxiii-b2.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268875089450-dumpfm-mistaxiii-b2.thumb.gif b/static/tests/avatars/20100317/1268875089450-dumpfm-mistaxiii-b2.thumb.gif
new file mode 100644
index 0000000..4cbc7a7
--- /dev/null
+++ b/static/tests/avatars/20100317/1268875089450-dumpfm-mistaxiii-b2.thumb.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268875138982-dumpfm-hankpeters-53-icon.png b/static/tests/avatars/20100317/1268875138982-dumpfm-hankpeters-53-icon.png
new file mode 100644
index 0000000..84a2c5e
--- /dev/null
+++ b/static/tests/avatars/20100317/1268875138982-dumpfm-hankpeters-53-icon.png
Binary files differ
diff --git a/static/tests/avatars/20100317/1268875138982-dumpfm-hankpeters-53-icon.thumb.png b/static/tests/avatars/20100317/1268875138982-dumpfm-hankpeters-53-icon.thumb.png
new file mode 100644
index 0000000..33a792e
--- /dev/null
+++ b/static/tests/avatars/20100317/1268875138982-dumpfm-hankpeters-53-icon.thumb.png
Binary files differ
diff --git a/static/tests/avatars/20100317/1268875479356-dumpfm-cassandreamy-japansmiley.JPG b/static/tests/avatars/20100317/1268875479356-dumpfm-cassandreamy-japansmiley.JPG
new file mode 100644
index 0000000..9a1c44b
--- /dev/null
+++ b/static/tests/avatars/20100317/1268875479356-dumpfm-cassandreamy-japansmiley.JPG
Binary files differ
diff --git a/static/tests/avatars/20100317/1268875479356-dumpfm-cassandreamy-japansmiley.thumb.JPG b/static/tests/avatars/20100317/1268875479356-dumpfm-cassandreamy-japansmiley.thumb.JPG
new file mode 100644
index 0000000..16ac653
--- /dev/null
+++ b/static/tests/avatars/20100317/1268875479356-dumpfm-cassandreamy-japansmiley.thumb.JPG
Binary files differ
diff --git a/static/tests/avatars/20100317/1268875995007-dumpfm-SrProlapse-keatonlolsmall.png b/static/tests/avatars/20100317/1268875995007-dumpfm-SrProlapse-keatonlolsmall.png
new file mode 100644
index 0000000..6f0b2cc
--- /dev/null
+++ b/static/tests/avatars/20100317/1268875995007-dumpfm-SrProlapse-keatonlolsmall.png
Binary files differ
diff --git a/static/tests/avatars/20100317/1268875995007-dumpfm-SrProlapse-keatonlolsmall.thumb.png b/static/tests/avatars/20100317/1268875995007-dumpfm-SrProlapse-keatonlolsmall.thumb.png
new file mode 100644
index 0000000..358506d
--- /dev/null
+++ b/static/tests/avatars/20100317/1268875995007-dumpfm-SrProlapse-keatonlolsmall.thumb.png
Binary files differ
diff --git a/static/tests/avatars/20100317/1268877139344-dumpfm-coeur-GoatBoy.jpg b/static/tests/avatars/20100317/1268877139344-dumpfm-coeur-GoatBoy.jpg
new file mode 100644
index 0000000..286dd58
--- /dev/null
+++ b/static/tests/avatars/20100317/1268877139344-dumpfm-coeur-GoatBoy.jpg
Binary files differ
diff --git a/static/tests/avatars/20100317/1268877139344-dumpfm-coeur-GoatBoy.thumb.jpg b/static/tests/avatars/20100317/1268877139344-dumpfm-coeur-GoatBoy.thumb.jpg
new file mode 100644
index 0000000..b071b4e
--- /dev/null
+++ b/static/tests/avatars/20100317/1268877139344-dumpfm-coeur-GoatBoy.thumb.jpg
Binary files differ
diff --git a/static/tests/avatars/20100317/1268877902821-dumpfm-3noneTwo-100ico.png b/static/tests/avatars/20100317/1268877902821-dumpfm-3noneTwo-100ico.png
new file mode 100644
index 0000000..b0461a8
--- /dev/null
+++ b/static/tests/avatars/20100317/1268877902821-dumpfm-3noneTwo-100ico.png
Binary files differ
diff --git a/static/tests/avatars/20100317/1268877902821-dumpfm-3noneTwo-100ico.thumb.png b/static/tests/avatars/20100317/1268877902821-dumpfm-3noneTwo-100ico.thumb.png
new file mode 100644
index 0000000..b17e8f0
--- /dev/null
+++ b/static/tests/avatars/20100317/1268877902821-dumpfm-3noneTwo-100ico.thumb.png
Binary files differ
diff --git a/static/tests/avatars/20100317/1268878362813-dumpfm-okeeblow-3-smith.gif b/static/tests/avatars/20100317/1268878362813-dumpfm-okeeblow-3-smith.gif
new file mode 100644
index 0000000..26922dd
--- /dev/null
+++ b/static/tests/avatars/20100317/1268878362813-dumpfm-okeeblow-3-smith.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268878362813-dumpfm-okeeblow-3-smith.thumb.gif b/static/tests/avatars/20100317/1268878362813-dumpfm-okeeblow-3-smith.thumb.gif
new file mode 100644
index 0000000..9ac7b20
--- /dev/null
+++ b/static/tests/avatars/20100317/1268878362813-dumpfm-okeeblow-3-smith.thumb.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268879836325-dumpfm-bendover-clifford-1.png b/static/tests/avatars/20100317/1268879836325-dumpfm-bendover-clifford-1.png
new file mode 100644
index 0000000..141e33f
--- /dev/null
+++ b/static/tests/avatars/20100317/1268879836325-dumpfm-bendover-clifford-1.png
Binary files differ
diff --git a/static/tests/avatars/20100317/1268879836325-dumpfm-bendover-clifford-1.thumb.png b/static/tests/avatars/20100317/1268879836325-dumpfm-bendover-clifford-1.thumb.png
new file mode 100644
index 0000000..e098fe0
--- /dev/null
+++ b/static/tests/avatars/20100317/1268879836325-dumpfm-bendover-clifford-1.thumb.png
Binary files differ
diff --git a/static/tests/avatars/20100317/1268879862249-dumpfm-justytamp-JUSTY-TAMP.png b/static/tests/avatars/20100317/1268879862249-dumpfm-justytamp-JUSTY-TAMP.png
new file mode 100644
index 0000000..fcf1b7d
--- /dev/null
+++ b/static/tests/avatars/20100317/1268879862249-dumpfm-justytamp-JUSTY-TAMP.png
Binary files differ
diff --git a/static/tests/avatars/20100317/1268879862249-dumpfm-justytamp-JUSTY-TAMP.thumb.png b/static/tests/avatars/20100317/1268879862249-dumpfm-justytamp-JUSTY-TAMP.thumb.png
new file mode 100644
index 0000000..76dd58d
--- /dev/null
+++ b/static/tests/avatars/20100317/1268879862249-dumpfm-justytamp-JUSTY-TAMP.thumb.png
Binary files differ
diff --git a/static/tests/avatars/20100317/1268881084236-dumpfm-mistaxiii-moooovies.gif b/static/tests/avatars/20100317/1268881084236-dumpfm-mistaxiii-moooovies.gif
new file mode 100644
index 0000000..ed41681
--- /dev/null
+++ b/static/tests/avatars/20100317/1268881084236-dumpfm-mistaxiii-moooovies.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268881084236-dumpfm-mistaxiii-moooovies.thumb.gif b/static/tests/avatars/20100317/1268881084236-dumpfm-mistaxiii-moooovies.thumb.gif
new file mode 100644
index 0000000..48f31f6
--- /dev/null
+++ b/static/tests/avatars/20100317/1268881084236-dumpfm-mistaxiii-moooovies.thumb.gif
Binary files differ
diff --git a/static/tests/avatars/20100317/1268881491088-dumpfm-abraham-stuntmaster_box_side_pic.jpg b/static/tests/avatars/20100317/1268881491088-dumpfm-abraham-stuntmaster_box_side_pic.jpg
new file mode 100644
index 0000000..68a0b8e
--- /dev/null
+++ b/static/tests/avatars/20100317/1268881491088-dumpfm-abraham-stuntmaster_box_side_pic.jpg
Binary files differ
diff --git a/static/tests/avatars/20100317/1268881491088-dumpfm-abraham-stuntmaster_box_side_pic.thumb.jpg b/static/tests/avatars/20100317/1268881491088-dumpfm-abraham-stuntmaster_box_side_pic.thumb.jpg
new file mode 100644
index 0000000..49e34b5
--- /dev/null
+++ b/static/tests/avatars/20100317/1268881491088-dumpfm-abraham-stuntmaster_box_side_pic.thumb.jpg
Binary files differ
diff --git a/static/tests/avatars/20100317/12688py862249-dumpfm-justytamp-JUSTY-TAMP.thumb.png b/static/tests/avatars/20100317/12688py862249-dumpfm-justytamp-JUSTY-TAMP.thumb.png
new file mode 100644
index 0000000..76dd58d
--- /dev/null
+++ b/static/tests/avatars/20100317/12688py862249-dumpfm-justytamp-JUSTY-TAMP.thumb.png
Binary files differ
diff --git a/static/tests/avatars/20100317/index.html b/static/tests/avatars/20100317/index.html
new file mode 100644
index 0000000..a80faec
--- /dev/null
+++ b/static/tests/avatars/20100317/index.html
@@ -0,0 +1,114 @@
+<html>
+<head>
+ <style>
+ td { text-align: right;}
+ .big { max-width: 500px; max-height: 500px; }
+ .small { max-width: 30px; max-height: 30px; height: 30px; }
+ body {background-image: url(../bg.gif);}
+ thead td { background-color: #000; color: #fff; border: 3px solid #888; }
+ </style>
+</head>
+<body>
+
+<table>
+ <thead>
+ <tr><td>original image w/ max-width/height</td><td>css resize</td><td>thumb</td></tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td><img class="big" src="1268824131789-dumpfm-nigga-babyjump.gif"></td>
+ <td><img class="small" src="1268824131789-dumpfm-nigga-babyjump.gif"></td>
+ <td><img class="thumb" src="1268824131789-dumpfm-nigga-babyjump.thumb.gif"></td>
+ </tr>
+ <tr>
+ <td><img class="big" src="1268843598216-dumpfm-tmkunt-girl.gif">
+ <td><img class="small" src="1268843598216-dumpfm-tmkunt-girl.gif">
+ <td><img class="thumb" src="1268843598216-dumpfm-tmkunt-girl.thumb.gif">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268843634561-dumpfm-tmkunt-tevye.jpg">
+ <td><img class="small" src="1268843634561-dumpfm-tmkunt-tevye.jpg">
+ <td><img class="thumb" src="1268843634561-dumpfm-tmkunt-tevye.thumb.jpg">
+ </tr>
+ <tr>
+ <tr>
+ <td><img class="big" src="1268881491088-dumpfm-abraham-stuntmaster_box_side_pic.jpg"></td>
+ <td><img class="small" src="1268881491088-dumpfm-abraham-stuntmaster_box_side_pic.jpg"></td>
+ <td><img class="thumb" src="1268881491088-dumpfm-abraham-stuntmaster_box_side_pic.thumb.jpg"></td>
+ </tr>
+ <tr>
+ <td><img class="big" src="1268881084236-dumpfm-mistaxiii-moooovies.gif">
+ <td><img class="small" src="1268881084236-dumpfm-mistaxiii-moooovies.gif">
+ <td><img class="thumb" src="1268881084236-dumpfm-mistaxiii-moooovies.thumb.gif">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268879862249-dumpfm-justytamp-JUSTY-TAMP.png">
+ <td><img class="small" src="1268879862249-dumpfm-justytamp-JUSTY-TAMP.png">
+ <td><img class="thumb" src="1268879862249-dumpfm-justytamp-JUSTY-TAMP.thumb.png">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268879836325-dumpfm-bendover-clifford-1.png">
+ <td><img class="small" src="1268879836325-dumpfm-bendover-clifford-1.png">
+ <td><img class="thumb" src="1268879836325-dumpfm-bendover-clifford-1.thumb.png">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268878362813-dumpfm-okeeblow-3-smith.gif ">
+ <td><img class="small" src="1268878362813-dumpfm-okeeblow-3-smith.gif ">
+ <td><img class="thumb" src="1268878362813-dumpfm-okeeblow-3-smith.thumb.gif ">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268877902821-dumpfm-3noneTwo-100ico.png"></td>
+ <td><img class="small" src="1268877902821-dumpfm-3noneTwo-100ico.png"></td>
+ <td><img class="thumb" src="1268877902821-dumpfm-3noneTwo-100ico.thumb.png"></td>
+ </tr>
+ <tr>
+ <td><img class="big" src="1268877139344-dumpfm-coeur-GoatBoy.jpg">
+ <td><img class="small" src="1268877139344-dumpfm-coeur-GoatBoy.jpg">
+ <td><img class="thumb" src="1268877139344-dumpfm-coeur-GoatBoy.thumb.jpg">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268875995007-dumpfm-SrProlapse-keatonlolsmall.png">
+ <td><img class="small" src="1268875995007-dumpfm-SrProlapse-keatonlolsmall.png">
+ <td><img class="thumb" src="1268875995007-dumpfm-SrProlapse-keatonlolsmall.thumb.png">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268875479356-dumpfm-cassandreamy-japansmiley.JPG">
+ <td><img class="small" src="1268875479356-dumpfm-cassandreamy-japansmiley.JPG">
+ <td><img class="thumb" src="1268875479356-dumpfm-cassandreamy-japansmiley.thumb.JPG">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268875138982-dumpfm-hankpeters-53-icon.png ">
+ <td><img class="small" src="1268875138982-dumpfm-hankpeters-53-icon.png ">
+ <td><img class="thumb" src="1268875138982-dumpfm-hankpeters-53-icon.thumb.png ">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268875089450-dumpfm-mistaxiii-b2.gif"></td>
+ <td><img class="small" src="1268875089450-dumpfm-mistaxiii-b2.gif"></td>
+ <td><img class="thumb" src="1268875089450-dumpfm-mistaxiii-b2.thumb.gif"></td>
+ </tr>
+ <tr>
+ <td><img class="big" src="1268873465668-dumpfm-grusandcrux-kissdubgiffblanc63ok1.gif">
+ <td><img class="small" src="1268873465668-dumpfm-grusandcrux-kissdubgiffblanc63ok1.gif">
+ <td><img class="thumb" src="1268873465668-dumpfm-grusandcrux-kissdubgiffblanc63ok1.thumb.gif">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268860204161-dumpfm-ghoulalt-allentown2009-11.jpg">
+ <td><img class="small" src="1268860204161-dumpfm-ghoulalt-allentown2009-11.jpg">
+ <td><img class="thumb" src="1268860204161-dumpfm-ghoulalt-allentown2009-11.thumb.jpg">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268854482173-dumpfm-loghorn-Picture-27.png">
+ <td><img class="small" src="1268854482173-dumpfm-loghorn-Picture-27.png">
+ <td><img class="thumb" src="1268854482173-dumpfm-loghorn-Picture-27.thumb.png">
+ </tr>
+ <tr>
+ <td><img class="big" src="1268845052790-dumpfm-foot-beads_placed_in_bone.gif ">
+ <td><img class="small" src="1268845052790-dumpfm-foot-beads_placed_in_bone.gif ">
+ <td><img class="thumb" src="1268845052790-dumpfm-foot-beads_placed_in_bone.thumb.gif ">
+ </tr>
+ </tbody>
+</table>
+
+
+</body>
+</html> \ No newline at end of file
diff --git a/static/tests/avatars/bg.gif b/static/tests/avatars/bg.gif
new file mode 100644
index 0000000..c7d2cbd
--- /dev/null
+++ b/static/tests/avatars/bg.gif
Binary files differ
diff --git a/static/tests/avatars2.html b/static/tests/avatars2.html
new file mode 100644
index 0000000..2c6460f
--- /dev/null
+++ b/static/tests/avatars2.html
@@ -0,0 +1,39 @@
+<html>
+<head>
+<style>
+</style>
+</head>
+<body>
+<div>
+<img src="http://www.gsarchives.net/nds/jump_superstars/sprites/animated/pla/Naruto_run.gif"><br>
+<img
+src="http://www.gsarchives.net/gameboyadvance/lego_star_wars_2/sprites/animated/playable/Stormtrooper_walk_south.gif"><br>
+<img
+src="http://www.gsarchives.net/gameboyadvance/mother_3/sprites/animated/npc-named/Mini-Porky_sirenred.gif"><br>
+<img
+src="http://www.gsarchives.net/gameboyadvance/mother_3/sprites/animated/enemies/Pigmask_Colonel_walk_southeast.gif"><br>
+<img
+src="http://www.gsarchives.net/gameboyadvance/mother_3/sprites/animated/playable/Duster_walk_southeast.gif"><br>
+<img src="http://www.gsarchives.net/nes/a_boy_and_his_blob/sprites/animated/NES_ABAHB_Blob_Stand-L_Ani.gif"><br>
+<img src="http://www.gsarchives.net/nes/a_boy_and_his_blob/sprites/animated/NES_ABAHB_Boy_Run-L_Ani.gif"><br>
+<img src="http://www.gsarchives.net/nes/kid_icarus/sprites/animated/kidic_nose.gif"><br>
+<img src="http://www.gsarchives.net/nes/super_mario_bros_2/sprites/animated/Char_LuigiSmall_Walk-L.gif"><br>
+<img src="http://www.gsarchives.net/nes/super_mario_bros_2/sprites/animated/Enemy_BobOmb-R.gif"><br>
+<img src="http://www.gsarchives.net/nes/super_mario_bros_2/sprites/animated/Boss3_Mouser.gif"><br>
+<img src="http://www.gsarchives.net/nes/super_mario_bros_2/sprites/animated/Object_RocketFly.gif"><br>
+<img src="http://www.gsarchives.net/nes/yo_noid/sprites/animated/Noid_earpull.gif"><br>
+<img src="http://www.gsarchives.net/nes/yo_noid/sprites/animated/RedNoidDancingLeft.gif"><br>
+<img
+src="http://dump.fm/avatars/20100526/1274899226905-dumpfm-noisia-1274373752899-dumpfm-noisia-Neko_animated.gif"><br>
+<img src="http://www.gsarchives.net/nes/pow/sprites/animated/player1%20walking%20right%20w%20knife.gif"><br>
+<img src="http://www.gsarchives.net/nes/pow/sprites/animated/Knife%20guard%20walk%20left.gif"><br>
+<img src="http://www.gsarchives.net/nes/pow/sprites/animated/player1%20gun%20mellee.gif"><br>
+<img src="http://www.gsarchives.net/nes/final_fantasy_3/sprites/animated/shamanwin.gif"><br>
+<img src="http://www.gsarchives.net/nes/final_fantasy_3/sprites/animated/onionkidgreenwin.gif"><br>
+<img src="http://www.gsarchives.net/nes/garfield/sprites/animated/garfield_catwalking_left.gif"><br>
+<img src="http://www.gsarchives.net/nes/garfield/sprites/animated/garfield_kick_right.gif"><br>
+<img src="http://www.gsarchives.net/nes/contra/sprites/animated/Scorpion_run_left.gif"><br>
+<img src="http://www.gsarchives.net/nes/addams_family/sprites/animated/nesaddamsfamilyenemyarmor2uh.gif"><br>
+</div>
+</body>
+</html>
diff --git a/static/tests/avatars3.html b/static/tests/avatars3.html
new file mode 100644
index 0000000..2b0c9ee
--- /dev/null
+++ b/static/tests/avatars3.html
@@ -0,0 +1,40 @@
+<html>
+<head>
+<style>
+img { width: 30px; height: 30px; }
+</style>
+</head>
+<body>
+<div>
+<img src="http://www.gsarchives.net/nds/jump_superstars/sprites/animated/pla/Naruto_run.gif"><br>
+<img
+src="http://www.gsarchives.net/gameboyadvance/lego_star_wars_2/sprites/animated/playable/Stormtrooper_walk_south.gif"><br>
+<img
+src="http://www.gsarchives.net/gameboyadvance/mother_3/sprites/animated/npc-named/Mini-Porky_sirenred.gif"><br>
+<img
+src="http://www.gsarchives.net/gameboyadvance/mother_3/sprites/animated/enemies/Pigmask_Colonel_walk_southeast.gif"><br>
+<img
+src="http://www.gsarchives.net/gameboyadvance/mother_3/sprites/animated/playable/Duster_walk_southeast.gif"><br>
+<img src="http://www.gsarchives.net/nes/a_boy_and_his_blob/sprites/animated/NES_ABAHB_Blob_Stand-L_Ani.gif"><br>
+<img src="http://www.gsarchives.net/nes/a_boy_and_his_blob/sprites/animated/NES_ABAHB_Boy_Run-L_Ani.gif"><br>
+<img src="http://www.gsarchives.net/nes/kid_icarus/sprites/animated/kidic_nose.gif"><br>
+<img src="http://www.gsarchives.net/nes/super_mario_bros_2/sprites/animated/Char_LuigiSmall_Walk-L.gif"><br>
+<img src="http://www.gsarchives.net/nes/super_mario_bros_2/sprites/animated/Enemy_BobOmb-R.gif"><br>
+<img src="http://www.gsarchives.net/nes/super_mario_bros_2/sprites/animated/Boss3_Mouser.gif"><br>
+<img src="http://www.gsarchives.net/nes/super_mario_bros_2/sprites/animated/Object_RocketFly.gif"><br>
+<img src="http://www.gsarchives.net/nes/yo_noid/sprites/animated/Noid_earpull.gif"><br>
+<img src="http://www.gsarchives.net/nes/yo_noid/sprites/animated/RedNoidDancingLeft.gif"><br>
+<img
+src="http://dump.fm/avatars/20100526/1274899226905-dumpfm-noisia-1274373752899-dumpfm-noisia-Neko_animated.gif"><br>
+<img src="http://www.gsarchives.net/nes/pow/sprites/animated/player1%20walking%20right%20w%20knife.gif"><br>
+<img src="http://www.gsarchives.net/nes/pow/sprites/animated/Knife%20guard%20walk%20left.gif"><br>
+<img src="http://www.gsarchives.net/nes/pow/sprites/animated/player1%20gun%20mellee.gif"><br>
+<img src="http://www.gsarchives.net/nes/final_fantasy_3/sprites/animated/shamanwin.gif"><br>
+<img src="http://www.gsarchives.net/nes/final_fantasy_3/sprites/animated/onionkidgreenwin.gif"><br>
+<img src="http://www.gsarchives.net/nes/garfield/sprites/animated/garfield_catwalking_left.gif"><br>
+<img src="http://www.gsarchives.net/nes/garfield/sprites/animated/garfield_kick_right.gif"><br>
+<img src="http://www.gsarchives.net/nes/contra/sprites/animated/Scorpion_run_left.gif"><br>
+<img src="http://www.gsarchives.net/nes/addams_family/sprites/animated/nesaddamsfamilyenemyarmor2uh.gif"><br>
+</div>
+</body>
+</html>
diff --git a/static/tests/canvas1/index.html b/static/tests/canvas1/index.html
new file mode 100644
index 0000000..dfff8af
--- /dev/null
+++ b/static/tests/canvas1/index.html
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en"><head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+
+
+ <script type="text/javascript" src="jsplatformer5_files/GameObject.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/VisualGameObject.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/RepeatingGameObject.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/AnimatedGameObject.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/Utils.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/ApplicationManager.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/GameObjectManager.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/Main.js"></script>
+ <style type="text/css">
+ body { font-family: Arial,Helvetica,sans-serif;}
+ </style>
+</head><body>
+
+ <canvas id="canvas" width="80" height="1200" >
+ <p>
+ Your browser does not support the canvas element.
+ </p>
+ </canvas>
+</body></html>
diff --git a/static/tests/canvas1/jsplatformer5_files/AnimatedGameObject.js b/static/tests/canvas1/jsplatformer5_files/AnimatedGameObject.js
new file mode 100644
index 0000000..895fc19
--- /dev/null
+++ b/static/tests/canvas1/jsplatformer5_files/AnimatedGameObject.js
@@ -0,0 +1,80 @@
+/**
+ Displays an animated Game Object
+ @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
+ @class
+*/
+function AnimatedGameObject()
+{
+ /**
+ Defines the current frame that is to be rendered
+ @type Number
+ */
+ this.currentFrame = 0;
+ /**
+ Defines the frames per second of the animation
+ @type Number
+ */
+ this.timeBetweenFrames = 0;
+ /**
+ The number of individual frames held in the image
+ @type Number
+ */
+ /**
+ Time until the next frame
+ @type number
+ */
+ this.timeSinceLastFrame = 0;
+ /**
+ The width of each individual frame
+ @type Number
+ */
+ this.frameWidth = 0;
+
+ /**
+ Initialises this object
+ @param image The image to be displayed
+ @param x The position on the X axis
+ @param y The position on the Y axis
+ @param z The depth
+ @param frameCount The number of animation frames in the image
+ @param fps The frames per second to animate this object at
+ */
+ this.startupAnimatedGameObject = function(/**Image*/ image, /**Number*/ x, /**Number*/ y, /**Number*/ z,
+/**Number*/ frameCount, /**Number*/ fps)
+ {
+ if (frameCount <= 0) throw "framecount can not be <= 0";
+ if (fps <= 0) throw "fps can not be <= 0"
+
+ this.startupVisualGameObject(image, x, y, z);
+ this.currentFrame = 0;
+ this.frameCount = frameCount;
+ this.timeBetweenFrames = 1/fps;
+ this.timeSinceLastFrame = this.timeBetweenFrames;
+ this.frameWidth = this.image.width / this.frameCount;
+ }
+
+ /**
+ Draws this element to the back buffer
+ @param dt Time in seconds since the last frame
+ @param context The context to draw to
+ @param xScroll The global scrolling value of the x axis
+ @param yScroll The global scrolling value of the y axis
+ */
+ this.draw = function(/**Number*/ dt, /**CanvasRenderingContext2D*/ context, /**Number*/ xScroll, /**Number*/
+yScroll)
+ {
+ var sourceX = this.frameWidth * this.currentFrame;
+ context.drawImage(this.image, sourceX, 0, this.frameWidth, this.image.height, this.x - xScroll, this.y -
+yScroll, this.frameWidth, this.image.height);
+
+ this.timeSinceLastFrame -= dt;
+ if (this.timeSinceLastFrame <= 0)
+ {
+ this.timeSinceLastFrame = this.timeBetweenFrames;
+ ++this.currentFrame;
+ this.currentFrame %= this.frameCount;
+ }
+ }
+}
+
+AnimatedGameObject.prototype = new VisualGameObject;
diff --git a/static/tests/canvas1/jsplatformer5_files/ApplicationManager.js b/static/tests/canvas1/jsplatformer5_files/ApplicationManager.js
new file mode 100644
index 0000000..487d4d8
--- /dev/null
+++ b/static/tests/canvas1/jsplatformer5_files/ApplicationManager.js
@@ -0,0 +1,42 @@
+/**
+ The ApplicationManager is used to manage the application itself.
+ @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
+ @class
+*/
+function ApplicationManager()
+{
+ /**
+ Initialises this object
+ @return A reference to the initialised object
+ */
+ this.startupApplicationManager = function()
+ {
+ this.runner = new AnimatedGameObject().startupAnimatedGameObject(g_run, 0, 0, 1, 12, 1);
+ this.runner1 = new AnimatedGameObject().startupAnimatedGameObject(g_run1, 0, 40, 1, 12, 2);
+ this.runner2 = new AnimatedGameObject().startupAnimatedGameObject(g_run2, 0, 80, 1, 12, 3);
+ this.runner3 = new AnimatedGameObject().startupAnimatedGameObject(g_run3, 0, 120, 1, 12, 4);
+ this.runner4 = new AnimatedGameObject().startupAnimatedGameObject(g_run4, 0, 160, 1, 12, 15);
+ this.runner5 = new AnimatedGameObject().startupAnimatedGameObject(g_run5, 0, 200, 1, 12, 16);
+ this.runner6 = new AnimatedGameObject().startupAnimatedGameObject(g_run6, 0, 240, 1, 12, 17);
+ this.runner7 = new AnimatedGameObject().startupAnimatedGameObject(g_run7, 0, 280, 1, 12, 18);
+ this.runner8 = new AnimatedGameObject().startupAnimatedGameObject(g_run8, 0, 320, 1, 12, 9);
+ this.runner9 = new AnimatedGameObject().startupAnimatedGameObject(g_run9, 0, 360, 1, 12, 10);
+ this.runner10 = new AnimatedGameObject().startupAnimatedGameObject(g_run10, 0, 400, 1, 12, 20);
+ this.runner11 = new AnimatedGameObject().startupAnimatedGameObject(g_run11, 0, 440, 1, 12, 19);
+ this.runner12 = new AnimatedGameObject().startupAnimatedGameObject(g_run12, 0, 480, 1, 12, 8);
+ this.runner13 = new AnimatedGameObject().startupAnimatedGameObject(g_run13, 0, 520, 1, 12, 7);
+ this.runner14 = new AnimatedGameObject().startupAnimatedGameObject(g_run14, 0, 560, 1, 12, 6);
+ this.runner15 = new AnimatedGameObject().startupAnimatedGameObject(g_run15, 0, 600, 1, 12, 5);
+ this.runner16 = new AnimatedGameObject().startupAnimatedGameObject(g_run16, 0, 640, 1, 12, 14);
+ this.runner17 = new AnimatedGameObject().startupAnimatedGameObject(g_run17, 0, 680, 1, 12, 13);
+ this.runner18 = new AnimatedGameObject().startupAnimatedGameObject(g_run18, 0, 720, 1, 12, 12);
+ this.runner19 = new AnimatedGameObject().startupAnimatedGameObject(g_run19, 0, 760, 1, 12, 11);
+ this.runner20 = new AnimatedGameObject().startupAnimatedGameObject(g_run20, 0, 800, 1, 12, 21);
+ this.runner21 = new AnimatedGameObject().startupAnimatedGameObject(g_run21, 0, 840, 1, 12, 22);
+ this.runner22 = new AnimatedGameObject().startupAnimatedGameObject(g_run22, 0, 880, 1, 12, 23);
+ this.runner23 = new AnimatedGameObject().startupAnimatedGameObject(g_run23, 0, 920, 1, 12, 24);
+ this.runner24 = new AnimatedGameObject().startupAnimatedGameObject(g_run24, 0, 960, 1, 12, 25);
+ this.runner25 = new AnimatedGameObject().startupAnimatedGameObject(g_run25, 0, 1000, 1, 12, 30);
+ return this;
+ }
+}
diff --git a/static/tests/canvas1/jsplatformer5_files/GameObject.js b/static/tests/canvas1/jsplatformer5_files/GameObject.js
new file mode 100644
index 0000000..e6e4e09
--- /dev/null
+++ b/static/tests/canvas1/jsplatformer5_files/GameObject.js
@@ -0,0 +1,46 @@
+/**
+ The base class for all elements that appear in the game.
+ @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
+ @class
+*/
+function GameObject()
+{
+ /** Display depth order. A smaller zOrder means the element is rendered first, and therefor
+ in the background.
+ @type Number
+ */
+ this.zOrder = 0;
+ /**
+ The position on the X axis
+ @type Number
+ */
+ this.x = 0;
+ /**
+ The position on the Y axis
+ @type Number
+ */
+ this.y = 0;
+
+ /**
+ Initialises the object, and adds it to the list of objects held by the GameObjectManager.
+ @param x The position on the X axis
+ @param y The position on the Y axis
+ @param z The z order of the element (elements in the background have a lower z value)
+ */
+ this.startupGameObject = function(/**Number*/ x, /**Number*/ y, /**Number*/ z)
+ {
+ this.zOrder = z;
+ this.x = x;
+ this.y = y;
+ g_GameObjectManager.addGameObject(this);
+ return this;
+ }
+
+ /**
+ Cleans up the object, and removes it from the list of objects held by the GameObjectManager.
+ */
+ this.shutdownGameObject = function()
+ {
+ g_GameObjectManager.removeGameObject(this);
+ }
+}
diff --git a/static/tests/canvas1/jsplatformer5_files/GameObjectManager.js b/static/tests/canvas1/jsplatformer5_files/GameObjectManager.js
new file mode 100644
index 0000000..c22ccd0
--- /dev/null
+++ b/static/tests/canvas1/jsplatformer5_files/GameObjectManager.js
@@ -0,0 +1,125 @@
+/**
+ A manager for all the objects in the game
+ @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
+ @class
+*/
+function GameObjectManager()
+{
+ /** An array of game objects
+ @type Arary
+ */
+ this.gameObjects = new Array();
+ /** The time that the last frame was rendered
+ @type Date
+ */
+ this.lastFrame = new Date().getTime();
+ /** The global scrolling value of the x axis
+ @type Number
+ */
+ this.xScroll = 0;
+ /** The global scrolling value of the y axis
+ @type Number
+ */
+ this.yScroll = 0;
+ /** A reference to the ApplicationManager instance
+ @type ApplicationManager
+ */
+ this.applicationManager = null;
+ /** A reference to the canvas element
+ @type HTMLCanvasElement
+ */
+ this.canvas = null;
+ /** A reference to the 2D context of the canvas element
+ @type CanvasRenderingContext2D
+ */
+ this.context2D = null;
+ /** A reference to the in-memory canvas used as a back buffer
+ @type HTMLCanvasElement
+ */
+ this.backBuffer = null;
+ /** A reference to the backbuffer 2D context
+ @type CanvasRenderingContext2D
+ */
+ this.backBufferContext2D = null;
+
+ /**
+ Initialises this object
+ @return A reference to the initialised object
+ */
+ this.startupGameObjectManager = function()
+ {
+ // set the global pointer to reference this object
+ g_GameObjectManager = this;
+
+ // get references to the canvas elements and their 2D contexts
+ this.canvas = document.getElementById('canvas');
+ this.context2D = this.canvas.getContext('2d');
+ this.backBuffer = document.createElement('canvas');
+ this.backBuffer.width = this.canvas.width;
+ this.backBuffer.height = this.canvas.height;
+ this.backBufferContext2D = this.backBuffer.getContext('2d');
+
+ // create a new ApplicationManager
+ this.applicationManager = new ApplicationManager().startupApplicationManager();
+
+ // use setInterval to call the draw function
+ setInterval(function(){g_GameObjectManager.draw();}, SECONDS_BETWEEN_FRAMES);
+
+ return this;
+ }
+
+ /**
+ The render loop
+ */
+ this.draw = function ()
+ {
+ // calculate the time since the last frame
+ var thisFrame = new Date().getTime();
+ var dt = (thisFrame - this.lastFrame)/1000;
+ this.lastFrame = thisFrame;
+
+ // clear the drawing contexts
+ this.backBufferContext2D.clearRect(0, 0, this.backBuffer.width, this.backBuffer.height);
+ this.context2D.clearRect(0, 0, this.canvas.width, this.canvas.height);
+
+ // first update all the game objects
+ for (x in this.gameObjects)
+ {
+ if (this.gameObjects[x].update)
+ {
+ this.gameObjects[x].update(dt, this.backBufferContext2D, this.xScroll, this.yScroll);
+ }
+ }
+
+ // then draw the game objects
+ for (x in this.gameObjects)
+ {
+ if (this.gameObjects[x].draw)
+ {
+ this.gameObjects[x].draw(dt, this.backBufferContext2D, this.xScroll, this.yScroll);
+ }
+ }
+
+ // copy the back buffer to the displayed canvas
+ this.context2D.drawImage(this.backBuffer, 0, 0);
+ };
+
+ /**
+ Adds a new GameObject to the gameObjects collection
+ @param gameObject The object to add
+ */
+ this.addGameObject = function(gameObject)
+ {
+ this.gameObjects.push(gameObject);
+ this.gameObjects.sort(function(a,b){return a.zOrder - b.zOrder;})
+ };
+
+ /**
+ Removes a GameObject from the gameObjects collection
+ @param gameObject The object to remove
+ */
+ this.removeGameObject = function(gameObject)
+ {
+ this.gameObjects.removeObject(gameObject);
+ }
+}
diff --git a/static/tests/canvas1/jsplatformer5_files/Main.js b/static/tests/canvas1/jsplatformer5_files/Main.js
new file mode 100644
index 0000000..752ffa4
--- /dev/null
+++ b/static/tests/canvas1/jsplatformer5_files/Main.js
@@ -0,0 +1,81 @@
+/** target frames per second
+ @type Number
+*/
+var FPS = 30;
+/** time between frames
+ @type Number
+*/
+var SECONDS_BETWEEN_FRAMES = 1 / FPS;
+/** A global reference to the GameObjectManager instance
+ @type GameObjectManager
+*/
+var g_GameObjectManager = null;
+/** An image to be used by the application
+ @type Image
+*/
+var g_run = new Image();
+var g_run1 = new Image();
+var g_run2 = new Image();
+var g_run3 = new Image();
+var g_run4 = new Image();
+var g_run5 = new Image();
+var g_run6 = new Image();
+var g_run7 = new Image();
+var g_run8 = new Image();
+var g_run9 = new Image();
+var g_run10 = new Image();
+var g_run11 = new Image();
+var g_run12 = new Image();
+var g_run13 = new Image();
+var g_run14 = new Image();
+var g_run15 = new Image();
+var g_run16 = new Image();
+var g_run17 = new Image();
+var g_run18 = new Image();
+var g_run19 = new Image();
+var g_run20 = new Image();
+var g_run21 = new Image();
+var g_run22 = new Image();
+var g_run23 = new Image();
+var g_run24 = new Image();
+var g_run25 = new Image();
+
+g_run.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run1.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run2.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run3.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run4.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run5.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run6.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run7.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run8.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run9.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run10.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run11.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run12.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run13.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run14.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run15.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run16.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run17.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run18.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run19.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run20.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run21.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run22.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run23.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run24.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run25.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+
+
+
+// The entry point of the application is set to the init function
+window.onload = init;
+
+/**
+ Application entry point
+*/
+function init()
+{
+ new GameObjectManager().startupGameObjectManager();
+}
diff --git a/static/tests/canvas1/jsplatformer5_files/RepeatingGameObject.js b/static/tests/canvas1/jsplatformer5_files/RepeatingGameObject.js
new file mode 100644
index 0000000..b145e97
--- /dev/null
+++ b/static/tests/canvas1/jsplatformer5_files/RepeatingGameObject.js
@@ -0,0 +1,90 @@
+/**
+ A class that display a repeating texture that can optionall be offset in either
+ the x or y axis
+ @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
+ @class
+*/
+function RepeatingGameObject()
+{
+ /** The width that the final image will take up
+ @type Number
+ */
+ this.width = 0;
+ /** The height that the final image will take up
+ @type Number
+ */
+ this.height = 0;
+ /** How much of the scrollX and scrollY to apply when drawing
+ @type Number
+ */
+ this.scrollFactor = 1;
+
+ /**
+ Initialises this object
+ @return A reference to the initialised object
+ */
+ this.startupRepeatingGameObject = function(image, x, y, z, width, height, scrollFactor)
+ {
+ this.startupVisualGameObject(image, x, y, z);
+ this.width = width;
+ this.height = height;
+ this.scrollFactor = scrollFactor;
+ return this;
+ }
+
+ /**
+ Clean this object up
+ */
+ this.shutdownstartupRepeatingGameObject = function()
+ {
+ this.shutdownVisualGameObject();
+ }
+
+ /**
+ Draws this element to the back buffer
+ @param dt Time in seconds since the last frame
+ @param context The context to draw to
+ @param xScroll The global scrolling value of the x axis
+ @param yScroll The global scrolling value of the y axis
+ */
+ this.draw = function(dt, canvas, xScroll, yScroll)
+ {
+ var areaDrawn = [0, 0];
+
+ for (var y = 0; y < this.height; y += areaDrawn[1])
+ {
+ for (var x = 0; x < this.width; x += areaDrawn[0])
+ {
+ // the top left corner to start drawing the next tile from
+ var newPosition = [this.x + x, this.y + y];
+ // the amount of space left in which to draw
+ var newFillArea = [this.width - x, this.height - y];
+ // the first time around you have to start drawing from the middle of the image
+ // subsequent tiles alwyas get drawn from the top or left
+ var newScrollPosition = [0, 0];
+ if (x==0) newScrollPosition[0] = xScroll * this.scrollFactor;
+ if (y==0) newScrollPosition[1] = yScroll * this.scrollFactor;
+ areaDrawn = this.drawRepeat(canvas, newPosition, newFillArea, newScrollPosition);
+ }
+ }
+ }
+
+ this.drawRepeat = function(canvas, newPosition, newFillArea, newScrollPosition)
+ {
+ // find where in our repeating texture to start drawing (the top left corner)
+ var xOffset = Math.abs(newScrollPosition[0]) % this.image.width;
+ var yOffset = Math.abs(newScrollPosition[1]) % this.image.height;
+ var left = newScrollPosition[0]<0?this.image.width-xOffset:xOffset;
+ var top = newScrollPosition[1]<0?this.image.height-yOffset:yOffset;
+ var width = newFillArea[0] < this.image.width-left?newFillArea[0]:this.image.width-left;
+ var height = newFillArea[1] < this.image.height-top?newFillArea[1]:this.image.height-top;
+
+ // draw the image
+ canvas.drawImage(this.image, left, top, width, height, newPosition[0], newPosition[1], width, height);
+
+ return [width, height];
+ }
+
+
+}
+RepeatingGameObject.prototype = new VisualGameObject();
diff --git a/static/tests/canvas1/jsplatformer5_files/Utils.js b/static/tests/canvas1/jsplatformer5_files/Utils.js
new file mode 100644
index 0000000..0ec5cfa
--- /dev/null
+++ b/static/tests/canvas1/jsplatformer5_files/Utils.js
@@ -0,0 +1,27 @@
+/**
+ Removes a number of objects from the array
+ @param from The first object to remove
+ @param to (Optional) The last object to remove
+*/
+Array.prototype.remove = function(/**Number*/ from, /**Number*/ to)
+{
+ var rest = this.slice((to || from) + 1 || this.length);
+ this.length = from < 0 ? this.length + from : from;
+ return this.push.apply(this, rest);
+};
+
+/**
+ Removes a specific object from the array
+ @param object The object to remove
+*/
+Array.prototype.removeObject = function(object)
+{
+ for (var i = 0; i < this.length; ++i)
+ {
+ if (this[i] === object)
+ {
+ this.remove(i);
+ break;
+ }
+ }
+}
diff --git a/static/tests/canvas1/jsplatformer5_files/VisualGameObject.js b/static/tests/canvas1/jsplatformer5_files/VisualGameObject.js
new file mode 100644
index 0000000..3f3329a
--- /dev/null
+++ b/static/tests/canvas1/jsplatformer5_files/VisualGameObject.js
@@ -0,0 +1,49 @@
+/**
+ The base class for all elements that appear in the game.
+ @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
+ @class
+*/
+function VisualGameObject()
+{
+ /**
+ The image that will be displayed by this object
+ @type Image
+ */
+ this.image = null;
+
+ /**
+ Draws this element to the back buffer
+ @param dt Time in seconds since the last frame
+ @param context The context to draw to
+ @param xScroll The global scrolling value of the x axis
+ @param yScroll The global scrolling value of the y axis
+ */
+ this.draw = function(/**Number*/ dt, /**CanvasRenderingContext2D*/ context, /**Number*/ xScroll, /**Number*/
+yScroll)
+ {
+ context.drawImage(this.image, this.x - xScroll, this.y - yScroll);
+ }
+
+ /**
+ Initialises this object
+ @param image The image to be displayed
+ @param x The position on the X axis
+ @param y The position on the Y axis
+ @param z The depth
+ */
+ this.startupVisualGameObject = function(/**Image*/ image, /**Number*/ x, /**Number*/ y, /**Number*/ z)
+ {
+ this.startupGameObject(x, y, z);
+ this.image = image;
+ return this;
+ }
+
+ /**
+ Clean this object up
+ */
+ this.shutdownVisualGameObject = function()
+ {
+ this.shutdownGameObject();
+ }
+}
+VisualGameObject.prototype = new GameObject;
diff --git a/static/tests/canvas2/index.html b/static/tests/canvas2/index.html
new file mode 100644
index 0000000..dfff8af
--- /dev/null
+++ b/static/tests/canvas2/index.html
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en"><head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
+
+
+ <script type="text/javascript" src="jsplatformer5_files/GameObject.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/VisualGameObject.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/RepeatingGameObject.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/AnimatedGameObject.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/Utils.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/ApplicationManager.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/GameObjectManager.js"></script>
+ <script type="text/javascript" src="jsplatformer5_files/Main.js"></script>
+ <style type="text/css">
+ body { font-family: Arial,Helvetica,sans-serif;}
+ </style>
+</head><body>
+
+ <canvas id="canvas" width="80" height="1200" >
+ <p>
+ Your browser does not support the canvas element.
+ </p>
+ </canvas>
+</body></html>
diff --git a/static/tests/canvas2/jsplatformer5_files/AnimatedGameObject.js b/static/tests/canvas2/jsplatformer5_files/AnimatedGameObject.js
new file mode 100644
index 0000000..895fc19
--- /dev/null
+++ b/static/tests/canvas2/jsplatformer5_files/AnimatedGameObject.js
@@ -0,0 +1,80 @@
+/**
+ Displays an animated Game Object
+ @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
+ @class
+*/
+function AnimatedGameObject()
+{
+ /**
+ Defines the current frame that is to be rendered
+ @type Number
+ */
+ this.currentFrame = 0;
+ /**
+ Defines the frames per second of the animation
+ @type Number
+ */
+ this.timeBetweenFrames = 0;
+ /**
+ The number of individual frames held in the image
+ @type Number
+ */
+ /**
+ Time until the next frame
+ @type number
+ */
+ this.timeSinceLastFrame = 0;
+ /**
+ The width of each individual frame
+ @type Number
+ */
+ this.frameWidth = 0;
+
+ /**
+ Initialises this object
+ @param image The image to be displayed
+ @param x The position on the X axis
+ @param y The position on the Y axis
+ @param z The depth
+ @param frameCount The number of animation frames in the image
+ @param fps The frames per second to animate this object at
+ */
+ this.startupAnimatedGameObject = function(/**Image*/ image, /**Number*/ x, /**Number*/ y, /**Number*/ z,
+/**Number*/ frameCount, /**Number*/ fps)
+ {
+ if (frameCount <= 0) throw "framecount can not be <= 0";
+ if (fps <= 0) throw "fps can not be <= 0"
+
+ this.startupVisualGameObject(image, x, y, z);
+ this.currentFrame = 0;
+ this.frameCount = frameCount;
+ this.timeBetweenFrames = 1/fps;
+ this.timeSinceLastFrame = this.timeBetweenFrames;
+ this.frameWidth = this.image.width / this.frameCount;
+ }
+
+ /**
+ Draws this element to the back buffer
+ @param dt Time in seconds since the last frame
+ @param context The context to draw to
+ @param xScroll The global scrolling value of the x axis
+ @param yScroll The global scrolling value of the y axis
+ */
+ this.draw = function(/**Number*/ dt, /**CanvasRenderingContext2D*/ context, /**Number*/ xScroll, /**Number*/
+yScroll)
+ {
+ var sourceX = this.frameWidth * this.currentFrame;
+ context.drawImage(this.image, sourceX, 0, this.frameWidth, this.image.height, this.x - xScroll, this.y -
+yScroll, this.frameWidth, this.image.height);
+
+ this.timeSinceLastFrame -= dt;
+ if (this.timeSinceLastFrame <= 0)
+ {
+ this.timeSinceLastFrame = this.timeBetweenFrames;
+ ++this.currentFrame;
+ this.currentFrame %= this.frameCount;
+ }
+ }
+}
+
+AnimatedGameObject.prototype = new VisualGameObject;
diff --git a/static/tests/canvas2/jsplatformer5_files/ApplicationManager.js b/static/tests/canvas2/jsplatformer5_files/ApplicationManager.js
new file mode 100644
index 0000000..e572e02
--- /dev/null
+++ b/static/tests/canvas2/jsplatformer5_files/ApplicationManager.js
@@ -0,0 +1,42 @@
+/**
+ The ApplicationManager is used to manage the application itself.
+ @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
+ @class
+*/
+function ApplicationManager()
+{
+ /**
+ Initialises this object
+ @return A reference to the initialised object
+ */
+ this.startupApplicationManager = function()
+ {
+ this.runner = new AnimatedGameObject().startupAnimatedGameObject(g_run, 0, 0, 1, 12, 10);
+ this.runner1 = new AnimatedGameObject().startupAnimatedGameObject(g_run1, 0, 40, 1, 12, 10);
+ this.runner2 = new AnimatedGameObject().startupAnimatedGameObject(g_run2, 0, 80, 1, 12, 10);
+ this.runner3 = new AnimatedGameObject().startupAnimatedGameObject(g_run3, 0, 120, 1, 12, 10);
+ this.runner4 = new AnimatedGameObject().startupAnimatedGameObject(g_run4, 0, 160, 1, 12, 10);
+ this.runner5 = new AnimatedGameObject().startupAnimatedGameObject(g_run5, 0, 200, 1, 12, 10);
+ this.runner6 = new AnimatedGameObject().startupAnimatedGameObject(g_run6, 0, 240, 1, 12, 10);
+ this.runner7 = new AnimatedGameObject().startupAnimatedGameObject(g_run7, 0, 280, 1, 12, 10);
+ this.runner8 = new AnimatedGameObject().startupAnimatedGameObject(g_run8, 0, 320, 1, 12, 10);
+ this.runner9 = new AnimatedGameObject().startupAnimatedGameObject(g_run9, 0, 360, 1, 12, 10);
+ this.runner10 = new AnimatedGameObject().startupAnimatedGameObject(g_run10, 0, 400, 1, 12, 10);
+ this.runner11 = new AnimatedGameObject().startupAnimatedGameObject(g_run11, 0, 440, 1, 12, 10);
+ this.runner12 = new AnimatedGameObject().startupAnimatedGameObject(g_run12, 0, 480, 1, 12, 10);
+ this.runner13 = new AnimatedGameObject().startupAnimatedGameObject(g_run13, 0, 520, 1, 12, 10);
+ this.runner14 = new AnimatedGameObject().startupAnimatedGameObject(g_run14, 0, 560, 1, 12, 10);
+ this.runner15 = new AnimatedGameObject().startupAnimatedGameObject(g_run15, 0, 600, 1, 12, 10);
+ this.runner16 = new AnimatedGameObject().startupAnimatedGameObject(g_run16, 0, 640, 1, 12, 10);
+ this.runner17 = new AnimatedGameObject().startupAnimatedGameObject(g_run17, 0, 680, 1, 12, 10);
+ this.runner18 = new AnimatedGameObject().startupAnimatedGameObject(g_run18, 0, 720, 1, 12, 10);
+ this.runner19 = new AnimatedGameObject().startupAnimatedGameObject(g_run19, 0, 760, 1, 12, 10);
+ this.runner20 = new AnimatedGameObject().startupAnimatedGameObject(g_run20, 0, 800, 1, 12, 10);
+ this.runner21 = new AnimatedGameObject().startupAnimatedGameObject(g_run21, 0, 840, 1, 12, 10);
+ this.runner22 = new AnimatedGameObject().startupAnimatedGameObject(g_run22, 0, 880, 1, 12, 10);
+ this.runner23 = new AnimatedGameObject().startupAnimatedGameObject(g_run23, 0, 920, 1, 12, 10);
+ this.runner24 = new AnimatedGameObject().startupAnimatedGameObject(g_run24, 0, 960, 1, 12, 10);
+ this.runner25 = new AnimatedGameObject().startupAnimatedGameObject(g_run25, 0, 1000, 1, 12, 10);
+ return this;
+ }
+}
diff --git a/static/tests/canvas2/jsplatformer5_files/GameObject.js b/static/tests/canvas2/jsplatformer5_files/GameObject.js
new file mode 100644
index 0000000..e6e4e09
--- /dev/null
+++ b/static/tests/canvas2/jsplatformer5_files/GameObject.js
@@ -0,0 +1,46 @@
+/**
+ The base class for all elements that appear in the game.
+ @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
+ @class
+*/
+function GameObject()
+{
+ /** Display depth order. A smaller zOrder means the element is rendered first, and therefor
+ in the background.
+ @type Number
+ */
+ this.zOrder = 0;
+ /**
+ The position on the X axis
+ @type Number
+ */
+ this.x = 0;
+ /**
+ The position on the Y axis
+ @type Number
+ */
+ this.y = 0;
+
+ /**
+ Initialises the object, and adds it to the list of objects held by the GameObjectManager.
+ @param x The position on the X axis
+ @param y The position on the Y axis
+ @param z The z order of the element (elements in the background have a lower z value)
+ */
+ this.startupGameObject = function(/**Number*/ x, /**Number*/ y, /**Number*/ z)
+ {
+ this.zOrder = z;
+ this.x = x;
+ this.y = y;
+ g_GameObjectManager.addGameObject(this);
+ return this;
+ }
+
+ /**
+ Cleans up the object, and removes it from the list of objects held by the GameObjectManager.
+ */
+ this.shutdownGameObject = function()
+ {
+ g_GameObjectManager.removeGameObject(this);
+ }
+}
diff --git a/static/tests/canvas2/jsplatformer5_files/GameObjectManager.js b/static/tests/canvas2/jsplatformer5_files/GameObjectManager.js
new file mode 100644
index 0000000..c22ccd0
--- /dev/null
+++ b/static/tests/canvas2/jsplatformer5_files/GameObjectManager.js
@@ -0,0 +1,125 @@
+/**
+ A manager for all the objects in the game
+ @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
+ @class
+*/
+function GameObjectManager()
+{
+ /** An array of game objects
+ @type Arary
+ */
+ this.gameObjects = new Array();
+ /** The time that the last frame was rendered
+ @type Date
+ */
+ this.lastFrame = new Date().getTime();
+ /** The global scrolling value of the x axis
+ @type Number
+ */
+ this.xScroll = 0;
+ /** The global scrolling value of the y axis
+ @type Number
+ */
+ this.yScroll = 0;
+ /** A reference to the ApplicationManager instance
+ @type ApplicationManager
+ */
+ this.applicationManager = null;
+ /** A reference to the canvas element
+ @type HTMLCanvasElement
+ */
+ this.canvas = null;
+ /** A reference to the 2D context of the canvas element
+ @type CanvasRenderingContext2D
+ */
+ this.context2D = null;
+ /** A reference to the in-memory canvas used as a back buffer
+ @type HTMLCanvasElement
+ */
+ this.backBuffer = null;
+ /** A reference to the backbuffer 2D context
+ @type CanvasRenderingContext2D
+ */
+ this.backBufferContext2D = null;
+
+ /**
+ Initialises this object
+ @return A reference to the initialised object
+ */
+ this.startupGameObjectManager = function()
+ {
+ // set the global pointer to reference this object
+ g_GameObjectManager = this;
+
+ // get references to the canvas elements and their 2D contexts
+ this.canvas = document.getElementById('canvas');
+ this.context2D = this.canvas.getContext('2d');
+ this.backBuffer = document.createElement('canvas');
+ this.backBuffer.width = this.canvas.width;
+ this.backBuffer.height = this.canvas.height;
+ this.backBufferContext2D = this.backBuffer.getContext('2d');
+
+ // create a new ApplicationManager
+ this.applicationManager = new ApplicationManager().startupApplicationManager();
+
+ // use setInterval to call the draw function
+ setInterval(function(){g_GameObjectManager.draw();}, SECONDS_BETWEEN_FRAMES);
+
+ return this;
+ }
+
+ /**
+ The render loop
+ */
+ this.draw = function ()
+ {
+ // calculate the time since the last frame
+ var thisFrame = new Date().getTime();
+ var dt = (thisFrame - this.lastFrame)/1000;
+ this.lastFrame = thisFrame;
+
+ // clear the drawing contexts
+ this.backBufferContext2D.clearRect(0, 0, this.backBuffer.width, this.backBuffer.height);
+ this.context2D.clearRect(0, 0, this.canvas.width, this.canvas.height);
+
+ // first update all the game objects
+ for (x in this.gameObjects)
+ {
+ if (this.gameObjects[x].update)
+ {
+ this.gameObjects[x].update(dt, this.backBufferContext2D, this.xScroll, this.yScroll);
+ }
+ }
+
+ // then draw the game objects
+ for (x in this.gameObjects)
+ {
+ if (this.gameObjects[x].draw)
+ {
+ this.gameObjects[x].draw(dt, this.backBufferContext2D, this.xScroll, this.yScroll);
+ }
+ }
+
+ // copy the back buffer to the displayed canvas
+ this.context2D.drawImage(this.backBuffer, 0, 0);
+ };
+
+ /**
+ Adds a new GameObject to the gameObjects collection
+ @param gameObject The object to add
+ */
+ this.addGameObject = function(gameObject)
+ {
+ this.gameObjects.push(gameObject);
+ this.gameObjects.sort(function(a,b){return a.zOrder - b.zOrder;})
+ };
+
+ /**
+ Removes a GameObject from the gameObjects collection
+ @param gameObject The object to remove
+ */
+ this.removeGameObject = function(gameObject)
+ {
+ this.gameObjects.removeObject(gameObject);
+ }
+}
diff --git a/static/tests/canvas2/jsplatformer5_files/Main.js b/static/tests/canvas2/jsplatformer5_files/Main.js
new file mode 100644
index 0000000..752ffa4
--- /dev/null
+++ b/static/tests/canvas2/jsplatformer5_files/Main.js
@@ -0,0 +1,81 @@
+/** target frames per second
+ @type Number
+*/
+var FPS = 30;
+/** time between frames
+ @type Number
+*/
+var SECONDS_BETWEEN_FRAMES = 1 / FPS;
+/** A global reference to the GameObjectManager instance
+ @type GameObjectManager
+*/
+var g_GameObjectManager = null;
+/** An image to be used by the application
+ @type Image
+*/
+var g_run = new Image();
+var g_run1 = new Image();
+var g_run2 = new Image();
+var g_run3 = new Image();
+var g_run4 = new Image();
+var g_run5 = new Image();
+var g_run6 = new Image();
+var g_run7 = new Image();
+var g_run8 = new Image();
+var g_run9 = new Image();
+var g_run10 = new Image();
+var g_run11 = new Image();
+var g_run12 = new Image();
+var g_run13 = new Image();
+var g_run14 = new Image();
+var g_run15 = new Image();
+var g_run16 = new Image();
+var g_run17 = new Image();
+var g_run18 = new Image();
+var g_run19 = new Image();
+var g_run20 = new Image();
+var g_run21 = new Image();
+var g_run22 = new Image();
+var g_run23 = new Image();
+var g_run24 = new Image();
+var g_run25 = new Image();
+
+g_run.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run1.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run2.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run3.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run4.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run5.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run6.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run7.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run8.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run9.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run10.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run11.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run12.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run13.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run14.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run15.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run16.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run17.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run18.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run19.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run20.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run21.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run22.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run23.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run24.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+g_run25.src = "http://webdemos.sourceforge.net/jsplatformer5/run.png";
+
+
+
+// The entry point of the application is set to the init function
+window.onload = init;
+
+/**
+ Application entry point
+*/
+function init()
+{
+ new GameObjectManager().startupGameObjectManager();
+}
diff --git a/static/tests/canvas2/jsplatformer5_files/RepeatingGameObject.js b/static/tests/canvas2/jsplatformer5_files/RepeatingGameObject.js
new file mode 100644
index 0000000..b145e97
--- /dev/null
+++ b/static/tests/canvas2/jsplatformer5_files/RepeatingGameObject.js
@@ -0,0 +1,90 @@
+/**
+ A class that display a repeating texture that can optionall be offset in either
+ the x or y axis
+ @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
+ @class
+*/
+function RepeatingGameObject()
+{
+ /** The width that the final image will take up
+ @type Number
+ */
+ this.width = 0;
+ /** The height that the final image will take up
+ @type Number
+ */
+ this.height = 0;
+ /** How much of the scrollX and scrollY to apply when drawing
+ @type Number
+ */
+ this.scrollFactor = 1;
+
+ /**
+ Initialises this object
+ @return A reference to the initialised object
+ */
+ this.startupRepeatingGameObject = function(image, x, y, z, width, height, scrollFactor)
+ {
+ this.startupVisualGameObject(image, x, y, z);
+ this.width = width;
+ this.height = height;
+ this.scrollFactor = scrollFactor;
+ return this;
+ }
+
+ /**
+ Clean this object up
+ */
+ this.shutdownstartupRepeatingGameObject = function()
+ {
+ this.shutdownVisualGameObject();
+ }
+
+ /**
+ Draws this element to the back buffer
+ @param dt Time in seconds since the last frame
+ @param context The context to draw to
+ @param xScroll The global scrolling value of the x axis
+ @param yScroll The global scrolling value of the y axis
+ */
+ this.draw = function(dt, canvas, xScroll, yScroll)
+ {
+ var areaDrawn = [0, 0];
+
+ for (var y = 0; y < this.height; y += areaDrawn[1])
+ {
+ for (var x = 0; x < this.width; x += areaDrawn[0])
+ {
+ // the top left corner to start drawing the next tile from
+ var newPosition = [this.x + x, this.y + y];
+ // the amount of space left in which to draw
+ var newFillArea = [this.width - x, this.height - y];
+ // the first time around you have to start drawing from the middle of the image
+ // subsequent tiles alwyas get drawn from the top or left
+ var newScrollPosition = [0, 0];
+ if (x==0) newScrollPosition[0] = xScroll * this.scrollFactor;
+ if (y==0) newScrollPosition[1] = yScroll * this.scrollFactor;
+ areaDrawn = this.drawRepeat(canvas, newPosition, newFillArea, newScrollPosition);
+ }
+ }
+ }
+
+ this.drawRepeat = function(canvas, newPosition, newFillArea, newScrollPosition)
+ {
+ // find where in our repeating texture to start drawing (the top left corner)
+ var xOffset = Math.abs(newScrollPosition[0]) % this.image.width;
+ var yOffset = Math.abs(newScrollPosition[1]) % this.image.height;
+ var left = newScrollPosition[0]<0?this.image.width-xOffset:xOffset;
+ var top = newScrollPosition[1]<0?this.image.height-yOffset:yOffset;
+ var width = newFillArea[0] < this.image.width-left?newFillArea[0]:this.image.width-left;
+ var height = newFillArea[1] < this.image.height-top?newFillArea[1]:this.image.height-top;
+
+ // draw the image
+ canvas.drawImage(this.image, left, top, width, height, newPosition[0], newPosition[1], width, height);
+
+ return [width, height];
+ }
+
+
+}
+RepeatingGameObject.prototype = new VisualGameObject();
diff --git a/static/tests/canvas2/jsplatformer5_files/Utils.js b/static/tests/canvas2/jsplatformer5_files/Utils.js
new file mode 100644
index 0000000..0ec5cfa
--- /dev/null
+++ b/static/tests/canvas2/jsplatformer5_files/Utils.js
@@ -0,0 +1,27 @@
+/**
+ Removes a number of objects from the array
+ @param from The first object to remove
+ @param to (Optional) The last object to remove
+*/
+Array.prototype.remove = function(/**Number*/ from, /**Number*/ to)
+{
+ var rest = this.slice((to || from) + 1 || this.length);
+ this.length = from < 0 ? this.length + from : from;
+ return this.push.apply(this, rest);
+};
+
+/**
+ Removes a specific object from the array
+ @param object The object to remove
+*/
+Array.prototype.removeObject = function(object)
+{
+ for (var i = 0; i < this.length; ++i)
+ {
+ if (this[i] === object)
+ {
+ this.remove(i);
+ break;
+ }
+ }
+}
diff --git a/static/tests/canvas2/jsplatformer5_files/VisualGameObject.js b/static/tests/canvas2/jsplatformer5_files/VisualGameObject.js
new file mode 100644
index 0000000..3f3329a
--- /dev/null
+++ b/static/tests/canvas2/jsplatformer5_files/VisualGameObject.js
@@ -0,0 +1,49 @@
+/**
+ The base class for all elements that appear in the game.
+ @author <a href="mailto:matthewcasperson@gmail.com">Matthew Casperson</a>
+ @class
+*/
+function VisualGameObject()
+{
+ /**
+ The image that will be displayed by this object
+ @type Image
+ */
+ this.image = null;
+
+ /**
+ Draws this element to the back buffer
+ @param dt Time in seconds since the last frame
+ @param context The context to draw to
+ @param xScroll The global scrolling value of the x axis
+ @param yScroll The global scrolling value of the y axis
+ */
+ this.draw = function(/**Number*/ dt, /**CanvasRenderingContext2D*/ context, /**Number*/ xScroll, /**Number*/
+yScroll)
+ {
+ context.drawImage(this.image, this.x - xScroll, this.y - yScroll);
+ }
+
+ /**
+ Initialises this object
+ @param image The image to be displayed
+ @param x The position on the X axis
+ @param y The position on the Y axis
+ @param z The depth
+ */
+ this.startupVisualGameObject = function(/**Image*/ image, /**Number*/ x, /**Number*/ y, /**Number*/ z)
+ {
+ this.startupGameObject(x, y, z);
+ this.image = image;
+ return this;
+ }
+
+ /**
+ Clean this object up
+ */
+ this.shutdownVisualGameObject = function()
+ {
+ this.shutdownGameObject();
+ }
+}
+VisualGameObject.prototype = new GameObject;