blob: 94ecd677a537287ec26ab2863f33944fea222d19 [file] [log] [blame]
/*
* 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.
*/
// Create the common container object.
var CommonContainer = new osapi.container.Container({});
// Default the security token for the container. Using this example security
// token requires enabling the DefaultSecurityTokenCodec to let
// UrlParameterAuthenticationHandler create valid security token.
shindig.auth.updateSecurityToken('john.doe:john.doe:appid:cont:url:0:default');
// Wrapper function to set the gadget site/id and default width.
CommonContainer.renderGadget = function(gadgetURL, gadgetId) {
// going to hardcode these values for width.
var el = document.getElementById('gadget-site-' + gadgetId);
var parms = {};
parms[osapi.container.RenderParam.WIDTH] = '100%';
var gadgetSite = CommonContainer.newGadgetSite(el);
CommonContainer.navigateGadget(gadgetSite, gadgetURL, {}, parms);
return gadgetSite;
};
// Function for pre-rendering gadgets. Gadget pre-rendering
// occurs when an action contributed by a pre-loaded gadget
// is executed.
function preRenderGadget(gadgetUrl, opt_params) {
var gadgetId = getGadgetId(gadgetUrl);
var el = $('#gadget-site-' + gadgetId);
var gadgetSite = CommonContainer.renderGadget(gadgetUrl, gadgetId);
el.data('gadgetSite', gadgetSite);
return gadgetSite;
}
// Common container init function.
CommonContainer.init = new function() {
// Map needed for lazy loading of gadgets
urlsToGadgetIdMap = {};
// Register our rendering functions with the action service
if (CommonContainer.actions) {
// Called when an action should be displayed in the container
CommonContainer.actions.registerShowActionsHandler(showActions);
// Called when a action should be removed from the container
CommonContainer.actions.registerHideActionsHandler(hideActions);
// Called for actions contributed by pre-loaded gadgets (lazy load)
CommonContainer.actions.registerNavigateGadgetHandler(preRenderGadget);
}
}
// Support for lazy loading gadgets
function getGadgetId(url) {
if (urlsToGadgetIdMap) {
return urlsToGadgetIdMap[url];
}
}
// Wrapper function to add gadgets to the page.
CommonContainer.addGadgetToPage = function(gadgetURL, lazyLoad) {
addGadget(gadgetURL, lazyLoad);
};
// Wrapper function to expand a gadget
CommonContainer.navigateView = function(gadgetSite, gadgetURL, view) {
var renderParms = {};
if (view === null || view === '') {
view = 'default';
}
renderParms[osapi.container.RenderParam.WIDTH] = '100%';
renderParms['view'] = view;
CommonContainer.navigateGadget(gadgetSite, gadgetURL, {}, renderParms);
};
// see peoplehelpers.js
osapi.people.getViewer = function(options) {
options = options || {};
options.userId = '@viewer';
options.groupId = '@self';
return osapi.people.get(options);
};
// see peoplehelpers.js
osapi.people.getViewerFriends = function(options) {
options = options || {};
options.userId = '@viewer';
options.groupId = '@friends';
return osapi.people.get(options);
};
// Function to display actions
function showActions(actions) {
var itemObj = actions[0];
if (!itemObj.path && !itemObj.dataType) {
// object is invalid!
return;
}
// bind the action to the specified data object type
if (itemObj.dataType) {
if (itemObj.dataType == 'opensocial.Person') {
addPersonAction(itemObj);
}
}
// bind the action to the specified path (container UI elements)
if (itemObj.path && itemObj.path.length > 0) {
addContainerAction(itemObj);
}
}
// Adds the specified action to a person element.
function addPersonAction(itemObj) {
// select all person elements
var personActionDiv = $('.personActions');
// create a link and append it to each person element
var actionStr = '';
if (itemObj.icon && itemObj.icon.length > 0) {
actionStr += '<img src="' + itemObj.icon + '"/>';
}
actionStr += '<a name="person-action-' + itemObj.id + '" title="' +
itemObj.tooltip + '" href="#">' + itemObj.label + '</a>';
actionStr = '<span class="' + itemObj.id + '">' + actionStr + '</span>';
var actionLink = $(actionStr);
// add a separator if needed
if (personActionDiv.children().length > 0) {
personActionDiv.append(' | ');
}
// select all links that were added and set the click handler
personActionDiv.append(actionLink);
$('a[name="person-action-' + itemObj.id + '"]').each(function(i) {
$(this).click(function() {
CommonContainer.actions.runAction(itemObj.id);
});
});
}
// Adds an action to the container UI
function addContainerAction(itemObj) {
var pathParts = itemObj.path.split('/');
var pathType = pathParts.shift();
var pathScope = pathParts.shift();
var remainingPath = pathParts.join('/');
var contributionBar;
// right now we support contributing to the global menubar
if (pathType == 'container' && pathScope == 'navigationLinks') {
contributionBar = $('#globalMenubar');
contributionBar.show();
}
// create the action element
var actionStr = '';
if (itemObj.icon && itemObj.icon.length > 0) {
actionStr += '<img src="' + itemObj.icon + '"/>';
}
actionStr += '<a title="' + itemObj.tooltip + '" href="#">'
+ itemObj.label + '</a>';
actionStr = '<span class="' + itemObj.id + '">' + actionStr + '</span>';
var actionLink = $(actionStr);
// add a separator if needed
if (contributionBar.children().length > 0) {
contributionBar.append(' | ');
}
// add the new action
contributionBar.append(actionLink);
actionLink.click(function() {
CommonContainer.actions.runAction(itemObj.id);
});
}
// Function to hide actions
function hideActions(actions) {
var itemObj = actions[0];
if (itemObj.path || itemObj.dataType) {
// remove the action from the specified data object type
if (itemObj.dataType && itemObj.dataType == 'opensocial.Person') {
removePersonAction(itemObj);
}
// remove the action to the specified path (container UI elements)
if (itemObj.path && itemObj.path.length > 0) {
removeContainerAction(itemObj);
}
}
}
// Removes the specified action from a person element.
function removePersonAction(itemObj) {
// hack - actions should be removed individually
$('.personActions').empty();
}
// Removes the specified action from the container UI
function removeContainerAction(itemObj) {
// hack - actions should be removed individually
$('#globalMenubar').empty();
$('#globalMenubar').hide();
}
// Runs the action specified in the action_id_field
function runAction() {
id = document.getElementById('action_id_field').value;
CommonContainer.actions.runAction(id, CommonContainer.selection.getSelection());
}