PageRenderTime 47ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/sapphire/thirdparty/greybox/AmiJS.js

https://github.com/benbruscella/vpcounselling.com
JavaScript | 378 lines | 366 code | 4 blank | 8 comment | 90 complexity | 0836549a730cd7de31e730aed7c0802e MD5 | raw file
  1. //AJS JavaScript library (minify'ed version)
  2. //Copyright (c) 2006 Amir Salihefendic. All rights reserved.
  3. //Copyright (c) 2005 Bob Ippolito. All rights reserved.
  4. //License: http://www.opensource.org/licenses/mit-license.php
  5. //Visit http://orangoo.com/AmiNation/AJS for full version.
  6. AJS = {
  7. BASE_URL: "",
  8. drag_obj: null,
  9. drag_elm: null,
  10. _drop_zones: [],
  11. _cur_pos: null,
  12. _unloadListeners: function() {
  13. if(AJS.listeners)
  14. AJS.map(AJS.listeners, function(elm, type, fn) {AJS.removeEventListener(elm, type, fn)});
  15. AJS.listeners = [];
  16. },
  17. getElement: function(id) {
  18. if(AJS.isString(id) || AJS.isNumber(id))
  19. return document.getElementById(id);
  20. else
  21. return id;
  22. },
  23. getScrollTop: function() {
  24. //From: http://www.quirksmode.org/js/doctypes.html
  25. var t;
  26. if (document.documentElement && document.documentElement.scrollTop)
  27. t = document.documentElement.scrollTop;
  28. else if (document.body)
  29. t = document.body.scrollTop;
  30. return t;
  31. },
  32. isArray: function(obj) {
  33. return obj instanceof Array;
  34. },
  35. removeElement: function(/*elm1, elm2...*/) {
  36. var args = AJS.flattenList(arguments);
  37. AJS.map(args, function(elm) { AJS.swapDOM(elm, null); });
  38. },
  39. isDict: function(o) {
  40. var str_repr = String(o);
  41. return str_repr.indexOf(" Object") != -1;
  42. },
  43. isString: function(obj) {
  44. return (typeof obj == 'string');
  45. },
  46. getIndex: function(elm, list/*optional*/, eval_fn) {
  47. for(var i=0; i < list.length; i++)
  48. if(eval_fn && eval_fn(list[i]) || elm == list[i])
  49. return i;
  50. return -1;
  51. },
  52. createDOM: function(name, attrs) {
  53. var i=0, attr;
  54. elm = document.createElement(name);
  55. if(AJS.isDict(attrs[i])) {
  56. for(k in attrs[0]) {
  57. attr = attrs[0][k];
  58. if(k == "style")
  59. elm.style.cssText = attr;
  60. else if(k == "class" || k == 'className')
  61. elm.className = attr;
  62. else {
  63. elm.setAttribute(k, attr);
  64. }
  65. }
  66. i++;
  67. }
  68. if(attrs[0] == null)
  69. i = 1;
  70. AJS.map(attrs, function(n) {
  71. if(n) {
  72. if(AJS.isString(n) || AJS.isNumber(n))
  73. n = AJS.TN(n);
  74. elm.appendChild(n);
  75. }
  76. }, i);
  77. return elm;
  78. },
  79. isIe: function() {
  80. return (navigator.userAgent.toLowerCase().indexOf("msie") != -1 && navigator.userAgent.toLowerCase().indexOf("opera") == -1);
  81. },
  82. addEventListener: function(elm, type, fn, /*optional*/listen_once, cancle_bubble) {
  83. if(!cancle_bubble)
  84. cancle_bubble = false;
  85. var elms = AJS.$A(elm);
  86. AJS.map(elms, function(elmz) {
  87. if(listen_once)
  88. fn = AJS._listenOnce(elmz, type, fn);
  89. if(AJS.isIn(type, ['submit', 'load', 'scroll', 'resize'])) {
  90. var old = elm['on' + type];
  91. elm['on' + type] = function() {
  92. if(old) {
  93. fn(arguments);
  94. return old(arguments);
  95. }
  96. else
  97. return fn(arguments);
  98. };
  99. return;
  100. }
  101. if (elmz.attachEvent) {
  102. //FIXME: We ignore cancle_bubble for IE... hmmz
  103. elmz.attachEvent("on" + type, fn);
  104. }
  105. else if(elmz.addEventListener)
  106. elmz.addEventListener(type, fn, cancle_bubble);
  107. AJS.listeners = AJS.$A(AJS.listeners);
  108. AJS.listeners.push([elmz, type, fn]);
  109. });
  110. },
  111. swapDOM: function(dest, src) {
  112. dest = AJS.getElement(dest);
  113. var parent = dest.parentNode;
  114. if (src) {
  115. src = AJS.getElement(src);
  116. parent.replaceChild(src, dest);
  117. } else {
  118. parent.removeChild(dest);
  119. }
  120. return src;
  121. },
  122. getLast: function(list) {
  123. if(list.length > 0)
  124. return list[list.length-1];
  125. else
  126. return null;
  127. },
  128. map: function(list, fn,/*optional*/ start_index, end_index) {
  129. var i = 0, l = list.length;
  130. if(start_index)
  131. i = start_index;
  132. if(end_index)
  133. l = end_index;
  134. for(i; i < l; i++)
  135. fn.apply(null, [list[i]]);
  136. },
  137. getElementsByTagAndClassName: function(tag_name, class_name, /*optional*/ parent) {
  138. var class_elements = [];
  139. if(!AJS.isDefined(parent))
  140. parent = document;
  141. if(!AJS.isDefined(tag_name))
  142. tag_name = '*';
  143. var els = parent.getElementsByTagName(tag_name);
  144. var els_len = els.length;
  145. var pattern = new RegExp("(^|\\s)" + class_name + "(\\s|$)");
  146. for (i = 0, j = 0; i < els_len; i++) {
  147. if ( pattern.test(els[i].className) || class_name == null ) {
  148. class_elements[j] = els[i];
  149. j++;
  150. }
  151. }
  152. return class_elements;
  153. },
  154. isOpera: function() {
  155. return (navigator.userAgent.toLowerCase().indexOf("opera") != -1);
  156. },
  157. setLeft: function(/*elm1, elm2..., left*/) {
  158. var args = AJS.flattenList(arguments);
  159. var l = AJS.getLast(args);
  160. AJS.map(args, function(elm) { elm.style.left = AJS.getCssDim(l)}, 0, args.length-1);
  161. },
  162. getBody: function() {
  163. return AJS.$bytc('body')[0]
  164. },
  165. getWindowSize: function() {
  166. var win_w, win_h;
  167. if (self.innerHeight) {
  168. win_w = self.innerWidth;
  169. win_h = self.innerHeight;
  170. } else if (document.documentElement && document.documentElement.clientHeight) {
  171. win_w = document.documentElement.clientWidth;
  172. win_h = document.documentElement.clientHeight;
  173. } else if (document.body) {
  174. win_w = document.body.clientWidth;
  175. win_h = document.body.clientHeight;
  176. }
  177. return {'w': win_w, 'h': win_h};
  178. },
  179. showElement: function(/*elms...*/) {
  180. var args = AJS.flattenList(arguments);
  181. AJS.map(args, function(elm) { elm.style.display = ''});
  182. },
  183. removeEventListener: function(elm, type, fn, /*optional*/cancle_bubble) {
  184. if(!cancle_bubble)
  185. cancle_bubble = false;
  186. if(elm.removeEventListener) {
  187. elm.removeEventListener(type, fn, cancle_bubble);
  188. if(AJS.isOpera())
  189. elm.removeEventListener(type, fn, !cancle_bubble);
  190. }
  191. else if(elm.detachEvent)
  192. elm.detachEvent("on" + type, fn);
  193. },
  194. _getRealScope: function(fn, /*optional*/ extra_args, dont_send_event, rev_extra_args) {
  195. var scope = window;
  196. extra_args = AJS.$A(extra_args);
  197. if(fn._cscope)
  198. scope = fn._cscope;
  199. return function() {
  200. //Append all the orginal arguments + extra_args
  201. var args = [];
  202. var i = 0;
  203. if(dont_send_event)
  204. i = 1;
  205. AJS.map(arguments, function(arg) { args.push(arg) }, i);
  206. args = args.concat(extra_args);
  207. if(rev_extra_args)
  208. args = args.reverse();
  209. return fn.apply(scope, args);
  210. };
  211. },
  212. _createDomShortcuts: function() {
  213. var elms = [
  214. "ul", "li", "td", "tr", "th",
  215. "tbody", "table", "input", "span", "b",
  216. "a", "div", "img", "button", "h1",
  217. "h2", "h3", "br", "textarea", "form",
  218. "p", "select", "option", "iframe", "script",
  219. "center", "dl", "dt", "dd", "small",
  220. "pre"
  221. ];
  222. var createDOM = AJS.createDOM;
  223. var extends_ajs = function(elm) {
  224. var c_dom = "return createDOM.apply(null, ['" + elm + "', arguments]);";
  225. var c_fun_dom = 'function() { ' + c_dom + ' }';
  226. eval("AJS." + elm.toUpperCase() + "=" + c_fun_dom);
  227. }
  228. AJS.map(elms, extends_ajs);
  229. AJS.TN = function(text) { return document.createTextNode(text) };
  230. },
  231. isNumber: function(obj) {
  232. return (typeof obj == 'number');
  233. },
  234. bind: function(fn, scope, /*optional*/ extra_args, dont_send_event, rev_extra_args) {
  235. fn._cscope = scope;
  236. return AJS._getRealScope(fn, extra_args, dont_send_event, rev_extra_args);
  237. },
  238. setTop: function(/*elm1, elm2..., top*/) {
  239. var args = AJS.flattenList(arguments);
  240. var t = AJS.getLast(args);
  241. AJS.map(args, function(elm) { elm.style.top = AJS.getCssDim(t)}, 0, args.length-1);
  242. },
  243. appendChildNodes: function(elm/*, elms...*/) {
  244. if(arguments.length >= 2) {
  245. AJS.map(arguments, function(n) {
  246. if(AJS.isString(n))
  247. n = AJS.TN(n);
  248. if(AJS.isDefined(n))
  249. elm.appendChild(n);
  250. }, 1);
  251. }
  252. return elm;
  253. },
  254. isDefined: function(o) {
  255. return (o != "undefined" && o != null)
  256. },
  257. isIn: function(elm, list) {
  258. var i = AJS.getIndex(elm, list);
  259. if(i != -1)
  260. return true;
  261. else
  262. return false;
  263. },
  264. setHeight: function(/*elm1, elm2..., height*/) {
  265. var args = AJS.flattenList(arguments);
  266. var h = AJS.getLast(args);
  267. AJS.map(args, function(elm) { elm.style.height = AJS.getCssDim(h)}, 0, args.length-1);
  268. },
  269. hideElement: function(elm) {
  270. var args = AJS.flattenList(arguments);
  271. AJS.map(args, function(elm) { elm.style.display = 'none'});
  272. },
  273. createArray: function(v) {
  274. if(AJS.isArray(v) && !AJS.isString(v))
  275. return v;
  276. else if(!v)
  277. return [];
  278. else
  279. return [v];
  280. },
  281. setWidth: function(/*elm1, elm2..., width*/) {
  282. var args = AJS.flattenList(arguments);
  283. var w = AJS.getLast(args);
  284. AJS.map(args, function(elm) { elm.style.width = AJS.getCssDim(w)}, 0, args.length-1);
  285. },
  286. getCssDim: function(dim) {
  287. if(AJS.isString(dim))
  288. return dim;
  289. else
  290. return dim + "px";
  291. },
  292. _listenOnce: function(elm, type, fn) {
  293. var r_fn = function() {
  294. AJS.removeEventListener(elm, type, r_fn);
  295. fn(arguments);
  296. }
  297. return r_fn;
  298. },
  299. flattenList: function(list) {
  300. var r = [];
  301. var _flatten = function(r, l) {
  302. AJS.map(l, function(o) {
  303. if (AJS.isArray(o))
  304. _flatten(r, o);
  305. else
  306. r.push(o);
  307. });
  308. }
  309. _flatten(r, list);
  310. return r;
  311. }
  312. }
  313. AJS.$ = AJS.getElement;
  314. AJS.$$ = AJS.getElements;
  315. AJS.$f = AJS.getFormElement;
  316. AJS.$b = AJS.bind;
  317. AJS.$A = AJS.createArray;
  318. AJS.DI = AJS.documentInsert;
  319. AJS.ACN = AJS.appendChildNodes;
  320. AJS.RCN = AJS.replaceChildNodes;
  321. AJS.AEV = AJS.addEventListener;
  322. AJS.REV = AJS.removeEventListener;
  323. AJS.$bytc = AJS.getElementsByTagAndClassName;
  324. AJS.addEventListener(window, 'unload', AJS._unloadListeners);
  325. AJS._createDomShortcuts()
  326. AJSDeferred = function(req) {
  327. this.callbacks = [];
  328. this.errbacks = [];
  329. this.req = req;
  330. };
  331. AJSDeferred.prototype = {
  332. excCallbackSeq: function(req, list) {
  333. var data = req.responseText;
  334. while (list.length > 0) {
  335. var fn = list.pop();
  336. var new_data = fn(data, req);
  337. if(new_data)
  338. data = new_data;
  339. }
  340. },
  341. callback: function () {
  342. this.excCallbackSeq(this.req, this.callbacks);
  343. },
  344. errback: function() {
  345. if(this.errbacks.length == 0)
  346. alert("Error encountered:\n" + this.req.responseText);
  347. this.excCallbackSeq(this.req, this.errbacks);
  348. },
  349. addErrback: function(fn) {
  350. this.errbacks.unshift(fn);
  351. },
  352. addCallback: function(fn) {
  353. this.callbacks.unshift(fn);
  354. },
  355. addCallbacks: function(fn1, fn2) {
  356. this.addCallback(fn1);
  357. this.addErrback(fn2);
  358. },
  359. sendReq: function(data) {
  360. if(AJS.isObject(data)) {
  361. var post_data = [];
  362. for(k in data) {
  363. post_data.push(k + "=" + AJS.urlencode(data[k]));
  364. }
  365. post_data = post_data.join("&");
  366. this.req.send(post_data);
  367. }
  368. else if(AJS.isDefined(data))
  369. this.req.send(data);
  370. else {
  371. this.req.send("");
  372. }
  373. }
  374. }