/* Inffuse Error: Failed to load Inffuse - app is not installed. */ /* main */ /** * @namespace * @name Inffuse */ var Inffuse = new function() { var self = this; this.platform = ''; this.server = ''; this.apiVersion = ''; this.editing = false; this._viewMode = 'site'; var EVENT_HANDLERS = {}; /*------------------------------------------*/ this.init = function() { window.addEventListener("message", function(event){ var message = event.data; if (message.app != 'inffuse') return; self.receiveMessage(message); }, false); // handle "publish" event from outside self.on("publish",function(){ if (!self.project) return; self.project.publish(); }); } /*------------------------------------------*/ /** * Request a callback when Inffuse is fully loaded and ready for work * @method ready * @param {function} onready Called when Inffuse is ready */ this.ready = function(onready) { if (typeof onready != 'undefined') { if (self.isready) onready(self); else { if (typeof self.readyCallbacks == 'undefined') self.readyCallbacks = []; self.readyCallbacks.push(onready); } return; } if (self.readyCallbacks) { for (var i in self.readyCallbacks) self.readyCallbacks[i](self); } self.broadcast("ready"); self.isready = true; } /** * @method viewMode * @returns {string} Returns the current viewing mode. Valid values - [editor/preview/site] */ this.viewMode = function() { return this._viewMode; } /** * @private */ this.error = function(msg) { var full_msg = "[Inffuse error] " + msg + '.'; if (window.console) console.error(full_msg); } /*------------------------------------------*/ /** * Subscribe to event from Inffuse or to a custom event. * @method on * @param {string} event Event name * @param {function} handler Called when the event is triggered * @param {object} data Event data * @example Inffuse event * Inffuse.on("data-changed",function(new_data) * { * if (new_data.hasOwnProperty("my_key")) * { * // Do something * return; * } * }); * @example Custom event * Inffuse.broadcast("my_custom_event",{weight: 78; height: 180; alias: "Johnny"}); * * Inffuse.on("my_custom_event",function(user) { * console.log("User Alias=%s, User Height=%d", user.alias, user.height) * }); */ this.on = function(event,handler) { if (!handler || typeof handler != "function") { throw "[Inffuse] Inffuse.on - invalid handler passed (function is required)"; return; } if (typeof EVENT_HANDLERS[event] == 'undefined') EVENT_HANDLERS[event] = []; EVENT_HANDLERS[event].push(handler); } /** * Unsubscribe from event * @method off * @param {string} event Event name * @param {function} handler Handler passed on Inffuse.on call * @example * Inffuse.on("data-changed",handle_data_change); * function handle_data_change(new_data) * { * if (new_data.hasOwnProperty("my_key")) * { * // Do something once * * Inffuse.off("data-changed",handle_data_change); * return; * } * }); */ this.off = function(event,handler) { if (typeof EVENT_HANDLERS[event] == 'undefined') return; EVENT_HANDLERS[event] = EVENT_HANDLERS[event].filter(function(h){ return h != handler; }); } /** * @private */ this.trigger = function(event,data) { var handlers = EVENT_HANDLERS[event]; if (typeof handlers == 'undefined' || handlers.length == 0) return false; EVENT_HANDLERS[event].map(function(handler){ handler(data); }); return true; } /*------------------------------------------*/ /** * Broadcast an event * @method broadcast * @param {string} event Event type * @param {object} data Event data * @param {object} includeSelf=false Should the event be sent to the current window. * @example * Inffuse.broadcast("my_custom_event",{weight: 78; height: 180; alias: "Johnny"}); * * Inffuse.on("my_custom_event",function(user){ * console.log("User Alias=%s, User Height=%d", user.alias, user.height) * }); */ this.broadcast = function(event,data,includeSelf) { if (!window.parent || !window.parent.postMessage) return; var msg = { app: 'inffuse', user: self.user ? self.user.key() : null, // site: self.site ? self.site.key() : null, // needed project: self.project ? self.project.key() : null, type: event, params: data } window.parent.postMessage(msg, "*"); if (includeSelf) self.trigger(event,data); } /*------------------------------------------*/ this.requestAPI = function(action,params,method,withCredentials,sync) { if (typeof method == 'undefined') method = 'GET'; params['app'] = self.app.id(); params['platform'] = self.platform; var access_token = self.user.accessToken() if (access_token) { params['access_token'] = access_token; } var url = [self.server,'api',self.apiVersion,action].join('/'); if (method == 'GET' || method == 'DELETE') { url += '?' + $.param(params); params = undefined; } var ajax_params = { url: url, type: method, data: params, async: !sync }; if (withCredentials) { ajax_params['crossDomain'] = true; ajax_params['xhrFields'] = {withCredentials: true}; } return $.ajax(ajax_params); } /*------------------------------------------*/ this.receiveMessage = function(message) { switch (message.type) { case 'data-changed': if (self.project) { var project_data = message.params; for (key in project_data) self.project.set(key,project_data[key],true); } break; } self.trigger(message.type,message.params); } /*------------------------------------------*/ }; Inffuse.init(); /* loader */ (function(Inffuse) { Inffuse.loader = new function() { var loadedScripts = {}; var promise = function(){ var nextPromise; var is_done = false; this.next = function(){ } this.then = function(next){ if (is_done) return next(); this.next = next; nextPromise = new promise(); return nextPromise; } this.done = function(){ is_done = true; var returnedPromise = this.next(); if (returnedPromise && returnedPromise.then) returnedPromise.then(function(){nextPromise.done();}) } } this.init = function() { } this.loadScript = function(script_src) { var p = new promise; if (loadedScripts[script_src]) { p.done(); } else { var base_url = Inffuse.server; if (script_src.indexOf('//') == -1) script_src = base_url + script_src; var head = document.getElementsByTagName('head')[0]; var script = document.createElement('script'); script.type = 'text/javascript'; script.src = script_src; head.appendChild(script); script.onload = function(){ loadedScripts[script_src] = true; p.done(); }; } return p; } }; })(Inffuse); /* error */ // Inffuse.loader.loadScript('https://d3eyf2cx8mbems.cloudfront.net/js/loggly.tracker.js') // .then(function(){ // var _LTracker = _LTracker || []; // _LTracker.push({'logglyKey': '35616c38-0702-4f64-8eea-d5a8e0badff5'}); // _LTracker.push({ // 'message': 'Inffuse client error', // 'error': "Failed to load Inffuse - app is not installed.", // 'location': document.location.href, // 'referrer': document.referrer // }); // }); Inffuse.error("Failed to load Inffuse - app is not installed.");