| @@ -1,135 +1 @@ | ||
| 1 | -(function ($, undef) { | |
| 2 | - var global = this; | |
| 3 | - | |
| 4 | - // Namespace. | |
| 5 | - global.FS = global.FS || {}; | |
| 6 | - | |
| 7 | - global.FS.PostMessage = function () | |
| 8 | - { | |
| 9 | - var | |
| 10 | - _is_child = false, | |
| 11 | - _postman = new NoJQueryPostMessageMixin('postMessage', 'receiveMessage'), | |
| 12 | - _callbacks = {}, | |
| 13 | - _base_url, | |
| 14 | - _parent_url = decodeURIComponent(document.location.hash.replace(/^#/, '')), | |
| 15 | - _parent_subdomain = _parent_url.substring(0, _parent_url.indexOf('/', ('https://' === _parent_url.substring(0, ('https://').length)) ? 8 : 7)), | |
| 16 | - _init = function () { | |
| 17 | - _postman.receiveMessage(function (e) { | |
| 18 | - var data = JSON.parse(e.data); | |
| 19 | - | |
| 20 | - if (_callbacks[data.type]) { | |
| 21 | - for (var i = 0; i < _callbacks[data.type].length; i++) { | |
| 22 | - // Execute type callbacks. | |
| 23 | - _callbacks[data.type][i](data.data); | |
| 24 | - } | |
| 25 | - } | |
| 26 | - }, _base_url); | |
| 27 | - }, | |
| 28 | - _hasParent = ('' !== _parent_url), | |
| 29 | - $window = $(window), | |
| 30 | - $html = $('html'); | |
| 31 | - | |
| 32 | - return { | |
| 33 | - init : function (url, iframes) | |
| 34 | - { | |
| 35 | - _base_url = url; | |
| 36 | - _init(); | |
| 37 | - | |
| 38 | - // Automatically receive forward messages. | |
| 39 | - FS.PostMessage.receiveOnce('forward', function (data){ | |
| 40 | - window.location = data.url; | |
| 41 | - }); | |
| 42 | - | |
| 43 | - iframes = iframes || []; | |
| 44 | - | |
| 45 | - if (iframes.length > 0) { | |
| 46 | - $window.on('scroll', function () { | |
| 47 | - for (var i = 0; i < iframes.length; i++) { | |
| 48 | - FS.PostMessage.postScroll(iframes[i]); | |
| 49 | - } | |
| 50 | - }); | |
| 51 | - } | |
| 52 | - }, | |
| 53 | - init_child : function () | |
| 54 | - { | |
| 55 | - this.init(_parent_subdomain); | |
| 56 | - | |
| 57 | - _is_child = true; | |
| 58 | - | |
| 59 | - // Post height of a child right after window is loaded. | |
| 60 | - $(window).bind('load', function () { | |
| 61 | - FS.PostMessage.postHeight(); | |
| 62 | - | |
| 63 | - // Post message that window was loaded. | |
| 64 | - FS.PostMessage.post('loaded'); | |
| 65 | - }); | |
| 66 | - }, | |
| 67 | - hasParent : function () | |
| 68 | - { | |
| 69 | - return _hasParent; | |
| 70 | - }, | |
| 71 | - postHeight : function (diff, wrapper) { | |
| 72 | - diff = diff || 0; | |
| 73 | - wrapper = wrapper || '#wrap_section'; | |
| 74 | - this.post('height', { | |
| 75 | - height: diff + $(wrapper).outerHeight(true) | |
| 76 | - }); | |
| 77 | - }, | |
| 78 | - postScroll : function (iframe) { | |
| 79 | - this.post('scroll', { | |
| 80 | - top: $window.scrollTop(), | |
| 81 | - height: ($window.height() - parseFloat($html.css('paddingTop')) - parseFloat($html.css('marginTop'))) | |
| 82 | - }, iframe); | |
| 83 | - }, | |
| 84 | - post : function (type, data, iframe) | |
| 85 | - { | |
| 86 | - console.debug('PostMessage.post', type); | |
| 87 | - | |
| 88 | - if (iframe) | |
| 89 | - { | |
| 90 | - // Post to iframe. | |
| 91 | - _postman.postMessage(JSON.stringify({ | |
| 92 | - type: type, | |
| 93 | - data: data | |
| 94 | - }), iframe.src, iframe.contentWindow); | |
| 95 | - } | |
| 96 | - else { | |
| 97 | - // Post to parent. | |
| 98 | - _postman.postMessage(JSON.stringify({ | |
| 99 | - type: type, | |
| 100 | - data: data | |
| 101 | - }), _parent_url, window.parent); | |
| 102 | - } | |
| 103 | - }, | |
| 104 | - receive: function (type, callback) | |
| 105 | - { | |
| 106 | - console.debug('PostMessage.receive', type); | |
| 107 | - | |
| 108 | - if (undef === _callbacks[type]) | |
| 109 | - _callbacks[type] = []; | |
| 110 | - | |
| 111 | - _callbacks[type].push(callback); | |
| 112 | - }, | |
| 113 | - receiveOnce: function (type, callback) | |
| 114 | - { | |
| 115 | - if (this.is_set(type)) | |
| 116 | - return; | |
| 117 | - | |
| 118 | - this.receive(type, callback); | |
| 119 | - }, | |
| 120 | - // Check if any callbacks assigned to a specified message type. | |
| 121 | - is_set: function (type) | |
| 122 | - { | |
| 123 | - return (undef != _callbacks[type]); | |
| 124 | - }, | |
| 125 | - parent_url: function () | |
| 126 | - { | |
| 127 | - return _parent_url; | |
| 128 | - }, | |
| 129 | - parent_subdomain: function () | |
| 130 | - { | |
| 131 | - return _parent_subdomain; | |
| 132 | - } | |
| 133 | - }; | |
| 134 | - }(); | |
| 135 | -})(jQuery); | |
| 1 | +!function(t,e){var s,n,o,i,r,a,c,p,u=this;u.FS=u.FS||{},u.FS.PostMessage=(n=new NoJQueryPostMessageMixin("postMessage","receiveMessage"),o={},i=decodeURIComponent(document.location.hash.replace(/^#/,"")),r=i.substring(0,i.indexOf("/","https://"===i.substring(0,8)?8:7)),a=""!==i,c=t(window),p=t("html"),{init:function(t,e){s=t,n.receiveMessage((function(t){var e=JSON.parse(t.data);if(o[e.type])for(var s=0;s<o[e.type].length;s++)o[e.type][s](e.data)}),s),FS.PostMessage.receiveOnce("forward",(function(t){t.url&&(t.url.startsWith("http://")||t.url.startsWith("https://"))&&(window.location=t.url)})),(e=e||[]).length>0&&c.on("scroll",(function(){for(var t=0;t<e.length;t++)FS.PostMessage.postScroll(e[t])}))},init_child:function(){a&&(this.init(r),t(window).bind("load",(function(){FS.PostMessage.postHeight(),FS.PostMessage.post("loaded")})))},hasParent:function(){return a},postHeight:function(e,s){e=e||0,s=s||"#wrap_section",this.post("height",{height:e+t(s).outerHeight(!0)})},postScroll:function(t){this.post("scroll",{top:c.scrollTop(),height:c.height()-parseFloat(p.css("paddingTop"))-parseFloat(p.css("marginTop"))},t)},post:function(t,e,s){console.debug("PostMessage.post",t),s?n.postMessage(JSON.stringify({type:t,data:e}),s.src,s.contentWindow):n.postMessage(JSON.stringify({type:t,data:e}),i,window.parent)},receive:function(t,s){console.debug("PostMessage.receive",t),e===o[t]&&(o[t]=[]),o[t].push(s)},receiveOnce:function(t,e){this.is_set(t)||this.receive(t,e)},is_set:function(t){return e!=o[t]},parent_url:function(){return i},parent_subdomain:function(){return r}})}(jQuery); | |