helper.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. function validateEmail(email) {
  2. var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
  3. return re.test(email);
  4. }
  5. function zero_pad(num) {
  6. zero = 2 - num.toString().length + 1;
  7. return Array(+(zero > 0 && zero)).join("0") + num;
  8. }
  9. function format_time(seconds) {
  10. if (isNaN(seconds)) seconds = 0;
  11. return zero_pad(parseInt(seconds/60)) + ":" + zero_pad(parseInt(seconds%60));
  12. }
  13. var url_to_links_rx = /(^|[\s\n]|>)((?:https?|ftp):\/\/[\-A-Z0-9+\u0026\u2019@#\/%?=()~_|!:,.;]*[\-A-Z0-9+\u0026@#\/%=~()_|])/gi;
  14. function urls_to_links(text) {
  15. return text.replace(url_to_links_rx, "$1<a target='_blank' href='$2'>$2</a>");
  16. }
  17. // http://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript
  18. function get_query_param(name) {
  19. name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
  20. var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
  21. results = regex.exec(location.search);
  22. return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
  23. }
  24. // http://stackoverflow.com/questions/1349404/generate-a-string-of-5-random-characters-in-javascript
  25. function random_string(len) {
  26. var text = "";
  27. var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!-_";
  28. for (var i=0; i < len; i++) {
  29. text += possible.charAt(Math.floor(Math.random() * possible.length));
  30. }
  31. return text;
  32. }
  33. function fixup_touches(evt) {
  34. // convert touch events
  35. var e = evt;
  36. if (evt.originalEvent) e = evt.originalEvent;
  37. evt = {
  38. pageX: evt.pageX,
  39. pageY: evt.pageY,
  40. offsetX: evt.offsetX,
  41. offsetY: evt.offsetY,
  42. clientX: evt.clientX,
  43. clientY: evt.clientY,
  44. layerX: evt.layerX,
  45. layerY: evt.layerY,
  46. target: evt.target,
  47. currentTarget: evt.currentTarget
  48. };
  49. if (e.changedTouches && e.changedTouches.length) {
  50. evt.pageX = e.changedTouches[0].pageX;
  51. evt.pageY = e.changedTouches[0].pageY;
  52. } else if (e.touches && e.touches.length) {
  53. evt.pageX = e.touches[0].pageX;
  54. evt.pageY = e.touches[0].pageY;
  55. }
  56. return evt;
  57. }
  58. function rgb_to_hex(r, g, b) {
  59. return ((1 << 24) + (parseInt(r) << 16) + (parseInt(g) << 8) + parseInt(b)).toString(16).slice(1);
  60. }
  61. function hex_to_rgba(color) {
  62. if (!color || color == "transparent") {
  63. return {r:0,g:0,b:0,a:0};
  64. }
  65. if (color.match("rgb\\(")) {
  66. color = color.replace("rgb(","").replace(")","").split(",");
  67. return {
  68. r: color[0],
  69. g: color[1],
  70. b: color[2],
  71. a: 255
  72. };
  73. }
  74. if (color.match("rgba\\(")) {
  75. color = color.replace("rgba(","").replace(")","").split(",");
  76. return {
  77. r: color[0],
  78. g: color[1],
  79. b: color[2],
  80. a: color[3]*255
  81. };
  82. }
  83. var r = parseInt(color.substr(1,2), 16);
  84. var g = parseInt(color.substr(3,2), 16);
  85. var b = parseInt(color.substr(5,2), 16);
  86. var a = 255;
  87. if (color.length>7) {
  88. a = parseInt(color.substr(7,2), 16);
  89. }
  90. return {r:r,g:g,b:b,a:a};
  91. }
  92. function rgb_to_hsv () {
  93. var rr, gg, bb,
  94. r = arguments[0] / 255,
  95. g = arguments[1] / 255,
  96. b = arguments[2] / 255,
  97. h, s,
  98. v = Math.max(r, g, b),
  99. diff = v - Math.min(r, g, b),
  100. diffc = function(c) {
  101. return (v - c) / 6 / diff + 1 / 2;
  102. };
  103. if (diff == 0) {
  104. h = s = 0;
  105. } else {
  106. s = diff / v;
  107. rr = diffc(r);
  108. gg = diffc(g);
  109. bb = diffc(b);
  110. if (r === v) {
  111. h = bb - gg;
  112. } else if (g === v) {
  113. h = (1 / 3) + rr - bb;
  114. } else if (b === v) {
  115. h = (2 / 3) + gg - rr;
  116. }
  117. if (h < 0) {
  118. h += 1;
  119. } else if (h > 1) {
  120. h -= 1;
  121. }
  122. }
  123. return {
  124. h: h || 0,
  125. s: s || 0,
  126. v: v || 0
  127. };
  128. }
  129. // values?
  130. function hsv_to_rgb(h, s, v) {
  131. var r, g, b, i, f, p, q, t;
  132. if (h && s === undefined && v === undefined) {
  133. s = h.s, v = h.v, h = h.h;
  134. }
  135. i = Math.floor(h * 6);
  136. f = h * 6 - i;
  137. p = v * (1 - s);
  138. q = v * (1 - f * s);
  139. t = v * (1 - (1 - f) * s);
  140. switch (i % 6) {
  141. case 0: r = v, g = t, b = p; break;
  142. case 1: r = q, g = v, b = p; break;
  143. case 2: r = p, g = v, b = t; break;
  144. case 3: r = p, g = q, b = v; break;
  145. case 4: r = t, g = p, b = v; break;
  146. case 5: r = v, g = p, b = q; break;
  147. }
  148. return {
  149. r: Math.round(r * 255),
  150. g: Math.round(g * 255),
  151. b: Math.round(b * 255)
  152. };
  153. }
  154. temp_grid_canvas = document.createElement("canvas");
  155. function render_grid(w,h,divisions) {
  156. temp_grid_canvas.width = w;
  157. temp_grid_canvas.height = h;
  158. var step = w / divisions;
  159. var ctx = temp_grid_canvas.getContext('2d');
  160. ctx.strokeStyle = "#f0f0f0";
  161. ctx.lineWidth = 1;
  162. var gc1 = "rgba(60,60,60,0.125)";
  163. var gc2 = "rgba(60,60,60,0.075)";
  164. for (var y=0; y<h; y+=step) {
  165. if (y==0) {
  166. ctx.fillStyle = gc1;
  167. } else {
  168. ctx.fillStyle = gc2;
  169. }
  170. ctx.fillRect(0,y,w,1);
  171. }
  172. for (var x=0; x<h; x+=step) {
  173. if (x==0) {
  174. ctx.fillStyle = gc1;
  175. } else {
  176. ctx.fillStyle = gc2;
  177. }
  178. ctx.fillRect(x,0,1,h);
  179. }
  180. var data_url = temp_grid_canvas.toDataURL()
  181. return data_url;
  182. }
  183. function focus_contenteditable(el, end) {
  184. range = document.createRange();
  185. if (!range || !el) return;
  186. var p = $(el).find("p");
  187. if (!p.length) return;
  188. // get last paragraph
  189. p = p[p.length-1];
  190. range.selectNodeContents(p);
  191. selection = window.getSelection();
  192. selection.removeAllRanges();
  193. if (range.toString()!="Text") {
  194. // move cursor to the end
  195. range.collapse(false);
  196. }
  197. selection.addRange(range);
  198. el.focus();
  199. }
  200. function setup_exclusive_audio_video_playback() {
  201. document.addEventListener('play', function(e) {
  202. var tags = ["audio","video"];
  203. for (var i=0; i<tags.length; i++) {
  204. var tag = tags[i];
  205. var players = document.getElementsByTagName(tag);
  206. for (var i = 0, len = players.length; i < len; i++) {
  207. if (players[i] != e.target) {
  208. players[i].pause();
  209. }
  210. }
  211. }
  212. }, true);
  213. }