blob: a1af38671d2acaeb17949fae5049b5653ebfbac2 [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.
*/
/**
* overview Container implementation of view enhancement.
*/
CommonContainer['views'] = CommonContainer['views'] || {};
/**
* Method will be called to create the DOM element to place the Gadget
* Site in.
*
* @param {Object}
* metadata: Gadget meta data for the gadget being opened in
* this GadgetSite.
* @param {Element}
* rel: The element to which opt_coordinates values are
* relative.
* @param {string=}
* opt_view: Optional parameter, the view that indicates the
* type of GadgetSite.
* @param {string=}
* opt_viewTarget: Optional parameter, the view target indicates
* where to open the gadget.
* @param {Object=}
* opt_coordinates: Object containing the desired absolute
* positioning css parameters (top|bottom|left|right) with
* appropriate values. All values are relative to the calling
* gadget.
* @return {Object} The DOM element to place the GadgetSite in.
*/
CommonContainer.views.createElementForGadget = function(metadata, rel, opt_view, opt_viewTarget,
opt_coordinates) {
var surfaceView = 'default';
var viewTarget = 'default';
if (typeof opt_view != 'undefined') {
surfaceView = opt_view;
}
if (typeof opt_viewTarget != 'undefined') {
viewTarget = opt_viewTarget;
}
switch (viewTarget) {
case 'tab':
return openInNewTab(metadata);
break;
case 'dialog':
return openInDialog(false, surfaceView, true, metadata);
break;
case 'modalDialog':
return openInDialog(true, surfaceView, true, metadata);
break;
default:
return openInDialog(false, surfaceView, true, metadata);
}
};
/**
* Method will be called to create the DOM element to place the UrlSite
* in.
*
* @param {Element}
* rel: The element to which opt_coordinates values are
* relative.
* @param {string=}
* opt_view: Optional parameter, the view to open. If not
* included the container should use its default view.
* @param {Object=}
* opt_coordinates: Object containing the desired absolute
* positioning css parameters (top|bottom|left|right) with
* appropriate values. All values are relative to the calling
* gadget.
* @return {Object} The DOM element to place the UrlSite object in.
*/
CommonContainer.views.createElementForUrl = function(rel, opt_viewTarget, opt_coordinates) {
var viewTarget = 'dialog';
if (typeof opt_viewTarget != 'undefined') {
viewTarget = opt_viewTarget;
}
switch (viewTarget) {
case 'tab':
return openInNewTab();
break;
case 'dialog':
return openInDialog(false, 'canvas', false);
break;
case 'modalDialog':
return openInDialog(true, 'canvas', false);
break;
default:
return openInDialog(false, 'canvas', false);
}
};
/**
* Method will be called when a gadget wants to close itself or the parent
* gadget wants to close a gadget or url site it has opened.
*
* @param {object=} site
* The id of the site to close.
*/
CommonContainer.views.destroyElement = function(site) {
closeDialog(site);
};
var dialog_counter = 0;
var tab_counter = 2;
var newTabId;
var $tabs;
/**
* private method will be called to create the dialog DOM element.
* @private
* @param {boolean} modaldialog
* true for modal dialog.
* @param {string} view
* view type.
* @param {boolean} isGadget
* true for gadget, false for url.
* @param {string} opt_gadgetMetadata
* gadget metadate.
* @return {Object} The DOM element to place the gadget or url site object in.
*/
function openInDialog(modaldialog, view, isGadget, opt_gadgetMetadata) {
var dialog_width = 450; // default width
if (view == 'canvas') {
dialog_width = 675; // width for canvas
}
dialog_counter++;
var dialog = document.createElement('div');
dialog.id = 'dialog_' + dialog_counter;
if (typeof opt_gadgetMetadata != 'undefined') {
// open gadget, get the title from gadgetMetadata
dialog.title = opt_gadgetMetadata['modulePrefs'].title;
}
document.getElementById('content').appendChild(dialog);
if (isGadget) {
var id = 'dialog_' + dialog_counter;
// use jquery to create the dialog
$('#' + id).dialog({
resizable: false,
width: dialog_width, // height will be auto
modal: modaldialog, // set modal: true or false
beforeClose: function(ev, ui) {
var dialogDiv = $('#' + id + ' iframe');
if(dialogDiv.length) {
//Means the user most likely clicked the 'x' in the dialog chrome
//If they clicked the OK or Cancel buttons in the dialog than the gadget
//iFrame would have already been removed from the DOM
var site = CommonContainer.getGadgetSiteByIframeId_(dialogDiv[0].id);
CommonContainer.closeGadget(site);
}
}
});
return dialog;
} else {
var dialog_height = 350; // default height
if (view == 'canvas') {
dialog_height = 530; // height for canvas
}
$('#dialog_' + dialog_counter).dialog({
resizable: false,
width: dialog_width,
height: dialog_height,
modal: modaldialog, // set modal: true or false
close: function(ev, ui) {
$(this).remove();
}
});
// Maybe an issue in jquery, we need to create another div, otherwise it
// will show vertical scroll bar
var dialog_content = document.createElement('div');
dialog_content.style.height = '100%';
dialog_content.style.width = '100%';
dialog.appendChild(dialog_content);
return dialog_content;
}
}
/**
* private method will be called to create the tab DOM element.
* @private
* @param {string} gadgetMetadata
* gadget metadate.
* @return {Object} The DOM element to place the gadget or url site object in.
*/
function openInNewTab(gadgetMetadata) {
var tabsNode;
if (!document.getElementById('tabs')) {
// add the new tab the first time, will create the default tab for the
// current content, and add a new tab
var controlPanelNode = document.getElementById('controlPanel');
var testAreaNode = document.getElementById('testArea');
var contentNode = document.getElementById('content');
contentNode.removeChild(controlPanelNode);
contentNode.removeChild(testAreaNode);
tabsNode = document.createElement('div');
tabsNode.id = 'tabs';
tabsNode.innerHTML = "<ul><li><a href='#tabs-1'>Default</a></li></ul>";
var tabs_1_Node = document.createElement('div');
tabs_1_Node.id = 'tabs-1';
// put the default content into the tabs-1
tabs_1_Node.appendChild(controlPanelNode);
tabs_1_Node.appendChild(testAreaNode);
tabsNode.appendChild(tabs_1_Node);
contentNode.appendChild(tabsNode);
newTabId = 'tabs-2';
// use jquery to create new tab
$tabs = $('#tabs')
.tabs(
{
tabTemplate: "<li><a href='#{href}'>#{label}</a>" +
"<span class='ui-icon ui-icon-close'>Remove Tab</span></li>",
add: function(event, ui) {
var tab_content_id = 'tab_content' + tab_counter;
var tab_content = document.createElement('div');
tab_content.id = tab_content_id;
// tab_content.className = "column";
tab_content.style.height = '1000px';
tab_content.style.width = '100%';
$(ui.panel).append(tab_content);
// set the focus to the new tab
$('#tabs').tabs('select', '#' + newTabId);
},
remove: function(event, ui) {
// If there is gadget inside, close the gadget
var iframes = $(this).parent().get(0)
.getElementsByTagName('iframe');
if (iframes.lenth > 0 && (typeof iframes[0].id != 'undefined')) {
var site = CommonContainer
.getGadgetSiteByIframeId_(iframes[0].id);
CommonContainer.closeGadget(site);
}
}
});
// close icon: removing the tab on click
// note: closable tabs gonna be an option in the future - see
// http://dev.jqueryui.com/ticket/3924
$('#tabs span.ui-icon-close').live('click', function() {
var index = $('li', $tabs).index($(this).parent());
$tabs.tabs('remove', index);
if ($tabs.tabs('length') < 2) {
controlPanelNode = document.getElementById('controlPanel');
testAreaNode = document.getElementById('testArea');
contentNode = document.getElementById('content');
tabsNode = document.getElementById('tabs');
tabs_1_Node = document.getElementById('tabs-1');
tabs_1_Node.removeChild(controlPanelNode);
tabs_1_Node.removeChild(testAreaNode);
contentNode.removeChild(tabsNode);
tab_counter = 2;
newTabId = null;
$tabs = null;
contentNode.appendChild(controlPanelNode);
contentNode.appendChild(testAreaNode);
}
});
}
newTabId = 'tabs-' + tab_counter;
var tab_content_id = 'tab_content' + tab_counter;
// add new tab with new id and new title
var tab_title = 'new tab ';
if ((typeof gadgetMetadata != 'undefined') &&
(typeof gadgetMetadata['modulePrefs'].title != 'undefined')) {
// open gadget, get the title from gadgetMetadata
tab_title = gadgetMetadata['modulePrefs'].title;
if (tab_title.length > 7) {
tab_title = tab_title.substring(0, 6) + '...';
}
}
$tabs.tabs('add', '#tabs-' + tab_counter, tab_title);
if (typeof gadgetMetadata != 'undefined') {
// rendering gadget's header
var gadgetSiteId = 'gadget-site-' + newTabId;
var gadgetTemplate = '<div class="portlet">' +
'<div class="portlet-header">sample to replace</div>' +
'<div id=' + gadgetSiteId +
' class="portlet-content"></div>' + '</div>';
$(gadgetTemplate).appendTo($('#' + tab_content_id)).addClass(
'ui-widget ui-widget-content ui-helper-clearfix ui-corner-all')
.find('.portlet-header')
.addClass('ui-widget-header ui-corner-all')
.text(gadgetMetadata['modulePrefs'].title)
.append('<span id="remove" class="ui-icon ui-icon-closethick"></span>');
}
tab_counter++;
// return the div
if (typeof gadgetMetadata != 'undefined') {
return document.getElementById('gadget-site-' + newTabId);
} else {
return document.getElementById(tab_content_id);
}
}
/**
* private method will be called to destroy dialog object.
* @private
* @param {object} site
* gadget site.
*/
function closeDialog(site) {
// this is the site id, we also need to find the dojo dialog widget id
var iframeId;
var widgetId = 'dialog_' + dialog_counter; //default
if (site && site.getActiveSiteHolder()) {
// get iframe id
iframeId = site.getActiveSiteHolder().getIframeId();
if (typeof iframeId != 'undefined') {
var iframeNode = document.getElementById(iframeId);
// get dialog widget id
widgetId = iframeNode.parentNode.id;
}
}
// close the gadget
CommonContainer.closeGadget(site);
// close the widget
$('#' + widgetId).dialog('close');
}