2013-11-01 14:13:51 +08:00

850 lines
30 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// FineUI应用程序域
var X = function (cmpName) {
return Ext.getCmp(cmpName);
};
X.state = function (cmp, state) {
X.util.setXState(cmp, state);
};
X.enable = function (id) {
X.util.enableSubmitControl(id);
};
X.disable = function (id) {
X.util.disableSubmitControl(id);
};
X.target = function (target) {
return X.util.getTargetWindow(target);
};
X.alert = function () {
X.util.alert.apply(window, arguments);
};
X.init = function () {
if (typeof (onInit) == 'function') {
onInit();
}
};
X.ready = function () {
if (typeof (onReady) == 'function') {
onReady();
}
};
X.ajaxReady = function () {
if (typeof (onAjaxReady) == 'function') {
onAjaxReady();
}
};
X.stop = function () {
var event = arguments.callee.caller.arguments[0] || window.event;
X.util.stopEventPropagation(event);
};
X.confirm = function () {
X.util.confirm.apply(null, arguments);
};
X.toggle = function (el, className) {
Ext.get(el).toggleCls(className);
};
X.fieldValue = function (cmp) {
return X.util.getFormFieldValue(cmp);
};
(function () {
// FineUI常用函数域Utility
X.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 (msgTarget, labelWidth, labelSeparator,
blankImageUrl, enableAjaxLoading, ajaxLoadingType, enableAjax, themeName) {
// Ext.QuickTips.init(true); 在原生的IE7非IE8下的IE7模式会有问题
// 表现为iframe中的页面出现滚动条时页面上的所有按钮都不能点击了。
// 测试例子在aspnet/test.aspx
//Ext.QuickTips.init(false);
Ext.tip.QuickTipManager.init();
X.ajax.hookPostBack();
X.global_enable_ajax = enableAjax;
X.global_enable_ajax_loading = enableAjaxLoading;
X.global_ajax_loading_type = ajaxLoadingType;
// 添加Ajax Loading提示节点
X.ajaxLoadingDefault = Ext.get(X.util.appendLoadingNode());
X.ajaxLoadingMask = Ext.create('Ext.LoadMask', Ext.getBody(), { msg: X.util.loading });
X.form_upload_file = false;
X.global_disable_ajax = false;
//X.x_window_manager = new Ext.WindowManager();
//X.x_window_manager.zseed = 6000;
X.util.setHiddenFieldValue('X_CHANGED', 'false');
document.forms[0].autocomplete = 'off';
// 向document.body添加主题类
if (themeName) {
Ext.getBody().addCls('theme-' + themeName);
}
if (Ext.form.field) {
var fieldPro = Ext.form.field.Base.prototype;
fieldPro.msgTarget = msgTarget;
fieldPro.labelWidth = labelWidth;
fieldPro.labelSeparator = labelSeparator;
fieldPro.autoFitErrors = true;
}
//if (enableBigFont) {
// Ext.getBody().addCls('bigfont');
//}
// Default empty image
if (Ext.isIE6 || Ext.isIE7) {
Ext.BLANK_IMAGE_URL = blankImageUrl;
}
},
setXState: function (cmp, state) {
if (!cmp || !cmp['x_state']) {
return;
}
var oldValue, newValue, el;
// 如果state中包含CssClass也就是在服务器端修改了CssClass属性则需要首先删除原来的CssClass属性。
if (typeof (state['CssClass']) !== 'undefined') {
newValue = state['CssClass'];
oldValue = cmp['x_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['x_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['x_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节点
removePageLoading: function (fadeOut) {
if (fadeOut) {
Ext.get("loading").remove();
Ext.get("loading-mask").fadeOut({ remove: true });
}
else {
Ext.get("loading").remove();
Ext.get("loading-mask").remove();
}
},
// 去掉字符串中的html标签
stripHtmlTags: function (str) {
return str.replace(/<[^>]*>/g, "");
},
// 弹出Alert对话框
alert: function (msg, title, icon, okscript) {
title = title || X.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 X.util.appendFormNode({ tag: "div", cls: "x-ajax-loading", html: X.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"}}
X.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) {
X(controlClientID).disable();
X.util.setHiddenFieldValue('X_TARGET', controlClientID);
},
// 启用提交按钮(在回发之后启用提交按钮)
enableSubmitControl: function (controlClientID) {
X(controlClientID).enable();
X.util.setHiddenFieldValue('X_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 = X.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 = '';
}
X.util.setHiddenFieldValue(viewStateHiddenFiledID, oldValue + newValue);
},
// 更新EventValidation的值
updateEventValidation: function (newValue) {
X.util.setHiddenFieldValue("__EVENTVALIDATION", newValue);
},
// 设置页面状态是否改变
setPageStateChanged: function () {
var pageState = Ext.get("X_CHANGED");
if (pageState && pageState.getValue() == "false") {
pageState.dom.value = "true";
}
},
// 页面状态是否改变
isPageStateChanged: function () {
var pageState = Ext.get("X_CHANGED");
if (pageState && pageState.getValue() == "true") {
return true;
}
return false;
},
// 验证多个表单,返回数组[是否验证通过,第一个不通过的表单字段]
validForms: function (forms, targetName, showBox) {
var target = X.util.getTargetWindow(targetName);
var valid = true;
var firstInvalidField = null;
for (var i = 0; i < forms.length; i++) {
var result = X(forms[i]).x_isValid();
if (!result[0]) {
valid = false;
if (firstInvalidField == null) {
firstInvalidField = result[1];
}
}
}
if (!valid) {
if (showBox) {
var alertMsg = Ext.String.format(X.util.formAlertMsg, firstInvalidField.fieldLabel);
target.X.util.alert(alertMsg, X.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 sourceArray.indexOf(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 (sourceArray.indexOf(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 (sourceArray.indexOf(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 = X(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) {
// 如果此节点已经存在,则先删除此节点
var node = Ext.get(id);
if (node) {
Ext.removeNode(node.dom);
}
// Tricks From: http://www.phpied.com/dynamic-script-and-style-elements-in-ie/
var 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, addTabCallback, refreshWhenExist) {
var iconId, iconCss, tabId, currentTab, tabConfig;
// 兼容 addMainTab(mainTabStrip, treeNode, addTabCallback, refreshWhenExist) 调用方式
if (typeof (id) !== 'string') {
refreshWhenExist = text;
addTabCallback = 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 (!X.util.hasCSS(iconId)) {
iconCss = [];
iconCss.push('.');
iconCss.push(iconId);
iconCss.push('{background-image:url("');
iconCss.push(icon);
iconCss.push('")}');
X.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 (addTabCallback) {
var addTabCallbackResult = addTabCallback.apply(window, [tabConfig]);
// 兼容之前的方法,函数返回值如果不为空,则将返回值作为顶部工具条实例
if (addTabCallbackResult) {
tabConfig['tbar'] = addTabCallbackResult;
}
}
mainTabStrip.addTab(tabConfig);
} else {
mainTabStrip.setActiveTab(currentTab);
if (refreshWhenExist) {
var iframeNode = currentTab.body.query('iframe')[0];
if (iframeNode) {
iframeNode.contentWindow.location.reload();
}
}
}
},
// 初始化左侧树(或者手风琴+树)与右侧选项卡控件的交互
// treeMenu 主框架中的树控件实例,或者内嵌树控件的手风琴控件实例
// mainTabStrip 选项卡实例
// addTabCallback 创建选项卡前的回调函数接受tabConfig参数
// updateLocationHash: 切换Tab时是否更新地址栏Hash值
// refreshWhenExist 添加选项卡时如果选项卡已经存在是否刷新内部IFrame
// refreshWhenTabChange: 切换选项卡时是否刷新内部IFrame
initTreeTabStrip: function (treeMenu, mainTabStrip, addTabCallback, updateLocationHash, refreshWhenExist, refreshWhenTabChange) {
// 注册树的节点点击事件
function registerTreeClickEvent(treeInstance) {
treeInstance.on('itemclick', function (view, record, item, index, event) {
if (record.isLeaf()) {
// 阻止事件传播
event.stopEvent();
var href = record.data.href;
if (updateLocationHash) {
// 修改地址栏
window.location.hash = '#' + href;
}
// 新增Tab节点
X.util.addMainTab(mainTabStrip, record, addTabCallback, 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 !== window.location.hash) {
if (updateLocationHash) {
window.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 = window.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();
X.util.addMainTab(mainTabStrip, currentNode, addTabCallback);
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.X_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 = (xselectedarray.indexOf(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': "&nbsp;",
'name': "tobedeleted"
});
}
*/
return items;
},
// 防止在短时间内同一GroupName的单选框触发两次事件
// 用于 MenuCheckBox 和 RadioButton
checkGroupLastTime: function (groupName) {
var checkName = groupName + '_lastupdatetime';
var checkValue = X.util[checkName];
X.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 = X.util.getTargetWindow(targetName);
var icon = X.util.getMessageBoxIcon(iconShortName);
wnd.Ext.MessageBox.show({
title: title || X.util.confirmTitle,
msg: msg,
buttons: Ext.MessageBox.OKCANCEL,
icon: icon,
fn: function (btn) {
if (btn == 'cancel') {
if (cancelScript) {
new Function(cancelScript)();
} else {
return false;
}
} else {
if (okScript) {
new Function(okScript)();
} else {
return false;
}
}
}
});
}
};
})();