| @@ -1 +1,135 @@ | ||
| 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); | |
| 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); | |