PageRenderTime 55ms CodeModel.GetById 25ms RepoModel.GetById 1ms app.codeStats 0ms

/_js/login/common.js

https://github.com/Subv/Armory
JavaScript | 455 lines | 411 code | 27 blank | 17 comment | 108 complexity | 2bb61d57075bf88cf2103a6a25b959dd MD5 | raw file
  1. var Browser = {
  2. a : navigator.userAgent.toLowerCase()
  3. }
  4. Browser = {
  5. ie : /*@cc_on true || @*/ false,
  6. ie6 : Browser.a.indexOf('msie 6') != -1,
  7. ie7 : Browser.a.indexOf('msie 7') != -1,
  8. opera : !!window.opera,
  9. safari : Browser.a.indexOf('safari') != -1,
  10. safari3 : Browser.a.indexOf('applewebkit/5') != -1,
  11. mac : Browser.a.indexOf('mac') != -1
  12. }
  13. function $(e) {
  14. if(typeof e == 'string')
  15. return document.getElementById(e);
  16. return e;
  17. }
  18. String.prototype.trim = function() {
  19. return this.replace(/^\s+|\s+$/g, '');
  20. }
  21. // Do not prototype Object or Array if using for-in loops
  22. function indexOf(array, elt /*, from*/) {
  23. // SpiderMonkey imlementation
  24. var len = array.length;
  25. var from = Number(arguments[2]) || 0;
  26. from = (from < 0) ? Math.ceil(from) : Math.floor(from);
  27. if(from < 0)
  28. from += len;
  29. for(; from < len; from++)
  30. if(from in array && array[from] === elt)
  31. return from;
  32. return -1;
  33. }
  34. function createElement(name, attrs, doc, xmlns) {
  35. var doc = doc || document;
  36. var elm;
  37. if(doc.createElementNS)
  38. elm = doc.createElementNS(xmlns || "http://www.w3.org/1999/xhtml", name);
  39. else
  40. elm = doc.createElement(name);
  41. if(attrs)
  42. for(attr in attrs)
  43. elm.setAttribute(attr, attrs[attr]);
  44. return elm;
  45. }
  46. function createElementStr(name, attrs) {
  47. return new NodeStr(name, attrs);
  48. }
  49. function setDisplay(e, display) {
  50. $(e).style.display = display;
  51. }
  52. function hide(e) {
  53. setDisplay(e, 'none');
  54. }
  55. function show(e) {
  56. setDisplay(e, '');
  57. }
  58. function visible(e) {
  59. return $(e).style.display != 'none';
  60. }
  61. function toggle(e) {
  62. (visible(e) ? hide : show)(e);
  63. }
  64. function visibleInverse(e) {
  65. return $(e).style.display != '';
  66. }
  67. function toggleInverse(e, display) {
  68. setDisplay(e, visibleInverse(e) ? '' : display);
  69. }
  70. function getChildElementsByTagName(e, tagName) {
  71. var nodes = [];
  72. for(var i = 0; i < e.childNodes.length; i++)
  73. if(e.childNodes[i].nodeName.toLowerCase() == tagName)
  74. nodes.push(e.childNodes[i]);
  75. return nodes;
  76. }
  77. function getElementsByClassName(className, element, tagName) {
  78. var regexp = new RegExp('(^|\\s)' + className + '(\\s|$)');
  79. var tagName = tagName || '*';
  80. var element = element || document;
  81. var elements = (tagName == '*' && element.all) ? element.all : element.getElementsByTagName(tagName);
  82. var found = [];
  83. for(var i = 0, elm; elm = elements[i]; i++)
  84. if(regexp.test(elm.className))
  85. found.push(elm);
  86. return found;
  87. }
  88. function hasClassName(e, className) {
  89. return (new RegExp('(^|\\s)' + className + '(\\s|$)').test($(e).className));
  90. }
  91. function addClassName(e, className) {
  92. var e = $(e);
  93. if(!hasClassName(e, className))
  94. e.className += (e.className ? ' ' : '') + className;
  95. }
  96. function removeClassName(e, className) {
  97. var e = $(e);
  98. e.className = e.className.replace(new RegExp('(^|\\s+)' + className + '(\\s+|$)'), ' ').trim();
  99. }
  100. function removeChildren(e) {
  101. while(e.firstChild)
  102. e.removeChild(e.firstChild);
  103. }
  104. function bind(method, scope, args) {
  105. if(!args)
  106. args = [];
  107. return function() {
  108. return method.apply(scope, args);
  109. }
  110. }
  111. function addEvent(obj, evType, fn) {
  112. if(obj.addEventListener) {
  113. obj.addEventListener(evType, fn, false);
  114. return true;
  115. } else if(obj.attachEvent || Browser.ie)
  116. return obj.attachEvent('on' + evType, fn);
  117. return false;
  118. }
  119. function removeEvent(obj, evType, fn) {
  120. if(obj.removeEventListener) {
  121. obj.removeEventListener(evType, fn, false);
  122. return true;
  123. } else if(obj.detatchEvent || Browser.ie)
  124. return obj.detachEvent('on' + evType, fn);
  125. return false;
  126. }
  127. function setBgPos(e, y, x) {
  128. $(e).style.backgroundPosition = y ? (x ? x + ' ' + y : '0 ' + y) : '0 0';
  129. }
  130. function hasScrolledToBottom(target) {
  131. return target.scrollTop >= (target.scrollHeight - target.offsetHeight);
  132. }
  133. function loadScript(src, id) {
  134. var head = document.getElementsByTagName('head')[0];
  135. var script = createElement('script', {'type': 'text/javascript', 'src': src} );
  136. if(id) {
  137. var old = document.getElementById(id);
  138. if(old)
  139. old.parentNode.removeChild(old);
  140. script.id = id;
  141. }
  142. head.appendChild(script);
  143. }
  144. function addStylesheet(href, media) {
  145. document.getElementsByTagName("head")[0].appendChild(createElement('link', {
  146. 'rel': 'stylesheet',
  147. 'type': 'text/css',
  148. 'media': media || 'screen, projection',
  149. 'href': href
  150. }));
  151. }
  152. // used for DOM-like creation of object elements in IE
  153. var NodeStr = function(name, attrs) {
  154. this.name = name;
  155. if(attrs)
  156. this.attrs = attrs;
  157. else
  158. this.attrs = {};
  159. this.childNodes = [];
  160. }
  161. NodeStr.prototype = {
  162. appendChild : function(node) {
  163. this.childNodes.push(node);
  164. return node;
  165. },
  166. setAttribute : function(name, value) {
  167. this.attrs[name] = value;
  168. },
  169. toString : function() {
  170. var str = '<' + this.name;
  171. if(this.attrs)
  172. for(attr in this.attrs)
  173. str += ' ' + attr + '="' + this.attrs[attr] + '"';
  174. str += '>';
  175. for(child in this.childNodes)
  176. str += this.childNodes[child];
  177. return str + '</' + this.name + '>';
  178. }
  179. }
  180. function selectLanguage(lang) {
  181. window.location = HTTP.setURLParams({'locale':lang});
  182. }
  183. var HTTP = {
  184. URL_SPACE_REGEXP : /%20/g,
  185. getURLParams : function(url) {
  186. var map = {};
  187. if(url) {
  188. var queryStart = url.indexOf('?');
  189. var hashStart = url.indexOf('#');
  190. if(queryStart != -1) {
  191. if(hashStart != -1)
  192. url = url.substring(queryStart + 1, hashStart);
  193. else
  194. url = url.substr(queryStart + 1);
  195. } else
  196. return map;
  197. } else
  198. url = window.location.search.substr(1);
  199. var entries = url.split('&');
  200. for(var i = 0; i < entries.length; i++) {
  201. var entry = entries[i].split('=', 2);
  202. if(!map[entry[0]])
  203. map[entry[0]] = [];
  204. map[entry[0]].push(entry.length == 2 ? decodeURIComponent(entry[1]) : null);
  205. }
  206. return map;
  207. },
  208. setURLParams : function(params, url) {
  209. var hash = '';
  210. var path;
  211. if(url) {
  212. var queryStart = url.indexOf('?');
  213. var hashStart = url.indexOf('#');
  214. if(queryStart != -1)
  215. path = url.substring(0, queryStart);
  216. else if(hashStart != -1)
  217. path = url.substring(0, hashStart);
  218. else
  219. path = url;
  220. if(hashStart != -1)
  221. hash = url.substr(hashStart);
  222. } else {
  223. url = false;
  224. path = window.location.pathname;
  225. hash = window.location.hash;
  226. }
  227. var curParams = HTTP.getURLParams(url);
  228. for(paramName in params)
  229. if(params[paramName] instanceof Array)
  230. curParams[paramName] = params[paramName];
  231. else
  232. curParams[paramName] = [params[paramName]];
  233. return path + HTTP._createQueryString(curParams) + hash;
  234. },
  235. encodeForm : function(form, post) {
  236. var pairs = [];
  237. var inputs = form.getElementsByTagName('input');
  238. var textareas = form.getElementsByTagName('textarea');
  239. var selects = form.getElementsByTagName('select');
  240. for(var i = 0, input; input = inputs[i]; i++)
  241. if(!input.disabled && input.name && ((input.type != 'radio' && input.type != 'checkbox') || input.checked))
  242. pairs.push(HTTP._formUrlEncode(input.name, post) + '=' + HTTP._formUrlEncode(input.value, post));
  243. for(var i = 0, input; input = textareas[i]; i++)
  244. if(!input.disabled && input.name)
  245. pairs.push(HTTP._formUrlEncode(input.name, post) + '=' + HTTP._formUrlEncode(input.value, post));
  246. for(var i = 0, input; input = selects[i]; i++)
  247. if(!input.disabled && input.name)
  248. for(var j = 0, option; option = input.options[j]; j++)
  249. if(option.selected)
  250. pairs.push(HTTP._formUrlEncode(input.name, post) + '=' + HTTP._formUrlEncode(option.value, post));
  251. return pairs.join('&');
  252. },
  253. _createQueryString : function(map) {
  254. var search = '';
  255. for(field in map)
  256. if(!Object.prototype[field]) {
  257. var array = map[field];
  258. for(var i = 0; i < array.length; i++) {
  259. if(search != '')
  260. search += '&';
  261. search += field;
  262. if(array[i] != null)
  263. search += '=' + array[i];
  264. }
  265. }
  266. if(search != '')
  267. search = '?' + search;
  268. return search;
  269. },
  270. _formUrlEncode : function(val, post) {
  271. if(post)
  272. return encodeURIComponent(val).replace(HTTP.URL_SPACE_REGEXP, '+');
  273. return encodeURIComponent(val);
  274. }
  275. }
  276. var Form = {
  277. getForm : function(node) {
  278. while(node.nodeName.toLowerCase() != 'form')
  279. node = node.parentNode;
  280. return node;
  281. },
  282. /* Allows an anchor tag or other element to act as a form submission button. Emulates correct
  283. * implementation of the DOM Level 2 method HTMLFormElement::submit. All supported browers
  284. * implement the submit method consistently incorrect, so duplicate calls to the onsubmit event
  285. * listener is not a concern at this time.
  286. *
  287. * If the parent form has an onsubmit event handler, the handler must return a value that will
  288. * resolve to true when the form submission should take place.
  289. */
  290. submit : function(node) {
  291. var form = Form.getForm(node);
  292. if(!form.onsubmit || form.onsubmit()) {
  293. /* Under SSL with server-side HTML generation, submit() will fail when called in
  294. * an onclick event handler on anchor tags in IE 6.
  295. */
  296. if(Browser.ie6) {
  297. window.setTimeout(function() {
  298. form.submit();
  299. }, 50);
  300. } else
  301. form.submit();
  302. }
  303. },
  304. getFields : function(element) {
  305. var fields = [];
  306. var fieldSets = [
  307. element.getElementsByTagName('input'),
  308. element.getElementsByTagName('textarea'),
  309. element.getElementsByTagName('select')
  310. ];
  311. for(var i = 0, fieldSet; fieldSet = fieldSets[i]; i++)
  312. for(var j = 0, field; field = fieldSet[j]; j++)
  313. fields.push(field);
  314. return fields;
  315. },
  316. showFields : function(e) {
  317. var fields = Form.getFields(e);
  318. for(field in fields)
  319. fields[field].disabled = false;
  320. show(e);
  321. },
  322. hideFields : function(e) {
  323. var fields = Form.getFields(e);
  324. hide(e);
  325. for(field in fields)
  326. fields[field].disabled = true;
  327. }
  328. }
  329. var CustomSelect = {
  330. toggleSelect : function(select, optionContainer, visibleClass, hiddenClass, inverse) {
  331. var optionContainer = $(optionContainer);
  332. if(inverse ? visibleInverse(optionContainer) : visible(optionContainer))
  333. CustomSelect._hideSelect(select, optionContainer, hiddenClass, inverse);
  334. else
  335. CustomSelect._showSelect(select, optionContainer, visibleClass, inverse);
  336. },
  337. hideSelectDelayed : function(index, select, optionContainer, className, inverse, delay) {
  338. var funcRef = function() {
  339. CustomSelect._hideSelect(select, optionContainer, className, inverse);
  340. }
  341. Timers.set('select' + index, funcRef, delay || 50);
  342. },
  343. onblur : function(index, select, optionContainer, className, inverse) {
  344. if(Browser.opera) // Opera handles focus/blur events differently than other browsers
  345. return;
  346. CustomSelect.hideSelectDelayed(index, select, optionContainer, className, inverse);
  347. },
  348. cancelHideSelect : function(index) {
  349. Timers.clear('select' + index);
  350. },
  351. cancelHideSelectDelayed : function(index) {
  352. window.setTimeout(function() {
  353. CustomSelect.cancelHideSelect(index)
  354. }, 10);
  355. },
  356. _showSelect : function(select, optionContainer, className, inverse) {
  357. var optionContainer = $(optionContainer);
  358. $(select).className = className;
  359. inverse ? setDisplay(optionContainer, 'block') : show(optionContainer);
  360. },
  361. _hideSelect : function(select, optionContainer, className, inverse) {
  362. var optionContainer = $(optionContainer);
  363. $(select).className = className;
  364. inverse ? setDisplay(optionContainer, '') : hide(optionContainer);
  365. }
  366. }
  367. var Timers = {
  368. set: function(id, code, timeout, allowMultiple) {
  369. if(Timers[id] != null && !allowMultiple)
  370. Timers.clear(id);
  371. Timers[id] = window.setTimeout(code, timeout);
  372. },
  373. clear: function(id) {
  374. window.clearTimeout(Timers[id]);
  375. Timers[id] = null;
  376. }
  377. };
  378. var login = {
  379. disableButton: function(linkClass, parentForm) {
  380. $j("a." + linkClass, parentForm).addClass("submitDisabled").removeAttr("onclick").html("<span>" + processingStr + "</span>");
  381. },
  382. scrollAccept :
  383. {
  384. scroll : function(node, checkboxID)
  385. {
  386. var checkbox = document.getElementById(checkboxID);
  387. //if scrolled to bottom, show/enable checkbox
  388. if(node.scrollTop >= (node.scrollHeight - node.offsetHeight)){
  389. $j(checkbox).removeAttr("disabled","false").css("visibility","visible").parent().addClass("enabled");
  390. }
  391. },
  392. accept : function(checkbox)
  393. {
  394. $j(checkbox).parent().bind('mousedown', function() { return false } )
  395. if(checkbox.checked)
  396. {
  397. $j(checkbox).parent().addClass("accepted");
  398. if(login.scrollAccept.validateCheckboxes(checkbox)){
  399. $j("a.submit").removeClass("submitDisabled");
  400. $j("a.submit").click(function(){
  401. Form.submit(checkbox);
  402. });
  403. }
  404. }
  405. //otherwise disable submit button
  406. else
  407. {
  408. $j(checkbox).parent().removeClass("accepted").addClass("enabled");
  409. $j("a.submit").addClass("submitDisabled");
  410. $j("a.submit").unbind("click");
  411. }
  412. return false;
  413. },
  414. validateCheckboxes : function(node)
  415. {
  416. //check all checkboxes within form
  417. var form = Form.getForm(node);
  418. var allChecked = true;
  419. $j(".scrollContainer input.legalCheckbox",form).each(function(){
  420. if(!this.checked){
  421. allChecked = false;
  422. return false;
  423. }
  424. });
  425. return allChecked;
  426. }
  427. }
  428. }