fassetar/penguins-rising

View on GitHub
js/game.min.js

Summary

Maintainability
A
0 mins
Test Coverage
/*!
 * Penguins Rising
 * @author Anthony Fassett
 * @version 2.0.0
 * Copyright 2015.
 */
"use script";function NextLevel(){Pause(!1),document.getElementsByClassName("LvlComplete")[0].style.display="none"}function getMousePos(e,t){var a=e.getBoundingClientRect();return{x:t.clientX-a.left,y:t.clientY-a.top}}function mouseClick(e){e.preventDefault(),player.shot||(player.shoot(),setTimeout(function(){player.shot=!1},500),player.shot=!0)}function Enemy(e){return e=e||{},e.active=!0,e.age=Math.floor(128*Math.random()),e.x=Math.random()*canvas.width,e.y=0,e.xVelocity=0,e.yVelocity=.5,e.width=42,e.height=37,e.length=0,e.frame=void 0,e.index=0,e.elapsed=0,e.snd=new Audio(SoundTest?"http://fassetar.github.io/penguins-rising/content/audio/mp3/cry.mp3":"content/wav/cry.wav"),e.animation=new AnimationData([{x:40,length:180},{x:78,length:180},{x:127,length:180}],{repeats:!0,keyframe:0}),e.reset=function(){e.elapsed=0,e.index=0,e.frame=e.animation.frames[e.index]}(),e.length=e.animation.frames.length,e.inBounds=function(){return e.y!==canvas.height?e.x>=0&&e.x<=canvas.width&&e.y>=0&&e.y<=canvas.height:(player.health-=1,!1)},e.RnP=Math.floor(3*Math.random()),e.deadAnm=[169,204,250],e.draw=function(){e.active?ctx.drawImage(img,e.frame.x,0,e.width,e.height,e.x,e.y,e.width,e.height):ctx.drawImage(img,e.deadAnm[e.RnP],0,45,37,e.x,e.y,46,37)},e.update=function(){e.active&&(e.x+=e.xVelocity,e.y+=e.yVelocity,e.xVelocity=Math.sin(e.age*Math.PI/64),e.age++,e.active=e.active&&e.inBounds(),e.elapsed=e.elapsed+30,e.elapsed>=e.frame.length&&(e.index++,e.elapsed=e.elapsed-e.frame.length),this.index>=this.length&&(this.animation.options.repeats?this.index=this.animation.options.keyframe:this.index--),e.frame=e.animation.frames[e.index])},e.deactive=function(){e.active=!1},e}function Boss(){}function Bullet(e){return e.type=0,e.active=!0,e.speed=10,e.radian=Math.atan2(canvas.width/2-game.mousePos.x,canvas.height-60-game.mousePos.y),e.xVelocity=-e.speed*Math.sin(e.radian),e.yVelocity=-e.speed*Math.cos(e.radian),e.width=3,e.height=3,e.color="#000",e.inBounds=function(){return e.x>=0&&e.x<=canvas.width&&e.y>=0&&e.y<=canvas.height},e.draw=function(){ctx.fillStyle=e.color,ctx.fillRect(e.x,e.y,e.width,e.height)},e.update=function(){e.x+=e.xVelocity,e.y+=e.yVelocity,e.active=e.active&&e.inBounds()},e}function AnimationData(e,t){this.frames=e||[{x:0,y:0,w:0,h:0,length:0}],this.options=t||{repeats:!1,keyframe:0}}function draw(){ctx.clearRect(0,0,canvas.width,canvas.height),ctx.drawImage(border,23,canvas.height-150,canvas.width-45,100),player.draw(),TheTrulyDead.forEach(function(e){e.draw()}),player.Bullets.forEach(function(e){e.draw()}),enemies.forEach(function(e){e.draw()}),ctx.fillText("Kills:"+TheTrulyDead.length,10,50),ctx.fillText("Level:"+game.Lvl,10,70),ctx.fillText("Health:"+player.health,10,100)}function collides(e,t){return e.x<t.x+t.width&&e.x+e.width>t.x&&e.y<t.y+t.height&&e.y+e.height>t.y}function handleCollisions(){player.Bullets.forEach(function(e){enemies.forEach(function(t){collides(e,t)&&(t.deactive(),TheTrulyDead.push(t),t.snd.play(),e.active=!1)})})}var achManager=achManager||{};achManager.achievements={},achManager.preloaded=!1,achManager.loadData=function(){var e=gapi.client.games.achievementDefinitions.list();e.execute(function(e){if(console.log("Achievement definitions",e),"games#achievementDefinitionsListResponse"===e.kind&&e.hasOwnProperty("items")){for(var t=0;e.items.length>t;t++)achManager.achievements[e.items[t].id]=e.items[t],achManager.achievements[e.items[t].id].achievementState=e.items[t].initialState;welcome.dataLoaded(welcome.ENUM_ACHIEVEMENT_DEFS),achManager.loadAchievementsEarnedByPlayer()}})},achManager.loadAchievementsEarnedByPlayer=function(){var e=gapi.client.games.achievements.list({playerId:"me"});e.execute(function(e){if(console.log("Your achievement data: ",e),"games#playerAchievementListResponse"===e.kind&&e.hasOwnProperty("items")){for(var t=0;e.items.length>t;t++){var a=e.items[t];achManager.achievements[a.id].achievementState=a.achievementState,a.hasOwnProperty("formattedCurrentStepsString")&&(achManager.achievements[a.id].formattedCurrentStepsString=a.formattedCurrentStepsString)}welcome.dataLoaded(welcome.ENUM_ACHIEVEMENT_PROGRESS)}else console.log("**Unexpected response **",e)}),achManager.preloaded=!0},achManager.scoreRequested=function(e){0===e?achManager.unlockAchievement(constants.ACH_HUMBLE):9999===e&&achManager.unlockAchievement(constants.ACH_COCKY)},achManager.scoreReturned=function(e){1337===e?achManager.unlockAchievement(constants.ACH_LEET):e>1&&utils.isPrime(e)&&achManager.unlockAchievement(constants.ACH_PRIME),achManager.submitProgress(constants.ACH_BORED,1),achManager.submitProgress(constants.ACH_REALLY_BORED,1)},achManager.getNameForId=function(e){return achManager.achievements[e].name},achManager.submitProgress=function(e,t){var a=gapi.client.games.achievements.increment({achievementId:e,stepsToIncrement:t});a.execute(function(t){console.log("Data from incrementing achievement is ",t),achManager.achievements[e].currentSteps=t.currentSteps,achManager.achievements[e].formattedCurrentStepsString=t.currentSteps+"",t.newlyUnlocked?achievementWidget.showAchievementWidget(e):console.log("You either haven't unlocked "+achManager.achievements[e].name+" yet, or you unlocked it already.")})},achManager.unlockAchievement=function(e){var t=gapi.client.games.achievements.unlock({achievementId:e});t.execute(function(t){console.log("Data from earning achievement is ",t),t.newlyUnlocked?(achievementWidget.showAchievementWidget(e),achManager.loadAchievementsEarnedByPlayer()):console.log("You unlocked "+achManager.achievements[e].name+" but you already unlocked it earlier.")})};var achievementTable=achievementTable||{};achievementTable.loadUp=function(){achievementTable.clearOut(),achManager.preloaded&&$.each(achManager.achievements,function(e,t){var a=achievementTable.buildTableRowFromData(t);a.appendTo($("#achievementsTable tbody"))}),$("#achievements").fadeIn(),$("#pageHeader").text("Achievements")},achievementTable.buildTableRowFromData=function(e){var t=$("<tr></tr>"),a=$("<td></td>").text(e.name).addClass("achievementName"),n=$("<td></td>").text(e.description).addClass("achievementDescrip"),o="";if("REVEALED"===e.achievementState){if(o=e.revealedIconUrl,"INCREMENTAL"===e.achievementType&&e.hasOwnProperty("formattedCurrentStepsString")){var i="("+e.formattedCurrentStepsString+"/"+e.formattedTotalSteps+")",s=$("<div></div>").text(i);n.append(s)}}else"UNLOCKED"===e.achievementState?o=e.unlockedIconUrl:"HIDDEN"===e.achievementState&&(o="images/Question_mark.png",a.text("Hidden"),n.text("This mysterious achievement will be revealed later"));var l=$("<img />").attr("src",o).attr("alt",e.achievementState).addClass("medIcon").appendTo($("<td></td>"));return t.append(a).append(n).append(l),t},achievementTable.goBack=function(){$("#achievements").fadeOut(),welcome.loadUp()},achievementTable.clearOut=function(){$("#achievementsTable tbody").html("")};var achievementWidget=achievementWidget||{};achievementWidget.showAchievementWidget=function(e){var t=$("#achUnlocked");t.find("img").prop("src",achManager.achievements[e].unlockedIconUrl),t.find("#achName").text(achManager.achievements[e].name),t.find("#achDescrip").text(achManager.achievements[e].description),t.css({top:"300px",opacity:"1.0"}),t.show(),t.delay(2e3).animate({top:50,opacity:.1},500,function(){t.hide()})},function(){"use strict";function e(){this.successCount=0,this.errorCount=0,this.downloadQueue=[],this.cache={}}e.prototype.queueDownload=function(e){this.downloadQueue.push(e)},e.prototype.downloadAll=function(e){0===this.downloadQueue.length&&e();for(var t=0;this.downloadQueue.length>t;t++){var a=this.downloadQueue[t],n=new Image;n.src=a,this.cache[a]=n}},e.prototype.isDone=function(){return this.downloadQueue.length===this.successCount+this.errorCount},e.prototype.getAsset=function(e){return this.cache[e]};var t=new e;t.downloadAll(function(){}),t.isDone&&(document.getElementById("Gamer").innerHTML="Play"),function(e,t,a,n,o,i,s){e.GoogleAnalyticsObject=o,e[o]=e[o]||function(){(e[o].q=e[o].q||[]).push(arguments)},e[o].l=1*new Date,i=t.createElement(a),s=t.getElementsByTagName(a)[0],i.async=1,i.src=n,s.parentNode.insertBefore(i,s)}(window,document,"script","https://www.google-analytics.com/analytics.js","ga"),ga("create","UA-41648493-1","penguinsontherise.appspot.com"),ga("send","pageview"),window.addEventListener("error",function(e){ga("send","event","Javascript Error",e.filename+":  "+e.lineno,e.message)})}();var img=new Image;img.src="http://fassetar.github.io/penguins-rising/content/img/characters.png";var canvas=document.getElementById("window"),ctx=canvas.getContext("2d"),enemies=[],TheTrulyDead=[],bosses=[],game={paused:!1,timer:null,Lvl:1,Lvlcomplete:!1,LvlEnemies:3,mousePos:{x:0,y:0},loop:function(){if(game.over||game.paused){if(game.over){var e=confirm("Your lose! Start Over?");e&&location.reload()}}else game.update(),draw();requestAnimFrame(game.loop)},over:!1,startGame:function(){canvas.addEventListener("mousedown",mouseClick),window.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e){window.setTimeout(e,50)}}(),game.loop(),window.onblur=function(){Pause(!0)},document.onkeypress=function(e){e=e||window.event;var t=e.keyCode||e.which,a=String.fromCharCode(t);"p"===a&&Pause()}},update:function(){TheTrulyDead.length>game.LvlEnemies&&0===enemies.length&&(game.Lvlcomplete=!0,game.LvlEnemies+=5,game.Lvl+=1,player.health=10),canvas.height="innerHeight"in window?window.innerHeight:document.documentElement.offsetHeight,canvas.width="innerWidth"in window?window.innerWidth:document.documentElement.offsetWidth,0>=player.health&&(game.over=!0),!game.Lvlcomplete&&player.update?(player.Bullets.forEach(function(e){e.update()}),player.Bullets=player.Bullets.filter(function(e){return e.active}),enemies.forEach(function(e){e.update()}),enemies=enemies.filter(function(e){return e.active}),handleCollisions(),game.LvlEnemies>enemies.length&&TheTrulyDead.length<=game.LvlEnemies&&(enemies.push(Enemy()),bosses.push(Boss(this)))):(player.update||console.log("you died"),enemies=[],TheTrulyDead=[],bosses=[],game.Lvlcomplete=!1,document.getElementsByClassName("LvlComplete")[0].style.display="block",game.paused=!0)}},Pause=function(e){game.paused=e?e:!game.paused,document.getElementsByClassName("pause")[0].style.display=game.paused?"block":"none"};window.onresize=function(){canvas.height="innerHeight"in window?window.innerHeight:document.documentElement.offsetHeight,canvas.width="innerWidth"in window?window.innerWidth:document.documentElement.offsetWidth}(),canvas.addEventListener("mousemove",function(e){game.mousePos=getMousePos(canvas,e)},!1);var a=document.createElement("audio"),SoundTest=function(){return!(!a.createElement("audio").canPlayType||!a.canPlayType("audio/mpeg;").replace(/no/,""))},player={x:canvas.width/2,y:canvas.height-60,vx:0,vy:0,health:10,Bullets:[],active:!0,weapons:{selected:[0,0,0],choice:["Uzi","Hunting Rifle","Shotgun","Minigun"],secondary:["Grenade","Mine","Ice Cracker","Reaper"],support:["Upgrade Wall","Barbes Wire","Eskimo Guards","Polar Bear","Mortar Support"]},draw:function(){ctx.save(),ctx.translate(canvas.width/2,canvas.height-60),ctx.rotate(Math.atan2(game.mousePos.x-canvas.width/2,canvas.height-60-game.mousePos.y)),ctx.drawImage(img,0,0,42,59,-18,-33,42,59),ctx.restore()},update:function(){return 1>player.health?!1:!0},shot:!1,snd:new Audio(SoundTest?"http://fassetar.github.io/penguins-rising/content/audio/mp3/gunshot.mp3":"http://fassetar.github.io/penguins-rising/content/audio/wav/gunshot.wav"),shoot:function(){var e=Math.atan2(canvas.width/2-game.mousePos.x,canvas.height-60-game.mousePos.y);player.snd.play(),player.Bullets.push(Bullet({radian:e,x:canvas.width/2+-18*Math.sin(e),y:canvas.height-60+-18*Math.cos(e)}))},displayName:"anonymous",profileUrl:"",userId:"",loadLocalPlayer:function(){var e=gapi.client.games.players.get({playerId:"me"});e.execute(function(e){e.displayName||(e.displayName="anonymous"),$("#welcome #message").text("Welcome, "+e.displayName+"!"),$("#welcomeAchievements, #welcomeleaderboards").fadeIn(),player.displayName=e.displayName,player.profileUrl=e.avatarImageUrl,player.userId=e.playerId,welcome.dataLoaded(welcome.ENUM_PLAYER_DATA)})}};Boss.prototype=new Enemy;var border=new Image;border.src="https://raw.githubusercontent.com/fassetar/penguins-rising/master/src/content/img/borderline.jpg";var leadManager=leadManager||{};leadManager.preloaded=!1,leadManager.leaderboards={},leadManager.preloadData=function(){var e=gapi.client.games.leaderboards.list();e.execute(function(e){if(console.log("Leaderboard data",e),"games#leaderboardListResponse"===e.kind&&e.hasOwnProperty("items"))for(var t=0;e.items.length>t;t++)leadManager.leaderboards[e.items[t].id]=e.items[t];leadManager.preloaded=!0,welcome.dataLoaded(welcome.ENUM_LEADERBOARDS)})},leadManager.getLeaderboardObject=function(e){return leadManager.leaderboards[e]},leadManager.gotScore=function(e,t,a){var n=t===game.EASY?constants.LEADERBOARD_EASY:constants.LEADERBOARD_HARD,o=gapi.client.games.scores.submit({leaderboardId:n,score:e});o.execute(function(e){console.log("Data from submitting high score is ",e);var t=!1;if(e.hasOwnProperty("beatenScoreTimeSpans"))for(var o=0;e.beatenScoreTimeSpans.length>o;o++)"WEEKLY"===e.beatenScoreTimeSpans[o]&&(console.log("Hooray! New weekly high score!"),t=!0,leaderboardWidget.show(n));a(t)})};var leaderboardWidget=leaderboardWidget||{};leaderboardWidget.show=function(e){var t=leadManager.getLeaderboardObject(e),a=t.iconUrl?t.iconUrl:"img/genericLeaderboard.png";$("#leadUnlocked img").prop("src",a),$("#leadUnlocked #leadName").text(t.name),$("#leadUnlocked").css({top:"250px",opacity:"1.0"}),$("#leadUnlocked").show(),$("#leadUnlocked").delay(3e3).animate({top:"50px",opacity:.1},500,function(){$("#leadUnlocked").hide()})};var leaderboardsTable=leaderboardsTable||{};leaderboardsTable.showAllLeaderboards=function(){leaderboardsTable.clearOut(),leadManager.preloaded&&($.each(leadManager.leaderboards,function(e,t){var a=leaderboardsTable.buildLeaderboardsRowFromData(t);a.appendTo($("#leaderboardsTable tbody"))}),$("#leaderboards").fadeIn()),$("#pageHeader").text("Leaderboards")},leaderboardsTable.buildLeaderboardsRowFromData=function(e){var t=$("<tr></tr>"),a=e.iconUrl?e.iconUrl:"img/genericLeaderboard.png",n=$("<td></td>").append($("<img />").prop("src",a).addClass("medIcon")),o=$("<td></td>").text(e.name),i=$("<td></td>").append($('<input type="button" />').prop("value","View").click(function(){leaderboardsTable.selectLeaderboard(e.id)}));return t.append(n).append(o).append(i),t},leaderboardsTable.selectLeaderboard=function(e){$("#leaderboards").hide(),leaderboardTable.showLeaderboard(e,leaderboardTable.BACK_TO_ALL_LEADERBOARDS)},leaderboardsTable.clearOut=function(){$("#leaderboardsTable tbody").html("")},leaderboardsTable.goBack=function(){$("#leaderboards").fadeOut(),welcome.loadUp()};var constants=constants||{};constants.CLIENT_ID="926286388840-qbj01r8d9on9dvnnba1m8iiknrtulrb1.apps.googleusercontent.com",constants.ACH_DONT_GET_COCKY_KID="CgkInoXkzIgWEAIQCA",constants.ACH_WERE_ALL_OUT_OF_BUBBLEGUM="CgkInoXkzIgWEAIQCw",constants.ACH_PRIME_TIME_FOR_YOUR_LIFE="CgkInoXkzIgWEAIQLg",constants.ACH_THE_PRINCESS_IS_BACK="CgkInoXkzIgWEAIQEg",constants.ACH_GOT_LUCKY="CgkInoXkzIgWEAIQDg",constants.ACH_A_TASTE_FOR_BLOOD="CgkInoXkzIgWEAIQDw",constants.ACH_KICKIN_IT_OLD_SKOOL="CgkInoXkzIgWEAIQDQ",constants.ACH_A_HIGHER_FOOD_CHAIN="CgkInoXkzIgWEAIQBw",constants.ACH_DONT_FEAR_THE_REPEAR="CgkInoXkzIgWEAIQKA",constants.ACH_THE_MOTHER_LOAD_OF_COWS="CgkInoXkzIgWEAIQEw",constants.ACH_ZOMBIE_PENGUIN_TRAINEE="CgkInoXkzIgWEAIQKQ",constants.ACH_ZOMBIE_PENGUIN_ADAPT="CgkInoXkzIgWEAIQBg",constants.ACH_ZOMBIE_PENGUIN_EXCEPT="CgkInoXkzIgWEAIQEQ",constants.ACH_ZOMBIE_PENGUIN_MASTER="CgkInoXkzIgWEAIQDA",constants.ACH_THERES_CAKE_AND_ICE_CREAM="CgkInoXkzIgWEAIQLA",constants.LEAD_HIGH_SCORES="CgkInoXkzIgWEAIQBQ",constants.LEAD_LONGEST_LIVED="CgkInoXkzIgWEAIQKg";var login={userId:"",loggedIn:!1,scopes:"https://www.googleapis.com/auth/games",init:function(){window.setTimeout(login.trySilentAuth,1)},loadClient:function(){gapi.client.load("games","v1",function(){achManager.loadData(),leadManager.preloadData(),welcome.loadUp(),$("#BetaInfo").hide()}),gapi.client.load("gamesManagement","v1management",function(){welcome.dataLoaded(welcome.ENUM_MANAGEMENT_API)}),gapi.client.load("plus","v1",function(){welcome.dataLoaded(welcome.ENUM_PLUS_API)})}};login.handleAuthResult=function(e){console.log("We are in handle auth result");var t=document.createElement("SCRIPT");t.src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js",t.type="text/javascript",document.getElementsByTagName("head")[0].appendChild(t),checkReady(function(t){e?(t("#loginDiv").fadeOut(),login.loadClient()):t("#loginDiv").fadeIn()})};var checkReady=function(e){window.jQuery?e(jQuery):window.setTimeout(function(){checkReady(e)},100)};login.trySilentAuth=function(){gapi.auth.authorize({client_id:constants.CLIENT_ID,scope:login.scopes,immediate:!0},login.handleAuthResult)},login.showLoginDialog=function(){gapi.auth.authorize({client_id:constants.CLIENT_ID,scope:login.scopes,immediate:!1},login.handleAuthResult)};var welcome=welcome||{};welcome.leaderboards_loaded=!1,welcome.achievement_defs_loaded=!1,welcome.achievement_progress_loaded=!1,welcome.player_data_loaded=!1,welcome.challenge_loaded=!1,welcome.management_APIs_loaded=!1,welcome.plus_APIs_loaded=!1,welcome.ENUM_LEADERBOARDS=1,welcome.ENUM_ACHIEVEMENT_DEFS=2,welcome.ENUM_ACHIEVEMENT_PROGRESS=3,welcome.ENUM_PLAYER_DATA=4,welcome.ENUM_CHALLENGE_DATA=5,welcome.ENUM_MANAGEMENT_API=6,welcome.ENUM_PLUS_API=7,welcome.dataLoaded=function(e){e===welcome.ENUM_LEADERBOARDS?welcome.leaderboards_loaded=!0:e===welcome.ENUM_ACHIEVEMENT_DEFS?welcome.achievement_defs_loaded=!0:e===welcome.ENUM_ACHIEVEMENT_PROGRESS?welcome.achievement_progress_loaded=!0:e===welcome.ENUM_PLAYER_DATA?welcome.player_data_loaded=!0:e===welcome.ENUM_CHALLENGE_DATA?welcome.challenge_loaded=!0:e===welcome.ENUM_MANAGEMENT_API?welcome.management_APIs_loaded=!0:e===welcome.ENUM_PLUS_API&&(welcome.plus_APIs_loaded=!0),welcome.activateButtonsIfReady()},welcome.activateButtonsIfReady=function(){welcome.leaderboards_loaded&&welcome.achievement_defs_loaded&&welcome.achievement_progress_loaded&&welcome.player_data_loaded&&welcome.challenge_loaded&&welcome.management_APIs_loaded&&welcome.plus_APIs_loaded&&($("#welcome input").attr("disabled",!1),$("#game").show(),welcome.startGame())},welcome.loadUp=function(){$("#welcome").fadeIn()},welcome.showCredits=function(e,t){var a=document.getElementById(e);a.style.display="none"!==a.style.display?"none":"",document.getElementById(t).style.display="block"===document.getElementById(t).style.display?"none":"block"},welcome.showAchievements=function(){achievementTable.loadUp()},welcome.showLeaderboards=function(){leaderboardsTable.showAllLeaderboards()},welcome.startGame=function(){document.getElementById("dialog-modal").style.display="none",document.getElementById("game").style.display="block",game.startGame()};var snowStorm=function(e,t){function a(e,t){return isNaN(t)&&(t=0),Math.random()*e+t}function n(e){return 1===parseInt(a(2),10)?-1*e:e}function o(){e.setTimeout(function(){l.start(!0)},20),l.events.remove(r?t:e,"mousemove",o)}function i(){l.excludeMobile&&d||o(),l.events.remove(e,"load",i)}this.autoStart=!0,this.excludeMobile=!0,this.flakesMax=128,this.flakesMaxActive=64,this.animationInterval=33,this.useGPU=!0,this.className=null,this.excludeMobile=!0,this.flakeBottom=null,this.followMouse=!0,this.snowColor="#fff",this.snowCharacter="&bull;",this.snowStick=!0,this.targetElement=null,this.useMeltEffect=!0,this.useTwinkleEffect=!1,this.usePositionFixed=!1,this.usePixelPosition=!1,this.freezeOnBlur=!0,this.flakeLeftOffset=0,this.flakeRightOffset=0,this.flakeWidth=8,this.flakeHeight=8,this.vMaxX=5,this.vMaxY=4,this.zIndex=0;var s,l=this,r=navigator.userAgent.match(/msie/i),c=navigator.userAgent.match(/msie 6/i),d=navigator.userAgent.match(/mobile|opera m(ob|in)/i),m=r&&"BackCompat"===t.compatMode,h=m||c,u=null,g=null,f=null,p=null,v=null,y=null,w=null,E=1,A=2,k=6,I=!1,b=!1,_=function(){try{t.createElement("div").style.opacity="0.5"}catch(e){return!1}return!0}(),M=!1,x=t.createDocumentFragment();return s=function(){function a(t){e.setTimeout(t,1e3/(l.animationInterval||20))}function n(e){var t=s.style[e];return void 0!==t?e:null}var o,i=e.requestAnimationFrame||e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame||e.oRequestAnimationFrame||e.msRequestAnimationFrame||a;o=i?function(){return i.apply(e,arguments)}:null;var s;s=t.createElement("div");var r={transform:{ie:n("-ms-transform"),moz:n("MozTransform"),opera:n("OTransform"),webkit:n("webkitTransform"),w3:n("transform"),prop:null},getAnimationFrame:o};return r.transform.prop=r.transform.w3||r.transform.moz||r.transform.webkit||r.transform.ie||r.transform.opera,s=null,r}(),this.timer=null,this.flakes=[],this.disabled=!1,this.active=!1,this.meltFrameCount=20,this.meltFrames=[],this.setXY=function(e,t,a){return e?(l.usePixelPosition||b?(e.style.left=t-l.flakeWidth+"px",e.style.top=a-l.flakeHeight+"px"):h?(e.style.right=100-100*(t/u)+"%",e.style.top=Math.min(a,v-l.flakeHeight)+"px"):l.flakeBottom?(e.style.right=100-100*(t/u)+"%",e.style.top=Math.min(a,v-l.flakeHeight)+"px"):(e.style.right=100-100*(t/u)+"%",e.style.bottom=100-100*(a/f)+"%"),void 0):!1},this.events=function(){function t(e){var t=s.call(e),a=t.length;return i?(t[1]="on"+t[1],a>3&&t.pop()):3===a&&t.push(!1),t}function a(e,t){var a=e.shift(),n=[l[t]];i?a[n](e[0],e[1]):a[n].apply(a,e)}function n(){a(t(arguments),"add")}function o(){a(t(arguments),"remove")}var i=!e.addEventListener&&e.attachEvent,s=Array.prototype.slice,l={add:i?"attachEvent":"addEventListener",remove:i?"detachEvent":"removeEventListener"};return{add:n,remove:o}}(),this.randomizeWind=function(){var e;if(y=n(a(l.vMaxX,.2)),w=a(l.vMaxY,.2),this.flakes)for(e=0;this.flakes.length>e;e++)this.flakes[e].active&&this.flakes[e].setVelocities()},this.scrollHandler=function(){var a;if(p=l.flakeBottom?0:parseInt(e.scrollY||t.documentElement.scrollTop||(h?t.body.scrollTop:0),10),isNaN(p)&&(p=0),!I&&!l.flakeBottom&&l.flakes)for(a=0;l.flakes.length>a;a++)0===l.flakes[a].active&&l.flakes[a].stick()},this.resizeHandler=function(){e.innerWidth||e.innerHeight?(u=e.innerWidth-16-l.flakeRightOffset,f=l.flakeBottom||e.innerHeight):(u=(t.documentElement.clientWidth||t.body.clientWidth||t.body.scrollWidth)-(r?0:8)-l.flakeRightOffset,f=l.flakeBottom||t.documentElement.clientHeight||t.body.clientHeight||t.body.scrollHeight),v=t.body.offsetHeight,g=parseInt(u/2,10)},this.resizeHandlerAlt=function(){u=l.targetElement.offsetWidth-l.flakeRightOffset,f=l.flakeBottom||l.targetElement.offsetHeight,g=parseInt(u/2,10),v=t.body.offsetHeight},this.freeze=function(){return l.disabled?!1:(l.disabled=1,l.timer=null,void 0)},this.resume=function(){return l.disabled?(l.disabled=0,l.timerInit(),void 0):!1},this.toggleSnow=function(){l.flakes.length?(l.active=!l.active,l.active?(l.show(),l.resume()):(l.stop(),l.freeze())):l.start()},this.stop=function(){var a;for(this.freeze(),a=0;this.flakes.length>a;a++)this.flakes[a].o.style.display="none";l.events.remove(e,"scroll",l.scrollHandler),l.events.remove(e,"resize",l.resizeHandler),l.freezeOnBlur&&(r?(l.events.remove(t,"focusout",l.freeze),l.events.remove(t,"focusin",l.resume)):(l.events.remove(e,"blur",l.freeze),l.events.remove(e,"focus",l.resume)))},this.show=function(){var e;for(e=0;this.flakes.length>e;e++)this.flakes[e].o.style.display="block"},this.SnowFlake=function(e,n,o){var i=this;this.type=e,this.x=n||parseInt(a(u-20),10),this.y=isNaN(o)?-a(f)-12:o,this.vX=null,this.vY=null,this.vAmpTypes=[1,1.2,1.4,1.6,1.8],this.vAmp=this.vAmpTypes[this.type]||1,this.melting=!1,this.meltFrameCount=l.meltFrameCount,this.meltFrames=l.meltFrames,this.meltFrame=0,this.twinkleFrame=0,this.active=1,this.fontSize=10+10*(this.type/5),this.o=t.createElement("div"),this.o.innerHTML=l.snowCharacter,l.className&&this.o.setAttribute("class",l.className),this.o.style.color=l.snowColor,this.o.style.position=I?"fixed":"absolute",l.useGPU&&s.transform.prop&&(this.o.style[s.transform.prop]="translate3d(0px, 0px, 0px)"),this.o.style.width=l.flakeWidth+"px",this.o.style.height=l.flakeHeight+"px",this.o.style.fontFamily="arial,verdana",this.o.style.cursor="default",this.o.style.overflow="hidden",this.o.style.fontWeight="normal",this.o.style.zIndex=l.zIndex,x.appendChild(this.o),this.refresh=function(){return isNaN(i.x)||isNaN(i.y)?!1:(l.setXY(i.o,i.x,i.y),void 0)},this.stick=function(){h||l.targetElement!==t.documentElement&&l.targetElement!==t.body?i.o.style.top=f+p-l.flakeHeight+"px":l.flakeBottom?i.o.style.top=l.flakeBottom+"px":(i.o.style.display="none",i.o.style.bottom="0%",i.o.style.position="fixed",i.o.style.display="block")},this.vCheck=function(){i.vX>=0&&.2>i.vX?i.vX=.2:0>i.vX&&i.vX>-.2&&(i.vX=-.2),i.vY>=0&&.2>i.vY&&(i.vY=.2)},this.move=function(){var e,t=i.vX*E;i.x+=t,i.y+=i.vY*i.vAmp,i.x>=u||u-i.x<l.flakeWidth?i.x=0:0>t&&i.x-l.flakeLeftOffset<-l.flakeWidth&&(i.x=u-l.flakeWidth-1),i.refresh(),e=f+p-i.y+l.flakeHeight,l.flakeHeight>e?(i.active=0,l.snowStick?i.stick():i.recycle()):(l.useMeltEffect&&i.active&&3>i.type&&!i.melting&&Math.random()>.998&&(i.melting=!0,i.melt()),l.useTwinkleEffect&&(0>i.twinkleFrame?Math.random()>.97&&(i.twinkleFrame=parseInt(8*Math.random(),10)):(i.twinkleFrame--,_?i.o.style.opacity=i.twinkleFrame&&0===i.twinkleFrame%2?0:1:i.o.style.visibility=i.twinkleFrame&&0===i.twinkleFrame%2?"hidden":"visible")))},this.animate=function(){i.move()},this.setVelocities=function(){i.vX=y+a(.12*l.vMaxX,.1),i.vY=w+a(.12*l.vMaxY,.1)},this.setOpacity=function(e,t){return _?(e.style.opacity=t,void 0):!1},this.melt=function(){l.useMeltEffect&&i.melting?i.meltFrame<i.meltFrameCount?(i.setOpacity(i.o,i.meltFrames[i.meltFrame]),i.o.style.fontSize=i.fontSize-i.fontSize*(i.meltFrame/i.meltFrameCount)+"px",i.o.style.lineHeight=l.flakeHeight+2+.75*l.flakeHeight*(i.meltFrame/i.meltFrameCount)+"px",i.meltFrame++):i.recycle():i.recycle()},this.recycle=function(){i.o.style.display="none",i.o.style.position=I?"fixed":"absolute",i.o.style.bottom="auto",i.setVelocities(),i.vCheck(),i.meltFrame=0,i.melting=!1,i.setOpacity(i.o,1),i.o.style.padding="0px",i.o.style.margin="0px",i.o.style.fontSize=i.fontSize+"px",i.o.style.lineHeight=l.flakeHeight+2+"px",i.o.style.textAlign="center",i.o.style.verticalAlign="baseline",i.x=parseInt(a(u-l.flakeWidth-20),10),i.y=parseInt(-1*a(f),10)-l.flakeHeight,i.refresh(),i.o.style.display="block",i.active=1},this.recycle(),this.refresh()},this.snow=function(){var e,t,n=0,o=null;for(e=0,t=l.flakes.length;t>e;e++)1===l.flakes[e].active&&(l.flakes[e].move(),n++),l.flakes[e].melting&&l.flakes[e].melt();l.flakesMaxActive>n&&(o=l.flakes[parseInt(a(l.flakes.length),10)],0===o.active&&(o.melting=!0)),l.timer&&s.getAnimationFrame(l.snow)},this.mouseMove=function(e){if(!l.followMouse)return!0;var t=parseInt(e.clientX,10);g>t?E=-A+t/g*A:(t-=g,E=t/g*A)},this.createSnow=function(e,t){var n;for(n=0;e>n;n++)l.flakes[l.flakes.length]=new l.SnowFlake(parseInt(a(k),10)),(t||n>l.flakesMaxActive)&&(l.flakes[l.flakes.length-1].active=-1);l.targetElement.appendChild(x)},this.timerInit=function(){l.timer=!0,l.snow()},this.init=function(){var a;for(a=0;l.meltFrameCount>a;a++)l.meltFrames.push(1-a/l.meltFrameCount);l.randomizeWind(),l.createSnow(l.flakesMax),l.events.add(e,"resize",l.resizeHandler),l.events.add(e,"scroll",l.scrollHandler),l.freezeOnBlur&&(r?(l.events.add(t,"focusout",l.freeze),l.events.add(t,"focusin",l.resume)):(l.events.add(e,"blur",l.freeze),l.events.add(e,"focus",l.resume))),l.resizeHandler(),l.scrollHandler(),l.followMouse&&l.events.add(r?t:e,"mousemove",l.mouseMove),l.animationInterval=Math.max(20,l.animationInterval),l.timerInit()},this.start=function(a){if(M){if(a)return!0}else M=!0;if("string"==typeof l.targetElement){var n=l.targetElement;if(l.targetElement=t.getElementById(n),!l.targetElement)throw Error('Snowstorm: Unable to get targetElement "'+n+'"')}if(l.targetElement||(l.targetElement=t.body||t.documentElement),l.targetElement!==t.documentElement&&l.targetElement!==t.body&&(l.resizeHandler=l.resizeHandlerAlt,l.usePixelPosition=!0),l.resizeHandler(),l.usePositionFixed=l.usePositionFixed&&!h&&!l.flakeBottom,e.getComputedStyle)try{b="relative"===e.getComputedStyle(l.targetElement,null).getPropertyValue("position")}catch(o){b=!1}I=l.usePositionFixed,u&&f&&!l.disabled&&(l.init(),l.active=!0)},l.autoStart&&l.events.add(e,"load",i,!1),this}(window,document);