PageRenderTime 50ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/portlets/opensocial-portlet/docroot/gadget/js/main.js

http://github.com/liferay/liferay-plugins
JavaScript | 890 lines | 688 code | 202 blank | 0 comment | 83 complexity | adbc3de58fcaf7cdf901d3daa12fdd6d MD5 | raw file
  1. AUI.add(
  2. 'liferay-open-social-gadget',
  3. function(A) {
  4. var Lang = A.Lang;
  5. var containsString = Lang.String.contains;
  6. var getClassName = A.getClassName;
  7. var isArray = Lang.isArray;
  8. var isString = Lang.isString;
  9. var CSS_CLASS_GADGET = getClassName('gadget');
  10. var GADGET_IFRAME_PREFIX = 'remote_iframe_';
  11. var MAP = {};
  12. var PREFIX = 'gadget:';
  13. var STR_EMPTY = '';
  14. var TPL_IFRAME = '<iframe id="{iframeId}" name="{iframeId}" class="' + CSS_CLASS_GADGET + '" src="{src}" frameborder="no" scrolling="{scrolling}" {height} {width}></iframe>';
  15. var Gadget = A.Component.create(
  16. {
  17. _id: 0,
  18. NAME: 'liferaygadget',
  19. ATTRS: {
  20. additionalParams: {},
  21. appId: {},
  22. checksum: {},
  23. content: {},
  24. country: {
  25. setter: function(v) {
  26. if (v) {
  27. return v;
  28. }
  29. else {
  30. return 'ALL';
  31. }
  32. }
  33. },
  34. debug: {},
  35. height: {
  36. setter: function(v) {
  37. if (v > 0) {
  38. return v;
  39. }
  40. else {
  41. return null;
  42. }
  43. }
  44. },
  45. iframeId: {
  46. getter: '_getIframeId'
  47. },
  48. iframeUrl: {
  49. getter: '_getIframeUrl'
  50. },
  51. language: {
  52. setter: function(v) {
  53. if (v) {
  54. return v;
  55. }
  56. else {
  57. return 'ALL';
  58. }
  59. }
  60. },
  61. moduleId: {
  62. valueFn: function() {
  63. return Gadget._id++;
  64. }
  65. },
  66. nocache: {},
  67. parentUrl: {
  68. value: document.location.protocol + '://' + document.location.host,
  69. setter: '_setParentUrl'
  70. },
  71. portletId:{},
  72. pubsubURILoadTimeout: {
  73. setter: function(v) {
  74. if (v > 0) {
  75. return v;
  76. }
  77. else {
  78. return null;
  79. }
  80. }
  81. },
  82. requiresPubsub:{},
  83. rpcRelay: {},
  84. rpcToken: {
  85. value: Math.round(0x7FFFFFFF * Math.random())
  86. },
  87. scrolling: {
  88. setter: function(v) {
  89. if (v) {
  90. return 'yes';
  91. }
  92. else {
  93. return 'no';
  94. }
  95. }
  96. },
  97. serverBase: {},
  98. secureToken: {
  99. value: 'john.doe:john.doe:appid:cont:url:0:default'
  100. },
  101. specUrl: {},
  102. store: {
  103. valueFn: function() {
  104. return new ExpandoStore();
  105. }
  106. },
  107. userPrefs: {
  108. setter: function(v) {
  109. if (v) {
  110. return v;
  111. }
  112. else {
  113. return {};
  114. }
  115. }
  116. },
  117. view: {
  118. value: 'default'
  119. },
  120. viewParams: {},
  121. width: {
  122. setter: function(v) {
  123. if (v > 0) {
  124. return v;
  125. }
  126. else {
  127. return null;
  128. }
  129. }
  130. }
  131. },
  132. prototype: {
  133. initializer: function() {
  134. var instance = this;
  135. Gadget.register(instance);
  136. gadgets.pubsub2router.init(
  137. {
  138. hub: managedHub
  139. }
  140. );
  141. },
  142. renderUI: function() {
  143. var instance = this;
  144. var height = instance.get('height');
  145. var iframeId = instance.get('iframeId');
  146. var scrolling = instance.get('scrolling');
  147. var secureToken = instance.get('secureToken');
  148. var width = instance.get('width');
  149. if (instance.get('requiresPubsub')) {
  150. var iframeAttrs = {
  151. className: CSS_CLASS_GADGET,
  152. frameborder: 'no',
  153. scrolling: scrolling
  154. };
  155. if (height) {
  156. iframeAttrs.height = height;
  157. }
  158. if (width) {
  159. iframeAttrs.width = width;
  160. }
  161. var container = gadgets.pubsub2router.hub.getContainer(iframeId);
  162. if (container) {
  163. delete gadgets.pubsub2router.hub._containers[iframeId];
  164. }
  165. container = new OpenAjax.hub.IframeContainer(
  166. gadgets.pubsub2router.hub,
  167. iframeId,
  168. {
  169. Container: {
  170. onSecurityAlert: function(source, alertType) {
  171. gadgets.error('Security error for container ' + source.getClientID() + ' : ' + alertType);
  172. source.getIframe().src = 'about:blank';
  173. }
  174. },
  175. IframeContainer: {
  176. iframeAttrs: iframeAttrs,
  177. parent: instance.get('contentBox'),
  178. timeout: instance.get('pubsubURILoadTimeout'),
  179. tunnelURI: shindig.uri(instance.get('serverBase') + instance.get('rpcRelay')).resolve(shindig.uri(window.location.href)),
  180. uri: instance.get('iframeUrl')
  181. }
  182. }
  183. );
  184. instance._iframe = container.getIframe();
  185. }
  186. else {
  187. var iframe = Lang.sub(
  188. TPL_IFRAME,
  189. {
  190. height: (height ? 'height="' + height + '"' : STR_EMPTY),
  191. iframeId: iframeId,
  192. scrolling: scrolling,
  193. src: instance.get('iframeUrl'),
  194. width: (width ? 'width="' + width + '"' : STR_EMPTY)
  195. }
  196. );
  197. var iframeNode = A.Node.create(iframe);
  198. instance.get('contentBox').appendChild(iframeNode);
  199. instance._iframe = iframeNode.getDOM();
  200. gadgets.rpc.setRelayUrl(iframeId, instance.get('serverBase') + instance.get('rpcRelay'));
  201. gadgets.rpc.setAuthToken(iframeId, instance.get('rpcToken'));
  202. }
  203. },
  204. bindUI: function() {
  205. var instance = this;
  206. instance.after(
  207. {
  208. additionalParamsChange: instance._afterAdditionalParamsChange,
  209. countryChange: instance._afterCountryChange,
  210. debugChange: instance._afterDebugChange,
  211. heightChange: instance._afterIframeHeightChange,
  212. languageChange: instance._afterLanguageChange,
  213. nocacheChange: instance._afterNocacheChange,
  214. parentUrlChange: instance._afterParentUrlChange,
  215. scrollingChange: instance._afterIframeScrollingChange,
  216. secureTokenChange: instance._afterSecureTokenChange,
  217. specUrlChange: instance._afterSpecUrlChange,
  218. userPrefsChange: instance._afterUserPrefsChange,
  219. viewChange: instance._afterViewChange,
  220. viewParamsChange: instance._afterViewParamsChange,
  221. widthChange: instance._afterIframeWidthChange
  222. }
  223. );
  224. },
  225. _afterAdditionalParamsChange: function(event) {
  226. var instance = this;
  227. var src = instance._iframe.src;
  228. var prevAdditionalParams = event.prevVal;
  229. for (var i in prevAdditionalParams) {
  230. src = instance._setSrcParameter(encodeURIComponent(i), '', src);
  231. }
  232. var newAdditionalParams = event.newVal;
  233. for (var i in newAdditionalParams) {
  234. src = instance._setSrcParameter(encodeURIComponent(i), encodeURIComponent(newAdditionalParams[i]), src);
  235. }
  236. instance._iframe.src = src;
  237. },
  238. _afterCountryChange: function(event) {
  239. var instance = this;
  240. instance._refreshSrcParameter('country', event.newVal);
  241. },
  242. _afterDebugChange: function(event) {
  243. var instance = this;
  244. var debug = 0;
  245. if (instance.get('debug')) {
  246. debug = 1;
  247. }
  248. instance._refreshSrcParameter('debug', debug);
  249. },
  250. _afterIframeHeightChange: function(event) {
  251. var instance = this;
  252. instance._uiSetIframeHeight(event.newVal);
  253. },
  254. _afterIframeScrollingChange: function(event) {
  255. var instance = this;
  256. instance._uiSetIframeScrolling(event.newVal);
  257. },
  258. _afterIframeWidthChange: function(event) {
  259. var instance = this;
  260. instance._uiSetIframeWidth(event.newVal);
  261. },
  262. _afterLanguageChange: function(event) {
  263. var instance = this;
  264. instance._refreshSrcParameter('lang', event.newVal);
  265. },
  266. _afterNocacheChange: function(event) {
  267. var instance = this;
  268. instance._refreshSrcParameter('nocache', event.newVal);
  269. },
  270. _afterParentUrlChange: function(event) {
  271. var instance = this;
  272. var parentUrl = event.newVal;
  273. if (parentUrl) {
  274. instance._refreshSrcParameter('parent', parentUrl);
  275. }
  276. },
  277. _afterSecureTokenChange: function(event) {
  278. var instance = this;
  279. var secureToken = event.newVal;
  280. if (secureToken) {
  281. instance._refreshSrcParameter('st', secureToken);
  282. }
  283. },
  284. _afterSpecUrlChange: function(event) {
  285. var instance = this;
  286. instance._refreshSrcParameter('url', event.newVal);
  287. },
  288. _afterUserPrefsChange: function(event) {
  289. var instance = this;
  290. if (!event.SYNC) {
  291. instance.get('store').savePrefs(instance);
  292. }
  293. instance._refreshUserPrefs();
  294. },
  295. _afterViewChange: function(event) {
  296. var instance = this;
  297. instance._refreshSrcParameter('view', event.newVal);
  298. },
  299. _afterViewParamsChange: function(event) {
  300. var instance = this;
  301. var viewParams = event.newVal;
  302. if (parentUrl) {
  303. instance._refreshSrcParameter('view-params', encodeURIComponent(A.JSON.stringify(viewParams)));
  304. }
  305. },
  306. _getIframeId: function(value) {
  307. var instance = this;
  308. return GADGET_IFRAME_PREFIX + instance.get('moduleId');
  309. },
  310. _getIframeUrl: function(value) {
  311. var instance = this;
  312. var url = STR_EMPTY;
  313. var urlData = {
  314. aid: instance.get('appId'),
  315. checksum: instance.get('checksum'),
  316. container: instance._CONTAINER,
  317. mid: instance.get('moduleId'),
  318. country: instance.get('country'),
  319. lang: instance.get('language'),
  320. view: instance.get('view'),
  321. url: instance.get('specUrl')
  322. };
  323. if (instance.get('debug')) {
  324. urlData.debug = 1;
  325. }
  326. if (instance.get('nocache')) {
  327. urlData.nocache = 1;
  328. }
  329. var parentUrl = instance.get('parentUrl');
  330. if (parentUrl) {
  331. urlData.parent = parentUrl;
  332. }
  333. url = instance.get('serverBase') + 'ifr?' + A.QueryString.stringify(urlData);
  334. var content = instance.get('content');
  335. if (content) {
  336. url += '&rawxml=' + content;
  337. }
  338. var secureToken = instance.get('secureToken');
  339. url += instance.get('additionalParams');
  340. url += instance._getUserPrefParams();
  341. if (secureToken) {
  342. url += '&st=' + secureToken;
  343. }
  344. if (!instance.get('requiresPubsub')) {
  345. url += '#rpctoken=' + instance.get('rpcToken');
  346. }
  347. var viewParams = instance.get('viewParams');
  348. if (viewParams) {
  349. url += '&view-params=' + encodeURIComponent(A.JSON.stringify(viewParams));
  350. }
  351. return url;
  352. },
  353. _getUserPrefParams: function() {
  354. var instance = this;
  355. var userPrefs = instance.get('userPrefs');
  356. var buffer = [];
  357. for (var i in userPrefs) {
  358. buffer.push('&up_' + encodeURIComponent(i) + '=' + encodeURIComponent(userPrefs[i]));
  359. }
  360. return buffer.join(STR_EMPTY);
  361. },
  362. _refreshSrcParameter: function(key, value) {
  363. var instance = this;
  364. var src = instance._iframe.src;
  365. src = instance._setSrcParameter(key, value, src);
  366. instance._iframe.src = src;
  367. },
  368. _refreshUserPrefs: function() {
  369. var instance = this;
  370. var src = instance._iframe.src;
  371. var userPrefs = instance.get('userPrefs');
  372. for (var i in userPrefs) {
  373. src = instance._setSrcParameter('&up_' + encodeURIComponent(i), encodeURIComponent(userPrefs[i]), src);
  374. }
  375. instance._iframe.src = src;
  376. },
  377. _setParentUrl: function(value) {
  378. var instance = this;
  379. if (!value.match(/^http[s]?:\/\//)) {
  380. value = document.location.href.match(/^[^?#]+\//)[0] + value;
  381. }
  382. return value;
  383. },
  384. _setSrcParameter: function(key, value, src) {
  385. var instance = this;
  386. var parameters = src.split('&');
  387. var parameterFound = false;
  388. for (var i = 0; i < parameters.length; i++) {
  389. var parameter = parameters[i].split('=');
  390. if (parameter[0] == key) {
  391. parameter[1] = value;
  392. parameters[i] = parameter.join('=');
  393. parameterFound = true;
  394. break;
  395. }
  396. }
  397. if (!parameterFound) {
  398. var newParameter = key + '=' + value;
  399. parameters[parameters.length] = newParameter;
  400. }
  401. return parameters.join('&');
  402. },
  403. _uiSetIframeHeight: function(value) {
  404. var instance = this;
  405. instance._iframe.setAttribute('height', value);
  406. },
  407. _uiSetIframeScrolling: function(value) {
  408. var instance = this;
  409. instance._iframe.setAttribute('scrolling', value);
  410. },
  411. _uiSetIframeWidth: function(value) {
  412. var instance = this;
  413. instance._iframe.setAttribute('width', value);
  414. },
  415. _CONTAINER: 'default'
  416. }
  417. }
  418. );
  419. var DefaultStore = A.Component.create(
  420. {
  421. ATTRS: {
  422. userPrefsKey: {}
  423. },
  424. EXTENDS: A.Base,
  425. NAME: 'gadgetstoredefault',
  426. prototype: {
  427. savePrefs: Lang.emptyFn
  428. }
  429. }
  430. );
  431. var CookieStore = A.Component.create(
  432. {
  433. EXTENDS: DefaultStore,
  434. NAME: 'gadgetstorecookie',
  435. prototype: {
  436. savePrefs: function(gadget) {
  437. var instance = this;
  438. return A.Cookie.setSubs(instance.get('userPrefsKey'), gadget.get('userPrefs'));
  439. }
  440. }
  441. }
  442. );
  443. var ExpandoStore = A.Component.create(
  444. {
  445. EXTENDS: DefaultStore,
  446. NAME: 'gadgetstoreexpando',
  447. prototype: {
  448. savePrefs: function(gadget) {
  449. var instance = this;
  450. Liferay.Service(
  451. '/expandovalue/add-value',
  452. {
  453. companyId: themeDisplay.getCompanyId(),
  454. className: instance._CLASS_NAME,
  455. tableName: instance._TABLE_NAME,
  456. columnName: instance.get('userPrefsKey'),
  457. classPK: themeDisplay.getPlid(),
  458. data: A.JSON.stringify(gadget.get('userPrefs'))
  459. }
  460. );
  461. },
  462. _CLASS_NAME: 'com.liferay.portal.model.Layout',
  463. _TABLE_NAME: 'OPEN_SOCIAL_DATA_'
  464. }
  465. }
  466. );
  467. var Store = {
  468. Cookie: CookieStore,
  469. Default: DefaultStore,
  470. Expando: ExpandoStore
  471. };
  472. var _instances = {};
  473. Gadget.register = function(gadget) {
  474. if (gadget) {
  475. var id = gadget.get('moduleId');
  476. _instances[id] = gadget;
  477. }
  478. return gadget;
  479. };
  480. Gadget.get = function(id) {
  481. id = String(id);
  482. if (id.indexOf(GADGET_IFRAME_PREFIX) === 0) {
  483. id = id.replace(GADGET_IFRAME_PREFIX, STR_EMPTY);
  484. }
  485. return _instances[id];
  486. };
  487. Liferay._detachInitialFn = Liferay.detach;
  488. Liferay._fireInitialFn = Liferay.fire;
  489. Liferay._onInitialFn = Liferay.on;
  490. Liferay.detach = function(topic, fn) {
  491. var handle = topic;
  492. var gadgetTopic = topic;
  493. var subscriptionId;
  494. if (handle && !handle.detach) {
  495. subscriptionId = getSubscriptionId(topic, fn);
  496. }
  497. if (subscriptionId) {
  498. unsubscribeTopic(gadgetTopic, subscriptionId);
  499. }
  500. return Liferay._detachInitialFn.apply(Liferay, arguments);
  501. };
  502. Liferay.fire = function(topic, data) {
  503. if (containsString(topic, PREFIX)) {
  504. var eventType = topic.replace(PREFIX, STR_EMPTY);
  505. gadgets.pubsub2router.hub.publish(eventType, data);
  506. }
  507. return Liferay._fireInitialFn.apply(Liferay, arguments);
  508. };
  509. Liferay.on = function(topic, fn) {
  510. var handle;
  511. var gadgetTopic;
  512. var subscriptionId;
  513. if (isArray(topic)) {
  514. gadgetTopic = [];
  515. subscriptionId = [];
  516. var eventName;
  517. for (var i = 0; i < topic.length; i++) {
  518. eventName = topic[i];
  519. if (containsString(eventName, PREFIX)) {
  520. gadgetTopic.push(eventName);
  521. subscriptionId.push(subscribeGadgetEvent(eventName, fn));
  522. }
  523. }
  524. }
  525. else if (containsString(topic, PREFIX)) {
  526. gadgetTopic = topic;
  527. subscriptionId = subscribeGadgetEvent(topic, fn);
  528. }
  529. if (subscriptionId && subscriptionId.length) {
  530. handle = Liferay._onInitialFn(topic, Lang.emptyFn);
  531. handle._LFR_HANDLE_DETACH = handle.detach;
  532. handle._LFR_GADGET_TOPIC = gadgetTopic;
  533. handle._LFR_SUB_ID = subscriptionId;
  534. handle.detach = function() {
  535. handle.detach = handle._LFR_HANDLE_DETACH;
  536. unsubscribeTopic(topic, subscriptionId);
  537. };
  538. }
  539. else {
  540. handle = Liferay._onInitialFn.apply(Liferay, arguments);
  541. }
  542. return handle;
  543. };
  544. var getSubscriptionId = function(topic, fn) {
  545. var subscriptionId = null;
  546. if (topic) {
  547. var eventType = topic.replace(PREFIX, STR_EMPTY);
  548. var eventMap = MAP[eventType];
  549. var allIds = (!fn);
  550. if (allIds) {
  551. subscriptionId = [];
  552. }
  553. if (eventMap) {
  554. for (var i in eventMap) {
  555. if (allIds) {
  556. subscriptionId.push(i);
  557. }
  558. else if (eventMap[i] == fn) {
  559. subscriptionId = i;
  560. break;
  561. }
  562. }
  563. }
  564. }
  565. return subscriptionId;
  566. };
  567. var subscribeGadgetEvent = function(topic, fn) {
  568. var eventType = topic.replace(PREFIX, STR_EMPTY);
  569. var eventMap = MAP[eventType] || {};
  570. var subscriptionId = gadgets.pubsub2router.hub.subscribe(eventType, fn);
  571. eventMap[subscriptionId] = fn;
  572. MAP[eventType] = eventMap;
  573. return subscriptionId;
  574. };
  575. var unsubscribeGadgetEvent = function(topic, subscriptionId, fn) {
  576. var eventType = topic.replace(PREFIX, STR_EMPTY);
  577. var eventMap = MAP[eventType];
  578. if (!fn || eventMap[subscriptionId] == fn) {
  579. gadgets.pubsub2router.hub.unsubscribe(subscriptionId);
  580. delete eventMap[subscriptionId];
  581. }
  582. };
  583. var unsubscribeTopic = function(topic, subscriptionId, fn) {
  584. if (isString(topic) && isString(subscriptionId)) {
  585. unsubscribeGadgetEvent(topic, subscriptionId, fn);
  586. }
  587. else if (isString(topic) && isArray(subscriptionId)) {
  588. for (var i = 0; i < subscriptionId.length; i++) {
  589. unsubscribeGadgetEvent(topic, subscriptionId[i], fn);
  590. }
  591. }
  592. else if (isArray(topic) && isArray(subscriptionId)) {
  593. for (var i = 0; i < subscriptionId.length; i++) {
  594. unsubscribeGadgetEvent(topic[i], subscriptionId[i]);
  595. }
  596. }
  597. };
  598. var managedHub = new OpenAjax.hub.ManagedHub(
  599. {
  600. onPublish: function(topic, data, pcont, scont) {
  601. if (!containsString(topic, PREFIX)) {
  602. var eventType = PREFIX + topic;
  603. Liferay._fireInitialFn(eventType, data);
  604. }
  605. return true;
  606. },
  607. onSubscribe: Lang.emptyFnTrue,
  608. onUnsubscribe: Lang.emptyFn
  609. }
  610. );
  611. var inlineContainer = new OpenAjax.hub.InlineContainer(managedHub , "liferay",
  612. {
  613. Container: {
  614. onSecurityAlert: function(source, alertType) {},
  615. onConnect: function(container) {},
  616. onDisconnect: function(container) {}
  617. }
  618. }
  619. );
  620. var hubClient = new OpenAjax.hub.InlineHubClient(
  621. {
  622. HubClient: {
  623. onSecurityAlert: function(source, alertType) {}
  624. },
  625. InlineHubClient: {
  626. container: inlineContainer
  627. }
  628. }
  629. );
  630. gadgets.rpc.register(
  631. 'resize_iframe',
  632. function(height) {
  633. var gadget = Gadget.get(this.f);
  634. if (gadget) {
  635. gadget.set('height', height);
  636. }
  637. }
  638. );
  639. var viewWindowStateMap = {
  640. canvas: 'maximized',
  641. 'default': 'normal',
  642. home: 'normal',
  643. profile: 'normal'
  644. };
  645. gadgets.rpc.register(
  646. 'requestNavigateTo',
  647. function(view, viewParams) {
  648. var gadget = Gadget.get(this.f);
  649. var portletURL = Liferay.PortletURL.createRenderURL();
  650. portletURL.setPortletId(gadget.get('portletId'));
  651. portletURL.setParameter('returnToFullPageURL', document.location.href);
  652. portletURL.setParameter('view', view);
  653. var windowState = viewWindowStateMap[view];
  654. if (windowState) {
  655. portletURL.setWindowState(windowState);
  656. }
  657. if (Lang.isString(viewParams)) {
  658. portletURL.setParameter('viewParams', viewParams);
  659. }
  660. document.location.href = portletURL.toString();
  661. }
  662. );
  663. gadgets.rpc.register(
  664. 'set_pref',
  665. function(editToken, name, value) {
  666. var gadget = Gadget.get(this.f);
  667. if (gadget) {
  668. var length = arguments.length;
  669. var userPrefs = gadget.get('userPrefs');
  670. for (var i = 1; i < length; i += 2) {
  671. arg = arguments[i];
  672. userPrefs[arg] = arguments[i + 1];
  673. }
  674. gadget.set('userPrefs', userPrefs);
  675. }
  676. }
  677. );
  678. gadgets.rpc.register('set_title', Lang.emptyFn);
  679. gadgets.rpc.register('requestSendMessage', Lang.emptyFn);
  680. var OpenSocial = Liferay.namespace('OpenSocial');
  681. OpenSocial.Gadget = Gadget;
  682. OpenSocial.Store = Store;
  683. },
  684. '',
  685. {
  686. requires: ['aui-base', 'aui-io', 'cookie', 'json', 'liferay-portlet-url', 'querystring']
  687. }
  688. );