konami.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. /*
  2. * Konami-JS ~
  3. * :: Now with support for touch events and multiple instances for
  4. * :: those situations that call for multiple easter eggs!
  5. * Code: http://konami-js.googlecode.com/
  6. * Examples: http://www.snaptortoise.com/konami-js
  7. * Copyright (c) 2009 George Mandis (georgemandis.com, snaptortoise.com)
  8. * Version: 1.4.1 (3/1/2013)
  9. * Licensed under the GNU General Public License v3
  10. * http://www.gnu.org/copyleft/gpl.html
  11. * Tested in: Safari 4+, Google Chrome 4+, Firefox 3+, IE7+, Mobile Safari 2.2.1 and Dolphin Browser
  12. */
  13. var Konami = function (callback) {
  14. var konami = {
  15. addEvent: function (obj, type, fn, ref_obj) {
  16. if (obj.addEventListener)
  17. obj.addEventListener(type, fn, false);
  18. else if (obj.attachEvent) {
  19. // IE
  20. obj["e" + type + fn] = fn;
  21. obj[type + fn] = function () {
  22. obj["e" + type + fn](window.event, ref_obj);
  23. }
  24. obj.attachEvent("on" + type, obj[type + fn]);
  25. }
  26. },
  27. input: "",
  28. pattern: "38384040373937396665",
  29. load: function (link) {
  30. this.addEvent(document, "keydown", function (e, ref_obj) {
  31. if (ref_obj) konami = ref_obj; // IE
  32. konami.input += e ? e.keyCode : event.keyCode;
  33. if (konami.input.length > konami.pattern.length)
  34. konami.input = konami.input.substr((konami.input.length - konami.pattern.length));
  35. if (konami.input == konami.pattern) {
  36. konami.code(link);
  37. konami.input = "";
  38. e.preventDefault();
  39. return false;
  40. }
  41. }, this);
  42. this.iphone.load(link);
  43. },
  44. code: function (link) {
  45. window.location = link
  46. },
  47. iphone: {
  48. start_x: 0,
  49. start_y: 0,
  50. stop_x: 0,
  51. stop_y: 0,
  52. tap: false,
  53. capture: false,
  54. orig_keys: "",
  55. keys: ["UP", "UP", "DOWN", "DOWN", "LEFT", "RIGHT", "LEFT", "RIGHT", "TAP", "TAP"],
  56. code: function (link) {
  57. konami.code(link);
  58. },
  59. load: function (link) {
  60. this.orig_keys = this.keys;
  61. konami.addEvent(document, "touchmove", function (e) {
  62. if (e.touches.length == 1 && konami.iphone.capture == true) {
  63. var touch = e.touches[0];
  64. konami.iphone.stop_x = touch.pageX;
  65. konami.iphone.stop_y = touch.pageY;
  66. konami.iphone.tap = false;
  67. konami.iphone.capture = false;
  68. konami.iphone.check_direction();
  69. }
  70. });
  71. konami.addEvent(document, "touchend", function (evt) {
  72. if (konami.iphone.tap == true) konami.iphone.check_direction(link);
  73. }, false);
  74. konami.addEvent(document, "touchstart", function (evt) {
  75. konami.iphone.start_x = evt.changedTouches[0].pageX;
  76. konami.iphone.start_y = evt.changedTouches[0].pageY;
  77. konami.iphone.tap = true;
  78. konami.iphone.capture = true;
  79. });
  80. },
  81. check_direction: function (link) {
  82. x_magnitude = Math.abs(this.start_x - this.stop_x);
  83. y_magnitude = Math.abs(this.start_y - this.stop_y);
  84. x = ((this.start_x - this.stop_x) < 0) ? "RIGHT" : "LEFT";
  85. y = ((this.start_y - this.stop_y) < 0) ? "DOWN" : "UP";
  86. result = (x_magnitude > y_magnitude) ? x : y;
  87. result = (this.tap == true) ? "TAP" : result;
  88. if (result == this.keys[0]) this.keys = this.keys.slice(1, this.keys.length);
  89. if (this.keys.length == 0) {
  90. this.keys = this.orig_keys;
  91. this.code(link);
  92. }
  93. }
  94. }
  95. }
  96. typeof callback === "string" && konami.load(callback);
  97. if (typeof callback === "function") {
  98. konami.code = callback;
  99. konami.load();
  100. }
  101. return konami;
  102. };