All Downloads are FREE. Search and download functionalities are using the official Maven repository.

features.shindig.container.shindig-container.js Maven / Gradle / Ivy

Go to download

Packages all the features that shindig provides into a single jar file to allow loading from the classpath

The newest version!
/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations under the License.
 */

/**
 * @fileoverview Open Gadget Container
 */

shindig.errors = {};
shindig.errors.SUBCLASS_RESPONSIBILITY = 'subclass responsibility';
shindig.errors.TO_BE_DONE = 'to be done';

/**
 * Calls an array of asynchronous functions and calls the continuation
 * function when all are done.
 * @param {Array} functions Array of asynchronous functions, each taking
 *     one argument that is the continuation function that handles the result
 *     That is, each function is something like the following:
 *     function(continuation) {
 *       // compute result asynchronously
 *       continuation(result);
 *     }
 * @param {Function} continuation Function to call when all results are in.  It
 *     is pass an array of all results of all functions
 * @param {Object} opt_this Optional object used as "this" when calling each
 *     function
 */
shindig.callAsyncAndJoin = function(functions, continuation, opt_this) {
  var pending = functions.length;
  var results = [];
  for (var i = 0; i < functions.length; i++) {
    // we need a wrapper here because i changes and we need one index
    // variable per closure
    var wrapper = function(index) {
      var fn = functions[index];
      if (typeof fn === 'string') {
        fn = opt_this[fn];
      }
      fn.call(opt_this, function(result) {
        results[index] = result;
        if (--pending === 0) {
          continuation(results);
        }
      });
    };
    wrapper(i);
  }
};


// ----------
// Extensible

shindig.Extensible = function() {
};

/**
 * Sets the dependencies.
 * @param {Object} dependencies Object whose properties are set on this
 *     container as dependencies
 */
shindig.Extensible.prototype.setDependencies = function(dependencies) {
  for (var p in dependencies) {
    this[p] = dependencies[p];
  }
};

/**
 * Returns a dependency given its name.
 * @param {String} name Name of dependency
 * @return {Object} Dependency with that name or undefined if not found
 */
shindig.Extensible.prototype.getDependencies = function(name) {
  return this[name];
};



// -------------
// UserPrefStore

/**
 * User preference store interface.
 * @constructor
 */
shindig.UserPrefStore = function() {
};

/**
 * Gets all user preferences of a gadget.
 * @param {Object} gadget Gadget object
 * @return {Object} All user preference of given gadget
 */
shindig.UserPrefStore.prototype.getPrefs = function(gadget) {
  throw Error(shindig.errors.SUBCLASS_RESPONSIBILITY);
};

/**
 * Saves user preferences of a gadget in the store.
 * @param {Object} gadget Gadget object
 * @param {Object} prefs User preferences
 */
shindig.UserPrefStore.prototype.savePrefs = function(gadget) {
  throw Error(shindig.errors.SUBCLASS_RESPONSIBILITY);
};


// -------------
// DefaultUserPrefStore

/**
 * User preference store implementation.
 * TODO: Turn this into a real implementation that is production safe
 * @constructor
 */
shindig.DefaultUserPrefStore = function() {
  shindig.UserPrefStore.call(this);
};
shindig.DefaultUserPrefStore.inherits(shindig.UserPrefStore);

shindig.DefaultUserPrefStore.prototype.getPrefs = function(gadget) { };

shindig.DefaultUserPrefStore.prototype.savePrefs = function(gadget) { };


// -------------
// GadgetService

/**
 * Interface of service provided to gadgets for resizing gadgets,
 * setting title, etc.
 * @constructor
 */
shindig.GadgetService = function() {
};

shindig.GadgetService.prototype.setHeight = function(elementId, height) {
  throw Error(shindig.errors.SUBCLASS_RESPONSIBILITY);
};

shindig.GadgetService.prototype.setTitle = function(gadget, title) {
  throw Error(shindig.errors.SUBCLASS_RESPONSIBILITY);
};

shindig.GadgetService.prototype.setUserPref = function(id) {
  throw Error(shindig.errors.SUBCLASS_RESPONSIBILITY);
};


// ----------------
// IfrGadgetService

/**
 * Base implementation of GadgetService.
 * @constructor
 */
shindig.IfrGadgetService = function() {
  shindig.GadgetService.call(this);
  gadgets.rpc.register('resize_iframe', this.setHeight);
  gadgets.rpc.register('set_pref', this.setUserPref);
  gadgets.rpc.register('set_title', this.setTitle);
  gadgets.rpc.register('requestNavigateTo', this.requestNavigateTo);
  gadgets.rpc.register('requestSendMessage', this.requestSendMessage);
};

shindig.IfrGadgetService.inherits(shindig.GadgetService);

shindig.IfrGadgetService.prototype.setHeight = function(height) {
  if (height > shindig.container.maxheight_) {
    height = shindig.container.maxheight_;
  }

  var element = document.getElementById(this.f);
  if (element) {
    element.style.height = height + 'px';
  }
};

shindig.IfrGadgetService.prototype.setTitle = function(title) {
  var element = document.getElementById(this.f + '_title');
  if (element) {
    element.innerHTML = title.replace(/&/g, '&').replace(/, String} recipients An ID, array of IDs, or a group reference;
 * the supported keys are VIEWER, OWNER, VIEWER_FRIENDS, OWNER_FRIENDS, or a
 * single ID within one of those groups
 * @param {opensocial.Message} message The message to send to the specified users
 * @param {Function} opt_callback The function to call once the request has been
 * processed; either this callback will be called or the gadget will be reloaded
 * from scratch
 * @param {opensocial.NavigationParameters} opt_params The optional parameters
 * indicating where to send a user when a request is made, or when a request
 * is accepted; options are of type  NavigationParameters.DestinationType
 */
shindig.IfrGadgetService.prototype.requestSendMessage = function(recipients,
    message, opt_callback, opt_params) {
    if (opt_callback) {
      window.setTimeout(function() {
        opt_callback(new opensocial.ResponseItem(
            null, null, opensocial.ResponseItem.Error.NOT_IMPLEMENTED, null));
      }, 0);
    }
};

/**
 * Navigates the page to a new url based on a gadgets requested view and
 * parameters.
 */
shindig.IfrGadgetService.prototype.requestNavigateTo = function(view,
    opt_params) {
  var id = shindig.container.gadgetService.getGadgetIdFromModuleId(this.f);
  var url = shindig.container.gadgetService.getUrlForView(view);

  if (opt_params) {
    var paramStr = gadgets.json.stringify(opt_params);
    if (paramStr.length > 0) {
      url += '&appParams=' + encodeURIComponent(paramStr);
    }
  }

  if (url && document.location.href.indexOf(url) == -1) {
    document.location.href = url;
  }
};

/**
 * This is a silly implementation that will need to be overriden by almost all
 * real containers.
 * TODO: Find a better default for this function
 *
 * @param view The view name to get the url for
 */
shindig.IfrGadgetService.prototype.getUrlForView = function(
    view) {
  if (view === 'canvas') {
    return '/canvas';
  } else if (view === 'profile') {
    return '/profile';
  } else {
    return null;
  }
};

shindig.IfrGadgetService.prototype.getGadgetIdFromModuleId = function(
    moduleId) {
  // Quick hack to extract the gadget id from module id
  return parseInt(moduleId.match(/_([0-9]+)$/)[1], 10);
};


// -------------
// LayoutManager

/**
 * Layout manager interface.
 * @constructor
 */
shindig.LayoutManager = function() {
};

/**
 * Gets the HTML element that is the chrome of a gadget into which the content
 * of the gadget can be rendered.
 * @param {Object} gadget Gadget instance
 * @return {Object} HTML element that is the chrome for the given gadget
 */
shindig.LayoutManager.prototype.getGadgetChrome = function(gadget) {
  throw Error(shindig.errors.SUBCLASS_RESPONSIBILITY);
};

// -------------------
// StaticLayoutManager

/**
 * Static layout manager where gadget ids have a 1:1 mapping to chrome ids.
 * @constructor
 */
shindig.StaticLayoutManager = function() {
  shindig.LayoutManager.call(this);
};

shindig.StaticLayoutManager.inherits(shindig.LayoutManager);

/**
 * Sets chrome ids, whose indexes are gadget instance ids (starting from 0).
 * @param {Array} gadgetChromeIds Gadget id to chrome id map
 */
shindig.StaticLayoutManager.prototype.setGadgetChromeIds =
    function(gadgetChromeIds) {
  this.gadgetChromeIds_ = gadgetChromeIds;
};

shindig.StaticLayoutManager.prototype.getGadgetChrome = function(gadget) {
  var chromeId = this.gadgetChromeIds_[gadget.id];
  return chromeId ? document.getElementById(chromeId) : null;
};


// ----------------------
// FloatLeftLayoutManager

/**
 * FloatLeft layout manager where gadget ids have a 1:1 mapping to chrome ids.
 * @constructor
 * @param {String} layoutRootId Id of the element that is the parent of all
 *     gadgets.
 */
shindig.FloatLeftLayoutManager = function(layoutRootId) {
  shindig.LayoutManager.call(this);
  this.layoutRootId_ = layoutRootId;
};

shindig.FloatLeftLayoutManager.inherits(shindig.LayoutManager);

shindig.FloatLeftLayoutManager.prototype.getGadgetChrome =
    function(gadget) {
  var layoutRoot = document.getElementById(this.layoutRootId_);
  if (layoutRoot) {
    var chrome = document.createElement('div');
    chrome.className = 'gadgets-gadget-chrome';
    chrome.style.cssFloat = 'left';
    layoutRoot.appendChild(chrome);
    return chrome;
  } else {
    return null;
  }
};


// ------
// Gadget

/**
 * Creates a new instance of gadget.  Optional parameters are set as instance
 * variables.
 * @constructor
 * @param {Object} params Parameters to set on gadget.  Common parameters:
 *    "specUrl": URL to gadget specification
 *    "private": Whether gadget spec is accessible only privately, which means
 *        browser can load it but not gadget server
 *    "spec": Gadget Specification in XML
 *    "userPrefs": a javascript object containing attribute value pairs of user
 *        preferences for this gadget with the value being a preference object
 *    "viewParams": a javascript object containing attribute value pairs
 *        for this gadgets
 *    "secureToken": an encoded token that is passed on the URL hash
 *    "hashData": Query-string like data that will be added to the
 *        hash portion of the URL.
 *    "specVersion": a hash value used to add a v= param to allow for better caching
 *    "title": the default title to use for the title bar.
 *    "height": height of the gadget
 *    "width": width of the gadget
 *    "debug": send debug=1 to the gadget server, gets us uncompressed
 *        javascript
 */
shindig.Gadget = function(params) {
  this.userPrefs = {};

  if (params) {
    for (var name in params)  if (params.hasOwnProperty(name)) {
      this[name] = params[name];
    }
  }
  if (!this.secureToken) {
    // Assume that the default security token implementation is
    // in use on the server.
    this.secureToken = 'john.doe:john.doe:appid:cont:url:0:default';
  }
};

shindig.Gadget.prototype.getUserPrefs = function() {
  return this.userPrefs;
};

shindig.Gadget.prototype.saveUserPrefs = function() {
  shindig.container.userPrefStore.savePrefs(this);
};

shindig.Gadget.prototype.getUserPrefValue = function(name) {
  var pref = this.userPrefs[name];
  return typeof(pref.value) != 'undefined' && pref.value != null ?
      pref.value : pref['default'];
};

shindig.Gadget.prototype.render = function(chrome) {
  if (chrome) {
    var gadget = this;
    this.getContent(function(content) {
      chrome.innerHTML = content;
      gadget.finishRender(chrome);
    });
  }
};

shindig.Gadget.prototype.getContent = function(continuation) {
  shindig.callAsyncAndJoin([
      'getTitleBarContent', 'getUserPrefsDialogContent',
      'getMainContent'], function(results) {
        continuation(results.join(''));
      }, this);
};

/**
 * Gets title bar content asynchronously or synchronously.
 * @param {Function} continuation Function that handles title bar content as
 *     the one and only argument
 */
shindig.Gadget.prototype.getTitleBarContent = function(continuation) {
  throw Error(shindig.errors.SUBCLASS_RESPONSIBILITY);
};

/**
 * Gets user preferences dialog content asynchronously or synchronously.
 * @param {Function} continuation Function that handles user preferences
 *     content as the one and only argument
 */
shindig.Gadget.prototype.getUserPrefsDialogContent = function(continuation) {
  throw Error(shindig.errors.SUBCLASS_RESPONSIBILITY);
};

/**
 * Gets gadget content asynchronously or synchronously.
 * @param {Function} continuation Function that handles gadget content as
 *     the one and only argument
 */
shindig.Gadget.prototype.getMainContent = function(continuation) {
  throw Error(shindig.errors.SUBCLASS_RESPONSIBILITY);
};

shindig.Gadget.prototype.finishRender = function(chrome) {
  throw Error(shindig.errors.SUBCLASS_RESPONSIBILITY);
};

/*
 * Gets additional parameters to append to the iframe url
 * Override this method if you need any custom params.
 */
shindig.Gadget.prototype.getAdditionalParams = function() {
  return '';
};


// ---------
// IfrGadget

shindig.BaseIfrGadget = function(opt_params) {
  shindig.Gadget.call(this, opt_params);
  this.serverBase_ = '/gadgets/'; // default gadget server
  this.queryIfrGadgetType_();
};

shindig.BaseIfrGadget.inherits(shindig.Gadget);

shindig.BaseIfrGadget.prototype.GADGET_IFRAME_PREFIX_ = 'remote_iframe_';

shindig.BaseIfrGadget.prototype.CONTAINER = 'default';

shindig.BaseIfrGadget.prototype.cssClassGadget = 'gadgets-gadget';
shindig.BaseIfrGadget.prototype.cssClassTitleBar = 'gadgets-gadget-title-bar';
shindig.BaseIfrGadget.prototype.cssClassTitle = 'gadgets-gadget-title';
shindig.BaseIfrGadget.prototype.cssClassTitleButtonBar =
    'gadgets-gadget-title-button-bar';
shindig.BaseIfrGadget.prototype.cssClassGadgetUserPrefsDialog =
    'gadgets-gadget-user-prefs-dialog';
shindig.BaseIfrGadget.prototype.cssClassGadgetUserPrefsDialogActionBar =
    'gadgets-gadget-user-prefs-dialog-action-bar';
shindig.BaseIfrGadget.prototype.cssClassTitleButton = 'gadgets-gadget-title-button';
shindig.BaseIfrGadget.prototype.cssClassGadgetContent = 'gadgets-gadget-content';
shindig.BaseIfrGadget.prototype.rpcToken = (0x7FFFFFFF * Math.random()) | 0;
shindig.BaseIfrGadget.prototype.rpcRelay = '../container/rpc_relay.html';

shindig.BaseIfrGadget.prototype.getTitleBarContent = function(continuation) {
  var settingsButton = this.hasViewablePrefs_() ?
      'settings '
      : '';
  continuation('
' + (this.title ? this.title : 'Title') + ' | ' + settingsButton + 'toggle
'); }; shindig.BaseIfrGadget.prototype.getUserPrefsDialogContent = function(continuation) { continuation('
'); }; shindig.BaseIfrGadget.prototype.setServerBase = function(url) { this.serverBase_ = url; }; shindig.BaseIfrGadget.prototype.getServerBase = function() { return this.serverBase_; }; shindig.BaseIfrGadget.prototype.getMainContent = function(continuation) { // proper sub-class has not been mixed-in yet var gadget = this; window.setTimeout( function() { gadget.getMainContent(continuation); }, 0); }; shindig.BaseIfrGadget.prototype.getIframeId = function() { return this.GADGET_IFRAME_PREFIX_ + this.id; }; shindig.BaseIfrGadget.prototype.getUserPrefsDialogId = function() { return this.getIframeId() + '_userPrefsDialog'; }; shindig.BaseIfrGadget.prototype.getUserPrefsParams = function() { var params = ''; for(var name in this.getUserPrefs()) { params += '&up_' + encodeURIComponent(name) + '=' + encodeURIComponent(this.getUserPrefValue(name)); } return params; }; shindig.BaseIfrGadget.prototype.handleToggle = function() { var gadgetIframe = document.getElementById(this.getIframeId()); if (gadgetIframe) { var gadgetContent = gadgetIframe.parentNode; var display = gadgetContent.style.display; gadgetContent.style.display = display ? '' : 'none'; } }; shindig.BaseIfrGadget.prototype.hasViewablePrefs_ = function() { for(var name in this.getUserPrefs()) { var pref = this.userPrefs[name]; if (pref.type != 'hidden') { return true; } } return false; }; shindig.BaseIfrGadget.prototype.handleOpenUserPrefsDialog = function() { if (this.userPrefsDialogContentLoaded) { this.showUserPrefsDialog(); } else { var gadget = this; var igCallbackName = 'ig_callback_' + this.id; window[igCallbackName] = function(userPrefsDialogContent) { gadget.userPrefsDialogContentLoaded = true; gadget.buildUserPrefsDialog(userPrefsDialogContent); gadget.showUserPrefsDialog(); }; var script = document.createElement('script'); script.src = 'http://www.gmodules.com/ig/gadgetsettings?mid=' + this.id + '&output=js' + this.getUserPrefsParams() + '&url=' + this.specUrl; document.body.appendChild(script); } }; shindig.BaseIfrGadget.prototype.buildUserPrefsDialog = function(content) { var userPrefsDialog = document.getElementById(this.getUserPrefsDialogId()); userPrefsDialog.innerHTML = content + '
'; userPrefsDialog.childNodes[0].style.display = ''; }; shindig.BaseIfrGadget.prototype.showUserPrefsDialog = function(opt_show) { var userPrefsDialog = document.getElementById(this.getUserPrefsDialogId()); userPrefsDialog.style.display = (opt_show || opt_show === undefined) ? '' : 'none'; }; shindig.BaseIfrGadget.prototype.hideUserPrefsDialog = function() { this.showUserPrefsDialog(false); }; shindig.BaseIfrGadget.prototype.handleSaveUserPrefs = function() { this.hideUserPrefsDialog(); var numFields = document.getElementById('m_' + this.id + '_numfields').value; for (var i = 0; i < numFields; i++) { var input = document.getElementById('m_' + this.id + '_' + i); var userPrefNamePrefix = 'm_' + this.id + '_up_'; var userPrefName = input.name.substring(userPrefNamePrefix.length); var userPrefValue = input.value; this.userPrefs[userPrefName].value = userPrefValue; } this.saveUserPrefs(); this.refresh(); }; shindig.BaseIfrGadget.prototype.handleCancelUserPrefs = function() { this.hideUserPrefsDialog(); }; shindig.BaseIfrGadget.prototype.refresh = function() { var iframeId = this.getIframeId(); document.getElementById(iframeId).src = this.getIframeUrl(); }; shindig.BaseIfrGadget.prototype.queryIfrGadgetType_ = function() { // Get the gadget metadata and check if the gadget requires the 'pubsub-2' // feature. If so, then we use OpenAjax Hub in order to create and manage // the iframe. Otherwise, we create the iframe ourselves. var request = { context: { country: "default", language: "default", view: "default", container: "default" }, gadgets: [{ url: this.specUrl, moduleId: 1 }] }; var makeRequestParams = { "CONTENT_TYPE" : "JSON", "METHOD" : "POST", "POST_DATA" : gadgets.json.stringify(request) }; var url = this.serverBase_+"metadata?st=" + this.secureToken; gadgets.io.makeNonProxiedRequest(url, handleJSONResponse, makeRequestParams, "application/javascript" ); var gadget = this; function handleJSONResponse(obj) { var requiresPubSub2 = false; var arr = obj.data.gadgets[0].features; for(var i = 0; i < arr.length; i++) { if (arr[i] === "pubsub-2") { requiresPubSub2 = true; break; } } var subClass = requiresPubSub2 ? shindig.OAAIfrGadget : shindig.IfrGadget; for (var name in subClass) if (subClass.hasOwnProperty(name)) { gadget[name] = subClass[name]; } } }; // --------- // IfrGadget shindig.IfrGadget = { getMainContent: function(continuation) { var iframeId = this.getIframeId(); gadgets.rpc.setRelayUrl(iframeId, this.serverBase_ + this.rpcRelay); gadgets.rpc.setAuthToken(iframeId, this.rpcToken); continuation('
'); }, finishRender: function(chrome) { window.frames[this.getIframeId()].location = this.getIframeUrl(); }, getIframeUrl: function() { return this.serverBase_ + 'ifr?' + 'container=' + this.CONTAINER + '&mid=' + this.id + '&nocache=' + shindig.container.nocache_ + '&country=' + shindig.container.country_ + '&lang=' + shindig.container.language_ + '&view=' + shindig.container.view_ + (this.specVersion ? '&v=' + this.specVersion : '') + (shindig.container.parentUrl_ ? '&parent=' + encodeURIComponent(shindig.container.parentUrl_) : '') + (this.debug ? '&debug=1' : '') + this.getAdditionalParams() + this.getUserPrefsParams() + (this.secureToken ? '&st=' + this.secureToken : '') + '&url=' + encodeURIComponent(this.specUrl) + '#rpctoken=' + this.rpcToken + (this.viewParams ? '&view-params=' + encodeURIComponent(gadgets.json.stringify(this.viewParams)) : '') + (this.hashData ? '&' + this.hashData : ''); } }; // --------- // OAAIfrGadget shindig.OAAIfrGadget = { getMainContent: function(continuation) { continuation('
'); }, finishRender: function(chrome) { var iframeAttrs = { className: this.cssClassGadget, frameborder: "no", scrolling: "no" }; if (this.height) { iframeAttrs.height = this.height; } if (this.width) { iframeAttrs.width = this.width; } new OpenAjax.hub.IframeContainer( gadgets.pubsub2router.hub, this.getIframeId(), { Container: { onSecurityAlert: function( source, alertType) { gadgets.error("Security error for container " + source.getClientID() + " : " + alertType); source.getIframe().src = "about:blank"; // for debugging // }, // onConnect: function( container ) { // gadgets.log("++ connected: " + container.getClientID()); } }, IframeContainer: { parent: document.getElementById(this.cssClassGadgetContent + '-' + this.id), uri: this.getIframeUrl(), tunnelURI: shindig.uri(this.serverBase_ + this.rpcRelay).resolve(shindig.uri(window.location.href)), iframeAttrs: iframeAttrs } } ); }, getIframeUrl: function() { return this.serverBase_ + 'ifr?' + 'container=' + this.CONTAINER + '&mid=' + this.id + '&nocache=' + shindig.container.nocache_ + '&country=' + shindig.container.country_ + '&lang=' + shindig.container.language_ + '&view=' + shindig.container.view_ + (this.specVersion ? '&v=' + this.specVersion : '') + // (shindig.container.parentUrl_ ? '&parent=' + encodeURIComponent(shindig.container.parentUrl_) : '') + (this.debug ? '&debug=1' : '') + this.getAdditionalParams() + this.getUserPrefsParams() + (this.secureToken ? '&st=' + this.secureToken : '') + '&url=' + encodeURIComponent(this.specUrl) + // '#rpctoken=' + this.rpcToken + (this.viewParams ? '&view-params=' + encodeURIComponent(gadgets.json.stringify(this.viewParams)) : '') + // (this.hashData ? '&' + this.hashData : ''); (this.hashData ? '#' + this.hashData : ''); } }; // --------- // Container /** * Container interface. * @constructor */ shindig.Container = function() { this.gadgets_ = {}; this.parentUrl_ = document.location.href + '://' + document.location.host; this.country_ = 'ALL'; this.language_ = 'ALL'; this.view_ = 'default'; this.nocache_ = 1; // signed max int this.maxheight_ = 0x7FFFFFFF; }; shindig.Container.inherits(shindig.Extensible); /** * Known dependencies: * gadgetClass: constructor to create a new gadget instance * userPrefStore: instance of a subclass of shindig.UserPrefStore * gadgetService: instance of a subclass of shindig.GadgetService * layoutManager: instance of a subclass of shindig.LayoutManager */ shindig.Container.prototype.gadgetClass = shindig.Gadget; shindig.Container.prototype.userPrefStore = new shindig.DefaultUserPrefStore(); shindig.Container.prototype.gadgetService = new shindig.GadgetService(); shindig.Container.prototype.layoutManager = new shindig.StaticLayoutManager(); shindig.Container.prototype.setParentUrl = function(url) { this.parentUrl_ = url; }; shindig.Container.prototype.setCountry = function(country) { this.country_ = country; }; shindig.Container.prototype.setNoCache = function(nocache) { this.nocache_ = nocache; }; shindig.Container.prototype.setLanguage = function(language) { this.language_ = language; }; shindig.Container.prototype.setView = function(view) { this.view_ = view; }; shindig.Container.prototype.setMaxHeight = function(maxheight) { this.maxheight_ = maxheight; }; shindig.Container.prototype.getGadgetKey_ = function(instanceId) { return 'gadget_' + instanceId; }; shindig.Container.prototype.getGadget = function(instanceId) { return this.gadgets_[this.getGadgetKey_(instanceId)]; }; shindig.Container.prototype.createGadget = function(opt_params) { return new this.gadgetClass(opt_params); }; shindig.Container.prototype.addGadget = function(gadget) { gadget.id = this.getNextGadgetInstanceId(); this.gadgets_[this.getGadgetKey_(gadget.id)] = gadget; }; shindig.Container.prototype.addGadgets = function(gadgets) { for (var i = 0; i < gadgets.length; i++) { this.addGadget(gadgets[i]); } }; /** * Renders all gadgets in the container. */ shindig.Container.prototype.renderGadgets = function() { for (var key in this.gadgets_) { this.renderGadget(this.gadgets_[key]); } }; /** * Renders a gadget. Gadgets are rendered inside their chrome element. * @param {Object} gadget Gadget object */ shindig.Container.prototype.renderGadget = function(gadget) { throw Error(shindig.errors.SUBCLASS_RESPONSIBILITY); }; shindig.Container.prototype.nextGadgetInstanceId_ = 0; shindig.Container.prototype.getNextGadgetInstanceId = function() { return this.nextGadgetInstanceId_++; }; /** * Refresh all the gadgets in the container. */ shindig.Container.prototype.refreshGadgets = function() { for (var key in this.gadgets_) { this.gadgets_[key].refresh(); } }; // ------------ // IfrContainer /** * Container that renders gadget using ifr. * @constructor */ shindig.IfrContainer = function() { shindig.Container.call(this); }; shindig.IfrContainer.inherits(shindig.Container); shindig.IfrContainer.prototype.gadgetClass = shindig.BaseIfrGadget; shindig.IfrContainer.prototype.gadgetService = new shindig.IfrGadgetService(); shindig.IfrContainer.prototype.setParentUrl = function(url) { if (!url.match(/^http[s]?:\/\//)) { url = document.location.href.match(/^[^?#]+\//)[0] + url; } this.parentUrl_ = url; }; /** * Renders a gadget using ifr. * @param {Object} gadget Gadget object */ shindig.IfrContainer.prototype.renderGadget = function(gadget) { var chrome = this.layoutManager.getGadgetChrome(gadget); gadget.render(chrome); }; /** * Default container. */ shindig.container = new shindig.IfrContainer();




© 2015 - 2024 Weber Informatics LLC | Privacy Policy