1307 lines
46 KiB
JavaScript
1307 lines
46 KiB
JavaScript
|
||
// FineUI应用程序域
|
||
var F = function (cmpName) {
|
||
return Ext.getCmp(cmpName);
|
||
};
|
||
|
||
F.state = function (cmp, state) {
|
||
F.util.setFState(cmp, state);
|
||
};
|
||
|
||
F.enable = function (id) {
|
||
F.util.enableSubmitControl(id);
|
||
};
|
||
|
||
F.disable = function (id) {
|
||
F.util.disableSubmitControl(id);
|
||
};
|
||
|
||
F.target = function (target) {
|
||
return F.util.getTargetWindow(target);
|
||
};
|
||
|
||
F.alert = function () {
|
||
F.util.alert.apply(window, arguments);
|
||
};
|
||
|
||
F.init = function () {
|
||
F.util.init.apply(window, arguments);
|
||
};
|
||
|
||
F.load = function () {
|
||
F.util.load.apply(window, arguments);
|
||
};
|
||
|
||
F.ready = function () {
|
||
F.util.ready.apply(window, arguments);
|
||
};
|
||
|
||
F.ajaxReady = function () {
|
||
F.util.ajaxReady.apply(window, arguments);
|
||
//if (typeof (onAjaxReady) == 'function') {
|
||
// onAjaxReady();
|
||
//}
|
||
};
|
||
|
||
F.beforeAjax = function () {
|
||
F.util.beforeAjax.apply(window, arguments);
|
||
};
|
||
|
||
F.stop = function () {
|
||
var event = arguments.callee.caller.arguments[0] || window.event;
|
||
F.util.stopEventPropagation(event);
|
||
};
|
||
|
||
F.confirm = function () {
|
||
F.util.confirm.apply(null, arguments);
|
||
};
|
||
|
||
F.toggle = function (el, className) {
|
||
Ext.get(el).toggleCls(className);
|
||
};
|
||
|
||
F.fieldValue = function (cmp) {
|
||
return F.util.getFormFieldValue(cmp);
|
||
};
|
||
|
||
F.customEvent = function (argument, validate) {
|
||
var pmv = F.pagemanager.validate;
|
||
if (validate && pmv) {
|
||
if (!F.util.validForms(pmv.forms, pmv.target, pmv.messagebox)) {
|
||
return false;
|
||
}
|
||
}
|
||
__doPostBack(F.pagemanager.name, argument);
|
||
};
|
||
|
||
F.getHidden = function () {
|
||
return F.util.getHiddenFieldValue.apply(window, arguments);
|
||
};
|
||
F.setHidden = function () {
|
||
return F.util.setHiddenFieldValue.apply(window, arguments);
|
||
};
|
||
|
||
F.addCSS = function () {
|
||
F.util.addCSS.apply(window, arguments);
|
||
};
|
||
|
||
|
||
// 更新EventValidation的值
|
||
F.eventValidation = function (newValue) {
|
||
F.setHidden("__EVENTVALIDATION", newValue);
|
||
};
|
||
|
||
|
||
// 更新ViewState的值
|
||
F.viewState = function (viewStateBeforeAJAX, newValue, startIndex) {
|
||
var viewStateHiddenFiledId = '__VIEWSTATE';
|
||
|
||
var oldValue = F.getHidden(viewStateHiddenFiledId);
|
||
var viewStateChanged = false;
|
||
if (oldValue !== viewStateBeforeAJAX) {
|
||
viewStateChanged = true;
|
||
}
|
||
|
||
if (typeof (newValue) === 'undefined') {
|
||
// AJAX过程中ViewState值没变化
|
||
if (viewStateChanged) {
|
||
F.setHidden(viewStateHiddenFiledId, viewStateBeforeAJAX);
|
||
}
|
||
} else {
|
||
// AJAX过程中ViewState值有变化
|
||
if (Ext.type(startIndex) === 'number' && startIndex > 0) {
|
||
// 只返回startIndex之后的内容
|
||
if (viewStateChanged) {
|
||
// 无法处理!
|
||
return false;
|
||
} else {
|
||
F.setHidden(viewStateHiddenFiledId, oldValue.substr(0, startIndex) + newValue);
|
||
}
|
||
} else {
|
||
// 返回完整的ViewState
|
||
F.setHidden(viewStateHiddenFiledId, newValue);
|
||
}
|
||
}
|
||
|
||
// 更新成功!
|
||
return true;
|
||
};
|
||
|
||
// cookie('theme');
|
||
// cookie('theme', 'gray');
|
||
// cookie('theme', 'gray', { 'expires': 3 });
|
||
// expires: 天
|
||
// 新增 或者 修改Cookie
|
||
F.cookie = function (key, value, options) {
|
||
if (typeof(value) === 'undefined') {
|
||
var cookies = document.cookie ? document.cookie.split('; ') : [];
|
||
var result = key ? '' : {};
|
||
Ext.Array.each(cookies, function (cookie, index) {
|
||
var parts = cookie.split('=');
|
||
var partName = decodeURIComponent(Ext.String.trim(parts[0]));
|
||
var partValue = decodeURIComponent(Ext.String.trim(parts[1]));
|
||
|
||
if (key) {
|
||
if (key === partName) {
|
||
result = partValue;
|
||
return false;
|
||
}
|
||
} else {
|
||
result[partName] = partValue;
|
||
}
|
||
});
|
||
return result;
|
||
} else {
|
||
// Set cookie
|
||
options = Ext.apply(options || {}, {
|
||
path: '/'
|
||
});
|
||
|
||
var expTime;
|
||
if (typeof (options.expires) === 'number') {
|
||
expTime = new Date();
|
||
expTime.setTime(expTime.getTime() + options.expires * 24 * 60 * 60 * 1000);
|
||
}
|
||
|
||
document.cookie = [
|
||
encodeURIComponent(key), '=', encodeURIComponent(value),
|
||
options.expires ? '; expires=' + expTime.toUTCString() : '',
|
||
options.path ? '; path=' + options.path : '',
|
||
options.domain ? '; domain=' + options.domain : '',
|
||
options.secure ? '; secure' : ''
|
||
].join('');
|
||
}
|
||
};
|
||
|
||
// 删除Cookie
|
||
F.removeCookie = function (key, options) {
|
||
options = Ext.apply(options || {}, {
|
||
path: '/',
|
||
'expires': -1
|
||
});
|
||
|
||
F.cookie(key, '', options);
|
||
};
|
||
|
||
|
||
Ext.onReady(function () {
|
||
|
||
F.util.triggerLoad();
|
||
|
||
|
||
F.util.triggerReady();
|
||
|
||
|
||
F.util.hidePageLoading();
|
||
|
||
});
|
||
|
||
(function () {
|
||
|
||
// 遍历定义了 renderTo 属性的对象
|
||
// callback: 'return false' to prevent loop continue
|
||
function resolveRenderToObj(callback) {
|
||
Ext.ComponentManager.each(function (key, cmp) {
|
||
if (cmp.isXType && cmp.renderTo) {
|
||
|
||
var result = callback.apply(cmp, [cmp]);
|
||
if (result === false) {
|
||
return false; // break
|
||
}
|
||
|
||
}
|
||
});
|
||
}
|
||
|
||
|
||
// 能否访问 iframe 中的 window.F 对象
|
||
function canIFrameWindowAccessed(iframeWnd) {
|
||
|
||
// 访问 iframeWnd.F 时,可能出现错误 Blocked a frame with origin "http://fineui.com/" from accessing a cross-origin frame.
|
||
// Blocked:这个问题出现在 http://fineui.com/ 页面加载一个 http://baidu.com/ 的 iframe 页面
|
||
try {
|
||
iframeWnd.F;
|
||
} catch (e) {
|
||
return false;
|
||
}
|
||
|
||
if (!iframeWnd.F) {
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
|
||
// FineUI常用函数域(Utility)
|
||
F.util = {
|
||
|
||
alertTitle: "Alert Dialog",
|
||
confirmTitle: "Confirm Dialog",
|
||
formAlertMsg: "Please provide valid value for {0}!",
|
||
formAlertTitle: "Form Invalid",
|
||
loading: "Loading...",
|
||
|
||
// 下拉列表的模板
|
||
ddlTPL: '<tpl for="."><div class="x-boundlist-item<tpl if="!enabled"> x-boundlist-item-disabled</tpl>">{prefix}{text}</div></tpl>',
|
||
|
||
// 初始化
|
||
init: function (options) { // msgTarget, labelWidth, labelSeparator, blankImageUrl, enableAjaxLoading, ajaxLoadingType, enableAjax, themeName, formChangeConfirm) {
|
||
|
||
Ext.apply(F, options, {
|
||
language: 'zh_CN',
|
||
msgTarget: 'side',
|
||
labelWidth: 100,
|
||
labelSeparator: ':',
|
||
//blankImageUrl: '',
|
||
enableAjaxLoading: true,
|
||
ajaxLoadingType: 'default',
|
||
enableAjax: true,
|
||
theme: 'neptune',
|
||
formChangeConfirm: false,
|
||
ajaxTimeout: 120
|
||
});
|
||
|
||
|
||
// Ext.QuickTips.init(true); 在原生的IE7(非IE8下的IE7模式)会有问题
|
||
// 表现为iframe中的页面出现滚动条时,页面上的所有按钮都不能点击了。
|
||
// 测试例子在:aspnet/test.aspx
|
||
//Ext.QuickTips.init(false);
|
||
Ext.tip.QuickTipManager.init();
|
||
|
||
F.ajax.hookPostBack();
|
||
|
||
F.global_enable_ajax = F.enableAjax;
|
||
|
||
F.global_enable_ajax_loading = F.enableAjaxLoading;
|
||
F.global_ajax_loading_type = F.ajaxLoadingType;
|
||
|
||
// 添加Ajax Loading提示节点
|
||
F.ajaxLoadingDefault = Ext.get(F.util.appendLoadingNode());
|
||
F.ajaxLoadingMask = Ext.create('Ext.LoadMask', Ext.getBody(), { msg: F.util.loading });
|
||
|
||
|
||
F.form_upload_file = false;
|
||
F.global_disable_ajax = false;
|
||
//F.x_window_manager = new Ext.WindowManager();
|
||
//F.x_window_manager.zseed = 6000;
|
||
|
||
F.util.setHiddenFieldValue('F_CHANGED', 'false');
|
||
document.forms[0].autocomplete = 'off';
|
||
|
||
Ext.getBody().addCls('f-body');
|
||
|
||
Ext.Ajax.timeout = F.ajaxTimeout * 1000;
|
||
|
||
// 向document.body添加主题类
|
||
if (F.theme) {
|
||
Ext.getBody().addCls('f-theme-' + F.theme);
|
||
}
|
||
|
||
if (Ext.form.field) {
|
||
var fieldPro = Ext.form.field.Base.prototype;
|
||
fieldPro.msgTarget = F.msgTarget;
|
||
fieldPro.labelWidth = F.labelWidth;
|
||
fieldPro.labelSeparator = F.labelSeparator;
|
||
fieldPro.autoFitErrors = true;
|
||
}
|
||
if (Ext.form.CheckboxGroup) {
|
||
var checkboxgroupPro = Ext.form.CheckboxGroup.prototype;
|
||
checkboxgroupPro.msgTarget = F.msgTarget;
|
||
checkboxgroupPro.labelWidth = F.labelWidth;
|
||
checkboxgroupPro.labelSeparator = F.labelSeparator;
|
||
checkboxgroupPro.autoFitErrors = true;
|
||
}
|
||
|
||
F.beforeunloadCheck = true;
|
||
// 启用表单改变确认对话框
|
||
if (F.formChangeConfirm) {
|
||
// 下面这个方法在 Chrome、 Firefox下无效
|
||
//Ext.EventManager.on(window, 'beforeunload', function (event) {
|
||
window.onbeforeunload = function () {
|
||
// 允许关闭页面前提示,并且表单改变
|
||
if (F.beforeunloadCheck && F.util.formChanged()) {
|
||
return F.wnd.formChangeConfirmMsg;
|
||
}
|
||
};
|
||
}
|
||
|
||
//if (enableBigFont) {
|
||
// Ext.getBody().addCls('bigfont');
|
||
//}
|
||
|
||
/*
|
||
// IE6&7不支持,IE8以上支持"data:image/gif;base64,R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="
|
||
if (Ext.isIE6 || Ext.isIE7) {
|
||
Ext.BLANK_IMAGE_URL = F.blankImageUrl;
|
||
}
|
||
*/
|
||
|
||
// Submit
|
||
F.ready(function () {
|
||
if (F.submitbutton) {
|
||
Ext.ComponentManager.each(function (key, cmp) {
|
||
if (cmp.isXType && cmp.renderTo) {
|
||
if (cmp.isXType('tooltip')) {
|
||
return true; // continue
|
||
}
|
||
|
||
if (cmp.isXType('panel') || cmp.isXType('formviewport')) {
|
||
F.util.registerPanelEnterKey(cmp);
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
});
|
||
|
||
|
||
|
||
// 为了防止【页面中只有一个input[type=text],则回车会提交表单】的问题,现在页面上创建一个input[type=text]的空元素
|
||
F.util.appendFormNode('<input type="text" class="f-input-text-hidden">');
|
||
|
||
},
|
||
|
||
_readyList: [],
|
||
_ajaxReadyList: [],
|
||
_beforeAjaxList: [],
|
||
_loadList: [],
|
||
|
||
ready: function (callback) {
|
||
F.util._readyList.push(callback);
|
||
},
|
||
triggerReady: function () {
|
||
Ext.Array.each(F.util._readyList, function (item, index) {
|
||
item.call(window);
|
||
});
|
||
},
|
||
|
||
|
||
ajaxReady: function (callback) {
|
||
F.util._ajaxReadyList.push(callback);
|
||
},
|
||
triggerAjaxReady: function () {
|
||
Ext.Array.each(F.util._ajaxReadyList, function (item, index) {
|
||
item.call(window);
|
||
});
|
||
},
|
||
|
||
beforeAjax: function (callback) {
|
||
F.util._beforeAjaxList.push(callback);
|
||
},
|
||
triggerBeforeAjax: function () {
|
||
Ext.Array.each(F.util._beforeAjaxList, function (item, index) {
|
||
item.call(window);
|
||
});
|
||
},
|
||
|
||
|
||
load: function (callback) {
|
||
F.util._loadList.push(callback);
|
||
},
|
||
triggerLoad: function () {
|
||
Ext.Array.each(F.util._loadList, function (item, index) {
|
||
item.call(window);
|
||
});
|
||
},
|
||
|
||
setFState: function (cmp, state) {
|
||
if (!cmp || !cmp['f_state']) {
|
||
return;
|
||
}
|
||
|
||
var oldValue, newValue, el;
|
||
// 如果state中包含CssClass,也就是在服务器端修改了CssClass属性,则需要首先删除原来的CssClass属性。
|
||
if (typeof (state['CssClass']) !== 'undefined') {
|
||
newValue = state['CssClass'];
|
||
oldValue = cmp['f_state']['CssClass'];
|
||
if (!oldValue) {
|
||
oldValue = cmp.initialConfig.cls;
|
||
}
|
||
el = cmp.el;
|
||
el.removeCls(oldValue);
|
||
el.addCls(newValue);
|
||
}
|
||
|
||
//if (typeof (state['FormItemClass']) !== 'undefined') {
|
||
// newValue = state['FormItemClass'];
|
||
// oldValue = cmp['f_state']['FormItemClass'];
|
||
// if (!oldValue) {
|
||
// oldValue = cmp.initialConfig.itemCls;
|
||
// }
|
||
// // Search for max 10 depth.
|
||
// el = cmp.el.findParent('.x-form-item', 10, true);
|
||
// el.removeCls(oldValue);
|
||
// el.addCls(newValue);
|
||
//}
|
||
|
||
Ext.apply(cmp['f_state'], state);
|
||
|
||
},
|
||
|
||
stopEventPropagation: function (event) {
|
||
event = event || window.event;
|
||
if (typeof (event.cancelBubble) === 'boolean') {
|
||
event.cancelBubble = true;
|
||
} else {
|
||
event.stopPropagation();
|
||
}
|
||
},
|
||
|
||
// 绑定函数的上下文
|
||
bind: function (fn, scope) {
|
||
return function () {
|
||
return fn.apply(scope, arguments);
|
||
};
|
||
},
|
||
|
||
// 在页面上查找id为findId的节点,替换成replaceHtml
|
||
replace: function (findId, replaceHtml) {
|
||
// 在findId外面添加一个DIV层,然后更新此wrapper的InnerHTML
|
||
var findedControl = Ext.get(findId);
|
||
if (findedControl) {
|
||
var wrapper = findedControl.wrap().update(replaceHtml);
|
||
// 将新增的节点移到wrapper上面
|
||
wrapper.first().insertBefore(wrapper);
|
||
// 然后删除wrapper
|
||
wrapper.remove();
|
||
}
|
||
},
|
||
|
||
// 隐藏PageLoading节点
|
||
hidePageLoading: function () {
|
||
/*
|
||
if (fadeOut) {
|
||
Ext.get("loading").remove();
|
||
Ext.get("loading-mask").fadeOut({ remove: true });
|
||
}
|
||
else {
|
||
Ext.get("loading").remove();
|
||
Ext.get("loading-mask").remove();
|
||
}
|
||
*/
|
||
|
||
Ext.get("loading").hide();
|
||
Ext.get("loading-mask").hide();
|
||
},
|
||
|
||
|
||
// 去掉字符串中的html标签
|
||
stripHtmlTags: function (str) {
|
||
return str.replace(/<[^>]*>/g, "");
|
||
},
|
||
|
||
|
||
// 弹出Alert对话框
|
||
alert: function (msg, title, icon, okscript) {
|
||
title = title || F.util.alertTitle;
|
||
icon = icon || Ext.MessageBox.INFO;
|
||
Ext.MessageBox.show({
|
||
title: title,
|
||
msg: msg,
|
||
buttons: Ext.MessageBox.OK,
|
||
icon: icon,
|
||
fn: function (buttonId) {
|
||
if (buttonId === "ok") {
|
||
if (typeof (okscript) === "function") {
|
||
okscript.call(window);
|
||
}
|
||
}
|
||
}
|
||
});
|
||
},
|
||
|
||
// 向页面添加Loading...节点
|
||
appendLoadingNode: function () {
|
||
return F.util.appendFormNode({ tag: 'div', id: 'f_ajax_loading', cls: 'f-ajax-loading', html: F.util.loading });
|
||
},
|
||
|
||
// 向页面的 form 节点最后添加新的节点
|
||
appendFormNode: function (htmlOrObj) {
|
||
return Ext.DomHelper.append(document.forms[0], htmlOrObj);
|
||
},
|
||
|
||
// 向页面添加一个隐藏字段,如果已经存在则更新值
|
||
setHiddenFieldValue: function (fieldId, fieldValue) {
|
||
var itemNode = Ext.get(fieldId);
|
||
if (!itemNode) {
|
||
// Ext.DomHelper.append 有问题,例如下面这个例子得到的结果是错的;变通一下,先插入节点,在设置节点的值。
|
||
// Ext.DomHelper.append(document.forms[0], { tag: "input", type: "hidden", value: '{"X_Items":[["Value1","可选项1",1],["Value2","可选项2(不可选择)",0],["Value3","可选项3(不可选择)",0],["Value4","可选项4",1],["Value5","可选项5",1],["Value6","可选项6",1],["Value7","可选择项7",1],["Value8","可选择项8",1],["Value9","可选择项9",1]],"SelectedValue":"Value1"}'});
|
||
// 上面的这个字符串,在IETest的IE8模式下会变成:
|
||
// {"DropDownList1":{"X_Items":[["Value1","\u9009\u9879 1",1],["Value2","\u9009\u9879 2\uff08\u4e0d\u53ef\u9009\u62e9\uff09",0],["Value3","\u9009\u9879 3\uff08\u4e0d\u53ef\u9009\u62e9\uff09",0],["Value4","\u9009\u9879 4",1],["Value5","\u9009\u9879 5",1],["Value6","\u9009\u9879 6",1],["Value7","\u9009\u9879 7",1],["Value8","\u9009\u9879 8",1],["Value9","\u9009\u9879 9",1]],"SelectedValue":"Value1"}}
|
||
|
||
F.util.appendFormNode({ tag: "input", type: "hidden", id: fieldId, name: fieldId });
|
||
Ext.get(fieldId).dom.value = fieldValue;
|
||
}
|
||
else {
|
||
itemNode.dom.value = fieldValue;
|
||
}
|
||
},
|
||
// 从表单中删除隐藏字段
|
||
removeHiddenField: function (fieldId) {
|
||
var itemNode = Ext.get(fieldId);
|
||
if (itemNode) {
|
||
itemNode.remove();
|
||
}
|
||
},
|
||
// 获取页面中一个隐藏字段的值
|
||
getHiddenFieldValue: function (fieldId) {
|
||
var itemNode = Ext.get(fieldId);
|
||
if (itemNode) {
|
||
return itemNode.getValue();
|
||
}
|
||
return null;
|
||
},
|
||
|
||
// 禁用提交按钮(在回发之前禁用以防止重复提交)
|
||
disableSubmitControl: function (controlClientID) {
|
||
F(controlClientID).disable();
|
||
F.util.setHiddenFieldValue('F_TARGET', controlClientID);
|
||
},
|
||
// 启用提交按钮(在回发之后启用提交按钮)
|
||
enableSubmitControl: function (controlClientID) {
|
||
F(controlClientID).enable();
|
||
F.util.setHiddenFieldValue('F_TARGET', '');
|
||
},
|
||
|
||
|
||
|
||
/*
|
||
// 更新ViewState的值
|
||
updateViewState: function (newValue, startIndex, gzipped) {
|
||
if (typeof (startIndex) === 'boolean') {
|
||
gzipped = startIndex;
|
||
startIndex = -1;
|
||
}
|
||
|
||
var viewStateHiddenFiledID = "__VIEWSTATE";
|
||
if (gzipped) {
|
||
viewStateHiddenFiledID = "__VIEWSTATE_GZ";
|
||
}
|
||
|
||
var oldValue = F.util.getHiddenFieldValue(viewStateHiddenFiledID);
|
||
if (Ext.type(startIndex) == "number" && startIndex > 0) {
|
||
if (startIndex < oldValue.length) {
|
||
oldValue = oldValue.substr(0, startIndex);
|
||
}
|
||
} else {
|
||
// Added on 2011-5-2, this is a horrible mistake.
|
||
oldValue = '';
|
||
}
|
||
F.util.setHiddenFieldValue(viewStateHiddenFiledID, oldValue + newValue);
|
||
},
|
||
|
||
// 更新EventValidation的值
|
||
updateEventValidation: function (newValue) {
|
||
F.util.setHiddenFieldValue("__EVENTVALIDATION", newValue);
|
||
},
|
||
*/
|
||
|
||
// 设置页面状态是否改变
|
||
setPageStateChanged: function (changed) {
|
||
var pageState = Ext.get("F_CHANGED");
|
||
if (pageState) {
|
||
pageState.dom.value = changed;
|
||
}
|
||
},
|
||
|
||
// 页面状态是否改变
|
||
isPageStateChanged: function () {
|
||
var pageState = Ext.get("F_CHANGED");
|
||
if (pageState && pageState.getValue() == "true") {
|
||
return true;
|
||
}
|
||
return false;
|
||
},
|
||
|
||
|
||
// 阻止页面关闭(页面中iframe内的表单已改变,或者页面中iframe定义了beforeunload)
|
||
preventPageClose: function (el) {
|
||
var me = this;
|
||
|
||
// 是否阻止关闭
|
||
var preventClose = false;
|
||
|
||
var iframeEls;
|
||
if (el) {
|
||
iframeEls = el.select('iframe');
|
||
} else {
|
||
iframeEls = Ext.select('iframe');
|
||
}
|
||
|
||
iframeEls.each(function (iframeEl) {
|
||
var iframeWnd = iframeEl.dom.contentWindow;
|
||
|
||
if (!canIFrameWindowAccessed(iframeWnd)) {
|
||
return true; // continue
|
||
}
|
||
|
||
if (iframeWnd && iframeWnd.F) {
|
||
var iframeF = iframeWnd.F;
|
||
|
||
// 启用表单改变确认对话框 并且 表单已改变
|
||
if (iframeF.formChangeConfirm && iframeF.util.formChanged()) {
|
||
// 阻止关闭当前面板
|
||
if (!window.confirm(F.wnd.formChangeConfirmMsg)) {
|
||
preventClose = true;
|
||
return false; // break
|
||
} else {
|
||
// 没有阻止,不要在触发 $(window).beforeunload 事件了
|
||
iframeF.beforeunloadCheck = false;
|
||
}
|
||
}
|
||
|
||
/*
|
||
// 是否自定义了 beforeunload 事件
|
||
var beforeunloadCallbacks = iframeF.util._fjs_getEvent('beforeunload');
|
||
if (beforeunloadCallbacks) {
|
||
for (var i = 0, count = beforeunloadCallbacks.length; i < count; i++) {
|
||
var beforeunloadCallback = beforeunloadCallbacks[i];
|
||
|
||
var confirmMsg = beforeunloadCallback.apply(iframeWnd);
|
||
if (confirmMsg) {
|
||
// 阻止关闭当前面板
|
||
if (!window.confirm(confirmMsg)) {
|
||
preventClose = true;
|
||
return false; // break
|
||
} else {
|
||
// 没有阻止,不要在触发 $(window).beforeunload 事件了
|
||
iframeF.beforeunloadCheck = false;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
*/
|
||
|
||
// 子页面是否阻止关闭
|
||
var childrenPreventClose = iframeF.util.preventPageClose();
|
||
if (childrenPreventClose) {
|
||
|
||
// 被子页面阻止了,则恢复父页面的 beforeunloadCheck 标识
|
||
iframeF.beforeunloadCheck = true;
|
||
|
||
preventClose = true;
|
||
return false; // break
|
||
}
|
||
}
|
||
|
||
});
|
||
|
||
return preventClose;
|
||
},
|
||
|
||
// 页面中表单字段是否改变
|
||
formChanged: function () {
|
||
var changed = false;
|
||
resolveRenderToObj(function (obj) {
|
||
if (obj.isXType('container') && obj.f_isDirty()) {
|
||
changed = true;
|
||
return false; // break
|
||
}
|
||
});
|
||
|
||
return changed;
|
||
},
|
||
|
||
|
||
// 验证多个表单,返回数组[是否验证通过,第一个不通过的表单字段]
|
||
validForms: function (forms, targetName, showBox) {
|
||
var target = F.util.getTargetWindow(targetName);
|
||
var valid = true;
|
||
var firstInvalidField = null;
|
||
for (var i = 0; i < forms.length; i++) {
|
||
var result = F(forms[i]).f_isValid();
|
||
if (!result[0]) {
|
||
valid = false;
|
||
if (firstInvalidField == null) {
|
||
firstInvalidField = result[1];
|
||
}
|
||
}
|
||
}
|
||
|
||
if (!valid) {
|
||
if (showBox) {
|
||
var alertMsg = Ext.String.format(F.util.formAlertMsg, firstInvalidField.fieldLabel);
|
||
target.F.util.alert(alertMsg, F.util.formAlertTitle, Ext.MessageBox.INFO);
|
||
}
|
||
return false;
|
||
}
|
||
return true;
|
||
},
|
||
|
||
|
||
// 判断隐藏字段值(数组)是否包含value
|
||
isHiddenFieldContains: function (domId, testValue) {
|
||
testValue += "";
|
||
var domValue = Ext.get(domId).dom.value;
|
||
if (domValue === "") {
|
||
//console.log(domId);
|
||
return false;
|
||
}
|
||
else {
|
||
var sourceArray = domValue.split(",");
|
||
return Ext.Array.indexOf(sourceArray, testValue) >= 0 ? true : false;
|
||
}
|
||
},
|
||
|
||
|
||
// 将一个字符添加到字符列表中,将2添加到[5,3,4]
|
||
addValueToHiddenField: function (domId, addValue) {
|
||
addValue += "";
|
||
var domValue = Ext.get(domId).dom.value;
|
||
if (domValue == "") {
|
||
Ext.get(domId).dom.value = addValue + "";
|
||
}
|
||
else {
|
||
var sourceArray = domValue.split(",");
|
||
if (Ext.Array.indexOf(sourceArray, addValue) < 0) {
|
||
sourceArray.push(addValue);
|
||
Ext.get(domId).dom.value = sourceArray.join(",");
|
||
}
|
||
}
|
||
},
|
||
|
||
|
||
// 从字符列表中移除一个字符,将2从dom的值"5,3,4,2"移除
|
||
removeValueFromHiddenField: function (domId, addValue) {
|
||
addValue += "";
|
||
var domValue = Ext.get(domId).dom.value;
|
||
if (domValue != "") {
|
||
var sourceArray = domValue.split(",");
|
||
if (Ext.Array.indexOf(sourceArray, addValue) >= 0) {
|
||
sourceArray = sourceArray.remove(addValue);
|
||
Ext.get(domId).dom.value = sourceArray.join(",");
|
||
}
|
||
}
|
||
},
|
||
|
||
|
||
// 取得隐藏字段的值
|
||
getHiddenFieldValue: function (fieldId) {
|
||
var itemNode = Ext.get(fieldId);
|
||
if (!itemNode) {
|
||
return "";
|
||
}
|
||
else {
|
||
return itemNode.dom.value;
|
||
}
|
||
},
|
||
|
||
|
||
// 取得表单字段的值
|
||
getFormFieldValue: function (cmp) {
|
||
if (typeof (cmp) === 'string') {
|
||
cmp = F(cmp);
|
||
}
|
||
var value = cmp.getValue();
|
||
if (cmp.isXType('displayfield')) {
|
||
value = value.replace(/<\/?span[^>]*>/ig, '');
|
||
}
|
||
return value;
|
||
},
|
||
|
||
|
||
// 由target获取window对象
|
||
getTargetWindow: function (target) {
|
||
var wnd = window;
|
||
if (target === '_self') {
|
||
wnd = window;
|
||
} else if (target === '_parent') {
|
||
wnd = parent;
|
||
} else if (target === '_top') {
|
||
wnd = top;
|
||
}
|
||
return wnd;
|
||
},
|
||
|
||
|
||
// 预加载图片
|
||
preloadImages: function (images) {
|
||
var imageInstance = [];
|
||
for (var i = 0; i < images.length; i++) {
|
||
imageInstance[i] = new Image();
|
||
imageInstance[i].src = images[i];
|
||
}
|
||
},
|
||
|
||
hasCSS: function (id) {
|
||
return !!Ext.get(id);
|
||
},
|
||
|
||
addCSS: function (id, content, isCSSFile) {
|
||
|
||
// 如果此节点已经存在,则先删除此节点
|
||
var node = Ext.get(id);
|
||
if (node) {
|
||
Ext.removeNode(node.dom);
|
||
}
|
||
|
||
var ss1;
|
||
|
||
if (isCSSFile) {
|
||
ss1 = document.createElement('link');
|
||
ss1.setAttribute('type', 'text/css');
|
||
ss1.setAttribute('rel', 'stylesheet');
|
||
ss1.setAttribute('id', id);
|
||
ss1.setAttribute('href', content);
|
||
} else {
|
||
// Tricks From: http://www.phpied.com/dynamic-script-and-style-elements-in-ie/
|
||
ss1 = document.createElement("style");
|
||
ss1.setAttribute("type", "text/css");
|
||
ss1.setAttribute("id", id);
|
||
if (ss1.styleSheet) { // IE
|
||
ss1.styleSheet.cssText = content;
|
||
} else { // the world
|
||
var tt1 = document.createTextNode(content);
|
||
ss1.appendChild(tt1);
|
||
}
|
||
}
|
||
|
||
var hh1 = document.getElementsByTagName("head")[0];
|
||
hh1.appendChild(ss1);
|
||
},
|
||
|
||
/*
|
||
// 在启用AJAX的情况下,使所有的Asp.net的提交按钮(type="submit")不要响应默认的submit行为,而是自定义的AJAX
|
||
makeAspnetSubmitButtonAjax: function (buttonId) {
|
||
|
||
// 低版本IE浏览器不允许使用JS修改input标签的type属性,导致此函数无效
|
||
function resetButton(button) {
|
||
button.set({ "type": "button" });
|
||
button.addListener("click", function (event, el) {
|
||
__doPostBack(el.getAttribute("name"), "");
|
||
event.stopEvent();
|
||
});
|
||
}
|
||
|
||
if (typeof (buttonId) === "undefined") {
|
||
Ext.Array.each(Ext.DomQuery.select("input[type=submit]"), function (item, index) {
|
||
resetButton(Ext.get(item));
|
||
});
|
||
} else {
|
||
var button = Ext.get(buttonId);
|
||
if (button.getAttribute("type") === "submit") {
|
||
resetButton(button);
|
||
}
|
||
}
|
||
|
||
},
|
||
|
||
*/
|
||
|
||
htmlEncode: function (str) {
|
||
var div = document.createElement("div");
|
||
div.appendChild(document.createTextNode(str));
|
||
return div.innerHTML;
|
||
},
|
||
|
||
htmlDecode: function (str) {
|
||
var div = document.createElement("div");
|
||
div.innerHTML = str;
|
||
return div.innerHTML;
|
||
},
|
||
|
||
|
||
// Whether a object is empty (With no property) or not.
|
||
// 可以使用 Ext.Object.isEmpty
|
||
isObjectEmpty: function (obj) {
|
||
for (var prop in obj) {
|
||
if (obj.hasOwnProperty(prop)) {
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
},
|
||
|
||
// Convert an array to object.
|
||
// ['Text', 'Icon'] -> {'Text':true, 'Icon': true}
|
||
arrayToObject: function (arr) {
|
||
var obj = {};
|
||
Ext.Array.each(arr, function (item, index) {
|
||
obj[item] = true;
|
||
});
|
||
return obj;
|
||
},
|
||
|
||
hideScrollbar: function () {
|
||
if (Ext.isIE) {
|
||
window.document.body.scroll = 'no';
|
||
} else {
|
||
window.document.body.style.overflow = 'hidden';
|
||
}
|
||
},
|
||
|
||
|
||
// 动态添加一个标签页
|
||
// mainTabStrip: 选项卡实例
|
||
// id: 选项卡ID
|
||
// url: 选项卡IFrame地址
|
||
// text: 选项卡标题
|
||
// icon: 选项卡图标
|
||
// addTabCallback: 创建选项卡前的回调函数(接受tabConfig参数)
|
||
// refreshWhenExist: 添加选项卡时,如果选项卡已经存在,是否刷新内部IFrame
|
||
addMainTab: function (mainTabStrip, id, url, text, icon, createToolbar, refreshWhenExist) {
|
||
var iconId, iconCss, tabId, currentTab, tabConfig;
|
||
|
||
// 兼容 addMainTab(mainTabStrip, treeNode, addTabCallback, refreshWhenExist) 调用方式
|
||
if (typeof (id) !== 'string') {
|
||
refreshWhenExist = text;
|
||
createToolbar = url;
|
||
url = id.data.href;
|
||
icon = id.data.icon;
|
||
text = id.data.text;
|
||
|
||
id = id.getId();
|
||
}
|
||
|
||
//var href = node.attributes.href;
|
||
if (icon) {
|
||
iconId = icon.replace(/\W/ig, '_');
|
||
if (!F.util.hasCSS(iconId)) {
|
||
iconCss = [];
|
||
iconCss.push('.');
|
||
iconCss.push(iconId);
|
||
iconCss.push('{background-image:url("');
|
||
iconCss.push(icon);
|
||
iconCss.push('")}');
|
||
F.util.addCSS(iconId, iconCss.join(''));
|
||
}
|
||
}
|
||
// 动态添加一个带工具栏的标签页
|
||
//tabId = 'dynamic_added_tab' + id.replace('__', '-');
|
||
currentTab = mainTabStrip.getTab(id);
|
||
if (!currentTab) {
|
||
tabConfig = {
|
||
'id': id,
|
||
'url': url,
|
||
'title': text,
|
||
'closable': true,
|
||
'bodyStyle': 'padding:0px;'
|
||
};
|
||
if (icon) {
|
||
tabConfig['iconCls'] = iconId;
|
||
}
|
||
|
||
if (createToolbar) {
|
||
var addTabCallbackResult = createToolbar.apply(window, [tabConfig]);
|
||
// 兼容之前的方法,函数返回值如果不为空,则将返回值作为顶部工具条实例
|
||
if (addTabCallbackResult) {
|
||
tabConfig['tbar'] = addTabCallbackResult;
|
||
}
|
||
}
|
||
mainTabStrip.addTab(tabConfig);
|
||
} else {
|
||
mainTabStrip.setActiveTab(currentTab);
|
||
currentTab.setTitle(text);
|
||
if (icon) {
|
||
currentTab.setIconCls(iconId);
|
||
}
|
||
if (refreshWhenExist) {
|
||
var iframeNode = currentTab.body.query('iframe')[0];
|
||
if (iframeNode) {
|
||
if (url) {
|
||
iframeNode.contentWindow.location.href = url;
|
||
} else {
|
||
iframeNode.contentWindow.location.reload();
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
},
|
||
|
||
// 初始化左侧树(或者手风琴+树)与右侧选项卡控件的交互
|
||
// treeMenu: 主框架中的树控件实例,或者内嵌树控件的手风琴控件实例
|
||
// mainTabStrip: 选项卡实例
|
||
// createToolbar: 创建选项卡前的回调函数(接受tabConfig参数)
|
||
// updateLocationHash: 切换Tab时,是否更新地址栏Hash值
|
||
// refreshWhenExist: 添加选项卡时,如果选项卡已经存在,是否刷新内部IFrame
|
||
// refreshWhenTabChange: 切换选项卡时,是否刷新内部IFrame
|
||
// hashWindow:需要更新Hash值的窗口对象,默认为当前window
|
||
initTreeTabStrip: function (treeMenu, mainTabStrip, createToolbar, updateLocationHash, refreshWhenExist, refreshWhenTabChange, hashWindow) {
|
||
if (!hashWindow) {
|
||
hashWindow = window;
|
||
}
|
||
|
||
// 注册树的节点点击事件
|
||
function registerTreeClickEvent(treeInstance) {
|
||
treeInstance.on('itemclick', function (view, record, item, index, event) {
|
||
var href = record.data.href;
|
||
|
||
// record.isLeaf()
|
||
// 不管当前节点是否子节点,只要有 href 属性,都需要打开一个新Tab
|
||
if (href) {
|
||
// 阻止事件传播
|
||
event.stopEvent();
|
||
|
||
if (updateLocationHash) {
|
||
// 修改地址栏
|
||
hashWindow.location.hash = '#' + href;
|
||
}
|
||
|
||
// 新增Tab节点
|
||
F.util.addMainTab(mainTabStrip, record, createToolbar, refreshWhenExist);
|
||
}
|
||
});
|
||
}
|
||
|
||
// treeMenu可能是Accordion或者Tree
|
||
if (treeMenu.getXType() === 'panel') {
|
||
treeMenu.items.each(function (item) {
|
||
var tree = item.items.getAt(0);
|
||
if (tree && tree.getXType() === 'treepanel') {
|
||
registerTreeClickEvent(tree);
|
||
}
|
||
});
|
||
} else if (treeMenu.getXType() === 'treepanel') {
|
||
registerTreeClickEvent(treeMenu);
|
||
}
|
||
|
||
// 切换主窗口的Tab
|
||
mainTabStrip.on('tabchange', function (tabStrip, tab) {
|
||
var tabHash = '#' + (tab.url || '');
|
||
|
||
// 只有当浏览器地址栏的Hash值和将要改变的不一样时,才进行如下两步处理:
|
||
// 1. 更新地址栏Hash值
|
||
// 2. 刷新Tab内的IFrame
|
||
if (tabHash !== hashWindow.location.hash) {
|
||
|
||
if (updateLocationHash) {
|
||
hashWindow.location.hash = tabHash;
|
||
}
|
||
|
||
if (refreshWhenTabChange) {
|
||
var iframeNode = tab.body.query('iframe')[0];
|
||
if (iframeNode) {
|
||
var currentLocationHref = iframeNode.contentWindow.location.href;
|
||
if (/^http(s?):\/\//.test(currentLocationHref)) {
|
||
iframeNode.contentWindow.location.reload();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
});
|
||
|
||
|
||
// 页面第一次加载时,根据URL地址在主窗口加载页面
|
||
var HASH = hashWindow.location.hash.substr(1);
|
||
if (HASH) {
|
||
var FOUND = false;
|
||
|
||
function initTreeMenu(treeInstance, node) {
|
||
var i, currentNode, nodes, node, path;
|
||
if (!FOUND && node.hasChildNodes()) {
|
||
nodes = node.childNodes;
|
||
for (i = 0; i < nodes.length; i++) {
|
||
currentNode = nodes[i];
|
||
if (currentNode.isLeaf()) {
|
||
if (currentNode.data.href === HASH) {
|
||
path = currentNode.getPath();
|
||
treeInstance.expandPath(path); //node.expand();
|
||
treeInstance.selectPath(path); // currentNode.select();
|
||
F.util.addMainTab(mainTabStrip, currentNode, createToolbar);
|
||
FOUND = true;
|
||
return;
|
||
}
|
||
} else {
|
||
arguments.callee(treeInstance, currentNode);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (treeMenu.getXType() === 'panel') {
|
||
treeMenu.items.each(function (item) {
|
||
var tree = item.items.getAt(0);
|
||
if (tree && tree.getXType() === 'treepanel') {
|
||
initTreeMenu(tree, tree.getRootNode());
|
||
|
||
// 找到树节点
|
||
if (FOUND) {
|
||
item.expand();
|
||
return false;
|
||
}
|
||
}
|
||
});
|
||
} else if (treeMenu.getXType() === 'treepanel') {
|
||
initTreeMenu(treeMenu, treeMenu.getRootNode());
|
||
}
|
||
}
|
||
|
||
},
|
||
|
||
// 复选框分组处理
|
||
resolveCheckBoxGroup: function (name, xstateContainer, isradiogroup) {
|
||
var items = [], i, count, xitem, xitemvalue, xitems, xselectedarray, xselected, xchecked, xitemname;
|
||
|
||
xitems = xstateContainer.F_Items;
|
||
xselectedarray = xstateContainer.SelectedValueArray;
|
||
xselected = xstateContainer.SelectedValue;
|
||
|
||
if (xitems && xitems.length > 0) {
|
||
for (i = 0, count = xitems.length; i < count; i++) {
|
||
xitem = xitems[i];
|
||
xitemvalue = xitem[1];
|
||
xchecked = false;
|
||
if (!isradiogroup) {
|
||
// xselectedarray 可能是undefined, [], ["value1", "value2"]
|
||
if (xselectedarray) {
|
||
xchecked = (Ext.Array.indexOf(xselectedarray, xitemvalue) >= 0) ? true : false;
|
||
}
|
||
xitemname = name + '_' + i;
|
||
} else {
|
||
xchecked = (xselected === xitemvalue) ? true : false;
|
||
xitemname = name;
|
||
}
|
||
items.push({
|
||
'inputValue': xitemvalue,
|
||
'boxLabel': xitem[0],
|
||
'name': xitemname,
|
||
'checked': xchecked
|
||
});
|
||
}
|
||
}
|
||
/*
|
||
else {
|
||
items.push({
|
||
'inputValue': "tobedeleted",
|
||
'boxLabel': " ",
|
||
'name': "tobedeleted"
|
||
});
|
||
}
|
||
*/
|
||
return items;
|
||
|
||
},
|
||
|
||
// 防止在短时间内,同一GroupName的单选框触发两次事件
|
||
// 用于 MenuCheckBox 和 RadioButton
|
||
checkGroupLastTime: function (groupName) {
|
||
var checkName = groupName + '_lastupdatetime';
|
||
var checkValue = F.util[checkName];
|
||
F.util[checkName] = new Date();
|
||
if (typeof (checkValue) === 'undefined') {
|
||
return true;
|
||
} else {
|
||
if ((new Date() - checkValue) < 100) {
|
||
return false;
|
||
} else {
|
||
return true;
|
||
}
|
||
}
|
||
},
|
||
|
||
// 对话框图标
|
||
getMessageBoxIcon: function (iconShortName) {
|
||
var icon = Ext.MessageBox.WARNING;
|
||
if (iconShortName === 'info') {
|
||
icon = Ext.MessageBox.INFO;
|
||
} else if (iconShortName === 'warning') {
|
||
icon = Ext.MessageBox.WARNING;
|
||
} else if (iconShortName === 'question') {
|
||
icon = Ext.MessageBox.QUESTION;
|
||
} else if (iconShortName === 'error') {
|
||
icon = Ext.MessageBox.ERROR;
|
||
}
|
||
return icon;
|
||
},
|
||
|
||
// 确认对话框
|
||
confirm: function (targetName, title, msg, okScript, cancelScript, iconShortName) {
|
||
var wnd = F.util.getTargetWindow(targetName);
|
||
var icon = F.util.getMessageBoxIcon(iconShortName);
|
||
wnd.Ext.MessageBox.show({
|
||
title: title || F.util.confirmTitle,
|
||
msg: msg,
|
||
buttons: Ext.MessageBox.OKCANCEL,
|
||
icon: icon,
|
||
fn: function (btn) {
|
||
if (btn == 'cancel') {
|
||
if (cancelScript) {
|
||
if (typeof (cancelScript) === 'string') {
|
||
new Function(cancelScript)();
|
||
} else {
|
||
cancelScript.apply(wnd);
|
||
}
|
||
} else {
|
||
return false;
|
||
}
|
||
} else {
|
||
if (okScript) {
|
||
if (typeof (okScript) === 'string') {
|
||
new Function(okScript)();
|
||
} else {
|
||
okScript.apply(wnd);
|
||
}
|
||
} else {
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
});
|
||
},
|
||
|
||
|
||
|
||
summaryType: function (gridId) {
|
||
return function (records, dataIndex) {
|
||
var summary = F(gridId).f_state['SummaryData'];
|
||
if (summary) {
|
||
var value = summary[dataIndex];
|
||
if (typeof (value) !== 'undefined') {
|
||
return value;
|
||
}
|
||
}
|
||
return '';
|
||
};
|
||
},
|
||
|
||
// 表单字段内按回车键触发提交按钮
|
||
registerPanelEnterKey: function (panel) {
|
||
if (F.submitbutton) {
|
||
Ext.create('Ext.util.KeyNav', panel.el, {
|
||
enter: function (e) {
|
||
var el = Ext.Element.getActiveElement();
|
||
if (el.type !== 'textarea') {
|
||
F(F.submitbutton).el.dom.click();
|
||
}
|
||
},
|
||
scope: panel
|
||
});
|
||
}
|
||
},
|
||
|
||
reset: function () {
|
||
Ext.ComponentManager.each(function (key, cmp) {
|
||
if (cmp.isXType && cmp.isXType('panel') && cmp.renderTo) {
|
||
cmp.f_reset();
|
||
}
|
||
});
|
||
},
|
||
|
||
|
||
isDate: function (value) {
|
||
return Object.prototype.toString.call(value) === '[object Date]';
|
||
},
|
||
|
||
resolveGridDateToString: function (fields, fieldName, fieldValue) {
|
||
var i, fieldConfig, result = fieldValue;
|
||
for (i = 0, count = fields.length; i < count; i++) {
|
||
fieldConfig = fields[i];
|
||
if (fieldConfig.name === fieldName && fieldConfig.type === 'date' && fieldConfig.dateFormat) {
|
||
result = Ext.util.Format.date(fieldValue, fieldConfig.dateFormat);
|
||
}
|
||
}
|
||
return result;
|
||
},
|
||
|
||
|
||
noop: function () { }
|
||
|
||
};
|
||
|
||
|
||
|
||
|
||
})(); |