quo.js 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246
  1. /* QuoJS v2.3.0 - 1/21/2013
  2. http://quojs.tapquo.com
  3. Copyright (c) 2013 Tapquo S.L. - Licensed MIT */
  4. var Quo;
  5. Quo = (function() {
  6. var $$, EMPTY_ARRAY, Q;
  7. EMPTY_ARRAY = [];
  8. $$ = function(selector, children) {
  9. var dom;
  10. if (!selector) {
  11. return Q();
  12. } else if ($$.toType(selector) === "function") {
  13. return $$(document).ready(selector);
  14. } else {
  15. dom = $$.getDOMObject(selector, children);
  16. return Q(dom, selector);
  17. }
  18. };
  19. Q = function(dom, selector) {
  20. dom = dom || EMPTY_ARRAY;
  21. dom.__proto__ = Q.prototype;
  22. dom.selector = selector || '';
  23. return dom;
  24. };
  25. $$.extend = function(target) {
  26. Array.prototype.slice.call(arguments, 1).forEach(function(source) {
  27. var key, _results;
  28. _results = [];
  29. for (key in source) {
  30. _results.push(target[key] = source[key]);
  31. }
  32. return _results;
  33. });
  34. return target;
  35. };
  36. Q.prototype = $$.fn = {};
  37. return $$;
  38. })();
  39. window.Quo = Quo;
  40. "$$" in window || (window.$$ = Quo);
  41. (function($$) {
  42. var EMPTY_ARRAY, HTML_CONTAINERS, IS_HTML_FRAGMENT, OBJECT_PROTOTYPE, TABLE, TABLE_ROW, _compact, _flatten;
  43. EMPTY_ARRAY = [];
  44. OBJECT_PROTOTYPE = Object.prototype;
  45. IS_HTML_FRAGMENT = /^\s*<(\w+|!)[^>]*>/;
  46. TABLE = document.createElement('table');
  47. TABLE_ROW = document.createElement('tr');
  48. HTML_CONTAINERS = {
  49. "tr": document.createElement("tbody"),
  50. "tbody": TABLE,
  51. "thead": TABLE,
  52. "tfoot": TABLE,
  53. "td": TABLE_ROW,
  54. "th": TABLE_ROW,
  55. "*": document.createElement("div")
  56. };
  57. $$.toType = function(obj) {
  58. return OBJECT_PROTOTYPE.toString.call(obj).match(/\s([a-z|A-Z]+)/)[1].toLowerCase();
  59. };
  60. $$.isOwnProperty = function(object, property) {
  61. return OBJECT_PROTOTYPE.hasOwnProperty.call(object, property);
  62. };
  63. $$.getDOMObject = function(selector, children) {
  64. var domain, elementTypes, type;
  65. domain = null;
  66. elementTypes = [1, 9, 11];
  67. type = $$.toType(selector);
  68. if (type === "array") {
  69. domain = _compact(selector);
  70. } else if (type === "string" && IS_HTML_FRAGMENT.test(selector)) {
  71. domain = $$.fragment(selector.trim(), RegExp.$1);
  72. selector = null;
  73. } else if (type === "string") {
  74. domain = $$.query(document, selector);
  75. if (children) {
  76. if (domain.length === 1) {
  77. domain = $$.query(domain[0], children);
  78. } else {
  79. domain = $$.map(function() {
  80. return $$.query(domain, children);
  81. });
  82. }
  83. }
  84. } else if (elementTypes.indexOf(selector.nodeType) >= 0 || selector === window) {
  85. domain = [selector];
  86. selector = null;
  87. }
  88. return domain;
  89. };
  90. $$.map = function(elements, callback) {
  91. var i, key, value, values;
  92. values = [];
  93. i = void 0;
  94. key = void 0;
  95. if ($$.toType(elements) === "array") {
  96. i = 0;
  97. while (i < elements.length) {
  98. value = callback(elements[i], i);
  99. if (value != null) {
  100. values.push(value);
  101. }
  102. i++;
  103. }
  104. } else {
  105. for (key in elements) {
  106. value = callback(elements[key], key);
  107. if (value != null) {
  108. values.push(value);
  109. }
  110. }
  111. }
  112. return _flatten(values);
  113. };
  114. $$.each = function(elements, callback) {
  115. var i, key;
  116. i = void 0;
  117. key = void 0;
  118. if ($$.toType(elements) === "array") {
  119. i = 0;
  120. while (i < elements.length) {
  121. if (callback.call(elements[i], i, elements[i]) === false) {
  122. return elements;
  123. }
  124. i++;
  125. }
  126. } else {
  127. for (key in elements) {
  128. if (callback.call(elements[key], key, elements[key]) === false) {
  129. return elements;
  130. }
  131. }
  132. }
  133. return elements;
  134. };
  135. $$.mix = function() {
  136. var arg, argument, child, len, prop;
  137. child = {};
  138. arg = 0;
  139. len = arguments.length;
  140. while (arg < len) {
  141. argument = arguments[arg];
  142. for (prop in argument) {
  143. if ($$.isOwnProperty(argument, prop) && argument[prop] !== undefined) {
  144. child[prop] = argument[prop];
  145. }
  146. }
  147. arg++;
  148. }
  149. return child;
  150. };
  151. $$.fragment = function(markup, tag) {
  152. var container;
  153. if (tag == null) {
  154. tag = "*";
  155. }
  156. if (!(tag in HTML_CONTAINERS)) {
  157. tag = "*";
  158. }
  159. container = HTML_CONTAINERS[tag];
  160. container.innerHTML = "" + markup;
  161. return $$.each(Array.prototype.slice.call(container.childNodes), function() {
  162. return container.removeChild(this);
  163. });
  164. };
  165. $$.fn.map = function(fn) {
  166. return $$.map(this, function(el, i) {
  167. return fn.call(el, i, el);
  168. });
  169. };
  170. $$.fn.instance = function(property) {
  171. return this.map(function() {
  172. return this[property];
  173. });
  174. };
  175. $$.fn.filter = function(selector) {
  176. return $$([].filter.call(this, function(element) {
  177. return element.parentNode && $$.query(element.parentNode, selector).indexOf(element) >= 0;
  178. }));
  179. };
  180. $$.fn.forEach = EMPTY_ARRAY.forEach;
  181. $$.fn.indexOf = EMPTY_ARRAY.indexOf;
  182. _compact = function(array) {
  183. return array.filter(function(item) {
  184. return item !== void 0 && item !== null;
  185. });
  186. };
  187. return _flatten = function(array) {
  188. if (array.length > 0) {
  189. return [].concat.apply([], array);
  190. } else {
  191. return array;
  192. }
  193. };
  194. })(Quo);
  195. (function($$) {
  196. var IS_WEBKIT, SUPPORTED_OS, _current, _detectBrowser, _detectEnvironment, _detectOS, _detectScreen;
  197. _current = null;
  198. IS_WEBKIT = /WebKit\/([\d.]+)/;
  199. SUPPORTED_OS = {
  200. Android: /(Android)\s+([\d.]+)/,
  201. ipad: /(iPad).*OS\s([\d_]+)/,
  202. iphone: /(iPhone\sOS)\s([\d_]+)/,
  203. blackberry: /(BlackBerry).*Version\/([\d.]+)/,
  204. blackberryPlaybook: /(PlayBook).*Version\/([\d.]+)/,
  205. firefoxOS: /(Mozilla).*Mobile[^\/]*\/([\d\.]*)/,
  206. webos: /(webOS|hpwOS)[\s\/]([\d.]+)/
  207. };
  208. $$.isMobile = function() {
  209. _current = _current || _detectEnvironment();
  210. return _current.isMobile && _current.os.name !== "firefoxOS";
  211. };
  212. $$.environment = function() {
  213. _current = _current || _detectEnvironment();
  214. return _current;
  215. };
  216. $$.isOnline = function() {
  217. return navigator.onLine;
  218. };
  219. _detectEnvironment = function() {
  220. var environment, user_agent;
  221. user_agent = navigator.userAgent;
  222. environment = {};
  223. environment.browser = _detectBrowser(user_agent);
  224. environment.os = _detectOS(user_agent);
  225. environment.isMobile = !!environment.os;
  226. environment.screen = _detectScreen();
  227. return environment;
  228. };
  229. _detectBrowser = function(user_agent) {
  230. var is_webkit;
  231. is_webkit = user_agent.match(IS_WEBKIT);
  232. if (is_webkit) {
  233. return is_webkit[0];
  234. } else {
  235. return user_agent;
  236. }
  237. };
  238. _detectOS = function(user_agent) {
  239. var detected_os, os, supported;
  240. detected_os = null;
  241. for (os in SUPPORTED_OS) {
  242. supported = user_agent.match(SUPPORTED_OS[os]);
  243. if (supported) {
  244. detected_os = {
  245. name: (os === "iphone" || os === "ipad" ? "ios" : os),
  246. version: supported[2].replace("_", ".")
  247. };
  248. break;
  249. }
  250. }
  251. return detected_os;
  252. };
  253. return _detectScreen = function() {
  254. return {
  255. width: window.innerWidth,
  256. height: window.innerHeight
  257. };
  258. };
  259. })(Quo);
  260. (function($$) {
  261. var CLASS_SELECTOR, ID_SELECTOR, PARENT_NODE, TAG_SELECTOR, _filtered, _findAncestors;
  262. PARENT_NODE = "parentNode";
  263. CLASS_SELECTOR = /^\.([\w-]+)$/;
  264. ID_SELECTOR = /^#[\w\d-]+$/;
  265. TAG_SELECTOR = /^[\w-]+$/;
  266. $$.query = function(domain, selector) {
  267. var elements;
  268. selector = selector.trim();
  269. if (CLASS_SELECTOR.test(selector)) {
  270. elements = domain.getElementsByClassName(selector.replace(".", ""));
  271. } else if (TAG_SELECTOR.test(selector)) {
  272. elements = domain.getElementsByTagName(selector);
  273. } else if (ID_SELECTOR.test(selector)) {
  274. elements = domain.getElementById(selector.replace("#", ""));
  275. if (!elements) {
  276. elements = [];
  277. }
  278. } else {
  279. elements = domain.querySelectorAll(selector);
  280. }
  281. if (elements.nodeType) {
  282. return [elements];
  283. } else {
  284. return Array.prototype.slice.call(elements);
  285. }
  286. };
  287. $$.fn.find = function(selector) {
  288. var result;
  289. if (this.length === 1) {
  290. result = Quo.query(this[0], selector);
  291. } else {
  292. result = this.map(function() {
  293. return Quo.query(this, selector);
  294. });
  295. }
  296. return $$(result);
  297. };
  298. $$.fn.parent = function(selector) {
  299. var ancestors;
  300. ancestors = (selector ? _findAncestors(this) : this.instance(PARENT_NODE));
  301. return _filtered(ancestors, selector);
  302. };
  303. $$.fn.siblings = function(selector) {
  304. var siblings_elements;
  305. siblings_elements = this.map(function(index, element) {
  306. return Array.prototype.slice.call(element.parentNode.children).filter(function(child) {
  307. return child !== element;
  308. });
  309. });
  310. return _filtered(siblings_elements, selector);
  311. };
  312. $$.fn.children = function(selector) {
  313. var children_elements;
  314. children_elements = this.map(function() {
  315. return Array.prototype.slice.call(this.children);
  316. });
  317. return _filtered(children_elements, selector);
  318. };
  319. $$.fn.get = function(index) {
  320. if (index === undefined) {
  321. return this;
  322. } else {
  323. return this[index];
  324. }
  325. };
  326. $$.fn.first = function() {
  327. return $$(this[0]);
  328. };
  329. $$.fn.last = function() {
  330. return $$(this[this.length - 1]);
  331. };
  332. $$.fn.closest = function(selector, context) {
  333. var candidates, node;
  334. node = this[0];
  335. candidates = $$(selector);
  336. if (!candidates.length) {
  337. node = null;
  338. }
  339. while (node && candidates.indexOf(node) < 0) {
  340. node = node !== context && node !== document && node.parentNode;
  341. }
  342. return $$(node);
  343. };
  344. $$.fn.each = function(callback) {
  345. this.forEach(function(element, index) {
  346. return callback.call(element, index, element);
  347. });
  348. return this;
  349. };
  350. _findAncestors = function(nodes) {
  351. var ancestors;
  352. ancestors = [];
  353. while (nodes.length > 0) {
  354. nodes = $$.map(nodes, function(node) {
  355. if ((node = node.parentNode) && node !== document && ancestors.indexOf(node) < 0) {
  356. ancestors.push(node);
  357. return node;
  358. }
  359. });
  360. }
  361. return ancestors;
  362. };
  363. return _filtered = function(nodes, selector) {
  364. if (selector === undefined) {
  365. return $$(nodes);
  366. } else {
  367. return $$(nodes).filter(selector);
  368. }
  369. };
  370. })(Quo);
  371. (function($$) {
  372. var VENDORS, _computedStyle, _existsClass;
  373. VENDORS = ["-webkit-", "-moz-", "-ms-", "-o-", ""];
  374. $$.fn.addClass = function(name) {
  375. return this.each(function() {
  376. if (!_existsClass(name, this.className)) {
  377. this.className += " " + name;
  378. return this.className = this.className.trim();
  379. }
  380. });
  381. };
  382. $$.fn.removeClass = function(name) {
  383. return this.each(function() {
  384. if (!name) {
  385. return this.className = "";
  386. } else {
  387. if (_existsClass(name, this.className)) {
  388. return this.className = this.className.replace(name, " ").replace(/\s+/g, " ").trim();
  389. }
  390. }
  391. });
  392. };
  393. $$.fn.toggleClass = function(name) {
  394. return this.each(function() {
  395. if (_existsClass(name, this.className)) {
  396. return this.className = this.className.replace(name, " ");
  397. } else {
  398. this.className += " " + name;
  399. return this.className = this.className.trim();
  400. }
  401. });
  402. };
  403. $$.fn.hasClass = function(name) {
  404. return _existsClass(name, this[0].className);
  405. };
  406. $$.fn.style = function(property, value) {
  407. if (value) {
  408. return this.each(function() {
  409. return this.style[property] = value;
  410. });
  411. } else {
  412. return this[0].style[property] || _computedStyle(this[0], property);
  413. }
  414. };
  415. $$.fn.css = function(property, value) {
  416. return this.style(property, value);
  417. };
  418. $$.fn.vendor = function(property, value) {
  419. var vendor, _i, _len, _results;
  420. _results = [];
  421. for (_i = 0, _len = VENDORS.length; _i < _len; _i++) {
  422. vendor = VENDORS[_i];
  423. _results.push(this.style("" + vendor + property, value));
  424. }
  425. return _results;
  426. };
  427. _existsClass = function(name, className) {
  428. var classes;
  429. classes = className.split(/\s+/g);
  430. return classes.indexOf(name) >= 0;
  431. };
  432. return _computedStyle = function(element, property) {
  433. return document.defaultView.getComputedStyle(element, "")[property];
  434. };
  435. })(Quo);
  436. (function($$) {
  437. $$.fn.attr = function(name, value) {
  438. if ($$.toType(name) === "string" && value === void 0) {
  439. return this[0].getAttribute(name);
  440. } else {
  441. return this.each(function() {
  442. return this.setAttribute(name, value);
  443. });
  444. }
  445. };
  446. $$.fn.removeAttr = function(name) {
  447. return this.each(function() {
  448. return this.removeAttribute(name);
  449. });
  450. };
  451. $$.fn.data = function(name, value) {
  452. return this.attr("data-" + name, value);
  453. };
  454. $$.fn.removeData = function(name) {
  455. return this.removeAttr("data-" + name);
  456. };
  457. $$.fn.val = function(value) {
  458. if ($$.toType(value) === "string") {
  459. return this.each(function() {
  460. return this.value = value;
  461. });
  462. } else {
  463. if (this.length > 0) {
  464. return this[0].value;
  465. } else {
  466. return null;
  467. }
  468. }
  469. };
  470. $$.fn.show = function() {
  471. return this.style("display", "block");
  472. };
  473. $$.fn.hide = function() {
  474. return this.style("display", "none");
  475. };
  476. $$.fn.height = function() {
  477. var offset;
  478. offset = this.offset();
  479. return offset.height;
  480. };
  481. $$.fn.width = function() {
  482. var offset;
  483. offset = this.offset();
  484. return offset.width;
  485. };
  486. $$.fn.offset = function() {
  487. var bounding;
  488. bounding = this[0].getBoundingClientRect();
  489. return {
  490. left: bounding.left + window.pageXOffset,
  491. top: bounding.top + window.pageYOffset,
  492. width: bounding.width,
  493. height: bounding.height
  494. };
  495. };
  496. return $$.fn.remove = function() {
  497. return this.each(function() {
  498. if (this.parentNode != null) {
  499. return this.parentNode.removeChild(this);
  500. }
  501. });
  502. };
  503. })(Quo);
  504. (function($$) {
  505. var _prependElement;
  506. $$.fn.text = function(value) {
  507. if (value || $$.toType(value) === "number") {
  508. return this.each(function() {
  509. return this.textContent = value;
  510. });
  511. } else {
  512. return this[0].textContent;
  513. }
  514. };
  515. $$.fn.html = function(value) {
  516. var type;
  517. type = $$.toType(value);
  518. if (value || type === "number" || type === "string") {
  519. return this.each(function() {
  520. if (type === "string" || type === "number") {
  521. return this.innerHTML = value;
  522. } else {
  523. this.innerHTML = null;
  524. return this.appendChild(value);
  525. }
  526. });
  527. } else {
  528. return this[0].innerHTML;
  529. }
  530. };
  531. $$.fn.append = function(value) {
  532. var type;
  533. type = $$.toType(value);
  534. return this.each(function() {
  535. var _this = this;
  536. if (type === "string") {
  537. return this.insertAdjacentHTML("beforeend", value);
  538. } else if (type === "array") {
  539. return value.each(function(index, value) {
  540. return _this.appendChild(value);
  541. });
  542. } else {
  543. return this.appendChild(value);
  544. }
  545. });
  546. };
  547. $$.fn.prepend = function(value) {
  548. var type;
  549. type = $$.toType(value);
  550. return this.each(function() {
  551. return _prependElement(this, value, type);
  552. });
  553. };
  554. $$.fn.replaceWith = function(value) {
  555. var type;
  556. type = $$.toType(value);
  557. this.each(function() {
  558. if (this.parentNode) {
  559. return _prependElement(this.parentNode, value, type);
  560. }
  561. });
  562. return this.remove();
  563. };
  564. $$.fn.empty = function() {
  565. return this.each(function() {
  566. return this.innerHTML = null;
  567. });
  568. };
  569. return _prependElement = function(parent, value, type) {
  570. var _this = this;
  571. if (type === "string") {
  572. return parent.insertAdjacentHTML("afterbegin", value);
  573. } else if (type === "array") {
  574. return value.each(function(index, value) {
  575. return parent.insertBefore(value, parent.firstChild);
  576. });
  577. } else {
  578. return parent.insertBefore(value, parent.firstChild);
  579. }
  580. };
  581. })(Quo);
  582. (function($$) {
  583. var DEFAULT, JSONP_ID, MIME_TYPES, _isJsonP, _parseResponse, _xhrError, _xhrForm, _xhrHeaders, _xhrStatus, _xhrSuccess, _xhrTimeout;
  584. DEFAULT = {
  585. TYPE: "GET",
  586. MIME: "json"
  587. };
  588. MIME_TYPES = {
  589. script: "text/javascript, application/javascript",
  590. json: "application/json",
  591. xml: "application/xml, text/xml",
  592. html: "text/html",
  593. text: "text/plain"
  594. };
  595. JSONP_ID = 0;
  596. $$.ajaxSettings = {
  597. type: DEFAULT.TYPE,
  598. async: true,
  599. success: {},
  600. error: {},
  601. context: null,
  602. dataType: DEFAULT.MIME,
  603. headers: {},
  604. xhr: function() {
  605. return new window.XMLHttpRequest();
  606. },
  607. crossDomain: false,
  608. timeout: 0
  609. };
  610. $$.ajax = function(options) {
  611. var abortTimeout, settings, xhr;
  612. settings = $$.mix($$.ajaxSettings, options);
  613. if (settings.type === DEFAULT.TYPE) {
  614. settings.url += $$.serializeParameters(settings.data, "?");
  615. } else {
  616. settings.data = $$.serializeParameters(settings.data);
  617. }
  618. if (_isJsonP(settings.url)) {
  619. return $$.jsonp(settings);
  620. }
  621. xhr = settings.xhr();
  622. xhr.onreadystatechange = function() {
  623. if (xhr.readyState === 4) {
  624. clearTimeout(abortTimeout);
  625. return _xhrStatus(xhr, settings);
  626. }
  627. };
  628. xhr.open(settings.type, settings.url, settings.async);
  629. _xhrHeaders(xhr, settings);
  630. if (settings.timeout > 0) {
  631. abortTimeout = setTimeout((function() {
  632. return _xhrTimeout(xhr, settings);
  633. }), settings.timeout);
  634. }
  635. try {
  636. xhr.send(settings.data);
  637. } catch (error) {
  638. xhr = error;
  639. _xhrError("Resource not found", xhr, settings);
  640. }
  641. if (settings.async) {
  642. return xhr;
  643. } else {
  644. return _parseResponse(xhr, settings);
  645. }
  646. };
  647. $$.jsonp = function(settings) {
  648. var abortTimeout, callbackName, script, xhr;
  649. if (settings.async) {
  650. callbackName = "jsonp" + (++JSONP_ID);
  651. script = document.createElement("script");
  652. xhr = {
  653. abort: function() {
  654. $$(script).remove();
  655. if (callbackName in window) {
  656. return window[callbackName] = {};
  657. }
  658. }
  659. };
  660. abortTimeout = void 0;
  661. window[callbackName] = function(response) {
  662. clearTimeout(abortTimeout);
  663. $$(script).remove();
  664. delete window[callbackName];
  665. return _xhrSuccess(response, xhr, settings);
  666. };
  667. script.src = settings.url.replace(RegExp("=\\?"), "=" + callbackName);
  668. $$("head").append(script);
  669. if (settings.timeout > 0) {
  670. abortTimeout = setTimeout((function() {
  671. return _xhrTimeout(xhr, settings);
  672. }), settings.timeout);
  673. }
  674. return xhr;
  675. } else {
  676. return console.error("QuoJS.ajax: Unable to make jsonp synchronous call.");
  677. }
  678. };
  679. $$.get = function(url, data, success, dataType) {
  680. return $$.ajax({
  681. url: url,
  682. data: data,
  683. success: success,
  684. dataType: dataType
  685. });
  686. };
  687. $$.post = function(url, data, success, dataType) {
  688. return _xhrForm("POST", url, data, success, dataType);
  689. };
  690. $$.put = function(url, data, success, dataType) {
  691. return _xhrForm("PUT", url, data, success, dataType);
  692. };
  693. $$["delete"] = function(url, data, success, dataType) {
  694. return _xhrForm("DELETE", url, data, success, dataType);
  695. };
  696. $$.json = function(url, data, success) {
  697. return $$.ajax({
  698. url: url,
  699. data: data,
  700. success: success,
  701. dataType: DEFAULT.MIME
  702. });
  703. };
  704. $$.serializeParameters = function(parameters, character) {
  705. var parameter, serialize;
  706. if (character == null) {
  707. character = "";
  708. }
  709. serialize = character;
  710. for (parameter in parameters) {
  711. if (parameters.hasOwnProperty(parameter)) {
  712. if (serialize !== character) {
  713. serialize += "&";
  714. }
  715. serialize += parameter + "=" + parameters[parameter];
  716. }
  717. }
  718. if (serialize === character) {
  719. return "";
  720. } else {
  721. return serialize;
  722. }
  723. };
  724. _xhrStatus = function(xhr, settings) {
  725. if ((xhr.status >= 200 && xhr.status < 300) || xhr.status === 0) {
  726. if (settings.async) {
  727. _xhrSuccess(_parseResponse(xhr, settings), xhr, settings);
  728. }
  729. } else {
  730. _xhrError("QuoJS.ajax: Unsuccesful request", xhr, settings);
  731. }
  732. };
  733. _xhrSuccess = function(response, xhr, settings) {
  734. settings.success.call(settings.context, response, xhr);
  735. };
  736. _xhrError = function(type, xhr, settings) {
  737. settings.error.call(settings.context, type, xhr, settings);
  738. };
  739. _xhrHeaders = function(xhr, settings) {
  740. var header;
  741. if (settings.contentType) {
  742. settings.headers["Content-Type"] = settings.contentType;
  743. }
  744. if (settings.dataType) {
  745. settings.headers["Accept"] = MIME_TYPES[settings.dataType];
  746. }
  747. for (header in settings.headers) {
  748. xhr.setRequestHeader(header, settings.headers[header]);
  749. }
  750. };
  751. _xhrTimeout = function(xhr, settings) {
  752. xhr.onreadystatechange = {};
  753. xhr.abort();
  754. _xhrError("QuoJS.ajax: Timeout exceeded", xhr, settings);
  755. };
  756. _xhrForm = function(method, url, data, success, dataType) {
  757. return $$.ajax({
  758. type: method,
  759. url: url,
  760. data: data,
  761. success: success,
  762. dataType: dataType,
  763. contentType: "application/x-www-form-urlencoded"
  764. });
  765. };
  766. _parseResponse = function(xhr, settings) {
  767. var response;
  768. response = xhr.responseText;
  769. if (response) {
  770. if (settings.dataType === DEFAULT.MIME) {
  771. try {
  772. response = JSON.parse(response);
  773. } catch (error) {
  774. response = error;
  775. _xhrError("QuoJS.ajax: Parse Error", xhr, settings);
  776. }
  777. } else {
  778. if (settings.dataType === "xml") {
  779. response = xhr.responseXML;
  780. }
  781. }
  782. }
  783. return response;
  784. };
  785. return _isJsonP = function(url) {
  786. return RegExp("=\\?").test(url);
  787. };
  788. })(Quo);
  789. (function($$) {
  790. var ELEMENT_ID, EVENTS_DESKTOP, EVENT_METHODS, HANDLERS, READY_EXPRESSION, SHORTCUTS, _createProxy, _createProxyCallback, _environmentEvent, _findHandlers, _getElementId, _subscribe, _unsubscribe;
  791. ELEMENT_ID = 1;
  792. HANDLERS = {};
  793. EVENT_METHODS = {
  794. preventDefault: "isDefaultPrevented",
  795. stopImmediatePropagation: "isImmediatePropagationStopped",
  796. stopPropagation: "isPropagationStopped"
  797. };
  798. EVENTS_DESKTOP = {
  799. touchstart: "mousedown",
  800. touchmove: "mousemove",
  801. touchend: "mouseup",
  802. touch: "click",
  803. doubletap: "dblclick",
  804. orientationchange: "resize"
  805. };
  806. READY_EXPRESSION = /complete|loaded|interactive/;
  807. SHORTCUTS = ["tap"];
  808. SHORTCUTS.forEach(function(event) {
  809. $$.fn[event] = function(callback) {
  810. return $$(document.body).delegate(this.selector, event, callback);
  811. };
  812. return this;
  813. });
  814. $$.fn.on = function(event, selector, callback) {
  815. if (selector === "undefined" || $$.toType(selector) === "function") {
  816. return this.bind(event, selector);
  817. } else {
  818. return this.delegate(selector, event, callback);
  819. }
  820. };
  821. $$.fn.off = function(event, selector, callback) {
  822. if (selector === "undefined" || $$.toType(selector) === "function") {
  823. return this.unbind(event, selector);
  824. } else {
  825. return this.undelegate(selector, event, callback);
  826. }
  827. };
  828. $$.fn.ready = function(callback) {
  829. if (READY_EXPRESSION.test(document.readyState)) {
  830. return callback($$);
  831. } else {
  832. return $$.fn.addEvent(document, "DOMContentLoaded", function() {
  833. return callback($$);
  834. });
  835. }
  836. };
  837. $$.Event = function(type, touch) {
  838. var event, property;
  839. event = document.createEvent("Events");
  840. event.initEvent(type, true, true, null, null, null, null, null, null, null, null, null, null, null, null);
  841. if (touch) {
  842. for (property in touch) {
  843. event[property] = touch[property];
  844. }
  845. }
  846. return event;
  847. };
  848. $$.fn.bind = function(event, callback) {
  849. return this.each(function() {
  850. _subscribe(this, event, callback);
  851. });
  852. };
  853. $$.fn.unbind = function(event, callback) {
  854. return this.each(function() {
  855. _unsubscribe(this, event, callback);
  856. });
  857. };
  858. $$.fn.delegate = function(selector, event, callback) {
  859. return this.each(function(i, element) {
  860. _subscribe(element, event, callback, selector, function(fn) {
  861. return function(e) {
  862. var evt, match;
  863. match = $$(e.target).closest(selector, element).get(0);
  864. if (match) {
  865. evt = $$.extend(_createProxy(e), {
  866. currentTarget: match,
  867. liveFired: element
  868. });
  869. return fn.apply(match, [evt].concat([].slice.call(arguments, 1)));
  870. }
  871. };
  872. });
  873. });
  874. };
  875. $$.fn.undelegate = function(selector, event, callback) {
  876. return this.each(function() {
  877. _unsubscribe(this, event, callback, selector);
  878. });
  879. };
  880. $$.fn.trigger = function(event, touch) {
  881. if ($$.toType(event) === "string") {
  882. event = $$.Event(event, touch);
  883. }
  884. return this.each(function() {
  885. this.dispatchEvent(event);
  886. });
  887. };
  888. $$.fn.addEvent = function(element, event_name, callback) {
  889. if (element.addEventListener) {
  890. return element.addEventListener(event_name, callback, false);
  891. } else if (element.attachEvent) {
  892. return element.attachEvent("on" + event_name, callback);
  893. } else {
  894. return element["on" + event_name] = callback;
  895. }
  896. };
  897. $$.fn.removeEvent = function(element, event_name, callback) {
  898. if (element.removeEventListener) {
  899. return element.removeEventListener(event_name, callback, false);
  900. } else if (element.detachEvent) {
  901. return element.detachEvent("on" + event_name, callback);
  902. } else {
  903. return element["on" + event_name] = null;
  904. }
  905. };
  906. _subscribe = function(element, event, callback, selector, delegate_callback) {
  907. var delegate, element_handlers, element_id, handler;
  908. event = _environmentEvent(event);
  909. element_id = _getElementId(element);
  910. element_handlers = HANDLERS[element_id] || (HANDLERS[element_id] = []);
  911. delegate = delegate_callback && delegate_callback(callback, event);
  912. handler = {
  913. event: event,
  914. callback: callback,
  915. selector: selector,
  916. proxy: _createProxyCallback(delegate, callback, element),
  917. delegate: delegate,
  918. index: element_handlers.length
  919. };
  920. element_handlers.push(handler);
  921. return $$.fn.addEvent(element, handler.event, handler.proxy);
  922. };
  923. _unsubscribe = function(element, event, callback, selector) {
  924. var element_id;
  925. event = _environmentEvent(event);
  926. element_id = _getElementId(element);
  927. return _findHandlers(element_id, event, callback, selector).forEach(function(handler) {
  928. delete HANDLERS[element_id][handler.index];
  929. return $$.fn.removeEvent(element, handler.event, handler.proxy);
  930. });
  931. };
  932. _getElementId = function(element) {
  933. return element._id || (element._id = ELEMENT_ID++);
  934. };
  935. _environmentEvent = function(event) {
  936. var environment_event;
  937. environment_event = ($$.isMobile() ? event : EVENTS_DESKTOP[event]);
  938. return environment_event || event;
  939. };
  940. _createProxyCallback = function(delegate, callback, element) {
  941. var proxy;
  942. callback = delegate || callback;
  943. proxy = function(event) {
  944. var result;
  945. result = callback.apply(element, [event].concat(event.data));
  946. if (result === false) {
  947. event.preventDefault();
  948. }
  949. return result;
  950. };
  951. return proxy;
  952. };
  953. _findHandlers = function(element_id, event, fn, selector) {
  954. return (HANDLERS[element_id] || []).filter(function(handler) {
  955. return handler && (!event || handler.event === event) && (!fn || handler.fn === fn) && (!selector || handler.selector === selector);
  956. });
  957. };
  958. return _createProxy = function(event) {
  959. var proxy;
  960. proxy = $$.extend({
  961. originalEvent: event
  962. }, event);
  963. $$.each(EVENT_METHODS, function(name, method) {
  964. proxy[name] = function() {
  965. this[method] = function() {
  966. return true;
  967. };
  968. return event[name].apply(event, arguments);
  969. };
  970. return proxy[method] = function() {
  971. return false;
  972. };
  973. });
  974. return proxy;
  975. };
  976. })(Quo);
  977. (function($$) {
  978. var CURRENT_TOUCH, FIRST_TOUCH, GESTURE, GESTURES, HOLD_DELAY, TAPS, TOUCH_TIMEOUT, _angle, _capturePinch, _captureRotation, _cleanGesture, _distance, _fingersPosition, _getTouches, _hold, _isSwipe, _listenTouches, _onTouchEnd, _onTouchMove, _onTouchStart, _parentIfText, _swipeDirection, _trigger;
  979. TAPS = null;
  980. GESTURE = {};
  981. FIRST_TOUCH = [];
  982. CURRENT_TOUCH = [];
  983. TOUCH_TIMEOUT = void 0;
  984. HOLD_DELAY = 650;
  985. GESTURES = ["doubleTap", "hold", "swipe", "swiping", "swipeLeft", "swipeRight", "swipeUp", "swipeDown", "rotate", "rotating", "rotateLeft", "rotateRight", "pinch", "pinching", "pinchIn", "pinchOut", "drag", "dragLeft", "dragRight", "dragUp", "dragDown"];
  986. GESTURES.forEach(function(event) {
  987. $$.fn[event] = function(callback) {
  988. return this.on(event, callback);
  989. };
  990. });
  991. $$(document).ready(function() {
  992. return _listenTouches();
  993. });
  994. _listenTouches = function() {
  995. var environment;
  996. environment = $$(document.body);
  997. environment.bind("touchstart", _onTouchStart);
  998. environment.bind("touchmove", _onTouchMove);
  999. environment.bind("touchend", _onTouchEnd);
  1000. return environment.bind("touchcancel", _cleanGesture);
  1001. };
  1002. _onTouchStart = function(event) {
  1003. var delta, fingers, now, touches;
  1004. now = Date.now();
  1005. delta = now - (GESTURE.last || now);
  1006. TOUCH_TIMEOUT && clearTimeout(TOUCH_TIMEOUT);
  1007. touches = _getTouches(event);
  1008. fingers = touches.length;
  1009. FIRST_TOUCH = _fingersPosition(touches, fingers);
  1010. GESTURE.el = $$(_parentIfText(touches[0].target));
  1011. GESTURE.fingers = fingers;
  1012. GESTURE.last = now;
  1013. if (!GESTURE.taps) {
  1014. GESTURE.taps = 0;
  1015. }
  1016. GESTURE.taps++;
  1017. if (fingers === 1) {
  1018. if (fingers >= 1) {
  1019. GESTURE.gap = delta > 0 && delta <= 250;
  1020. }
  1021. return setTimeout(_hold, HOLD_DELAY);
  1022. } else if (fingers === 2) {
  1023. GESTURE.initial_angle = parseInt(_angle(FIRST_TOUCH), 10);
  1024. GESTURE.initial_distance = parseInt(_distance(FIRST_TOUCH), 10);
  1025. GESTURE.angle_difference = 0;
  1026. return GESTURE.distance_difference = 0;
  1027. }
  1028. };
  1029. _onTouchMove = function(event) {
  1030. var fingers, touches;
  1031. if (GESTURE.el) {
  1032. touches = _getTouches(event);
  1033. fingers = touches.length;
  1034. if (fingers === GESTURE.fingers) {
  1035. CURRENT_TOUCH = _fingersPosition(touches, fingers);
  1036. if (_isSwipe(event)) {
  1037. _trigger("swiping");
  1038. }
  1039. if (fingers === 2) {
  1040. _captureRotation();
  1041. _capturePinch();
  1042. event.preventDefault();
  1043. }
  1044. } else {
  1045. _cleanGesture();
  1046. }
  1047. }
  1048. return true;
  1049. };
  1050. _isSwipe = function(event) {
  1051. var it_is, move_horizontal, move_vertical;
  1052. it_is = false;
  1053. if (CURRENT_TOUCH[0]) {
  1054. move_horizontal = Math.abs(FIRST_TOUCH[0].x - CURRENT_TOUCH[0].x) > 30;
  1055. move_vertical = Math.abs(FIRST_TOUCH[0].y - CURRENT_TOUCH[0].y) > 30;
  1056. it_is = GESTURE.el && (move_horizontal || move_vertical);
  1057. }
  1058. return it_is;
  1059. };
  1060. _onTouchEnd = function(event) {
  1061. var anyevent, drag_direction, pinch_direction, rotation_direction, swipe_direction;
  1062. if (GESTURE.fingers === 1) {
  1063. if (GESTURE.taps === 2 && GESTURE.gap) {
  1064. _trigger("doubleTap");
  1065. return _cleanGesture();
  1066. } else if (_isSwipe()) {
  1067. _trigger("swipe");
  1068. swipe_direction = _swipeDirection(FIRST_TOUCH[0].x, CURRENT_TOUCH[0].x, FIRST_TOUCH[0].y, CURRENT_TOUCH[0].y);
  1069. _trigger("swipe" + swipe_direction);
  1070. return _cleanGesture();
  1071. } else {
  1072. _trigger("tap");
  1073. if (GESTURE.taps === 1) {
  1074. return TOUCH_TIMEOUT = setTimeout((function() {
  1075. _trigger("singleTap");
  1076. return _cleanGesture();
  1077. }), 100);
  1078. }
  1079. }
  1080. } else {
  1081. anyevent = false;
  1082. if (GESTURE.angle_difference !== 0) {
  1083. _trigger("rotate", {
  1084. angle: GESTURE.angle_difference
  1085. });
  1086. rotation_direction = GESTURE.angle_difference > 0 ? "rotateRight" : "rotateLeft";
  1087. _trigger(rotation_direction, {
  1088. angle: GESTURE.angle_difference
  1089. });
  1090. anyevent = true;
  1091. }
  1092. if (GESTURE.distance_difference !== 0) {
  1093. _trigger("pinch", {
  1094. angle: GESTURE.distance_difference
  1095. });
  1096. pinch_direction = GESTURE.distance_difference > 0 ? "pinchOut" : "pinchIn";
  1097. _trigger(pinch_direction, {
  1098. distance: GESTURE.distance_difference
  1099. });
  1100. anyevent = true;
  1101. }
  1102. if (!anyevent && CURRENT_TOUCH[0]) {
  1103. if (Math.abs(FIRST_TOUCH[0].x - CURRENT_TOUCH[0].x) > 10 || Math.abs(FIRST_TOUCH[0].y - CURRENT_TOUCH[0].y) > 10) {
  1104. _trigger("drag");
  1105. drag_direction = _swipeDirection(FIRST_TOUCH[0].x, CURRENT_TOUCH[0].x, FIRST_TOUCH[0].y, CURRENT_TOUCH[0].y);
  1106. _trigger("drag" + drag_direction);
  1107. }
  1108. }
  1109. return _cleanGesture();
  1110. }
  1111. };
  1112. _fingersPosition = function(touches, fingers) {
  1113. var i, result;
  1114. result = [];
  1115. i = 0;
  1116. touches = touches[0].targetTouches ? touches[0].targetTouches : touches;
  1117. while (i < fingers) {
  1118. result.push({
  1119. x: touches[i].pageX,
  1120. y: touches[i].pageY
  1121. });
  1122. i++;
  1123. }
  1124. return result;
  1125. };
  1126. _captureRotation = function() {
  1127. var angle, diff, i, symbol;
  1128. angle = parseInt(_angle(CURRENT_TOUCH), 10);
  1129. diff = parseInt(GESTURE.initial_angle - angle, 10);
  1130. if (Math.abs(diff) > 20 || GESTURE.angle_difference !== 0) {
  1131. i = 0;
  1132. symbol = GESTURE.angle_difference < 0 ? "-" : "+";
  1133. while (Math.abs(diff - GESTURE.angle_difference) > 90 && i++ < 10) {
  1134. eval("diff " + symbol + "= 180;");
  1135. }
  1136. GESTURE.angle_difference = parseInt(diff, 10);
  1137. return _trigger("rotating", {
  1138. angle: GESTURE.angle_difference
  1139. });
  1140. }
  1141. };
  1142. _capturePinch = function() {
  1143. var diff, distance;
  1144. distance = parseInt(_distance(CURRENT_TOUCH), 10);
  1145. diff = GESTURE.initial_distance - distance;
  1146. if (Math.abs(diff) > 10) {
  1147. GESTURE.distance_difference = diff;
  1148. return _trigger("pinching", {
  1149. distance: diff
  1150. });
  1151. }
  1152. };
  1153. _trigger = function(type, params) {
  1154. if (GESTURE.el) {
  1155. params = params || {};
  1156. if (CURRENT_TOUCH[0]) {
  1157. params.iniTouch = (GESTURE.fingers > 1 ? FIRST_TOUCH : FIRST_TOUCH[0]);
  1158. params.currentTouch = (GESTURE.fingers > 1 ? CURRENT_TOUCH : CURRENT_TOUCH[0]);
  1159. }
  1160. return GESTURE.el.trigger(type, params);
  1161. }
  1162. };
  1163. _cleanGesture = function(event) {
  1164. FIRST_TOUCH = [];
  1165. CURRENT_TOUCH = [];
  1166. GESTURE = {};
  1167. return clearTimeout(TOUCH_TIMEOUT);
  1168. };
  1169. _angle = function(touches_data) {
  1170. var A, B, angle;
  1171. A = touches_data[0];
  1172. B = touches_data[1];
  1173. angle = Math.atan((B.y - A.y) * -1 / (B.x - A.x)) * (180 / Math.PI);
  1174. if (angle < 0) {
  1175. return angle + 180;
  1176. } else {
  1177. return angle;
  1178. }
  1179. };
  1180. _distance = function(touches_data) {
  1181. var A, B;
  1182. A = touches_data[0];
  1183. B = touches_data[1];
  1184. return Math.sqrt((B.x - A.x) * (B.x - A.x) + (B.y - A.y) * (B.y - A.y)) * -1;
  1185. };
  1186. _getTouches = function(event) {
  1187. if ($$.isMobile()) {
  1188. return event.touches;
  1189. } else {
  1190. return [event];
  1191. }
  1192. };
  1193. _parentIfText = function(node) {
  1194. if ("tagName" in node) {
  1195. return node;
  1196. } else {
  1197. return node.parentNode;
  1198. }
  1199. };
  1200. _swipeDirection = function(x1, x2, y1, y2) {
  1201. var xDelta, yDelta;
  1202. xDelta = Math.abs(x1 - x2);
  1203. yDelta = Math.abs(y1 - y2);
  1204. if (xDelta >= yDelta) {
  1205. if (x1 - x2 > 0) {
  1206. return "Left";
  1207. } else {
  1208. return "Right";
  1209. }
  1210. } else {
  1211. if (y1 - y2 > 0) {
  1212. return "Up";
  1213. } else {
  1214. return "Down";
  1215. }
  1216. }
  1217. };
  1218. return _hold = function() {
  1219. if (GESTURE.last && (Date.now() - GESTURE.last >= HOLD_DELAY)) {
  1220. _trigger("hold");
  1221. return GESTURE.taps = 0;
  1222. }
  1223. };
  1224. })(Quo);