/*********************************************************************************
* SugarCRM Community Edition is a customer relationship management program developed by
* SugarCRM, Inc. Copyright (C) 2004-2011 SugarCRM Inc.
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU Affero General Public License version 3 as published by the
* Free Software Foundation with the addition of the following permission added
* to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
* IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
* OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
* details.
*
* You should have received a copy of the GNU Affero General Public License along with
* this program; if not, see http://www.gnu.org/licenses or write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*
* You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
* SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU Affero General Public License version 3.
*
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "Powered by
* SugarCRM" logo. If the display of the logo is not reasonably feasible for
* technical reasons, the Appropriate Legal Notices must display the words
* "Powered by SugarCRM".
********************************************************************************/
YAHOO.namespace("SUGAR");
(function() {
var sw = YAHOO.SUGAR,
Event = YAHOO.util.Event,
Connect = YAHOO.util.Connect,
Dom = YAHOO.util.Dom;
/**
* Message Box is a singleton widget designed to replace the browsers 'alert'
* function, as well as provide capabilities for pop-over loading bars and
* other small non-interactive pop-overs.
* TODO:Still needs configurable buttons in the footer as well as
* auto building of a loading bar.
*/
sw.MessageBox = {
progressTemplate : "{body}
",
promptTemplate : "{body}:",
show: function(config) {
var myConf = sw.MessageBox.config = {
type:'message',
modal:true,
width: 240,
id:'sugarMsgWindow',
close:true,
title:"Alert",
msg: " ",
buttons: [ ]
};
if (config['type'] && config['type'] == "prompt") {
myConf['buttons'] = [{
text: SUGAR.language.get("app_strings", "LBL_EMAIL_CANCEL"), handler:YAHOO.SUGAR.MessageBox.hide
},{
text: SUGAR.language.get("app_strings", "LBL_EMAIL_OK"), handler:config['fn'] ?
function(){
var returnValue = config['fn'](YAHOO.util.Dom.get("sugar-message-prompt").value);
if (typeof(returnValue) == "undefined" || returnValue) {
YAHOO.SUGAR.MessageBox.hide();
} // if
}
: YAHOO.SUGAR.MessageBox.hide, isDefault:true
}];
} else if ((config['type'] && config['type'] == "alert")) {
myConf['buttons'] = [{
text: SUGAR.language.get("app_strings", "LBL_EMAIL_OK"),
handler: config['fn'] ?
function(){YAHOO.SUGAR.MessageBox.hide(); config['fn']();}
:
YAHOO.SUGAR.MessageBox.hide,
isDefault:true
}]
} else if((config['type'] && config['type'] == "confirm")) {
myConf['buttons'] = [{
text: SUGAR.language.get("app_strings", "LBL_EMAIL_YES"), handler:config['fn'] ?
function(){config['fn']('yes');YAHOO.SUGAR.MessageBox.hide();}
: YAHOO.SUGAR.MessageBox.hide, isDefault:true
},{
text: SUGAR.language.get("app_strings", "LBL_EMAIL_NO"), handler:config['fn'] ?
function(){config['fn']('no');YAHOO.SUGAR.MessageBox.hide();}
: YAHOO.SUGAR.MessageBox.hide
}];
}
else if((config['type'] && config['type'] == "plain")) {
myConf['buttons'] = [];
} // else if
for (var i in config) {
myConf[i] = config[i];
}
if (sw.MessageBox.panel) {
sw.MessageBox.panel.destroy();
}
sw.MessageBox.panel = new YAHOO.widget.SimpleDialog(myConf.id, {
width: myConf.width + 'px',
close: myConf.close,
modal: myConf.modal,
visible: true,
fixedcenter: true,
constraintoviewport: true,
draggable: true,
buttons: myConf.buttons
});
if (myConf.type == "progress") {
sw.MessageBox.panel.setBody(sw.MessageBox.progressTemplate.replace(/\{body\}/gi, myConf.msg));
} else if (myConf.type == "prompt") {
sw.MessageBox.panel.setBody(sw.MessageBox.promptTemplate.replace(/\{body\}/gi, myConf.msg));
} else if (myConf.type == "confirm") {
sw.MessageBox.panel.setBody(myConf.msg);
} else {
sw.MessageBox.panel.setBody(myConf.msg);
}
sw.MessageBox.panel.setHeader(myConf.title);
if (myConf.beforeShow) {
sw.MessageBox.panel.beforeShowEvent.subscribe(function() {myConf.beforeShow();});
} // if
if (myConf.beforeHide) {
sw.MessageBox.panel.beforeHideEvent.subscribe(function() {myConf.beforeHide();});
} // if
sw.MessageBox.panel.render(document.body);
sw.MessageBox.panel.show();
},
updateProgress: function(percent, message) {
if (!sw.MessageBox.config.type == "progress") return;
if (typeof message == "string") {
sw.MessageBox.panel.setBody(sw.MessageBox.progressTemplate.replace(/\{body\}/gi, message));
}
var barEl = Dom.getElementsByClassName("sugar-progress-bar", null, YAHOO.SUGAR.MessageBox.panel.element)[0];
if (percent > 100)
percent = 100;
else if (percent < 0)
percent = 0;
barEl.style.width = percent + "%";
},
hide: function() {
if (sw.MessageBox.panel)
sw.MessageBox.panel.hide();
}
};
sw.Template = function(content) {
this._setContent(content);
};
sw.Template.prototype = {
regex : /\{([\w\.]*)\}/gim,
append: function (target, args) {
var tEl = Dom.get(target);
if (tEl) tEl.innerHTML += this.exec(args);
else if (!SUGAR.isIE) console.log("Warning, unable to find target:" + target);
},
exec : function (args) {
var out = this.content;
for (var i in this.vars) {
var val = this._getValue(i, args);
var reg = new RegExp("\\{" + i + "\\}", "g");
out = out.replace(reg, val);
}
return out;
},
_setContent : function(content) {
this.content = content;
var lastIndex = -1;
var result = this.regex.exec(content);
this.vars = { };
while(result && result.index > lastIndex){
lastIndex = result.index;
this.vars[result[1]] = true;
result = this.regex.exec(content);
}
},
_getValue: function(v, scope) {
return function(e) {return eval("this." + e);}.call(scope, v);
}
};
/**
* SelectionGrid is simply a YUI Data Table with row selection already enabled.
*/
sw.SelectionGrid = function(containerEl, columns, dataSource, config){
sw.SelectionGrid.superclass.constructor.call(this, containerEl, columns, dataSource, config);
// Subscribe to events for row selection
this.subscribe("rowMouseoverEvent", this.onEventHighlightRow);
this.subscribe("rowMouseoutEvent", this.onEventUnhighlightRow);
this.subscribe("rowClickEvent", this.onEventSelectRow);
// Programmatically select the first row
this.selectRow(this.getTrEl(0));
// Programmatically bring focus to the instance so arrow selection works immediately
this.focus();
}
YAHOO.extend(sw.SelectionGrid, YAHOO.widget.ScrollingDataTable, {
//Bugfix, the default getColumn will fail if a th element is passed in. http://yuilibrary.com/projects/yui2/ticket/2528034
getColumn : function(column) {
var oColumn = this._oColumnSet.getColumn(column);
if(!oColumn) {
// Validate TD element
var elCell = this.getTdEl(column);
if(elCell && (!column.tagName || column.tagName.toUpperCase() != "TH")) {
oColumn = this._oColumnSet.getColumn(elCell.cellIndex);
}
// Validate TH element
else {
elCell = this.getThEl(column);
if(elCell) {
// Find by TH el ID
var allColumns = this._oColumnSet.flat;
for(var i=0, len=allColumns.length; i]*>)/gim,
_removeIdRegex : new RegExp("(<.[^\\/<]*)id\\s*=\\s*['|\"]?\w*['|\"]?([^>]*>)", "gim"),
_resizeProxy: function() {
this.constructor.superclass._resizeProxy.apply(this, arguments);
var dragEl = this.getDragEl(),
el = this.getEl();
Dom.setStyle(this.pointer, 'height', (this.rowEl.offsetHeight + 5) + 'px');
Dom.setStyle(this.pointer, 'display', 'block');
var xy = Dom.getXY(el);
Dom.setXY(this.pointer, [xy[0], (xy[1] - 5)]);
Dom.setStyle(dragEl, 'height', this.rowEl.offsetHeight + "px");
Dom.setStyle(dragEl, 'width', (parseInt(Dom.getStyle(dragEl, 'width'),10) + 4) + 'px');
Dom.setXY(this.dragEl, xy);
},
startDrag: function(x, y) {
var dragEl = this.getDragEl();
var clickEl = this.getEl();
Dom.setStyle(clickEl, "opacity", "0.25");
var tableWrap = false;
if (clickEl.tagName.toUpperCase() == "TR")
tableWrap = true;
dragEl.innerHTML = "